Salome HOME
merging the main trunk with the BrForComp branch to build a pre V3_0_1
authornadir <nadir>
Tue, 12 Jul 2005 08:43:59 +0000 (08:43 +0000)
committernadir <nadir>
Tue, 12 Jul 2005 08:43:59 +0000 (08:43 +0000)
version, which will be tagged V3_0_1b1.

186 files changed:
INSTALL
Makefile.in
adm_local/unix/make_commence.in
adm_local/unix/make_conclude.in
bin/VERSION
configure.in.base
idl/MED.idl
resources/MEDCatalog.xml
resources/Mistrat_import22.med [new file with mode: 0644]
resources/TimeStamps_import22.med [new file with mode: 0644]
resources/carre_en_quad4_import22.med [new file with mode: 0644]
resources/carre_en_quad4_seg2_import22.med [new file with mode: 0644]
resources/cas_defaut_domaine_fluide.med [new file with mode: 0644]
resources/cube_hexa8_import22.med [new file with mode: 0644]
resources/cube_hexa8_quad4_import22.med [new file with mode: 0644]
resources/maillage_UniSegFam_import22.med [new file with mode: 0644]
resources/mesh_import22.med [new file with mode: 0755]
resources/pointe_import22.med [new file with mode: 0644]
resources/poly3D.med [new file with mode: 0644]
resources/polyedres.med [new file with mode: 0644]
resources/polygones.med [new file with mode: 0644]
resources/recoll_bord.med [new file with mode: 0644]
src/INTERPOLATION/MEDMEM_Interpolation.hxx
src/INTERPOLATION/MEDMEM_InterpolationHighLevelObjects.hxx
src/INTERPOLATION/MEDMEM_InterpolationTools.hxx
src/INTERPOLATION/MEDMEM_Mapping.hxx
src/INTERPOLATION/MEDMEM_MappingTools.hxx
src/INTERPOLATION/MEDMEM_WrapperCells.hxx
src/INTERPOLATION/MEDMEM_WrapperMesh.hxx
src/INTERPOLATION/MEDMEM_WrapperNodes.hxx
src/INTERPOLATION/MEDMEM_dTree.hxx
src/INTERPOLATION/UseCaseInterpolationts.cxx
src/INTERPOLATION/UseCaseInterpolationwots.cxx
src/INTERPOLATION/UseCaseMapping.cxx
src/INTERPOLATION/UseCaseWrapper_Maillage.cxx
src/INTERPOLATION/UseCasedTree.cxx
src/INTERPOLATION/test_MEDMEM_Interpolation.cxx
src/INTERPOLATION/test_MEDMEM_InterpolationFlipBack.cxx
src/INTERPOLATION/test_MEDMEM_InterpolationFromMesh_toMesh.cxx
src/INTERPOLATION/test_MEDMEM_InterpolationRecopieMaillage.cxx
src/INTERPOLATION/test_MEDMEM_InterpolationSansRecopieMaillage.cxx
src/INTERPOLATION/test_MEDMEM_InterpolationTimeStep.cxx
src/MED/Makefile.in
src/MED/Med_Gen_i.cxx
src/MEDGUI/MED_icons.po [deleted file]
src/MEDGUI/MED_images.po [new file with mode: 0644]
src/MEDGUI/MED_msg_en.po
src/MEDGUI/Makefile.in
src/MEDGUI/MedGUI.cxx
src/MEDGUI/MedGUI.h
src/MEDGUI/MedGUI_Selection.cxx [new file with mode: 0644]
src/MEDGUI/MedGUI_Selection.h [new file with mode: 0644]
src/MEDMEM/MEDMEM_Array.hxx
src/MEDMEM/MEDMEM_AsciiFieldDriver.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_CellModel.hxx
src/MEDMEM/MEDMEM_Compatibility21_22.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_Connectivity.cxx
src/MEDMEM/MEDMEM_Connectivity.hxx
src/MEDMEM/MEDMEM_Coordinate.hxx
src/MEDMEM/MEDMEM_DriverFactory.cxx
src/MEDMEM/MEDMEM_DriverFactory.hxx
src/MEDMEM/MEDMEM_DriverTools.cxx
src/MEDMEM/MEDMEM_DriverTools.hxx
src/MEDMEM/MEDMEM_Family.cxx
src/MEDMEM/MEDMEM_Field.cxx
src/MEDMEM/MEDMEM_Field.hxx
src/MEDMEM/MEDMEM_Formulae.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_GenDriver.hxx
src/MEDMEM/MEDMEM_GibiMeshDriver.cxx
src/MEDMEM/MEDMEM_GibiMeshDriver.hxx
src/MEDMEM/MEDMEM_Grid.cxx
src/MEDMEM/MEDMEM_Grid.hxx
src/MEDMEM/MEDMEM_Med.cxx
src/MEDMEM/MEDMEM_Med.hxx
src/MEDMEM/MEDMEM_MedFieldDriver.hxx
src/MEDMEM/MEDMEM_MedFieldDriver21.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedFieldDriver22.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedMedDriver.cxx
src/MEDMEM/MEDMEM_MedMedDriver.hxx
src/MEDMEM/MEDMEM_MedMedDriver21.cxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedMedDriver21.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedMedDriver22.cxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedMedDriver22.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedMeshDriver.cxx
src/MEDMEM/MEDMEM_MedMeshDriver.hxx
src/MEDMEM/MEDMEM_MedMeshDriver21.cxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedMeshDriver21.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedMeshDriver22.cxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedMeshDriver22.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedVersion.cxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_MedVersion.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_Mesh.cxx
src/MEDMEM/MEDMEM_Mesh.hxx
src/MEDMEM/MEDMEM_Meshing.cxx
src/MEDMEM/MEDMEM_Meshing.hxx
src/MEDMEM/MEDMEM_PolyhedronArray.cxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_PolyhedronArray.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_PorflowMeshDriver.cxx
src/MEDMEM/MEDMEM_PorflowMeshDriver.hxx
src/MEDMEM/MEDMEM_RCBase.hxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_Support.cxx
src/MEDMEM/MEDMEM_Support.hxx
src/MEDMEM/MEDMEM_VtkFieldDriver.hxx
src/MEDMEM/MEDMEM_VtkMeshDriver.cxx
src/MEDMEM/MEDMEM_define.hxx
src/MEDMEM/MEDMEM_medimport_src.cxx [new file with mode: 0644]
src/MEDMEM/MEDMEM_medimport_src.hxx [new file with mode: 0644]
src/MEDMEM/Makefile.in
src/MEDMEM/create_poly2D.c [new file with mode: 0644]
src/MEDMEM/create_poly3D.c [new file with mode: 0644]
src/MEDMEM/duplicateMED.cxx
src/MEDMEM/duplicateMEDMESH.cxx
src/MEDMEM/med2_1_To_med2_2.cxx [new file with mode: 0644]
src/MEDMEM/med2vtk.cxx
src/MEDMEM/med_test.cxx
src/MEDMEM/test_MEDMEM_Array.cxx
src/MEDMEM/test_MEDMEM_CellModel.cxx
src/MEDMEM/test_MEDMEM_Meshing.cxx
src/MEDMEM/test_MEDMEM_MeshingPoly.cxx [new file with mode: 0644]
src/MEDMEM/test_MEDMEM_Meshing_poly.cxx [new file with mode: 0644]
src/MEDMEM/test_MEDMEM_ModulusArray.cxx
src/MEDMEM/test_MEDMEM_PolyConnectivity.cxx [new file with mode: 0644]
src/MEDMEM/test_MEDMEM_PolyDriverMedMeshRead.cxx [new file with mode: 0644]
src/MEDMEM/test_MEDMEM_PolyDriverMedMeshWrite.cxx [new file with mode: 0644]
src/MEDMEM/test_MEDMEM_PolyhedronArray.cxx [new file with mode: 0644]
src/MEDMEM/test_MEDMEM_SkyLineArray.cxx
src/MEDMEM/test_MEDMEM_poly3D.cxx [new file with mode: 0755]
src/MEDMEM/test_affect_medarray.cxx
src/MEDMEM/test_copie_connectivity.cxx
src/MEDMEM/test_copie_coordinate.cxx
src/MEDMEM/test_copie_family.cxx
src/MEDMEM/test_copie_fieldT.cxx
src/MEDMEM/test_copie_field_.cxx
src/MEDMEM/test_copie_group.cxx
src/MEDMEM/test_copie_medarray.cxx
src/MEDMEM/test_copie_mesh.cxx
src/MEDMEM/test_copie_support.cxx
src/MEDMEM/test_gibi_driver.cxx
src/MEDMEM/test_grid.cxx
src/MEDMEM/test_operation_fielddouble.cxx
src/MEDMEM/test_operation_fieldint.cxx
src/MEDMEM/test_porflow_driver.cxx
src/MEDMEM/tests/readCoordinate.cxx
src/MEDMEM/tests/readEntete.cxx
src/MEDMEM/tests/testUCellModel.cxx
src/MEDMEM_I/MEDMEM_FieldDouble_i.cxx
src/MEDMEM_I/MEDMEM_FieldDouble_i.hxx
src/MEDMEM_I/MEDMEM_FieldInt_i.cxx
src/MEDMEM_I/MEDMEM_FieldInt_i.hxx
src/MEDMEM_I/MEDMEM_Mesh_i.cxx
src/MEDMEM_I/MEDMEM_Mesh_i.hxx
src/MEDMEM_I/MEDMEM_Support_i.cxx
src/MEDMEM_I/MEDMEM_Support_i.hxx
src/MEDMEM_I/Makefile.in
src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldDoubleDriver.cxx [new file with mode: 0644]
src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldDoubleDriver.hxx [new file with mode: 0644]
src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldIntDriver.cxx [new file with mode: 0644]
src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldIntDriver.hxx [new file with mode: 0644]
src/MEDMEM_SWIG/MEDMEM_SWIG_MedFieldDoubleDriver.cxx
src/MEDMEM_SWIG/MEDMEM_SWIG_MedFieldDoubleDriver.hxx
src/MEDMEM_SWIG/MEDMEM_SWIG_MedFieldIntDriver.cxx
src/MEDMEM_SWIG/MEDMEM_SWIG_MedFieldIntDriver.hxx
src/MEDMEM_SWIG/MEDMEM_SWIG_Templates.hxx [new file with mode: 0644]
src/MEDMEM_SWIG/Makefile.in
src/MEDMEM_SWIG/libMEDMEM_Swig.i
src/MEDMEM_SWIG/med_opsupp_test.py
src/MEDMEM_SWIG/testMedMemCxxTests.py [new file with mode: 0644]
src/MEDMEM_SWIG/testMedMemGeneral.py
src/MEDMEM_SWIG/test_porflow.py
src/Makefile.in
src/MedClient/src/CONNECTIVITYClient.cxx
src/MedClient/src/COORDINATEClient.cxx
src/MedClient/src/FIELDClient.cxx
src/MedClient/src/FIELDClient.hxx
src/MedClient/src/FIELDDOUBLEClient.cxx
src/MedClient/src/FIELDDOUBLEClient.hxx
src/MedClient/src/FIELDINTClient.cxx
src/MedClient/src/FIELDINTClient.hxx
src/MedClient/src/MESHClient.cxx
src/MedClient/src/MESHClient.hxx
src/MedClient/src/Makefile.in
src/MedClient/src/SUPPORTClient.cxx
src/MedClient/src/SUPPORTClient.hxx
src/MedClient/src/libMEDClient.i
src/MedClient/test/test2/Makefile.in
src/MedCorba_Swig/Makefile.in

diff --git a/INSTALL b/INSTALL
index 4f67db23f5b9d41419fd24563c9fbfe6815fbdc5..6998b170f32079d79abd696fb62a48b1ca648643 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,3 +1,4 @@
-This is the version 2.2.0 of MED
+This is the version 3.0.1 of MED
 Compatible with :
 Compatible with :
-       - KERNEL 2.2.0
+       - KERNEL 3.0.0
+       - SALOMEGUI 3.0.0
index 128237327eed60aca3b42f8397f92ce371be016e..ab72f27280f6734addf90d24e8ef6f28fb93155f 100644 (file)
@@ -41,6 +41,20 @@ test19.med \
 zzzz121b.med \
 Mistrat.med \
 TimeStamps.med \
 zzzz121b.med \
 Mistrat.med \
 TimeStamps.med \
+cas_defaut_domaine_fluide.med \
+polyedres.med \
+polygones.med \
+recoll_bord.med \
+carre_en_quad4_import22.med \
+carre_en_quad4_seg2_import22.med \
+cube_hexa8_import22.med \
+cube_hexa8_quad4_import22.med \
+maillage_UniSegFam_import22.med \
+mesh_import22.med \
+Mistrat_import22.med \
+pointe_import22.med \
+TimeStamps_import22.med \
+poly3D.med \
 Darcy3_3D_H_10x10x10.sauve \
 dx200_dy1_avec_2couches.sauve \
 elle_2D_QT_10x10.sauve \
 Darcy3_3D_H_10x10x10.sauve \
 dx200_dy1_avec_2couches.sauve \
 elle_2D_QT_10x10.sauve \
index 7ba97d68fbeffc9109b226529468c7493ce44861..ccd4d35de94aa0090c4b9aea350e7af7aff069ab 100644 (file)
@@ -66,7 +66,7 @@ QT_MT_LIBS = @QT_MT_LIBS@
 
 MOC = @MOC@
 UIC = @UIC@
 
 MOC = @MOC@
 UIC = @UIC@
-
+MSG2QM = @MSG2QM@
 
 #QWT
 
 
 #QWT
 
index cce2f06a4b1bb73c62219aa91c6a530158598f55..a08e1348cf6ba3eee0257d60d6313fd6dfb32fa3 100644 (file)
@@ -327,11 +327,7 @@ distclean: clean
        $(SWIG) $(SWIG_FLAGS) -o $@ $<
 
 $(top_builddir)/share/salome/resources/%.qm: %.po
        $(SWIG) $(SWIG_FLAGS) -o $@ $<
 
 $(top_builddir)/share/salome/resources/%.qm: %.po
-       if test -e ${KERNEL_ROOT_DIR}/bin/salome/msg2qm ; then \
-               ${KERNEL_ROOT_DIR}/bin/salome/msg2qm $< $@ ; \
-       else \
-               $(top_builddir)/bin/salome/msg2qm $< $@ ; \
-       fi
+               $(MSG2QM) $< $@ ; \
 
 #------------------------------------------------------------------------------
 # The following section of this makefile contains dependencies between the
 
 #------------------------------------------------------------------------------
 # The following section of this makefile contains dependencies between the
index d4a8f78949782c65f58d8ba4ec28cf395d0c2b2d..0e99034200547845e5faa0986f4ef8d2d419dd4b 100755 (executable)
@@ -1 +1 @@
-THIS IS SALOME - MED VERSION: 2.2.0
+THIS IS SALOME - MED VERSION: 3.0.1
index b61554a4234d8afbee97cfa48bc701ab56a74ec6..412737634165d15089464480e9c956bb890849fb 100644 (file)
@@ -242,6 +242,14 @@ echo
 
 CHECK_QT
 
 
 CHECK_QT
 
+echo
+echo ---------------------------------------------
+echo testing MSG2QM
+echo ---------------------------------------------
+echo
+
+CHECK_MSG2QM
+
 echo
 echo ---------------------------------------------
 echo testing VTK
 echo
 echo ---------------------------------------------
 echo testing VTK
index 39bb194a7bfd14b1943443d469c473546e60f8dc..5b580ddb79ba1a4eb87fb4c1573e848859278d0c 100644 (file)
@@ -195,7 +195,7 @@ This enumeration contains a set of elements defining the type of connectivity.
       Returns an array (Sender) of coordinates stored in any type.\n
       It could be used in a Client code using the MED Client classes.
      */
       Returns an array (Sender) of coordinates stored in any type.\n
       It could be used in a Client code using the MED Client classes.
      */
-    SALOME::Sender getSenderForCoordinates(in medModeSwitch typeSwitch)
+    SALOME::SenderDouble getSenderForCoordinates(in medModeSwitch typeSwitch)
       raises (SALOME::SALOME_Exception);
     /*!
      Returns coordinate  n° Number on axis n° Axis 
       raises (SALOME::SALOME_Exception);
     /*!
      Returns coordinate  n° Number on axis n° Axis 
@@ -302,7 +302,7 @@ This enumeration contains a set of elements defining the type of connectivity.
       Idem getConnectivity but return a Sender.\n
       It could be used in a Client code using the MED Client classes.
      */
       Idem getConnectivity but return a Sender.\n
       It could be used in a Client code using the MED Client classes.
      */
-    SALOME::Sender getSenderForConnectivity(in medModeSwitch typeSwitch,
+    SALOME::SenderInt getSenderForConnectivity(in medModeSwitch typeSwitch,
                                        in medConnectivity mode,
                                        in medEntityMesh entity,
                                        in medGeometryElement geomElement)
                                        in medConnectivity mode,
                                        in medEntityMesh entity,
                                        in medGeometryElement geomElement)
@@ -509,6 +509,7 @@ Internal Corba method.
           Group_array  groupCell;
     };
     meshInfos getMeshGlobal()          raises (SALOME::SALOME_Exception);
           Group_array  groupCell;
     };
     meshInfos getMeshGlobal()          raises (SALOME::SALOME_Exception);
+    boolean areEquals(in MESH other);
   };
 
   
   };
 
   
@@ -593,7 +594,7 @@ Internal Corba method.
       It could be used in a Client code using the MED Client classes.
      */
 
       It could be used in a Client code using the MED Client classes.
      */
 
-    SALOME::Sender getSenderForNumber(in medGeometryElement geomElement)
+    SALOME::SenderInt getSenderForNumber(in medGeometryElement geomElement)
       raises (SALOME::SALOME_Exception);
     
     /*!
       raises (SALOME::SALOME_Exception);
     
     /*!
@@ -612,7 +613,7 @@ Internal Corba method.
       Idem SALOME_MED::long_array getNumberIndex() but return a Sender.\n
       It could be used in a Client code using the MED Client classes.
      */
       Idem SALOME_MED::long_array getNumberIndex() but return a Sender.\n
       It could be used in a Client code using the MED Client classes.
      */
-    SALOME::Sender getSenderForNumberIndex()
+    SALOME::SenderInt getSenderForNumberIndex()
       raises (SALOME::SALOME_Exception);
 
     /*!
       raises (SALOME::SALOME_Exception);
 
     /*!
@@ -906,7 +907,7 @@ Internal Corba method.
       Idem as getValue but it could be used in a Client code using the
       MED Client classes.
     */
       Idem as getValue but it could be used in a Client code using the
       MED Client classes.
     */
-    SALOME::Sender getSenderForValue(in medModeSwitch mode)
+    SALOME::SenderDouble getSenderForValue(in medModeSwitch mode)
       raises (SALOME::SALOME_Exception);
   };
 
       raises (SALOME::SALOME_Exception);
   };
 
@@ -922,7 +923,7 @@ Internal Corba method.
       Idem as getValue but it could be used in a Client code using the
       MED Client classes.
     */
       Idem as getValue but it could be used in a Client code using the
       MED Client classes.
     */
-    SALOME::Sender getSenderForValue(in medModeSwitch mode)
+    SALOME::SenderInt getSenderForValue(in medModeSwitch mode)
       raises (SALOME::SALOME_Exception);
   };
 
       raises (SALOME::SALOME_Exception);
   };
 
index 39fbf2dd16676c0f6a4f3e4d0b37f16f227ad360..2a18495051dde5663256099a1bd43069e292f8e3 100644 (file)
@@ -16,7 +16,7 @@
                <component-username>Med</component-username>
                <component-type>MESH</component-type>
                <component-author>Patrick GOLDBRONN</component-author>
                <component-username>Med</component-username>
                <component-type>MESH</component-type>
                <component-author>Patrick GOLDBRONN</component-author>
-               <component-version>2.2.0</component-version>
+               <component-version>3.0.1</component-version>
                <component-comment>MED memory component</component-comment>
                <component-multistudy>1</component-multistudy>
                <component-icone>ModuleMed.png</component-icone>
                <component-comment>MED memory component</component-comment>
                <component-multistudy>1</component-multistudy>
                <component-icone>ModuleMed.png</component-icone>
diff --git a/resources/Mistrat_import22.med b/resources/Mistrat_import22.med
new file mode 100644 (file)
index 0000000..6729b94
Binary files /dev/null and b/resources/Mistrat_import22.med differ
diff --git a/resources/TimeStamps_import22.med b/resources/TimeStamps_import22.med
new file mode 100644 (file)
index 0000000..2f86799
Binary files /dev/null and b/resources/TimeStamps_import22.med differ
diff --git a/resources/carre_en_quad4_import22.med b/resources/carre_en_quad4_import22.med
new file mode 100644 (file)
index 0000000..e72db68
Binary files /dev/null and b/resources/carre_en_quad4_import22.med differ
diff --git a/resources/carre_en_quad4_seg2_import22.med b/resources/carre_en_quad4_seg2_import22.med
new file mode 100644 (file)
index 0000000..847cc70
Binary files /dev/null and b/resources/carre_en_quad4_seg2_import22.med differ
diff --git a/resources/cas_defaut_domaine_fluide.med b/resources/cas_defaut_domaine_fluide.med
new file mode 100644 (file)
index 0000000..f200a4f
Binary files /dev/null and b/resources/cas_defaut_domaine_fluide.med differ
diff --git a/resources/cube_hexa8_import22.med b/resources/cube_hexa8_import22.med
new file mode 100644 (file)
index 0000000..751abc5
Binary files /dev/null and b/resources/cube_hexa8_import22.med differ
diff --git a/resources/cube_hexa8_quad4_import22.med b/resources/cube_hexa8_quad4_import22.med
new file mode 100644 (file)
index 0000000..1a8f393
Binary files /dev/null and b/resources/cube_hexa8_quad4_import22.med differ
diff --git a/resources/maillage_UniSegFam_import22.med b/resources/maillage_UniSegFam_import22.med
new file mode 100644 (file)
index 0000000..57b9f75
Binary files /dev/null and b/resources/maillage_UniSegFam_import22.med differ
diff --git a/resources/mesh_import22.med b/resources/mesh_import22.med
new file mode 100755 (executable)
index 0000000..8450043
Binary files /dev/null and b/resources/mesh_import22.med differ
diff --git a/resources/pointe_import22.med b/resources/pointe_import22.med
new file mode 100644 (file)
index 0000000..5c4221a
Binary files /dev/null and b/resources/pointe_import22.med differ
diff --git a/resources/poly3D.med b/resources/poly3D.med
new file mode 100644 (file)
index 0000000..5a42c3f
Binary files /dev/null and b/resources/poly3D.med differ
diff --git a/resources/polyedres.med b/resources/polyedres.med
new file mode 100644 (file)
index 0000000..830e53f
Binary files /dev/null and b/resources/polyedres.med differ
diff --git a/resources/polygones.med b/resources/polygones.med
new file mode 100644 (file)
index 0000000..a1c404d
Binary files /dev/null and b/resources/polygones.med differ
diff --git a/resources/recoll_bord.med b/resources/recoll_bord.med
new file mode 100644 (file)
index 0000000..5b44057
Binary files /dev/null and b/resources/recoll_bord.med differ
index 473bc4e90d71323628fc0d41e4157e8e5b216ce7..cdb8182eec7371a020e5a6044166fc9641c7d3c2 100644 (file)
@@ -106,7 +106,7 @@ template <int DIMENSION> INTERPOLATION<DIMENSION>::INTERPOLATION(const MESH & fr
   if (spaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" << _fromMesh->getName() << "| is |" << spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ;
 
   _fromWrapper = new Meta_Wrapper<DIMENSION>(_fromMesh->getNumberOfNodes(),
   if (spaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" << _fromMesh->getName() << "| is |" << spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ;
 
   _fromWrapper = new Meta_Wrapper<DIMENSION>(_fromMesh->getNumberOfNodes(),
-                                             const_cast<double *> (_fromMesh->getCoordinates(MED_FULL_INTERLACE)),
+                                             const_cast<double *> (_fromMesh->getCoordinates(MED_EN::MED_FULL_INTERLACE)),
                                             const_cast<CONNECTIVITY *> (_fromMesh->getConnectivityptr())
                                             );
 
                                             const_cast<CONNECTIVITY *> (_fromMesh->getConnectivityptr())
                                             );
 
@@ -131,16 +131,16 @@ template <int DIMENSION> INTERPOLATION<DIMENSION>::INTERPOLATION(const MESH & fr
   int fromSpaceDimension = _fromMesh->getSpaceDimension();
   int toSpaceDimension   =   _toMesh->getSpaceDimension();
   
   int fromSpaceDimension = _fromMesh->getSpaceDimension();
   int toSpaceDimension   =   _toMesh->getSpaceDimension();
   
-  if (fromSpaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" << _fromMesh->getName() << "| is |" << spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ;
-  if (  toSpaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" <<   _toMesh->getName() << "| is |" << spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ;
+  if (fromSpaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" << _fromMesh->getName() << "| is |" << INTERPOLATION<DIMENSION>::spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ;
+  if (  toSpaceDimension != DIMENSION ) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The spaceDimension of mesh |" <<   _toMesh->getName() << "| is |" << INTERPOLATION<DIMENSION>::spaceDimension << "| and should be |" << DIMENSION << "|" << endl)) ;
  
   _fromWrapper = new Meta_Wrapper<DIMENSION>(_fromMesh->getNumberOfNodes(),
  
   _fromWrapper = new Meta_Wrapper<DIMENSION>(_fromMesh->getNumberOfNodes(),
-                                             const_cast<double *> (_fromMesh->getCoordinates(MED_FULL_INTERLACE)),
+                                             const_cast<double *> (_fromMesh->getCoordinates(MED_EN::MED_FULL_INTERLACE)),
                                             const_cast<CONNECTIVITY *> (_fromMesh->getConnectivityptr())
                                             );
 
   _toWrapper   = new Meta_Wrapper<DIMENSION>(_toMesh->getNumberOfNodes(),
                                             const_cast<CONNECTIVITY *> (_fromMesh->getConnectivityptr())
                                             );
 
   _toWrapper   = new Meta_Wrapper<DIMENSION>(_toMesh->getNumberOfNodes(),
-                                             const_cast<double *> (_toMesh->getCoordinates(MED_FULL_INTERLACE))
+                                             const_cast<double *> (_toMesh->getCoordinates(MED_EN::MED_FULL_INTERLACE))
                                             );
 
   _mapping     = new  Meta_Mapping<DIMENSION> (_fromWrapper);
                                             );
 
   _mapping     = new  Meta_Mapping<DIMENSION> (_fromWrapper);
index 92655d64c1130090dce446972aaa70fadf87e118..b816efe928cc8667db85de84717d853c0de47f01 100644 (file)
@@ -11,6 +11,8 @@
 #include "MEDMEM_WrapperField.hxx"
 #include "MEDMEM_InterpolationTools.hxx"
 
 #include "MEDMEM_WrapperField.hxx"
 #include "MEDMEM_InterpolationTools.hxx"
 
+#define _CALCUL_HYBRIDE_ Calcul_Hybride<Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>
+
 //////////////////////////////////////////////////////////////////
 ///                                                            ///
 ///                        DECLARATIONS                        ///
 //////////////////////////////////////////////////////////////////
 ///                                                            ///
 ///                        DECLARATIONS                        ///
@@ -157,20 +159,20 @@ public :
                Meta_Nuage_Maille *              nm = MW->Get_Nuage_Mailles();
                Wrapper_MED_Field *              c  = MW->Get_Champ();
                
                Meta_Nuage_Maille *              nm = MW->Get_Nuage_Mailles();
                Wrapper_MED_Field *              c  = MW->Get_Champ();
                
-               mailles=nm;
+               _CALCUL_HYBRIDE_::mailles=nm;
                
                
-               fonctions[ MED_EN::MED_TRIA3  ]=new Calcul_Interpolation_Tria3  <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
-               fonctions[ MED_EN::MED_QUAD4  ]=new Calcul_Interpolation_Quad4  <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
-               fonctions[ MED_EN::MED_TETRA4 ]=new Calcul_Interpolation_Tetra4 <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
-               fonctions[ MED_EN::MED_HEXA8  ]=new Calcul_Interpolation_Hexa8  <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
-               fonctions[ MED_EN::MED_PENTA6 ]=new Calcul_Interpolation_Penta6 <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
-               fonctions[ MED_EN::MED_PYRA5  ]=new Calcul_Interpolation_Pyra5  <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
-               fonctions[ MED_EN::MED_TRIA6  ]=fonctions[ MED_EN::MED_TRIA3  ];
-               fonctions[ MED_EN::MED_QUAD8  ]=fonctions[ MED_EN::MED_QUAD4  ];
-               fonctions[ MED_EN::MED_TETRA10]=fonctions[ MED_EN::MED_TETRA4 ];
-               fonctions[ MED_EN::MED_HEXA20 ]=fonctions[ MED_EN::MED_HEXA8  ];
-               fonctions[ MED_EN::MED_PENTA15]=fonctions[ MED_EN::MED_PENTA6 ];
-               fonctions[ MED_EN::MED_PYRA13 ]=fonctions[ MED_EN::MED_PYRA5  ];
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_TRIA3  ]=new Calcul_Interpolation_Tria3  <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_QUAD4  ]=new Calcul_Interpolation_Quad4  <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_TETRA4 ]=new Calcul_Interpolation_Tetra4 <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_HEXA8  ]=new Calcul_Interpolation_Hexa8  <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_PENTA6 ]=new Calcul_Interpolation_Penta6 <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_PYRA5  ]=new Calcul_Interpolation_Pyra5  <Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>(nn,nm,c);
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_TRIA6  ]=_CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_TRIA3  ];
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_QUAD8  ]=_CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_QUAD4  ];
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_TETRA10]=_CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_TETRA4 ];
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_HEXA20 ]=_CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_HEXA8  ];
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_PENTA15]=_CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_PENTA6 ];
+               _CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_PYRA13 ]=_CALCUL_HYBRIDE_::fonctions[ MED_EN::MED_PYRA5  ];
                }
        Valeur<double> operator() (Wrapper_Noeud<DIMENSION> & node, int num_maille){return Calcul_Hybride<Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>::operator()(node,num_maille);}
        Valeur<double> operator() (double * node, int num_maille) 
                }
        Valeur<double> operator() (Wrapper_Noeud<DIMENSION> & node, int num_maille){return Calcul_Hybride<Wrapper_MED_Field,Valeur<double>,Wrapper_Nuage_Noeud<DIMENSION>,Wrapper_Noeud<DIMENSION>,Meta_Nuage_Maille>::operator()(node,num_maille);}
        Valeur<double> operator() (double * node, int num_maille) 
index ecce21bce6fea240f48cd5150680e30de0f91e51..1e71b418d2462f6c036f227ae717694b9e4b2211 100644 (file)
@@ -87,7 +87,7 @@ _TEMPLATE_ class Calcul_Interpolation_P0      : public Calcul_Interpolation<_PAR
 public : Calcul_Interpolation_P0(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
 public : Calcul_Interpolation_P0(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
-       return (*champ)[num_maille];
+       return (*Calcul_Interpolation<_PARAM_>::champ)[num_maille];
        }
 };
 _TEMPLATE_ class Calcul_Interpolation_Tria3   : public Calcul_Interpolation<_PARAM_>
        }
 };
 _TEMPLATE_ class Calcul_Interpolation_Tria3   : public Calcul_Interpolation<_PARAM_>
@@ -95,20 +95,20 @@ _TEMPLATE_ class Calcul_Interpolation_Tria3   : public Calcul_Interpolation<_PAR
 public : Calcul_Interpolation_Tria3(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
 public : Calcul_Interpolation_Tria3(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
-       int num0=(*mailles)[num_maille][0];
-       int num1=(*mailles)[num_maille][1];
-       int num2=(*mailles)[num_maille][2];
+       int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
+       int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
+       int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
        
        
-       double x0=(*noeuds)[num0][0];
-       double y0=(*noeuds)[num0][1];
-       double x1=(*noeuds)[num1][0];
-       double y1=(*noeuds)[num1][1];
-       double x2=(*noeuds)[num2][0];
-       double y2=(*noeuds)[num2][1];
+       double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];
+       double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];
+       double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];
+       double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];
+       double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];
+       double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];
        
        
-       VALEURCHAMP v0=(*champ)[num0];
-       VALEURCHAMP v1=(*champ)[num1];
-       VALEURCHAMP v2=(*champ)[num2];
+       VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
+       VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
+       VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
        
        double x=n[0];
        double y=n[1];
        
        double x=n[0];
        double y=n[1];
@@ -132,26 +132,26 @@ public : Calcul_Interpolation_Tria6(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
        // ON SUPPOSE IMPLICITEMENT QUE LES NOEUDS SUPPLEMENTAIRES SONT BIEN DES NOEUDS MILIEUX
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
        // ON SUPPOSE IMPLICITEMENT QUE LES NOEUDS SUPPLEMENTAIRES SONT BIEN DES NOEUDS MILIEUX
-       int num0 =(*mailles)[num_maille][0];
-       int num1 =(*mailles)[num_maille][1];
-       int num2 =(*mailles)[num_maille][2];
-       int num01=(*mailles)[num_maille][3];
-       int num12=(*mailles)[num_maille][4];
-       int num20=(*mailles)[num_maille][5];
-       
-       double x0=(*noeuds)[num0][0];
-       double y0=(*noeuds)[num0][1];
-       double x1=(*noeuds)[num1][0];
-       double y1=(*noeuds)[num1][1];
-       double x2=(*noeuds)[num2][0];
-       double y2=(*noeuds)[num2][1];
-       
-       VALEURCHAMP v0=(*champ)[num0];
-       VALEURCHAMP v1=(*champ)[num1];
-       VALEURCHAMP v2=(*champ)[num2];
-       VALEURCHAMP v01=(*champ)[num01];
-       VALEURCHAMP v12=(*champ)[num12];
-       VALEURCHAMP v20=(*champ)[num20];
+       int num0 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
+       int num1 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
+       int num2 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
+       int num01=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
+       int num12=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
+       int num20=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][5];
+       
+       double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];
+       double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];
+       double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];
+       double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];
+       double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];
+       double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];
+       
+       VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
+       VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
+       VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
+       VALEURCHAMP v01=(*Calcul_Interpolation<_PARAM_>::champ)[num01];
+       VALEURCHAMP v12=(*Calcul_Interpolation<_PARAM_>::champ)[num12];
+       VALEURCHAMP v20=(*Calcul_Interpolation<_PARAM_>::champ)[num20];
        
        double x=n[0];
        double y=n[1];
        
        double x=n[0];
        double y=n[1];
@@ -181,24 +181,24 @@ _TEMPLATE_ class Calcul_Interpolation_Quad4   : public Calcul_Interpolation<_PAR
 public : Calcul_Interpolation_Quad4(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
 public : Calcul_Interpolation_Quad4(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
-       int num0=(*mailles)[num_maille][0];
-       int num1=(*mailles)[num_maille][1];
-       int num2=(*mailles)[num_maille][2];
-       int num3=(*mailles)[num_maille][3];
-       
-       double x0=(*noeuds)[num0][0];
-       double y0=(*noeuds)[num0][1];
-       double x1=(*noeuds)[num1][0];
-       double y1=(*noeuds)[num1][1];
-       double x2=(*noeuds)[num2][0];
-       double y2=(*noeuds)[num2][1];
-       double x3=(*noeuds)[num3][0];
-       double y3=(*noeuds)[num3][1];
-       
-       VALEURCHAMP v0=(*champ)[num0];
-       VALEURCHAMP v1=(*champ)[num1];
-       VALEURCHAMP v2=(*champ)[num2];
-       VALEURCHAMP v3=(*champ)[num3];
+       int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
+       int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
+       int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
+       int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
+       
+       double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];
+       double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];
+       double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];
+       double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];
+       double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];
+       double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];
+       double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];
+       double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];
+       
+       VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
+       VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
+       VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
+       VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
        
        double x=n[0];
        double y=n[1];
        
        double x=n[0];
        double y=n[1];
@@ -240,28 +240,28 @@ _TEMPLATE_ class Calcul_Interpolation_Tetra4  : public Calcul_Interpolation<_PAR
 public : Calcul_Interpolation_Tetra4(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
 public : Calcul_Interpolation_Tetra4(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
-       int num0=(*mailles)[num_maille][0];
-       int num1=(*mailles)[num_maille][1];
-       int num2=(*mailles)[num_maille][2];
-       int num3=(*mailles)[num_maille][3];
-       
-       double x0=(*noeuds)[num0][0];
-       double y0=(*noeuds)[num0][1];
-       double z0=(*noeuds)[num0][2];
-       double x1=(*noeuds)[num1][0];
-       double y1=(*noeuds)[num1][1];
-       double z1=(*noeuds)[num1][2];
-       double x2=(*noeuds)[num2][0];
-       double y2=(*noeuds)[num2][1];
-       double z2=(*noeuds)[num2][2];
-       double x3=(*noeuds)[num3][0];
-       double y3=(*noeuds)[num3][1];
-       double z3=(*noeuds)[num3][2];
-       
-       VALEURCHAMP v0=(*champ)[num0];
-       VALEURCHAMP v1=(*champ)[num1];
-       VALEURCHAMP v2=(*champ)[num2];
-       VALEURCHAMP v3=(*champ)[num3];
+       int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
+       int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
+       int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
+       int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
+       
+       double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];
+       double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];
+       double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
+       double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];
+       double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];
+       double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
+       double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];
+       double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];
+       double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
+       double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];
+       double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];
+       double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
+       
+       VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
+       VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
+       VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
+       VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
        
        double x=n[0];
        double y=n[1];
        
        double x=n[0];
        double y=n[1];
@@ -285,32 +285,32 @@ public : Calcul_Interpolation_Tetra10(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
        // ON SUPPOSE IMPLICITEMENT QUE LES NOEUDS SUPPLEMENTAIRES SONT BIEN DES NOEUDS MILIEUX
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
        // ON SUPPOSE IMPLICITEMENT QUE LES NOEUDS SUPPLEMENTAIRES SONT BIEN DES NOEUDS MILIEUX
-       int num0 =(*mailles)[num_maille][0];
-       int num1 =(*mailles)[num_maille][1];
-       int num2 =(*mailles)[num_maille][2];
-       int num3 =(*mailles)[num_maille][3];
-       int num01=(*mailles)[num_maille][4];
-       int num02=(*mailles)[num_maille][6];
-       int num03=(*mailles)[num_maille][7];
-       int num12=(*mailles)[num_maille][5];
-       int num13=(*mailles)[num_maille][8];
-       int num23=(*mailles)[num_maille][9];
-       
-       double x0=(*noeuds)[num0][0];double y0=(*noeuds)[num0][1];double z0=(*noeuds)[num0][2];
-       double x1=(*noeuds)[num1][0];double y1=(*noeuds)[num1][1];double z1=(*noeuds)[num1][2];
-       double x2=(*noeuds)[num2][0];double y2=(*noeuds)[num2][1];double z2=(*noeuds)[num2][2];
-       double x3=(*noeuds)[num3][0];double y3=(*noeuds)[num3][1];double z3=(*noeuds)[num3][2];
-       
-       VALEURCHAMP v0=(*champ)[num0];  
-       VALEURCHAMP v1=(*champ)[num1];  
-       VALEURCHAMP v2=(*champ)[num2];  
-       VALEURCHAMP v3=(*champ)[num3];  
-       VALEURCHAMP v01=(*champ)[num01];
-       VALEURCHAMP v02=(*champ)[num02];
-       VALEURCHAMP v03=(*champ)[num03];
-       VALEURCHAMP v12=(*champ)[num12];
-       VALEURCHAMP v13=(*champ)[num13];
-       VALEURCHAMP v23=(*champ)[num23];
+       int num0 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
+       int num1 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
+       int num2 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
+       int num3 =(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
+       int num01=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
+       int num02=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][6];
+       int num03=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][7];
+       int num12=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][5];
+       int num13=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][8];
+       int num23=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][9];
+       
+       double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
+       double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
+       double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
+       double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
+       
+       VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];  
+       VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];  
+       VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];  
+       VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];  
+       VALEURCHAMP v01=(*Calcul_Interpolation<_PARAM_>::champ)[num01];
+       VALEURCHAMP v02=(*Calcul_Interpolation<_PARAM_>::champ)[num02];
+       VALEURCHAMP v03=(*Calcul_Interpolation<_PARAM_>::champ)[num03];
+       VALEURCHAMP v12=(*Calcul_Interpolation<_PARAM_>::champ)[num12];
+       VALEURCHAMP v13=(*Calcul_Interpolation<_PARAM_>::champ)[num13];
+       VALEURCHAMP v23=(*Calcul_Interpolation<_PARAM_>::champ)[num23];
        
        double x=n[0];
        double y=n[1];
        
        double x=n[0];
        double y=n[1];
@@ -355,34 +355,34 @@ public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        
        // Tres probablement numériquement mauvais, Ã  revoir
        
        
        // Tres probablement numériquement mauvais, Ã  revoir
        
-       int num0=(*mailles)[num_maille][0];
-       int num1=(*mailles)[num_maille][1];
-       int num2=(*mailles)[num_maille][2];
-       int num3=(*mailles)[num_maille][3];
-       int num4=(*mailles)[num_maille][4];
-       int num5=(*mailles)[num_maille][5];
-       int num6=(*mailles)[num_maille][6];
-       int num7=(*mailles)[num_maille][7];
-       
-       
-       double x0=(*noeuds)[num0][0];double y0=(*noeuds)[num0][1];double z0=(*noeuds)[num0][2];
-       double x1=(*noeuds)[num1][0];double y1=(*noeuds)[num1][1];double z1=(*noeuds)[num1][2];
-       double x2=(*noeuds)[num2][0];double y2=(*noeuds)[num2][1];double z2=(*noeuds)[num2][2];
-       double x3=(*noeuds)[num3][0];double y3=(*noeuds)[num3][1];double z3=(*noeuds)[num3][2];
-       double x4=(*noeuds)[num4][0];double y4=(*noeuds)[num4][1];double z4=(*noeuds)[num4][2];
-       double x5=(*noeuds)[num5][0];double y5=(*noeuds)[num5][1];double z5=(*noeuds)[num5][2];
-       double x6=(*noeuds)[num6][0];double y6=(*noeuds)[num6][1];double z6=(*noeuds)[num6][2];
-       double x7=(*noeuds)[num7][0];double y7=(*noeuds)[num7][1];double z7=(*noeuds)[num7][2];
-       
-       
-       VALEURCHAMP v0=(*champ)[num0];
-       VALEURCHAMP v1=(*champ)[num1];
-       VALEURCHAMP v2=(*champ)[num2];
-       VALEURCHAMP v3=(*champ)[num3];
-       VALEURCHAMP v4=(*champ)[num4];
-       VALEURCHAMP v5=(*champ)[num5];
-       VALEURCHAMP v6=(*champ)[num6];
-       VALEURCHAMP v7=(*champ)[num7];
+       int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
+       int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
+       int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
+       int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
+       int num4=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
+       int num5=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][5];
+       int num6=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][6];
+       int num7=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][7];
+       
+       
+       double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
+       double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
+       double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
+       double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
+       double x4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][0];double y4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][1];double z4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][2];
+       double x5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][0];double y5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][1];double z5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][2];
+       double x6=(*Calcul_Interpolation<_PARAM_>::noeuds)[num6][0];double y6=(*Calcul_Interpolation<_PARAM_>::noeuds)[num6][1];double z6=(*Calcul_Interpolation<_PARAM_>::noeuds)[num6][2];
+       double x7=(*Calcul_Interpolation<_PARAM_>::noeuds)[num7][0];double y7=(*Calcul_Interpolation<_PARAM_>::noeuds)[num7][1];double z7=(*Calcul_Interpolation<_PARAM_>::noeuds)[num7][2];
+       
+       
+       VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
+       VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
+       VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
+       VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
+       VALEURCHAMP v4=(*Calcul_Interpolation<_PARAM_>::champ)[num4];
+       VALEURCHAMP v5=(*Calcul_Interpolation<_PARAM_>::champ)[num5];
+       VALEURCHAMP v6=(*Calcul_Interpolation<_PARAM_>::champ)[num6];
+       VALEURCHAMP v7=(*Calcul_Interpolation<_PARAM_>::champ)[num7];
 
        double x=n[0];
        double y=n[1];
 
        double x=n[0];
        double y=n[1];
@@ -427,26 +427,26 @@ _TEMPLATE_ class Calcul_Interpolation_Penta6  : public Calcul_Interpolation<_PAR
 public : Calcul_Interpolation_Penta6(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
 public : Calcul_Interpolation_Penta6(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):Calcul_Interpolation<_PARAM_>(nn,nm,c) {}
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
-       int num0=(*mailles)[num_maille][0];
-       int num1=(*mailles)[num_maille][1];
-       int num2=(*mailles)[num_maille][2];
-       int num3=(*mailles)[num_maille][3];
-       int num4=(*mailles)[num_maille][4];
-       int num5=(*mailles)[num_maille][5];    
-       
-       double x0=(*noeuds)[num0][0];double y0=(*noeuds)[num0][1];double z0=(*noeuds)[num0][2];
-       double x1=(*noeuds)[num1][0];double y1=(*noeuds)[num1][1];double z1=(*noeuds)[num1][2];
-       double x2=(*noeuds)[num2][0];double y2=(*noeuds)[num2][1];double z2=(*noeuds)[num2][2];
-       double x3=(*noeuds)[num3][0];double y3=(*noeuds)[num3][1];double z3=(*noeuds)[num3][2];
-       double x4=(*noeuds)[num4][0];double y4=(*noeuds)[num4][1];double z4=(*noeuds)[num4][2];
-       double x5=(*noeuds)[num5][0];double y5=(*noeuds)[num5][1];double z5=(*noeuds)[num5][2]; 
-       
-       VALEURCHAMP v0=(*champ)[num0];
-       VALEURCHAMP v1=(*champ)[num1];
-       VALEURCHAMP v2=(*champ)[num2];
-       VALEURCHAMP v3=(*champ)[num3];
-       VALEURCHAMP v4=(*champ)[num4];
-       VALEURCHAMP v5=(*champ)[num5];
+       int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
+       int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
+       int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
+       int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
+       int num4=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
+       int num5=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][5];    
+       
+       double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
+       double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
+       double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
+       double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
+       double x4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][0];double y4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][1];double z4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][2];
+       double x5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][0];double y5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][1];double z5=(*Calcul_Interpolation<_PARAM_>::noeuds)[num5][2];    
+       
+       VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
+       VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
+       VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
+       VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
+       VALEURCHAMP v4=(*Calcul_Interpolation<_PARAM_>::champ)[num4];
+       VALEURCHAMP v5=(*Calcul_Interpolation<_PARAM_>::champ)[num5];
 
        double x=n[0];
        double y=n[1];
 
        double x=n[0];
        double y=n[1];
@@ -481,23 +481,23 @@ public : Calcul_Interpolation_Pyra5(NUAGENOEUD * nn,NUAGEMAILLE * nm,CHAMP * c):
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
        // NON TESTE
 public : VALEURCHAMP operator() (const NOEUD & n, int num_maille)
        {
        // NON TESTE
-       int num0=(*mailles)[num_maille][0];
-       int num1=(*mailles)[num_maille][1];
-       int num2=(*mailles)[num_maille][2];
-       int num3=(*mailles)[num_maille][3];
-       int num4=(*mailles)[num_maille][4];
-       
-       double x0=(*noeuds)[num0][0];double y0=(*noeuds)[num0][1];double z0=(*noeuds)[num0][2];
-       double x1=(*noeuds)[num1][0];double y1=(*noeuds)[num1][1];double z1=(*noeuds)[num1][2];
-       double x2=(*noeuds)[num2][0];double y2=(*noeuds)[num2][1];double z2=(*noeuds)[num2][2];
-       double x3=(*noeuds)[num3][0];double y3=(*noeuds)[num3][1];double z3=(*noeuds)[num3][2];
-       double x4=(*noeuds)[num4][0];double y4=(*noeuds)[num4][1];double z4=(*noeuds)[num4][2];
-       
-       VALEURCHAMP v0=(*champ)[num0];
-       VALEURCHAMP v1=(*champ)[num1];
-       VALEURCHAMP v2=(*champ)[num2];
-       VALEURCHAMP v3=(*champ)[num3];
-       VALEURCHAMP v4=(*champ)[num4];
+       int num0=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][0];
+       int num1=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][1];
+       int num2=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][2];
+       int num3=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][3];
+       int num4=(*Calcul_Interpolation<_PARAM_>::mailles)[num_maille][4];
+       
+       double x0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][0];double y0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][1];double z0=(*Calcul_Interpolation<_PARAM_>::noeuds)[num0][2];
+       double x1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][0];double y1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][1];double z1=(*Calcul_Interpolation<_PARAM_>::noeuds)[num1][2];
+       double x2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][0];double y2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][1];double z2=(*Calcul_Interpolation<_PARAM_>::noeuds)[num2][2];
+       double x3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][0];double y3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][1];double z3=(*Calcul_Interpolation<_PARAM_>::noeuds)[num3][2];
+       double x4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][0];double y4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][1];double z4=(*Calcul_Interpolation<_PARAM_>::noeuds)[num4][2];
+       
+       VALEURCHAMP v0=(*Calcul_Interpolation<_PARAM_>::champ)[num0];
+       VALEURCHAMP v1=(*Calcul_Interpolation<_PARAM_>::champ)[num1];
+       VALEURCHAMP v2=(*Calcul_Interpolation<_PARAM_>::champ)[num2];
+       VALEURCHAMP v3=(*Calcul_Interpolation<_PARAM_>::champ)[num3];
+       VALEURCHAMP v4=(*Calcul_Interpolation<_PARAM_>::champ)[num4];
 
        double x=n[0];
        double y=n[1];
 
        double x=n[0];
        double y=n[1];
index 166e35a0678508f5d607f1f91b6db6e77e48a952..4b70bf8c7630f28ed299cefb7e47b5b95a1ac48a 100644 (file)
@@ -84,7 +84,7 @@ _TEMPLATE_ void _MAPPING_::Cree_Mapping(int flag_convexe)
                         exit(-1);
                         }
                 
                         exit(-1);
                         }
                 
-               int i,j,k;
+               int i;
                int nbr_noeuds=noeuds_front->SIZE();
                int num_maille_depart;
                int nma=0;
                int nbr_noeuds=noeuds_front->SIZE();
                int num_maille_depart;
                int nma=0;
index e1566f91819ebd3f0cbf183daaa9b44de74ad02c..79b5edfd95b0e8a05198b4ae2b569c20ff57137b 100644 (file)
@@ -99,17 +99,19 @@ _TEMPLATE_SPE_ _COORDBARY_2D_::Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGE
 
 _TEMPLATE_SPE_ vector<double> _COORDBARY_2D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M)
        {
 
 _TEMPLATE_SPE_ vector<double> _COORDBARY_2D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M)
        {
-       int i,j,nbr_faces;
+       int i,nbr_faces;
        if (etat_coord_baryc[num_maille]==FAUX) 
                {
        if (etat_coord_baryc[num_maille]==FAUX) 
                {
-               nbr_faces=(*mailles).DONNE_NBR_FACES();
+               nbr_faces=(*mailles)[num_maille].DONNE_NBR_FACES();
                
                coord_baryc[num_maille]=vector< vector<double> >(nbr_faces);
                
                
                coord_baryc[num_maille]=vector< vector<double> >(nbr_faces);
                
+               type_retour simplexe_base;
+               
                for (i=0;i<nbr_faces;i++)
                        {
                for (i=0;i<nbr_faces;i++)
                        {
-                       vector<int> simplexe_base=(*mailles).DONNE_SIMPLEXE_BASE(i);
-                       coord_baryc[num_maille][i]=Calcule_Base_Coord_Baryc(simplexe_base);
+                       (*mailles)[num_maille].DONNE_SIMPLEXE_BASE(i,simplexe_base);
+                       coord_baryc[num_maille][i]=Calcule_Base_Coord_Baryc(vector<int>(&simplexe_base.quoi[0],&simplexe_base.quoi[simplexe_base.combien]));
                        etat_coord_baryc[num_maille]=VRAI;
                        }
                }       
                        etat_coord_baryc[num_maille]=VRAI;
                        }
                }       
@@ -120,7 +122,6 @@ _TEMPLATE_SPE_ vector<double> _COORDBARY_2D_::Calcule_Base_Coord_Baryc(const vec
        {
        const vector<int> &ref=simplexe_base;
        vector<double> retour(3);
        {
        const vector<int> &ref=simplexe_base;
        vector<double> retour(3);
-       int i,j;
                
        double x0=(*sommets)[ref[0]][0];
        double y0=(*sommets)[ref[0]][1];
                
        double x0=(*sommets)[ref[0]][0];
        double y0=(*sommets)[ref[0]][1];
@@ -161,7 +162,7 @@ _TEMPLATE_SPE_ _COORDBARY_3D_::Coordonnees_Barycentriques(NUAGEMAILLE * m, NUAGE
        
 _TEMPLATE_SPE_ vector<double> _COORDBARY_3D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M)
        {
        
 _TEMPLATE_SPE_ vector<double> _COORDBARY_3D_::Donne_Pseudo_Coord_Baryc(int num_maille,const NOEUD &M)
        {
-       int i,j,nbr_faces;
+       int i,nbr_faces;
        if (etat_coord_baryc[num_maille]==FAUX) 
                {
                nbr_faces=(*mailles)[num_maille].DONNE_NBR_FACES();
        if (etat_coord_baryc[num_maille]==FAUX) 
                {
                nbr_faces=(*mailles)[num_maille].DONNE_NBR_FACES();
@@ -185,7 +186,6 @@ _TEMPLATE_SPE_ vector<double> _COORDBARY_3D_::Calcule_Base_Coord_Baryc(const vec
        {
        const vector<int> &ref=simplexe_base;
        vector<double> retour(4);
        {
        const vector<int> &ref=simplexe_base;
        vector<double> retour(4);
-       int i,j;
                
        double x0=(*sommets)[ref[0]][0];
        double y0=(*sommets)[ref[0]][1];
                
        double x0=(*sommets)[ref[0]][0];
        double y0=(*sommets)[ref[0]][1];
index 1aec47ec3ec5c3f5c8631e3e6f5fa2c770475d54..d0cdc930ce2ac32515ada78f55ba179cc0294b13 100644 (file)
@@ -293,8 +293,6 @@ inline int  Wrapper_Maille::DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour
        {
        type_retour face_loc;
        int num_face;
        {
        type_retour face_loc;
        int num_face;
-       int taille_face_exam;
-       int test=FAUX;
        for (num_face=0;num_face<DONNE_NBR_FACES();num_face++)
                {
                DONNE_FACE(num_face,face_loc);
        for (num_face=0;num_face<DONNE_NBR_FACES();num_face++)
                {
                DONNE_FACE(num_face,face_loc);
index 87b8ce921deceed88c2b37a841d655bce5fc7c7a..8093d139f659319f490784c0295d8a7d82f26802 100644 (file)
@@ -141,12 +141,11 @@ template <class NUAGEMAILLE> Wrapper_Maillage<NUAGEMAILLE>::Wrapper_Maillage(NUA
                exit(-1);
                }
                
                exit(-1);
                }
                
-       int i,j,k;
+       int i,j;
        int num_local_face;
        int num_local_face;
-       int ind_num_noeud,num_noeud;
+       int num_noeud;
        int num_maille;
        int ind_num_maille_sec,num_maille_sec;
        int num_maille;
        int ind_num_maille_sec,num_maille_sec;
-       int num_local_sec;
        int flag_existence;
        int nbr_mailles=mailles->SIZE();
        int nbr_formants=0;
        int flag_existence;
        int nbr_mailles=mailles->SIZE();
        int nbr_formants=0;
index 084a9ad4a106e61267e329920f3e916e3f947fea..31018c09871643e9e8fcf448c125d05eed7fe647 100644 (file)
@@ -6,6 +6,8 @@
 #define NULL 0
 #endif
 
 #define NULL 0
 #endif
 
+#include <math.h>
+
 //////////////////////////////////////////////////////////////////
 ///                                                            ///
 ///                        DECLARATIONS                        ///
 //////////////////////////////////////////////////////////////////
 ///                                                            ///
 ///                        DECLARATIONS                        ///
index 47f5a374089d09f766ee27bac7ad4aef978e02c1..3e1aea46ef3312fd6273aade7f43daefd60db355 100644 (file)
@@ -194,8 +194,7 @@ _TEMPLATE_ _DTREE_::dTree(const Sommet_dTree<DIMENSION> &A,const Sommet_dTree<DI
        if (mypere!=NULL)
                {
                
        if (mypere!=NULL)
                {
                
-               int i,j;
-               double tmp;
+               int i;
                
                init();
                
                
                init();
                
@@ -319,7 +318,7 @@ _TEMPLATE_ _DTREE_ & _DTREE_::operator = (const _DTREE_ & F)
        // Pas Super Top Moumoute ... Recopie de pointeurs et pas de contenus, merdique
        int i,j;
        init();
        // Pas Super Top Moumoute ... Recopie de pointeurs et pas de contenus, merdique
        int i,j;
        init();
-       for (i=0;i<nbr_descendans;i++) descendant[i]=F.descendant[i];
+       for (i=0;i<_DTREE_::nbr_descendans;i++) descendant[i]=F.descendant[i];
        noeud_contenu=F.noeud_contenu;
        etat=F.etat;
        niveau=F.niveau;
        noeud_contenu=F.noeud_contenu;
        etat=F.etat;
        niveau=F.niveau;
@@ -369,8 +368,10 @@ _TEMPLATE_ _DTREE_ * _DTREE_::trouve_dTree_contenant(NOEUD P) const
                        if (!test) break;
                        }
 
                        if (!test) break;
                        }
 
-               if (test) return descendant[i]->trouve_dTree_contenant(P); // Propagation
+               if (test)
+                 return descendant[i]->trouve_dTree_contenant(P); // Propagation
                }
                }
+       return NULL;
        }
 // si de le dTree n'est pas TERMINAL, scanne tous les points du nuage du pere pour trouver le point le plus proche
 // sinon scanne uniquement les points contenus dans le dTree
        }
 // si de le dTree n'est pas TERMINAL, scanne tous les points du nuage du pere pour trouver le point le plus proche
 // sinon scanne uniquement les points contenus dans le dTree
index 4b25863f9565b76395e9def3aa26685eaac7c9cd..d7418aa26f7330ecd7d02edaff4bd42cc64f187d 100644 (file)
 
 #include "stdio.h"
 
 
 #include "stdio.h"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
-    
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   const char * fromFileName   = "ResultatSyrthes.med";
   const char * toFileName     = "MaillageAster.med";
   const char * resultFileName = "ResultatInterpolation.med";
   const char * fromFileName   = "ResultatSyrthes.med";
   const char * toFileName     = "MaillageAster.med";
   const char * resultFileName = "ResultatInterpolation.med";
index bd1682aa2b6ba480cd08eec559bbe7c42fae43c0..e0535328c18170241d124d4714697321f6c1ab89 100644 (file)
@@ -7,11 +7,18 @@
 
 #include "stdio.h"
 
 
 #include "stdio.h"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
-  
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   const char * fromFileName  = "fromMesh.med";
   const char * toFileName    = "toMesh.med";
   const char * fieldName     = "fieldnodedouble";
   const char * fromFileName  = "fromMesh.med";
   const char * toFileName    = "toMesh.med";
   const char * fieldName     = "fieldnodedouble";
index e1001a401830ba5136efd72b2d5db37018ceb5bd..d24ca9f2789f3e3bf56458877f579ac03c794ea7 100644 (file)
@@ -5,11 +5,19 @@
 
 #include "MEDMEM_InterpolationHighLevelObjects.hxx"
 
 
 #include "MEDMEM_InterpolationHighLevelObjects.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 int main (void) 
 {
 using namespace MEDMEM;
 using namespace MED_EN;
 
 int main (void) 
 {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
 int i;
 
 const int DIMENSION = 3;
 int i;
 
 const int DIMENSION = 3;
index 220ca89b755bba4010672de0a542985440e15fd4..bc19a7a0b6a87c5f3dc24a155963bc3d315a60fc 100644 (file)
@@ -5,11 +5,19 @@
 
 #include "MEDMEM_InterpolationHighLevelObjects.hxx"
 
 
 #include "MEDMEM_InterpolationHighLevelObjects.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 int main (void) 
 {
 using namespace MEDMEM;
 using namespace MED_EN;
 
 int main (void) 
 {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
 int i,j;
 
 const char * fromFileName  = "fromMesh.med";
 int i,j;
 
 const char * fromFileName  = "fromMesh.med";
index 0ab7ce241b23c79ee9e4b7c085bfb4f2911d7c25..f307b89ba9398b4905f864dd27e467e27b9643ee 100644 (file)
@@ -5,10 +5,18 @@
 
 #include "MEDMEM_InterpolationHighLevelObjects.hxx"
 
 
 #include "MEDMEM_InterpolationHighLevelObjects.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 #define affiche(NOEUD) cout<<flush;for (int iii=0;iii<DIMENSION;iii++) cout<<NOEUD[iii]<<" "<<flush;
 
 int main (void) 
 {
 #define affiche(NOEUD) cout<<flush;for (int iii=0;iii<DIMENSION;iii++) cout<<NOEUD[iii]<<" "<<flush;
 
 int main (void) 
 {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
 int i;
 
 const int DIMENSION  = 3;
 int i;
 
 const int DIMENSION  = 3;
index 5d8112d8e26189bf27410ff53fa00708d5ced6a1..15264ea1d75630b557076952910e321a95112cc4 100644 (file)
@@ -7,8 +7,15 @@
 
 #include "stdio.h"
 
 
 #include "stdio.h"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 main () {
 main () {
-  
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   const char * fromFileName  = "fromMesh.med";
   const char * toFileName    = "toMesh.med";
   //const char * fieldName     = "fieldcelldoublevector"; 
   const char * fromFileName  = "fromMesh.med";
   const char * toFileName    = "toMesh.med";
   //const char * fieldName     = "fieldcelldoublevector"; 
index ee69b31b92564ffa82476412da44fb16a9710b04..54de77b3aa438b14baa8eab931d5a9e9161512f5 100644 (file)
 
 #include "stdio.h"
 
 
 #include "stdio.h"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 
 // pour gestion timings
 using namespace MEDMEM;
 
 // pour gestion timings
@@ -134,6 +138,9 @@ void Flipback(FIELD<double> * firstField, FIELD<double> * secondField)
 #include "MEDMEM_WrapperCells.hxx"
 
 main () {
 #include "MEDMEM_WrapperCells.hxx"
 
 main () {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   const char * fromFileName   = "ResultatSyrthes.med";
   const char * toFileName     = "MaillageAster.med";
 
   const char * fromFileName   = "ResultatSyrthes.med";
   const char * toFileName     = "MaillageAster.med";
index e7d160346deea2c5049a8c6f6d662ca3070ca66d..02a270b086b2e5ab1816e9642344d61005a1d62a 100644 (file)
@@ -7,11 +7,18 @@
 
 #include "stdio.h"
 
 
 #include "stdio.h"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
-  
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   const char * fromFileName  = "fromMesh.med";
   const char * toFileName    = "toMesh.med";
   //const char * fieldName     = "fieldcelldoublevector"; 
   const char * fromFileName  = "fromMesh.med";
   const char * toFileName    = "toMesh.med";
   //const char * fieldName     = "fieldcelldoublevector"; 
index 4d586a5d72ece5b5f13f18e8fe306114d9ed164c..dccd8fccf07e49c107b59cae42d271f9aeab275b 100644 (file)
 
 #include "stdio.h"
 
 
 #include "stdio.h"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
@@ -35,6 +39,10 @@ double CPUtime()
 #include "MEDMEM_WrapperCells.hxx"
 
 main () {
 #include "MEDMEM_WrapperCells.hxx"
 
 main () {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
 /*
 int taille=100;
 int * liste = new int [taille] ;
 /*
 int taille=100;
 int * liste = new int [taille] ;
index 147bc3d68add47be66bf350b245eda42de221193..85b2df000d99129a7a1d460338e2a85d4c7e962d 100644 (file)
 
 #include "stdio.h"
 
 
 #include "stdio.h"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
-    
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   const char * fromFileName   = "ResultatSyrthes.med";
   const char * toFileName     = "MaillageAster.med";
 //  const char * resultFileName = "ResultatInterpolation.med";
   const char * fromFileName   = "ResultatSyrthes.med";
   const char * toFileName     = "MaillageAster.med";
 //  const char * resultFileName = "ResultatInterpolation.med";
index b66e4c86ee1b80311cfff2ea6387dddf128dd61a..dc0ecbdede979a2097f3e21d11a5d2b88a97864e 100644 (file)
 
 #include "stdio.h"
 
 
 #include "stdio.h"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
 using namespace MEDMEM;
 using namespace MED_EN;
 
 main () {
-    
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   const char * fromFileName   = "ResultatSyrthes.med";
   const char * toFileName     = "MaillageAster.med";
   const char * resultFileName = "ResultatInterpolation.med";
   const char * fromFileName   = "ResultatSyrthes.med";
   const char * toFileName     = "MaillageAster.med";
   const char * resultFileName = "ResultatInterpolation.med";
index 947eb171929c34e6ab0f919e298c53c86dbaad74..0a578bc42e7de83a2273ccbc3729b6f58ea34703 100644 (file)
@@ -43,7 +43,7 @@ LIB_SRC = Med_Gen_i.cxx
 LIB_SERVER_IDL = MED_Gen.idl SALOME_Component.idl \
                 SALOME_Exception.idl MED.idl             
 
 LIB_SERVER_IDL = MED_Gen.idl SALOME_Component.idl \
                 SALOME_Exception.idl MED.idl             
 
-LIB_CLIENT_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_ModuleCatalog.idl SALOME_Comm.idl
+LIB_CLIENT_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_ModuleCatalog.idl SALOME_Comm.idl SALOME_GenericObj.idl
 
 # Executables targets
 BIN = 
 
 # Executables targets
 BIN = 
index db4192d87e09cb5f1742401a80127f74b024ea52..91e9b7cfcd1b60fd4f418367b020d0ce27bcd199 100755 (executable)
@@ -38,7 +38,7 @@
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_Med.hxx"
 #include "MEDMEM_MedMedDriver.hxx"
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_Med.hxx"
 #include "MEDMEM_MedMedDriver.hxx"
-#include "MEDMEM_MedMeshDriver.hxx"
+#include "MEDMEM_MedMeshDriver21.hxx"
 #include "MEDMEM_MedFieldDriver.hxx"
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_DriversDef.hxx"
 #include "MEDMEM_MedFieldDriver.hxx"
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_DriversDef.hxx"
@@ -278,7 +278,7 @@ throw (SALOME::SALOME_Exception)
 
        MESH * myMesh= new MESH() ;
        myMesh->setName(meshName);
 
        MESH * myMesh= new MESH() ;
        myMesh->setName(meshName);
-       MED_MESH_RDONLY_DRIVER myMeshDriver(fileName,myMesh);
+       MED_MESH_RDONLY_DRIVER21 myMeshDriver(fileName,myMesh);
        try
        {
                myMeshDriver.setMeshName(meshName);
        try
        {
                myMeshDriver.setMeshName(meshName);
@@ -847,7 +847,7 @@ char* Med_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject,
       sprintf(aFileName, "%shdf_from_ascii.hdf", aResultPath);
       delete(aResultPath);
     } else aFileName = CORBA::string_dup((aTmpDir + aSaveStudyName + (char*)aLocalPersistentID).ToCString());
       sprintf(aFileName, "%shdf_from_ascii.hdf", aResultPath);
       delete(aResultPath);
     } else aFileName = CORBA::string_dup((aTmpDir + aSaveStudyName + (char*)aLocalPersistentID).ToCString());
-    MED_MESH_RDONLY_DRIVER myMeshDriver(aFileName,myMesh);
+    MED_MESH_RDONLY_DRIVER21 myMeshDriver(aFileName,myMesh);
     try
       {
        myMeshDriver.setMeshName(aMeshName);
     try
       {
        myMeshDriver.setMeshName(aMeshName);
@@ -1054,7 +1054,7 @@ SALOMEDS::SObject_ptr Med_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
   char* aFullMeshName = new char[strlen(aMeshName)+1];
   strcpy(aFullMeshName,aMeshName);
   myMesh->setName(aFullMeshName);
   char* aFullMeshName = new char[strlen(aMeshName)+1];
   strcpy(aFullMeshName,aMeshName);
   myMesh->setName(aFullMeshName);
-  MED_MESH_RDONLY_DRIVER myMeshDriver(aFullName, myMesh);
+  MED_MESH_RDONLY_DRIVER21 myMeshDriver(aFullName, myMesh);
   try {
     myMeshDriver.setMeshName(aFullMeshName);
     myMeshDriver.open();
   try {
     myMeshDriver.setMeshName(aFullMeshName);
     myMeshDriver.open();
diff --git a/src/MEDGUI/MED_icons.po b/src/MEDGUI/MED_icons.po
deleted file mode 100644 (file)
index 2aefa19..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#  MED MEDGUI : MED component GUI implemetation 
-#
-#  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-# 
-#  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. 
-# 
-#  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
-#
-#
-#
-#  File   : MedGUI_icons.po
-#  Module : MED
-
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"POT-Creation-Date: 2001-06-14 09:11:49 PM CEST\n"
-"PO-Revision-Date: YYYY-MM-DD\n"
-"Last-Translator: FULLNAME <EMAIL@ADDRESS>\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-
-<
\ No newline at end of file
diff --git a/src/MEDGUI/MED_images.po b/src/MEDGUI/MED_images.po
new file mode 100644 (file)
index 0000000..0620063
--- /dev/null
@@ -0,0 +1,44 @@
+#  MED MEDGUI : MED component GUI implemetation
+#
+#  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+# 
+#  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. 
+# 
+#  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+#
+#
+#
+#  File   : MedGUI_icons.po
+#  Module : MED
+
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"POT-Creation-Date: 2001-06-14 09:11:49 PM CEST\n"
+"PO-Revision-Date: YYYY-MM-DD\n"
+"Last-Translator: FULLNAME <EMAIL@ADDRESS>\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+
+msgid "ICO_TB_MESHSEL"
+msgstr "Data.png"
+
+msgid "ICO_TB_FIELDSEL"
+msgstr "Infos.png"
+
+msgid "ICO_TB_EXPLORE"
+msgstr "Structure.png"
+
+
index fdf99dfb5a1647db831cd265708cc4d5bd907449..5e94cabbeb3cbbb5df049d64a2ba38f9dfa29081 100644 (file)
@@ -1,4 +1,4 @@
-#  MED MEDGUI : MED component GUI implemetation 
+#  MED MEDGUI : MED component GUI implemetation
 #
 #  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
 #
 #  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
@@ -28,7 +28,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "POT-Creation-Date: 2001-09-21 14:31:28 METDST\n"
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "POT-Creation-Date: 2001-09-21 14:31:28 METDST\n"
-"PO-Revision-Date: YYYY-MM-DD\n"
+"PO-Revision-Date: 2005-06-09 14:38+0400\n"
 "Last-Translator: FULLNAME <EMAIL@ADDRESS>\n"
 "Content-Type: text/plain; charset=iso-8859-1\n"
 
 "Last-Translator: FULLNAME <EMAIL@ADDRESS>\n"
 "Content-Type: text/plain; charset=iso-8859-1\n"
 
@@ -38,6 +38,7 @@ msgid "MedGUI::MED_MEN_ALL_FILES"
 msgstr "All Files ( * )"
 
 #: MedGUI.cxx:167
 msgstr "All Files ( * )"
 
 #: MedGUI.cxx:167
+#, fuzzy
 msgid "MedGUI::MED_MEN_IMPORT"
 msgstr "Import"
 
 msgid "MedGUI::MED_MEN_IMPORT"
 msgstr "Import"
 
@@ -68,3 +69,84 @@ msgstr "Please enter the name of the mesh you want to read"
 #: MedGUI.cxx:297
 msgid "MED_INF_FIELDNAME"
 msgstr "Please enter the name of the field you want to read"
 #: MedGUI.cxx:297
 msgid "MED_INF_FIELDNAME"
 msgstr "Please enter the name of the field you want to read"
+
+
+# Menu items
+
+msgid "TOP_MESHSEL"
+msgstr "Mesh selection"
+
+msgid "MEN_MESHSEL"
+msgstr "Mesh selection"
+
+msgid "STB_MESHSEL"
+msgstr "Read a mesh"
+
+msgid "TOP_FIELDSEL"
+msgstr "Field selection"
+
+msgid "MEN_FIELDSEL"
+msgstr "Field selection"
+
+msgid "STB_FIELDSEL"
+msgstr "Read a field"
+
+msgid "TOP_EXPLORE"
+msgstr "Explore Med File"
+
+msgid "MEN_EXPLORE"
+msgstr "Explore Med File"
+
+msgid "STB_EXPLORE"
+msgstr "Explore Med File"
+
+msgid "TOP_DUMPMESH"
+msgstr "Dump Mesh"
+
+msgid "MEN_DUMPMESH"
+msgstr "Dump Mesh"
+
+msgid "STB_DUMPMESH"
+msgstr "dump Mesh"
+
+msgid "TOP_DUMPSUBMESH"
+msgstr "Dump SubMesh"
+
+msgid "MEN_DUMPSUBMESH"
+msgstr "Dump SubMesh"
+
+msgid "STB_DUMPSUBMESH"
+msgstr "dump Mesh"
+
+msgid "TOP_POPUPTEST"
+msgstr "Popup test"
+
+msgid "MEN_POPUPTEST"
+msgstr "Popup test"
+
+msgid "STB_POPUPTEST"
+msgstr "Popup test"
+
+msgid "TOP_ERASE"
+msgstr "Erase"
+
+msgid "MEN_ERASE"
+msgstr "Erase"
+
+msgid "STB_ERASE"
+msgstr "Erase"
+
+msgid "TOP_DISPLAY"
+msgstr "Display"
+
+msgid "MEN_DISPLAY"
+msgstr "Display"
+
+msgid "STB_DISPLAY"
+msgstr "Display"
+
+
+
+msgid "TB_MED"
+msgstr "Med Toolbar"
+
index d465f0b8ada05fcac4c3609af3291303b9de61d7..747f07c2bbe475d8622eb4b9076e8fd8563ae5d8 100644 (file)
@@ -1,4 +1,4 @@
-#  MED MEDGUI : MED component GUI implemetation 
+#  MED MEDGUI : MED component GUI implemetation
 #
 #  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
 #
 #  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
@@ -17,7 +17,7 @@
 #  License along with this library; if not, write to the Free Software 
 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
 # 
 #  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+#  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
 #
 #
 #
 #
 #
 #
@@ -38,19 +38,19 @@ EXPORT_HEADERS=
 
 # .po files to transform in .qm
 PO_FILES = \
 
 # .po files to transform in .qm
 PO_FILES = \
-           MED_icons.po \
+           MED_images.po \
            MED_msg_fr.po \
            MED_msg_en.po \
 
 
 # Libraries targets
            MED_msg_fr.po \
            MED_msg_en.po \
 
 
 # Libraries targets
-LIB = libMEDGUI.la
-LIB_SRC = MedGUI.cxx  
+LIB = libMED.la
+LIB_SRC = MedGUI.cxx MedGUI_Selection.cxx
 LIB_MOC = MedGUI.h
 
 LIB_MOC = MedGUI.h
 
-LIB_CLIENT_IDL = SALOMEDS.idl SALOME_Exception.idl \
+LIB_CLIENT_IDL = SALOMEDS.idl SALOME_Exception.idl SALOME_Component.idl \
                  MED_Gen.idl  MED.idl \
                  MED_Gen.idl  MED.idl \
-                SALOMEDS_Attributes.idl SALOME_Comm.idl
+                SALOMEDS_Attributes.idl SALOME_Comm.idl SALOME_GenericObj.idl
 #               SMESH_Mesh.idl SMESH_Hypothesis.idl SMESH_BasicHypothesis.idl \
 #               GEOM_Shape.idl SALOMEDS_Attributes.idl
 
 #               SMESH_Mesh.idl SMESH_Hypothesis.idl SMESH_BasicHypothesis.idl \
 #               GEOM_Shape.idl SALOMEDS_Attributes.idl
 
@@ -58,10 +58,10 @@ LIB_SERVER_IDL =
 
 # additionnal information to compil and link file
 
 
 # additionnal information to compil and link file
 
-CPPFLAGS += $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome
-LDFLAGS += -lSalomeGUI -lMEDMEMImpl -lmedmem -lMEDEngine -I${KERNEL_ROOT_DIR}/include/salome
+CPPFLAGS += $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GUI_ROOT_DIR}/include/salome -I${BOOSTDIR}
+LDFLAGS += -lSalomeApp -lMEDMEMImpl -lmedmem -lMEDEngine -I${KERNEL_ROOT_DIR}/include/salome -I${GUI_ROOT_DIR}/include/salome -I${BOOSTDIR}
 
 
-LDFLAGS += -lSalomeGUI -lMEDMEMImpl -lmedmem -lMEDEngine -L${KERNEL_ROOT_DIR}/lib/salome
+LDFLAGS += -lSalomeApp -lMEDMEMImpl -lmedmem -lMEDEngine -L${KERNEL_ROOT_DIR}/lib/salome -L${GUI_ROOT_DIR}/lib/salome
 
 MED.hh MEDSK.cc: MED.idl
        omniidl -bcxx -Wbtp -I$(top_builddir)/idl -I${KERNEL_ROOT_DIR}/idl/salome $^
 
 MED.hh MEDSK.cc: MED.idl
        omniidl -bcxx -Wbtp -I$(top_builddir)/idl -I${KERNEL_ROOT_DIR}/idl/salome $^
index 31b8f64e0f2e231b812cd82de9ea745d1d68e86b..22404a68391d32ce20983ceab354ed2d344773f5 100644 (file)
@@ -1,23 +1,23 @@
-//  MED MEDGUI : MED component GUI implemetation 
+//  MED MEDGUI : MED component GUI implemetation
 //
 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 //
 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-// 
-//  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. 
-// 
-//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  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.
+//
+//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
 //
 //
 //
 //
 //
 //
@@ -32,16 +32,30 @@ using namespace std;
 #include "Utils_SINGLETON.hxx"
 #include "utilities.h"
 
 #include "Utils_SINGLETON.hxx"
 #include "utilities.h"
 
-#include "SALOME_Selection.h"
-#include "SALOME_InteractiveObject.hxx"
-#include "SALOMEGUI_QtCatchCorbaException.hxx"
+#include <SALOME_LifeCycleCORBA.hxx>
+#include <SALOME_InteractiveObject.hxx>
+#include <SALOME_ListIO.hxx>
+#include <SalomeApp_Tools.h>
+
+#include <SUIT_MessageBox.h>
+#include <SUIT_Tools.h>
+#include <SUIT_FileDlg.h>
+#include <SUIT_ResourceMgr.h>
 
 
-#include "QAD_MessageBox.h"
-#include "QAD_Tools.h"
-#include "QAD_FileDlg.h"
+#include <CAM_Application.h>
+#include <SalomeApp_Application.h>
+#include <SalomeApp_DataModel.h>
+#include <SalomeApp_Study.h>
+#include <SalomeApp_SelectionMgr.h>
+#include <SALOMEDSClient_Study.hxx>
+#include <SALOMEDSClient_SObject.hxx>
+
+#include <OB_Browser.h>
 
 //#include "SMESH_TypeFilter.hxx"
 
 
 //#include "SMESH_TypeFilter.hxx"
 
+#include <MedGUI_Selection.h>
+
 // QT Includes
 #include <qinputdialog.h>
 
 // QT Includes
 #include <qinputdialog.h>
 
@@ -58,24 +72,225 @@ static CORBA::ORB_var   _orb;
  *
  */
 //=============================================================================
  *
  */
 //=============================================================================
-MedGUI::MedGUI( const QString& theName, QObject* theParent ) :
-  SALOMEGUI( theName, theParent )
+MedGUI::MedGUI() :
+  SalomeApp_Module( "MED" )
 {}
 
 {}
 
-bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void MedGUI::createPopupItem( const int id,
+                              const QString& clients,
+                              const QString& types,
+                              const QString& theRule,
+                             const int pId )
 {
 {
-  setOrb();
+  int parentId = pId;
+  if( pId!=-1 )
+    parentId = popupMgr()->actionId( action( pId ) );
+
+  if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) )
+    popupMgr()->insert( action( id ), parentId, 0 );
+
+  QChar lc = QtxPopupMgr::Selection::defEquality();
+  QString rule = "(%1)";
+  if( !types.isEmpty() ) 
+    rule += " and (%2) and (%3)";
+
+  rule = rule.arg( QString( "client in {%1}" ).arg( clients ) );
+
+  if( !types.isEmpty() )
+  {
+    rule = rule.arg( QString( "%1>0" ).arg( QtxPopupMgr::Selection::defSelCountParam() ) );
+    rule = rule.arg( QString( "%1type in {%2}" ).arg( lc ).arg( types ) );
+  }
+  rule += theRule;
+  popupMgr()->setRule( action( id ), rule, true );
+}
+
+void MedGUI::createMedAction( const int id, const QString& po_id, const QString& icon_id )
+{
+  QWidget* parent = application()->desktop();
+  SUIT_ResourceMgr* mgr = application()->resourceMgr();
+
+  QPixmap pix; QIconSet icon;
+  if( !icon_id.isEmpty() )
+    pix = mgr->loadPixmap( "MED", tr( icon_id ) );
+  else
+    pix = mgr->loadPixmap( "MED", tr( QString( "ICO_" )+po_id ) );
+  if ( !pix.isNull() )
+    icon = QIconSet( pix );
+
+  createAction( id, tr( "TOP_" + po_id ), icon, tr( "MEN_" + po_id ), tr( "STB_" + po_id ), 0, parent, false, this, SLOT( onGUIEvent() ) );
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void MedGUI::initialize( CAM_Application* app )
+{
+  SalomeApp_Module::initialize( app );
   
   
-  QAD_Study* myActiveStudy   = parent->getActiveStudy();
-  SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
-  SALOME_NamingService* myNameService = parent->getNameService();
+  QWidget* parent = application()->desktop();
+
+  createMedAction( 931, "MESHSEL" );
+  createMedAction( 932, "FIELDSEL" );
+  createMedAction( 933, "EXPLORE" );
+  createMedAction( 934, "DUMPMESH" );
+  createMedAction( 935, "DUMPSUBMESH" );
+  createMedAction( 8031, "POPUPTEST" );
+  createMedAction( 9002, "ERASE" );
+  createMedAction( 903, "DISPLAY" );
+  createMedAction( 4031, "MESHSEL", "ICO_TB_MESHSEL" );
+  createMedAction( 4032, "FIELDSEL", "ICO_TB_FIELDSEL" );
+  createMedAction( 4033, "EXPLORE", "ICO_TB_EXPLORE" );
+
+  int MedId = createMenu( tr( "MED" ), -1, 50, 10 );
+  createMenu( separator(), MedId, 10 );
+  createMenu( 931, MedId, 11 );
+  createMenu( 932, MedId, 11 );
+  createMenu( 933, MedId, 11 );
+  createMenu( 934, MedId, 11 );
+  createMenu( 935, MedId, 11 );
+
+  int medTb = createTool( tr( "TB_MED" ) );
+  createTool( 4031, medTb );
+  createTool( 4032, medTb );
+  createTool( 4033, medTb );
+
+  QString OB = "'ObjectBrowser'",
+          View = QString("'%1'").arg( "VTKViewer" /* SVTK_Viewer::Type()*/ );
+
+  createPopupItem( 8031, View, "", "" );
+  createPopupItem( 9002, OB, "", "" );
+  createPopupItem( 903,  OB, "", "" );
+}
+
+void MedGUI::contextMenuPopup( const QString& client, QPopupMenu* menu, QString& /*title*/ )
+{
+  MedGUI_Selection sel;
+  SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( application() );
+  if( app )
+  {
+    sel.init( client, app->selectionMgr() );
+    popupMgr()->updatePopup( menu, &sel );
+  }
+}
+
+QString MedGUI::engineIOR() const
+{
+  SALOME_MED::MED_Gen_ptr aMedGen = InitMedGen();
+  if ( !CORBA::is_nil( aMedGen) )
+    return QString( getApp()->orb()->object_to_string( aMedGen ));
+  return QString( "" );
+}
+
+void MedGUI::windows( QMap<int, int>& mappa ) const
+{
+  mappa.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::DockLeft );
+  mappa.insert( SalomeApp_Application::WT_PyConsole, Qt::DockBottom );
+}
+
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void MedGUI::onGUIEvent()
+{
+  const QObject* obj = sender();
+  if ( !obj || !obj->inherits( "QAction" ) )
+    return;
+  int id = actionId((QAction*)obj);
+  if ( id != -1 )
+    OnGUIEvent( id );
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void MedGUI::EmitSignalCloseAllDialogs()
+{
+  emit SignalCloseAllDialogs();
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+bool MedGUI::deactivateModule( SUIT_Study* study )
+{
+  setMenuShown( false );
+  setToolShown( false );
+
+  disconnect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
+            this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
+
+  EmitSignalCloseAllDialogs();
+
+  return SalomeApp_Module::deactivateModule( study );
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+bool MedGUI::activateModule( SUIT_Study* study )
+{
+  bool res = SalomeApp_Module::activateModule( study );
+
+  setMenuShown( true );
+  setToolShown( true );
+
+  connect( application()->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
+         this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
+  return res;
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+void MedGUI::onWindowActivated( SUIT_ViewWindow* )
+{
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+bool MedGUI::OnGUIEvent (int theCommandID)
+{
+  setOrb();
+
+  SalomeApp_Study* myActiveStudy = dynamic_cast< SalomeApp_Study* >( application()->activeStudy() );
+  if( !myActiveStudy )
+    return false;
+
+  _PTR(Study) aStudy = myActiveStudy->studyDS();
+  //SALOME_NamingService* myNameService = parent->getNameService();
 
   QString file;
 
   QString file;
-  QStringList filtersList ;    
+  QStringList filtersList ;
 
   filtersList.append( tr("MED_MEN_IMPORT_MED") );
   filtersList.append( tr("MED_MEN_ALL_FILES") ) ;
 
 
   filtersList.append( tr("MED_MEN_IMPORT_MED") );
   filtersList.append( tr("MED_MEN_ALL_FILES") ) ;
 
+  SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( application() );
+  if( !app )
+    return false;
+
   switch (theCommandID)
     {
     case 4031:
   switch (theCommandID)
     {
     case 4031:
@@ -84,15 +299,15 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
       {
        MESSAGE("command " << theCommandID << " activated");
 
       {
        MESSAGE("command " << theCommandID << " activated");
 
-       QString myStudyName = myActiveStudy->getTitle();
+       QString myStudyName = myActiveStudy->studyName();
        bool ok=FALSE;
        bool ok=FALSE;
-       int myStudyId = myActiveStudy->getStudyId();
+       int myStudyId = myActiveStudy->id();
 
        // load MED engine
 
        // load MED engine
-       SALOME_MED::MED_Gen_ptr medgen = InitMedGen(parent);
+       SALOME_MED::MED_Gen_ptr medgen = InitMedGen();
 
        // Selection du Fichier
 
        // Selection du Fichier
-       file = QAD_FileDlg::getFileName(parent,
+       file = SUIT_FileDlg::getFileName(application()->desktop(),
                                        "",
                                        filtersList,
                                        tr("MED_MEN_IMPORT"),
                                        "",
                                        filtersList,
                                        tr("MED_MEN_IMPORT"),
@@ -103,7 +318,7 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
          {
            SCRUTE(file);
            QString meshName;
          {
            SCRUTE(file);
            QString meshName;
-           meshName = QInputDialog::getText( QString( tr("MED_INF_MESHNAME") ), 
+           meshName = QInputDialog::getText( QString( tr("MED_INF_MESHNAME") ),
                                              QString::null,
                                              //VRV: porting on Qt 3.0.5
 #if QT_VERSION >= 0x030005
                                              QString::null,
                                              //VRV: porting on Qt 3.0.5
 #if QT_VERSION >= 0x030005
@@ -116,19 +331,19 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
                  try
                    {
                      medgen->readMeshInFile(file.latin1(),myStudyName,meshName);
                  try
                    {
                      medgen->readMeshInFile(file.latin1(),myStudyName,meshName);
-                     if (myActiveStudy->getStudyDocument()->GetProperties()->IsLocked()) {
-                       QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
-                                              QObject::tr("WRN_WARNING"), 
+                     if (myActiveStudy->studyDS()->GetProperties()->IsLocked()) {
+                       SUIT_MessageBox::warn1 (application()->desktop(),
+                                              QObject::tr("WRN_WARNING"),
                                               QObject::tr("WRN_STUDY_LOCKED"),
                                               QObject::tr("BUT_OK"));
                      }
                    }
                  catch (const SALOME::SALOME_Exception & S_ex)
                    {
                                               QObject::tr("WRN_STUDY_LOCKED"),
                                               QObject::tr("BUT_OK"));
                      }
                    }
                  catch (const SALOME::SALOME_Exception & S_ex)
                    {
-                     QtCatchCorbaException(S_ex);
+                     SalomeApp_Tools::QtCatchCorbaException(S_ex);
                    }
                }
                    }
                }
-               myActiveStudy->updateObjBrowser();
+               updateObjBrowser();
          }
        break;
       }
          }
        break;
       }
@@ -138,15 +353,15 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
       {
        MESSAGE("command " << theCommandID << " activated");
 
       {
        MESSAGE("command " << theCommandID << " activated");
 
-       QString myStudyName = myActiveStudy->getTitle();
+       QString myStudyName = myActiveStudy->studyName();
        bool ok=FALSE;
        bool ok=FALSE;
-       int myStudyId = myActiveStudy->getStudyId();
+       int myStudyId = myActiveStudy->id();
 
        // load MED engine
 
        // load MED engine
-       SALOME_MED::MED_Gen_ptr medgen = InitMedGen(parent);
+       SALOME_MED::MED_Gen_ptr medgen = InitMedGen();
 
        // Selection du Fichier
 
        // Selection du Fichier
-       file = QAD_FileDlg::getFileName(parent,
+       file = SUIT_FileDlg::getFileName(application()->desktop(),
                                        "",
                                        filtersList,
                                        tr("MED_MEN_IMPORT"),
                                        "",
                                        filtersList,
                                        tr("MED_MEN_IMPORT"),
@@ -170,19 +385,18 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
                try
                  {
                    medgen->readFieldInFile(file.latin1(),myStudyName,fieldName,-1,-1);
                try
                  {
                    medgen->readFieldInFile(file.latin1(),myStudyName,fieldName,-1,-1);
-                   if (myActiveStudy->getStudyDocument()->GetProperties()->IsLocked()) {
-                     QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
-                                            QObject::tr("WRN_WARNING"), 
+                   if (myActiveStudy->studyDS()->GetProperties()->IsLocked()) {
+                     SUIT_MessageBox::warn1 (application()->desktop(),
+                                            QObject::tr("WRN_WARNING"),
                                             QObject::tr("WRN_STUDY_LOCKED"),
                                             QObject::tr("BUT_OK"));
                    }
                  }
                catch (const SALOME::SALOME_Exception & S_ex)
                  {
                                             QObject::tr("WRN_STUDY_LOCKED"),
                                             QObject::tr("BUT_OK"));
                    }
                  }
                catch (const SALOME::SALOME_Exception & S_ex)
                  {
-                   QtCatchCorbaException(S_ex);
+                   SalomeApp_Tools::QtCatchCorbaException(S_ex);
                  }
                  }
-
-               myActiveStudy->updateObjBrowser();
+               updateObjBrowser ();
              }
          }
        break;
              }
          }
        break;
@@ -192,14 +406,14 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
       {
        MESSAGE("command " << theCommandID << " activated");
 
       {
        MESSAGE("command " << theCommandID << " activated");
 
-       QString myStudyName = myActiveStudy->getTitle();
-       int myStudyId = myActiveStudy->getStudyId();
+       QString myStudyName = myActiveStudy->studyName();
+       int myStudyId = myActiveStudy->id();
 
        // load MED engine
 
        // load MED engine
-       SALOME_MED::MED_Gen_ptr medgen = InitMedGen(parent);
+       SALOME_MED::MED_Gen_ptr medgen = InitMedGen();
 
        // Selection du Fichier
 
        // Selection du Fichier
-       file = QAD_FileDlg::getFileName(parent,
+       file = SUIT_FileDlg::getFileName(application()->desktop(),
                                        "",
                                        filtersList,
                                        tr("MED_MEN_IMPORT"),
                                        "",
                                        filtersList,
                                        tr("MED_MEN_IMPORT"),
@@ -211,8 +425,17 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
              {
 //             medgen->readStructFile(file.latin1(),myStudyName);
                medgen->readStructFileWithFieldType(file.latin1(),myStudyName);
              {
 //             medgen->readStructFile(file.latin1(),myStudyName);
                medgen->readStructFileWithFieldType(file.latin1(),myStudyName);
-               if (myActiveStudy->getStudyDocument()->GetProperties()->IsLocked()) {
-                 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
+
+
+               MESSAGE("Ouais on est la !!!!");
+
+               if (myActiveStudy->studyDS()->GetProperties()->IsLocked()) {
+
+
+               MESSAGE("Ouais on est la 1 !!!!");
+
+
+                 SUIT_MessageBox::warn1 (application()->desktop(),
                                         QObject::tr("WRN_WARNING"), 
                                         QObject::tr("WRN_STUDY_LOCKED"),
                                         QObject::tr("BUT_OK"));
                                         QObject::tr("WRN_WARNING"), 
                                         QObject::tr("WRN_STUDY_LOCKED"),
                                         QObject::tr("BUT_OK"));
@@ -220,36 +443,47 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
              }
            catch (const SALOME::SALOME_Exception & S_ex)
              {
              }
            catch (const SALOME::SALOME_Exception & S_ex)
              {
-               QtCatchCorbaException(S_ex);
+
+               MESSAGE("Ouais on est la 2 !!!!");
+
+               SalomeApp_Tools::QtCatchCorbaException(S_ex);
              }
              }
-           myActiveStudy->updateObjBrowser();
+
+           MESSAGE("Ouais on est la 3 !!!!");
+
+           updateObjBrowser ();
          }
        break;
       }
          }
        break;
       }
-      
+
     case 934:
       {
        //Handle(SMESH_TypeFilter) aMeshFilter = new SMESH_TypeFilter( MESH );
     case 934:
       {
        //Handle(SMESH_TypeFilter) aMeshFilter = new SMESH_TypeFilter( MESH );
-       SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
+
+       SALOME_ListIO list;
+       SalomeApp_Application* app = getApp();
+       SalomeApp_SelectionMgr* mgr = app ? app->selectionMgr() : NULL;
+       if( mgr )
+         mgr->selectedObjects( list );
        //Sel->AddFilter(aMeshFilter) ;
        //Sel->AddFilter(aMeshFilter) ;
-       
-       int nbSel = Sel->IObjectCount();
-       if ( nbSel == 1 ) 
+
+       int nbSel = list.Extent();
+       if ( nbSel == 1 )
          {
            //      SMESH::SMESH_Mesh_var aM;
            SALOME_MED::MESH_var aMesh;
          {
            //      SMESH::SMESH_Mesh_var aM;
            SALOME_MED::MESH_var aMesh;
-           Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
-           if ( IObject->hasEntry() ) 
+           Handle(SALOME_InteractiveObject) IObject = list.First();
+           if ( IObject->hasEntry() )
              {
              {
-               SALOMEDS::SObject_var aMorSM = aStudy->FindObjectID( IObject->getEntry() );
-               if ( !aMorSM->_is_nil() ) 
+               _PTR(SObject) aMorSM = aStudy->FindObjectID( IObject->getEntry() );
+               if ( aMorSM )
                  {
                  {
-                   SALOMEDS::GenericAttribute_var anAttr;
-                   SALOMEDS::AttributeIOR_var     anIOR;
-                   if (aMorSM->FindAttribute(anAttr, "AttributeIOR")) 
+                   _PTR(GenericAttribute) anAttr;
+                   _PTR(AttributeIOR)     anIOR;
+                   if (aMorSM->FindAttribute(anAttr, "AttributeIOR"))
                      {
                      {
-                       anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
-                       aMesh = SALOME_MED::MESH::_narrow( _orb->string_to_object(anIOR->Value()) );
+                       anIOR = anAttr;
+                       aMesh = SALOME_MED::MESH::_narrow( _orb->string_to_object(anIOR->Value().c_str()) );
                        if ( aMesh->_is_nil() )
                          {
                            //                              aM = SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->Value()));
                        if ( aMesh->_is_nil() )
                          {
                            //                              aM = SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->Value()));
@@ -265,8 +499,8 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
                            //                              aMesh = aM->GetMEDMesh();
                            if ( aMesh->_is_nil() )
                              {
                            //                              aMesh = aM->GetMEDMesh();
                            if ( aMesh->_is_nil() )
                              {
-                               QAD_MessageBox::warn1
-                                 ( QAD_Application::getDesktop(),
+                               SUIT_MessageBox::warn1
+                                 ( application()->desktop(),
                                    tr ("MED_WRN_WARNING"),
                                    tr ("MED_INF_NOTIMPL"),
                                    tr ("MED_BUT_OK") );
                                    tr ("MED_WRN_WARNING"),
                                    tr ("MED_INF_NOTIMPL"),
                                    tr ("MED_BUT_OK") );
@@ -278,8 +512,8 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
                      }
                    else
                      {
                      }
                    else
                      {
-                       QAD_MessageBox::warn1
-                         ( QAD_Application::getDesktop(),
+                       SUIT_MessageBox::warn1
+                         ( application()->desktop(),
                            tr ("MED_WRN_WARNING"),
                            tr ("MED_INF_NOIOR"),
                            tr ("MED_BUT_OK") );
                            tr ("MED_WRN_WARNING"),
                            tr ("MED_INF_NOIOR"),
                            tr ("MED_BUT_OK") );
@@ -287,32 +521,38 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
                      }
                  }
              }
                      }
                  }
              }
-         } 
+         }
        break;
       }
 
     case 935:
       {
        //Handle(SMESH_TypeFilter) aSubMeshFilter = new SMESH_TypeFilter( SUBMESH );
        break;
       }
 
     case 935:
       {
        //Handle(SMESH_TypeFilter) aSubMeshFilter = new SMESH_TypeFilter( SUBMESH );
-       SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
+
+       SALOME_ListIO list;
+       SalomeApp_Application* app = getApp();
+       SalomeApp_SelectionMgr* mgr = app ? app->selectionMgr() : NULL;
+       if( mgr )
+         mgr->selectedObjects( list );
+
        //Sel->AddFilter(aSubMeshFilter) ;
        //Sel->AddFilter(aSubMeshFilter) ;
-       
-       int nbSel = Sel->IObjectCount();
-       if ( nbSel == 1 ) 
+
+       int nbSel = list.Extent();
+       if ( nbSel == 1 )
          {
            //      SMESH::SMESH_subMesh_var aSubM;
            SALOME_MED::FAMILY_var aFam;
          {
            //      SMESH::SMESH_subMesh_var aSubM;
            SALOME_MED::FAMILY_var aFam;
-           Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject();
-           if ( IObject->hasEntry() ) 
+           Handle(SALOME_InteractiveObject) IObject = list.First();
+           if ( IObject->hasEntry() )
              {
              {
-               SALOMEDS::SObject_var aMorSM = aStudy->FindObjectID( IObject->getEntry() );
-               if ( !aMorSM->_is_nil() ) 
+               _PTR(SObject) aMorSM = aStudy->FindObjectID( IObject->getEntry() );
+               if ( aMorSM )
                  {
                  {
-                   SALOMEDS::GenericAttribute_var anAttr;
-                   SALOMEDS::AttributeIOR_var     anIOR;
-                   if (aMorSM->FindAttribute(anAttr, "AttributeIOR")) 
+                   _PTR(GenericAttribute) anAttr;
+                   _PTR(AttributeIOR)     anIOR;
+                   if (aMorSM->FindAttribute(anAttr, "AttributeIOR"))
                      {
                      {
-                       anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
+                       anIOR = anAttr;
                        //                      aSubM = SMESH::SMESH_subMesh::_narrow( _orb->string_to_object(anIOR->Value()) );
                        //                      if ( aSubM->_is_nil() )
                        //                        {
                        //                      aSubM = SMESH::SMESH_subMesh::_narrow( _orb->string_to_object(anIOR->Value()) );
                        //                      if ( aSubM->_is_nil() )
                        //                        {
@@ -336,8 +576,8 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
                      }
                    else
                      {
                      }
                    else
                      {
-                       QAD_MessageBox::warn1
-                         ( QAD_Application::getDesktop(),
+                       SUIT_MessageBox::warn1
+                         ( application()->desktop(),
                            tr ("MED_WRN_WARNING"),
                            tr ("MED_INFNOIOR"),
                            tr ("MED_BUT_OK") );
                            tr ("MED_WRN_WARNING"),
                            tr ("MED_INFNOIOR"),
                            tr ("MED_BUT_OK") );
@@ -359,21 +599,19 @@ bool MedGUI::OnGUIEvent (int theCommandID, QAD_Desktop* parent)
  */
 //=============================================================================
 bool MedGUI::OnMousePress (QMouseEvent* pe ,
  */
 //=============================================================================
 bool MedGUI::OnMousePress (QMouseEvent* pe ,
-                          QAD_Desktop* parent, 
-                          QAD_StudyFrame* studyFrame)
+                          SUIT_ViewWindow* wnd )
 {
   MESSAGE("MedGUI::OnMousePress");
   return true;
 }
 {
   MESSAGE("MedGUI::OnMousePress");
   return true;
 }
+
 //=============================================================================
 /*!
  *
  */
 //=============================================================================
 bool MedGUI::OnMouseMove (QMouseEvent* pe ,
 //=============================================================================
 /*!
  *
  */
 //=============================================================================
 bool MedGUI::OnMouseMove (QMouseEvent* pe ,
-                         QAD_Desktop* parent, 
-                         QAD_StudyFrame* studyFrame)
+                         SUIT_ViewWindow* wnd )
 {
   //   MESSAGE("MedGUI::OnMouseMouve");
   return true;
 {
   //   MESSAGE("MedGUI::OnMouseMouve");
   return true;
@@ -385,8 +623,7 @@ bool MedGUI::OnMouseMove (QMouseEvent* pe ,
  */
 //=============================================================================
 bool MedGUI::OnKeyPress (QKeyEvent* pe,
  */
 //=============================================================================
 bool MedGUI::OnKeyPress (QKeyEvent* pe,
-                        QAD_Desktop* parent,
-                        QAD_StudyFrame* studyFrame)
+                        SUIT_ViewWindow* wnd)
 {
   MESSAGE("MedGUI::OnKeyPress");
   return true;
 {
   MESSAGE("MedGUI::OnKeyPress");
   return true;
@@ -397,19 +634,18 @@ bool MedGUI::OnKeyPress (QKeyEvent* pe,
  *
  */
 //=============================================================================
  *
  */
 //=============================================================================
-bool MedGUI::SetSettings (QAD_Desktop* parent)
+/*bool MedGUI::SetSettings ()
 {
   MESSAGE("MedGUI::SetSettings");
   return true;
 {
   MESSAGE("MedGUI::SetSettings");
   return true;
-}
+}*/
 
 //=============================================================================
 /*!
  *
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *
  */
 //=============================================================================
-bool MedGUI::CustomPopup ( QAD_Desktop* parent,
-                          QPopupMenu* popup,
+/*bool MedGUI::CustomPopup ( QPopupMenu* popup,
                           const QString & theContext,
                           const QString & theParent,
                           const QString & theObject )
                           const QString & theContext,
                           const QString & theParent,
                           const QString & theObject )
@@ -417,29 +653,29 @@ bool MedGUI::CustomPopup ( QAD_Desktop* parent,
   MESSAGE("MedGUI::CustomPopup");
   popup->clear();
   return true;
   MESSAGE("MedGUI::CustomPopup");
   popup->clear();
   return true;
-}
+}*/
 
 //=============================================================================
 /*!
  *
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *
  */
 //=============================================================================
-bool MedGUI::ActiveStudyChanged( QAD_Desktop* parent )
+/*bool MedGUI::ActiveStudyChanged()
 {
   return true;
 {
   return true;
-}
+}*/
 
 //=============================================================================
 /*!
  *
  */
 //=============================================================================
 
 //=============================================================================
 /*!
  *
  */
 //=============================================================================
-void MedGUI::DefinePopup( QString & theContext, QString & theParent, QString & theObject )
+/*void MedGUI::DefinePopup( QString & theContext, QString & theParent, QString & theObject )
 {
   theObject = "";
   theContext = "";
 }
 {
   theObject = "";
   theContext = "";
 }
-
+*/
 //=============================================================================
 /*!
  *
 //=============================================================================
 /*!
  *
@@ -447,7 +683,7 @@ void MedGUI::DefinePopup( QString & theContext, QString & theParent, QString & t
 //=============================================================================
 bool MedGUI::DumpMesh( SALOME_MED::MESH_var MEDMesh)
 {
 //=============================================================================
 bool MedGUI::DumpMesh( SALOME_MED::MESH_var MEDMesh)
 {
-  
+
   if ( MEDMesh->_is_nil() )
     {
       return false;
   if ( MEDMesh->_is_nil() )
     {
       return false;
@@ -470,13 +706,13 @@ bool MedGUI::DumpMesh( SALOME_MED::MESH_var MEDMesh)
   while (lu < k ) {
     if (dim2==3)
       {
   while (lu < k ) {
     if (dim2==3)
       {
-       MESSAGE ( " Coordinates  X = " << coords[i] << " Y = " << coords[i+1] << " Z = " << coords[i+2] ); 
+       MESSAGE ( " Coordinates  X = " << coords[i] << " Y = " << coords[i+1] << " Z = " << coords[i+2] );
        i = i + 3; // Only for triangles
       }
     else
       {
        i = i + 3; // Only for triangles
       }
     else
       {
-       MESSAGE ( " Coordinates  X = " << coords[i] << " Y = " << coords[i+1] ); 
-       i = i + 2; 
+       MESSAGE ( " Coordinates  X = " << coords[i] << " Y = " << coords[i+1] );
+       i = i + 2;
       }
     lu=lu+1;
   }
       }
     lu=lu+1;
   }
@@ -484,7 +720,7 @@ bool MedGUI::DumpMesh( SALOME_MED::MESH_var MEDMesh)
   int nbfam=MEDMesh->getNumberOfFamilies(SALOME_MED::MED_NODE);
   SCRUTE(nbfam);
   SALOME_MED::Family_array_var Families=MEDMesh->getFamilies(SALOME_MED::MED_NODE) ;
   int nbfam=MEDMesh->getNumberOfFamilies(SALOME_MED::MED_NODE);
   SCRUTE(nbfam);
   SALOME_MED::Family_array_var Families=MEDMesh->getFamilies(SALOME_MED::MED_NODE) ;
-  
+
   for (k=0;  k < nbfam; k++) {
     SCRUTE(k);
     string nomFam=Families[k]->getName();
   for (k=0;  k < nbfam; k++) {
     SCRUTE(k);
     string nomFam=Families[k]->getName();
@@ -495,9 +731,9 @@ bool MedGUI::DumpMesh( SALOME_MED::MESH_var MEDMesh)
     SCRUTE(nbelemnts);
     SALOME_MED::long_array_var tabnoeuds=Families[k]->getNumber(SALOME_MED::MED_NONE);
     for (int l=0;l<tabnoeuds->length();l++)
     SCRUTE(nbelemnts);
     SALOME_MED::long_array_var tabnoeuds=Families[k]->getNumber(SALOME_MED::MED_NONE);
     for (int l=0;l<tabnoeuds->length();l++)
-      SCRUTE(tabnoeuds[l]); 
+      SCRUTE(tabnoeuds[l]);
   }
   }
-   
+
   //     int famIdent = 1;
   //     SALOME_MED::FAMILY_ptr Family=MEDMesh->getFamily(SALOME_MED::MED_NODE,1) ;
   //     MESSAGE("ici");
   //     int famIdent = 1;
   //     SALOME_MED::FAMILY_ptr Family=MEDMesh->getFamily(SALOME_MED::MED_NODE,1) ;
   //     MESSAGE("ici");
@@ -507,7 +743,7 @@ bool MedGUI::DumpMesh( SALOME_MED::MESH_var MEDMesh)
   //     SCRUTE(identfam);
   //     SALOME_MED::long_array_var tabnoeuds=Family->getNumber(SALOME_MED::MED_NONE);
   //     for (int l=0;l<tabnoeuds->length();l++)
   //     SCRUTE(identfam);
   //     SALOME_MED::long_array_var tabnoeuds=Family->getNumber(SALOME_MED::MED_NONE);
   //     for (int l=0;l<tabnoeuds->length();l++)
-  //       SCRUTE(tabnoeuds[l]); 
+  //       SCRUTE(tabnoeuds[l]);
 
   return true;
 }
 
   return true;
 }
@@ -528,7 +764,7 @@ bool MedGUI::DumpMesh( SALOME_MED::MESH_var MEDMesh)
 
 //    SALOME_MED::long_array_var tabnoeuds=Fam->getNumber(SALOME_MED::MED_NONE);
 //    for (int l=0;l<tabnoeuds->length();l++)
 
 //    SALOME_MED::long_array_var tabnoeuds=Fam->getNumber(SALOME_MED::MED_NONE);
 //    for (int l=0;l<tabnoeuds->length();l++)
-//      SCRUTE(tabnoeuds[l]); 
+//      SCRUTE(tabnoeuds[l]);
 
 //    return true;
 //  }
 
 //    return true;
 //  }
@@ -555,10 +791,12 @@ bool MedGUI::DumpSubMesh( SALOME_MED::FAMILY_var Fam )
  *
  */
 //=============================================================================
  *
  */
 //=============================================================================
-SALOME_MED::MED_Gen_ptr MedGUI::InitMedGen(QAD_Desktop* parent)
+SALOME_MED::MED_Gen_ptr MedGUI::InitMedGen() const
 {
 {
-  Engines::Component_var comp = 
-    parent->getEngine("FactoryServer", "MED");
+  SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( application() );
+  Engines::Component_var comp =
+    SALOME_LifeCycleCORBA(app->namingService()).FindOrLoad_Component( "FactoryServer", "MED" );
+
   MESSAGE("_________________________________________");
   SALOME_MED::MED_Gen_var clr = SALOME_MED::MED_Gen::_narrow(comp);
   ASSERT(!CORBA::is_nil(clr));
   MESSAGE("_________________________________________");
   SALOME_MED::MED_Gen_var clr = SALOME_MED::MED_Gen::_narrow(comp);
   ASSERT(!CORBA::is_nil(clr));
@@ -583,10 +821,8 @@ void MedGUI::setOrb()
   ASSERT(! CORBA::is_nil(_orb));
 }
 
   ASSERT(! CORBA::is_nil(_orb));
 }
 
-static MedGUI aGUI("");
-extern "C"
-{
-  Standard_EXPORT SALOMEGUI* GetComponentGUI() {
-    return &aGUI;
+extern "C" {
+  Standard_EXPORT CAM_Module* createModule() {
+    return new MedGUI();
   }
 }
   }
 }
index e102779c9714b49bdb28b581f1f082aba05bad26..c6c3fabe264db0e8498ab0443b533e9e87af7db6 100644 (file)
@@ -1,4 +1,4 @@
-//  MED MEDGUI : MED component GUI implemetation 
+//  MED MEDGUI : MED component GUI implemetation
 //
 //  Copyright (C) 2003  CEA/DEN, EDF R&D
 //
 //
 //  Copyright (C) 2003  CEA/DEN, EDF R&D
 //
 #ifndef _MEDGUI_H_
 #define _MEDGUI_H_
 
 #ifndef _MEDGUI_H_
 #define _MEDGUI_H_
 
-#include "SALOMEGUI.h"
-#include "QAD_Desktop.h"
-#include "QAD_StudyFrame.h"
+#include <SalomeApp_Module.h>
+#include <SUIT_Desktop.h>
 
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(MED_Gen)
 //#include CORBA_CLIENT_HEADER(SMESH_Mesh)
 #include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
 
 
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(MED_Gen)
 //#include CORBA_CLIENT_HEADER(SMESH_Mesh)
 #include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
 
-class MedGUI: public SALOMEGUI
+class MedGUI: public SalomeApp_Module
 {
   Q_OBJECT
 
 public:
 {
   Q_OBJECT
 
 public:
-  MedGUI( const QString& name = "", QObject* parent = 0 );
+  MedGUI();
 
 
-  virtual bool OnGUIEvent        (int theCommandID, QAD_Desktop* parent);
-  virtual bool OnKeyPress        (QKeyEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame);
-  virtual bool OnMousePress      (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame);
-  virtual bool OnMouseMove       (QMouseEvent* pe, QAD_Desktop* parent, QAD_StudyFrame* studyFrame);
-  virtual bool SetSettings       ( QAD_Desktop* parent );
-  virtual bool CustomPopup       ( QAD_Desktop* parent, QPopupMenu* popup, const QString & theContext,
-                                   const QString & theParent, const QString & theObject );
-  virtual void DefinePopup       ( QString & theContext, QString & theParent, QString & theObject );
-  virtual bool ActiveStudyChanged( QAD_Desktop* parent );
+  virtual void initialize        ( CAM_Application* );
+  virtual QString                engineIOR() const;
+  virtual void windows( QMap<int, int>& mappa ) const;
+  virtual bool OnGUIEvent        (int theCommandID);
+  virtual bool OnKeyPress        (QKeyEvent* pe, SUIT_ViewWindow* );
+  virtual bool OnMousePress      (QMouseEvent* pe, SUIT_ViewWindow* );
+  virtual bool OnMouseMove       (QMouseEvent* pe, SUIT_ViewWindow* );
 
 
-  static SALOME_MED::MED_Gen_ptr InitMedGen(QAD_Desktop* parent);
+  void createMedAction( const int, const QString&, const QString& = "" );
+  void createPopupItem( const int, const QString&, const QString&, const QString& = "", const int = -1 );
+
+  virtual void contextMenuPopup( const QString&, QPopupMenu*, QString& );
+
+  //virtual bool SetSettings       ();
+  //virtual bool CustomPopup       ( QAD_Desktop* parent, QPopupMenu* popup, const QString & theContext,
+  //                                 const QString & theParent, const QString & theObject );
+  //virtual void DefinePopup       ( QString & theContext, QString & theParent, QString & theObject );
+  //virtual bool ActiveStudyChanged( QAD_Desktop* parent );
+
+  /*static*/ SALOME_MED::MED_Gen_ptr InitMedGen() const;
 
   static bool DumpMesh( SALOME_MED::MESH_var aMesh );
   //  static bool DumpSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh ) ;
 
   static bool DumpMesh( SALOME_MED::MESH_var aMesh );
   //  static bool DumpSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh ) ;
@@ -44,9 +52,19 @@ public:
 
   static void setOrb();
 
 
   static void setOrb();
 
-protected:
+  void EmitSignalCloseAllDialogs();
 
 
-private:
+signals :
+  void                        SignalCloseAllDialogs();
+
+public slots:
+  virtual bool                deactivateModule( SUIT_Study* );
+  virtual bool                activateModule( SUIT_Study* );
+
+protected:
+private slots:
+  void onGUIEvent();
+  void onWindowActivated( SUIT_ViewWindow* );
 
 };
 
 
 };
 
diff --git a/src/MEDGUI/MedGUI_Selection.cxx b/src/MEDGUI/MedGUI_Selection.cxx
new file mode 100644 (file)
index 0000000..d5c3b3e
--- /dev/null
@@ -0,0 +1,20 @@
+
+#include "MedGUI_Selection.h"
+
+//=======================================================================
+//function : MedGUI_Selection
+//purpose  : 
+//=======================================================================
+MedGUI_Selection::MedGUI_Selection()
+: SalomeApp_Selection()
+{
+}
+
+//=======================================================================
+//function : ~MedGUI_Selection
+//purpose  : 
+//=======================================================================
+MedGUI_Selection::~MedGUI_Selection()
+{
+}
+
diff --git a/src/MEDGUI/MedGUI_Selection.h b/src/MEDGUI/MedGUI_Selection.h
new file mode 100644 (file)
index 0000000..39702a9
--- /dev/null
@@ -0,0 +1,41 @@
+//  MED MEDGUI_Selection
+//
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  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.
+//
+//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+//
+//
+//
+//  File   : MEDGUI_Selection.h
+//  Author : Alexander SOLOVYOV
+//  Module : MED
+//  $Header$
+
+#ifndef MEDGUI_SELECTION_HeaderFile
+#define MEDGUI_SELECTION_HeaderFile
+
+#include "SalomeApp_Selection.h"
+
+class MedGUI_Selection : public SalomeApp_Selection
+{
+public:
+  MedGUI_Selection();
+  virtual ~MedGUI_Selection();
+};
+
+#endif
index 69d379cdba5cdeb61179af256a0a86156f277f51..7dad7b3b5dd64484b5c311d937a746b8586e3c4e 100644 (file)
@@ -106,9 +106,9 @@ public :
 
 
 template <class T> inline MEDARRAY<T>::MEDARRAY():
 
 
 template <class T> inline MEDARRAY<T>::MEDARRAY():
-                       _ldValues(0), _lengthValues(0), _mode(MED_FULL_INTERLACE),
-                       _valuesFull(), _valuesNo(),
-                       _valuesDefault(), _valuesOther()
+  _ldValues(0), _lengthValues(0), _mode(MED_EN::MED_FULL_INTERLACE),
+  _valuesFull(), _valuesNo(),
+  _valuesDefault(), _valuesOther()
 {
 };
 
 {
 };
 
@@ -441,9 +441,6 @@ template <class T> const T* MEDARRAY<T>::get(const MED_EN::medModeSwitch mode)
                                
 template <class T> const T* MEDARRAY<T>::getRow(const int i)
 {
                                
 template <class T> const T* MEDARRAY<T>::getRow(const int i)
 {
-
-  BEGIN_OF("MEDARRAY<T>::getRow(const int i)");
-
   if ((T*)_valuesDefault == NULL)
   {
        throw MEDEXCEPTION("MEDARRAY::getRow(i) : No values defined !");
   if ((T*)_valuesDefault == NULL)
   {
        throw MEDEXCEPTION("MEDARRAY::getRow(i) : No values defined !");
@@ -459,7 +456,6 @@ template <class T> const T* MEDARRAY<T>::getRow(const int i)
 
   if ((T*)_valuesFull == NULL)
   {
 
   if ((T*)_valuesFull == NULL)
   {
-       ASSERT(((T*) _valuesDefault)==((T*) _valuesNo));
        calculateOther();
   }
   ASSERT((T*)_valuesFull != NULL);
        calculateOther();
   }
   ASSERT((T*)_valuesFull != NULL);
@@ -468,7 +464,6 @@ template <class T> const T* MEDARRAY<T>::getRow(const int i)
   //const T* ptr = (const T*)_valuesFull + (i-1)*_ldValues;
   const T* ptr =  (T*) _valuesFull + (i-1)*_ldValues;
 
   //const T* ptr = (const T*)_valuesFull + (i-1)*_ldValues;
   const T* ptr =  (T*) _valuesFull + (i-1)*_ldValues;
 
-  END_OF("MEDARRAY<T>::getRow(const int i )");
   return ptr;
 }
 //                             ------------------
   return ptr;
 }
 //                             ------------------
@@ -481,7 +476,6 @@ template <class T> const T* MEDARRAY<T>::getRow(const int i)
 
 template <class T> const T* MEDARRAY<T>::getColumn(const int j)
 {
 
 template <class T> const T* MEDARRAY<T>::getColumn(const int j)
 {
-  BEGIN_OF("MEDARRAY<T>::getColumn(const int j)");
   if ((T*)_valuesDefault == NULL)
   {
        throw MEDEXCEPTION("MEDARRAY::getColumn(j) : No values defined !");
   if ((T*)_valuesDefault == NULL)
   {
        throw MEDEXCEPTION("MEDARRAY::getColumn(j) : No values defined !");
@@ -553,8 +547,6 @@ template <class T> const T MEDARRAY<T>::getIJ(const int i,const  int j) const
                                    (internal use : needed by write method) */
 template <class T> inline MED_EN::medModeSwitch MEDARRAY<T>::getMode() const
 {
                                    (internal use : needed by write method) */
 template <class T> inline MED_EN::medModeSwitch MEDARRAY<T>::getMode() const
 {
-  BEGIN_OF("MEDARRAY<T>::getMode()");
-  END_OF("MEDARRAY<T>::getMode()");
   return _mode;
 }
 
   return _mode;
 }
 
diff --git a/src/MEDMEM/MEDMEM_AsciiFieldDriver.hxx b/src/MEDMEM/MEDMEM_AsciiFieldDriver.hxx
new file mode 100644 (file)
index 0000000..5b9947f
--- /dev/null
@@ -0,0 +1,417 @@
+#ifndef ASCII_FIELD_DRIVER_HXX
+#define ASCII_FIELD_DRIVER_HXX
+
+#include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_Support.hxx"
+#include "MEDMEM_GenDriver.hxx"
+#include "MEDMEM_Exception.hxx"
+#include "MEDMEM_Unit.hxx"
+
+#include <list>
+#include <string>
+#include <ctype.h>
+#include <iomanip>
+#include <stdlib.h>
+#include <string.h>
+#include <fstream.h>
+
+#define PRECISION_IN_ASCII_FILE 10
+#define PRECISION_IN_COMPARE 1e-10
+#define SPACE_BETWEEN_NBS 19
+
+namespace MEDMEM {
+
+  template<class T>
+  class FIELD;
+
+  template<int N,unsigned int CODE>
+  void fill(double *a, const double *b)
+  {
+    a[N]=b[CODE & 0x3 ];
+    fill<N-1, (CODE>>2) >(a,b);
+  }
+
+  template<int N>
+  bool compare(const double* a, const double* b)
+  {
+    double sign=b[N]<0 ? -1 : 1;
+    if(a[N]<b[N]*(1-sign*PRECISION_IN_COMPARE))
+      return true;
+    if(a[N]>b[N]*(1+sign*PRECISION_IN_COMPARE))
+      return false;
+    return compare<N-1>(a,b);
+  }
+
+  template<>
+  void fill<-1,0x3>(double *a, const double *b);
+
+  template<>
+  bool compare<-1>(const double *a, const double *b);
+
+  template <class T, int SPACEDIMENSION, unsigned int SORTSTRATEGY> 
+  class SDForSorting
+  {
+  private:
+    double _coords[SPACEDIMENSION];
+    T *_components;
+    int _nbComponents;
+  public:
+    SDForSorting(const double *coords, const T* comp, int nbComponents);
+    SDForSorting(const SDForSorting& other);
+    ~SDForSorting();
+    bool operator< (const SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>& other) const;
+    void writeLine(ofstream& file) const;
+  };
+
+  template <class T>
+  class ASCII_FIELD_DRIVER : public GENDRIVER
+  {
+  private:
+    MESH          *_mesh;
+    SUPPORT       *_support;
+    mutable FIELD<T> *     _ptrField;
+    std::string         _fileName;
+    mutable ofstream            _file;
+    unsigned int        _code;
+    MED_EN::med_sort_direc _direc;
+    int                         _nbComponents;
+    int                         _spaceDimension;
+    //static int           _nbComponentsForCpyInfo;
+  public:
+    ASCII_FIELD_DRIVER(const string & fileName, FIELD<T> * ptrField, 
+                      MED_EN::med_sort_direc direction=MED_EN::ASCENDING,
+                      const char *priority="");
+    ASCII_FIELD_DRIVER(const ASCII_FIELD_DRIVER<T>& other);
+    void open() throw (MEDEXCEPTION);
+    void close();
+    void read ( void ) throw (MEDEXCEPTION);
+    void write( void ) const throw (MEDEXCEPTION);
+    GENDRIVER* copy() const;
+  private:
+    void buildIntroduction() const;
+    template<int SPACEDIMENSION, unsigned int SORTSTRATEGY>
+    void sortAndWrite() const;
+    //template<int SPACEDIMENSION, unsigned int SORTSTRATEGY>//, std::list< SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY > > >
+    //static void copyInfo(const double *a,T *b);
+    //static void copyInfo2(const double *,T *);
+  };
+}
+
+#include "MEDMEM_Field.hxx"
+
+namespace MEDMEM {
+
+  template <class T, int SPACEDIMENSION, unsigned int SORTSTRATEGY>
+  SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>::SDForSorting(const double *coords, const T* comp, int nbComponents):_nbComponents(nbComponents)
+  {
+    fill<SPACEDIMENSION-1,SORTSTRATEGY>(_coords,coords);
+    _components=new T[_nbComponents];
+    memcpy(_components,comp,sizeof(T)*_nbComponents);
+  }
+
+  template <class T, int SPACEDIMENSION, unsigned int SORTSTRATEGY>
+  SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>::SDForSorting(const SDForSorting& other):_nbComponents(other._nbComponents)
+  {
+    memcpy(_coords,other._coords,sizeof(double)*SPACEDIMENSION);
+    _components=new T[_nbComponents];
+    memcpy(_components,other._components,sizeof(T)*_nbComponents);
+  }
+
+  template <class T, int SPACEDIMENSION, unsigned int SORTSTRATEGY>
+  SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>::~SDForSorting()
+  {
+    delete [] _components;
+  }
+
+  template <class T, int SPACEDIMENSION, unsigned int SORTSTRATEGY>
+  bool SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>::operator< (const SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>& other) const
+  {
+    return compare<SPACEDIMENSION-1>(_coords,other._coords);
+  }
+
+  template <class T, int SPACEDIMENSION, unsigned int SORTSTRATEGY>
+  void SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>::writeLine(ofstream& file) const
+  {
+    int i;
+    double temp[SPACEDIMENSION];
+    fill<SPACEDIMENSION-1,SORTSTRATEGY>(temp,_coords);
+    for(i=0;i<SPACEDIMENSION;i++)
+      file << setw(SPACE_BETWEEN_NBS) << temp[i];
+    for(i=0;i<_nbComponents;i++)
+      file << setw(SPACE_BETWEEN_NBS) << _components[i];
+    file << endl;
+  }
+
+  template <class T>
+  ASCII_FIELD_DRIVER<T>::ASCII_FIELD_DRIVER(const string & fileName, FIELD<T> * ptrField,
+                                           MED_EN::med_sort_direc direction,const char *priority)
+    :GENDRIVER(fileName,MED_EN::MED_ECRI),_ptrField(ptrField),_fileName(fileName),_direc(direction)
+  {
+    _nbComponents=_ptrField->getNumberOfComponents();
+    if(_nbComponents<=0)
+      throw MEDEXCEPTION("ASCII_FIELD_DRIVER : No components in FIELD<T>");
+    _support=(SUPPORT *)_ptrField->getSupport();
+    _mesh=(MESH *)_support->getMesh();
+    _spaceDimension=_mesh->getSpaceDimension();
+    _code=3;
+    int i;
+    if(priority[0]=='\0')
+      for(i=_spaceDimension-1;i>=0;i--)
+       {
+         _code<<=2;
+         _code+=i;
+       }
+    else
+      {
+       if(_spaceDimension!=strlen(priority))
+         throw MEDEXCEPTION("ASCII_FIELD_DRIVER : Coordinate priority invalid with spaceDim");
+       for(i=_spaceDimension-1;i>=0;i--)
+         {
+           char c=toupper(priority[i]);
+           if(int(c-'X')>(_spaceDimension-1))
+             throw MEDEXCEPTION("ASCII_FIELD_DRIVER : Invalid priority definition");
+           _code<<=2;
+           _code+=c-'X';
+         }
+      }
+  }
+
+  template <class T>
+  ASCII_FIELD_DRIVER<T>::ASCII_FIELD_DRIVER(const ASCII_FIELD_DRIVER<T>& other)
+    :_ptrField(other._ptrField),_fileName(other._fileName),_direc(other._direc),_mesh(other._mesh),_nbComponents(other._nbComponents),
+     _code(other._code),_spaceDimension(other._spaceDimension),_support(other._support)
+  {
+  }
+
+  template <class T>
+  void ASCII_FIELD_DRIVER<T>::open() throw (MEDEXCEPTION)
+  {
+    _file.open(_fileName.c_str(),ofstream::out | ofstream::app);
+  }
+
+  template <class T>
+  void ASCII_FIELD_DRIVER<T>::close()
+  {
+    _file.close();
+  }
+
+  template <class T>
+  void ASCII_FIELD_DRIVER<T>::read ( void ) throw (MEDEXCEPTION)
+  {
+    throw MEDEXCEPTION("ASCII_FIELD_DRIVER::read : Can't read with a WRONLY driver !");
+  }
+
+  template <class T>
+  GENDRIVER* ASCII_FIELD_DRIVER<T>::copy() const
+  {
+    return new ASCII_FIELD_DRIVER<T>(*this);
+  }
+
+  template <class T>
+  void ASCII_FIELD_DRIVER<T>::write( void ) const throw (MEDEXCEPTION)
+  {
+    buildIntroduction();
+    switch(_spaceDimension)
+      {
+      case 2:
+       {
+         switch(_code)
+           {
+           case 52: //XY
+             {
+               sortAndWrite<2,52>();
+               break;
+             }
+           case 49: //YX
+             {
+               sortAndWrite<2,49>();
+               break;
+             }
+           default:
+             MEDEXCEPTION("ASCII_FIELD_DRIVER : Invalid priority definition");
+           }
+         break;
+       }
+       case 3:
+       {
+         switch(_code)
+           {
+           case 228: //XYZ
+             {
+               sortAndWrite<3,228>();
+               break;
+             }
+           case 216: //XZY
+             {
+               sortAndWrite<3,216>();
+               break;
+             }
+           case 225://YXZ
+             {
+               sortAndWrite<3,225>();
+               break;
+             }
+           case 201://YZX
+             {
+               sortAndWrite<3,201>();
+               break;
+             }
+           case 210://ZXY
+             {
+               sortAndWrite<3,210>();
+               break;
+             }
+           case 198://ZYX
+             {
+               sortAndWrite<3,198>();
+               break;
+             }
+            default:
+             MEDEXCEPTION("ASCII_FIELD_DRIVER : Invalid priority definition");
+           }
+         break;
+         }
+      default:
+       MEDEXCEPTION("ASCII_FIELD_DRIVER : Invalid space dimension must be 2 or 3");
+       }
+  }
+
+  template <class T>
+  void ASCII_FIELD_DRIVER<T>::buildIntroduction() const
+  {
+    int i;
+    _file  << setiosflags(ios::scientific);
+    _file << "#TITLE: table " << _ptrField->getName() << " TIME: " << _ptrField->getTime() << " IT: " << _ptrField->getIterationNumber() << endl;
+    _file << "#COLUMN_TITLES: ";
+    for(i=0;i<_spaceDimension;i++)
+      _file << char('X'+i) << " | ";
+    const std::string *compoNames=_ptrField->getComponentsNames();
+    for(i=0;i<_nbComponents;i++)
+      {
+       if(!compoNames)
+         _file << compoNames[i];
+       else
+         _file << "None";
+       if(i<_nbComponents-1)
+         _file << " | ";
+      }
+    _file << endl;
+    _file << "#COLUMN_UNITS: ";
+    compoNames=_mesh->getCoordinateptr()->getCoordinatesUnits();
+    for(i=0;i<_spaceDimension;i++)
+      {
+       if(!compoNames)
+         _file << compoNames[i];
+       else
+         _file << "None";
+       _file << " | ";
+      }
+    const UNIT *compoUnits=_ptrField->getComponentsUnits();
+    for(i=0;i<_nbComponents;i++)
+      {
+       if(!compoUnits)
+         _file << compoUnits[i].getName();
+       else
+         _file << "None";
+       if(i<_nbComponents-1)
+         _file << " | ";
+      }
+    _file << endl;
+  }
+
+  template <class T>
+  template<int SPACEDIMENSION, unsigned int SORTSTRATEGY>
+  void ASCII_FIELD_DRIVER<T>::sortAndWrite() const
+  {
+    int i,j;
+    int numberOfValues=_ptrField->getNumberOfValues();
+    std::list< SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY > > li;
+    const double * coord;
+    FIELD<double> * barycenterField=0;
+    double * xyz[SPACEDIMENSION];
+    bool deallocateXyz=false;
+    if(_support->getEntity()==MED_EN::MED_NODE)
+      {
+       if (_support->isOnAllElements())
+         {
+           coord=_mesh->getCoordinates(MED_EN::MED_NO_INTERLACE);
+           for(i=0; i<SPACEDIMENSION; i++)
+             xyz[i]=(double *)coord+i*numberOfValues;  
+         }
+       else
+         {
+           coord = _mesh->getCoordinates(MED_EN::MED_FULL_INTERLACE);
+           const int * nodesNumber=_support->getNumber(MED_EN::MED_ALL_ELEMENTS);
+           for(i=0; i<SPACEDIMENSION; i++)
+             xyz[i]=new double[numberOfValues];
+           deallocateXyz=true;
+           for(i=0;i<numberOfValues;i++)
+             {
+               for(j=0;j<SPACEDIMENSION;j++)
+                 xyz[j][i]=coord[(nodesNumber[i]-1)*SPACEDIMENSION+j];
+             }
+         }
+      }
+    else
+      {
+       barycenterField = _mesh->getBarycenter(_support);
+       coord=barycenterField->getValue(MED_EN::MED_NO_INTERLACE);
+       for(i=0; i<SPACEDIMENSION; i++)
+         xyz[i]=(double *)(coord+i*numberOfValues);
+      }
+    T* valsToSet=(T*)_ptrField->getValue(MED_EN::MED_FULL_INTERLACE);
+    double temp[SPACEDIMENSION];
+    for(i=0;i<numberOfValues;i++)
+      {
+       for(j=0;j<SPACEDIMENSION;j++)
+         temp[j]=xyz[j][i];
+       li.push_back(SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>(temp,valsToSet+i*_nbComponents,_nbComponents));
+      }
+    if(barycenterField)
+      delete barycenterField;
+    if(deallocateXyz)
+      for(j=0;j<SPACEDIMENSION;j++)
+       delete [] xyz[j];
+    li.sort();
+    _file << setprecision(PRECISION_IN_ASCII_FILE);
+    if(_direc==MED_EN::ASCENDING)
+      {
+       typename std::list< SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY > >::iterator iter;
+       for(iter=li.begin();iter!=li.end();iter++)
+         (*iter).writeLine(_file);
+       _file << endl;
+      }
+    else if(_direc==MED_EN::DESCENDING)
+      {
+       typename std::list< SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY > >::reverse_iterator iter;
+       for(iter=li.rbegin();iter!=li.rend();iter++)
+         (*iter).writeLine(_file);
+       _file << endl;
+      }
+    else
+      MEDEXCEPTION("ASCII_FIELD_DRIVER : Invalid sort direction");
+  }
+  //{
+    //_nbComponentsForCpyInfo=_nbComponents;
+    //_ptrField->fillFromAnalytic <TEST<T>::copyInfo3> ();
+    //_ptrField->fillFromAnalytic<  ASCII_FIELD_DRIVER<T>::copyInfo<SPACEDIMENSION,SORTSTRATEGY> > ();
+    //li.sort();
+    //typename std::list< SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY > >::iterator iter;
+    //_file << setiosflags(ios::scientific) << setprecision(PRECISION_IN_ASCII_FILE);
+    //for(iter=li.begin();iter!=li.end();iter++)
+    //  {
+    //(*iter).writeLine(_file);
+    // }
+
+//   template <class T>
+//   template<int SPACEDIMENSION, unsigned int SORTSTRATEGY>//, std::list< SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY> > lis>
+//   void ASCII_FIELD_DRIVER<T>::copyInfo(const double *a,T *b)
+//   {
+//     //lis.push_back(SDForSorting<T,SPACEDIMENSION,SORTSTRATEGY>(a,b,_nbComponentsForCpyInfo));
+//   }
+
+//   template <class T>
+//   int ASCII_FIELD_DRIVER<T>::_nbComponentsForCpyInfo=0;
+}
+
+#endif
index 7b8222d66853f2c2bee7ddf1137bce3fa4d6711c..ff458ad6cb2735bfd4368e8d11a185362b2a4821 100644 (file)
@@ -159,7 +159,7 @@ inline CELLMODEL::CELLMODEL(const CELLMODEL &m)
 }
 inline CELLMODEL::~CELLMODEL() 
 {
 }
 inline CELLMODEL::~CELLMODEL() 
 {
-  MESSAGE("CELLMODEL::~CELLMODEL() destroying the cell");
+  //  MESSAGE("CELLMODEL::~CELLMODEL() destroying the cell");
   clean() ;
 };
 inline CELLMODEL & CELLMODEL::operator=(const CELLMODEL &m) 
   clean() ;
 };
 inline CELLMODEL & CELLMODEL::operator=(const CELLMODEL &m) 
diff --git a/src/MEDMEM/MEDMEM_Compatibility21_22.hxx b/src/MEDMEM/MEDMEM_Compatibility21_22.hxx
new file mode 100644 (file)
index 0000000..ff5593d
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+  Include file managing the compatibility
+  Med File V 2.1 and V 2.2
+*/
+
+#ifndef COMPATIBILITY_21_22_HXX
+#define COMPATIBILITY_21_22_HXX
+
+/*
+  Med File V 2.1 attributes
+*/
+
+#undef MED_H
+#undef MED_PROTO_H
+
+# include <med.hxx>
+# include <med_proto.hxx>
+
+#undef MED_TAILLE_PNOM
+#undef MED_NOPFLi
+
+/*
+  Med File V 2.2 attributes
+*/
+
+#undef MED_H
+#undef MED_PROTO_H
+
+namespace med_2_2 {
+  extern "C" { 
+#include <med.h>
+#include <med_proto.h>
+  }
+}
+
+/*
+  Core of the management V2.1 V2.2 of the Med File
+*/
+
+#undef MED_TAILLE_PNOM
+#undef MED_NOPFLi
+
+#define MED_TAILLE_PNOM21   8
+#define MED_TAILLE_PNOM22  16
+
+#endif /* COMPATIBILITY_21_22_HXX */
index 2df8f784ad743945919eb18679bde4ea12b9f904..ab06ea653ffa4ac3e8726a58c3ebd3450e40fce0 100644 (file)
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
+
+// Enlarge the vector if necessary to insert the element
+static inline void insert_vector(vector<int> &Vect, int Indice, int Element)
+{
+  if (Indice >= Vect.capacity())
+    Vect.reserve(Indice + 1000);
+
+  if (Indice >= Vect.size())
+    Vect.resize(Indice+1);
+
+  Vect[Indice] = Element;
+}
+
 /*!
 /*!
-   Default Constructor. \n
+   Default Constructor. /n
    Default for Entity is MED_CELL and type of Connectivity is MED_NODAL */
 //--------------------------------------------------------------//
 CONNECTIVITY::CONNECTIVITY(medEntityMesh Entity /* =MED_CELL */) :
    Default for Entity is MED_CELL and type of Connectivity is MED_NODAL */
 //--------------------------------------------------------------//
 CONNECTIVITY::CONNECTIVITY(medEntityMesh Entity /* =MED_CELL */) :
@@ -24,9 +37,14 @@ CONNECTIVITY::CONNECTIVITY(medEntityMesh Entity /* =MED_CELL */) :
                                _geometricTypes((medGeometryElement*)NULL),
                                _type((CELLMODEL*)NULL),
                                _entityDimension(0),
                                _geometricTypes((medGeometryElement*)NULL),
                                _type((CELLMODEL*)NULL),
                                _entityDimension(0),
+                               _numberOfNodes(0),
                                _count((int*)NULL),
                                _nodal((MEDSKYLINEARRAY*)NULL),
                                _count((int*)NULL),
                                _nodal((MEDSKYLINEARRAY*)NULL),
+                               _polygonsNodal((MEDSKYLINEARRAY*)NULL),
+                               _polyhedronNodal((POLYHEDRONARRAY*)NULL),
                                _descending((MEDSKYLINEARRAY*)NULL),
                                _descending((MEDSKYLINEARRAY*)NULL),
+                               _polygonsDescending((MEDSKYLINEARRAY*)NULL),
+                               _polyhedronDescending((MEDSKYLINEARRAY*)NULL),
                                _reverseNodalConnectivity((MEDSKYLINEARRAY*)NULL),
                                _reverseDescendingConnectivity((MEDSKYLINEARRAY*)NULL),
                                _neighbourhood((MEDSKYLINEARRAY*)NULL),
                                _reverseNodalConnectivity((MEDSKYLINEARRAY*)NULL),
                                _reverseDescendingConnectivity((MEDSKYLINEARRAY*)NULL),
                                _neighbourhood((MEDSKYLINEARRAY*)NULL),
@@ -36,7 +54,7 @@ CONNECTIVITY::CONNECTIVITY(medEntityMesh Entity /* =MED_CELL */) :
 }
 
 /*!
 }
 
 /*!
-   Constructor. \n
+   Constructor. /n
    Default for Entity is MED_CELL */
 //------------------------------------------------------------------------------//
 CONNECTIVITY::CONNECTIVITY(int numberOfTypes,medEntityMesh Entity /* =MED_CELL */):
    Default for Entity is MED_CELL */
 //------------------------------------------------------------------------------//
 CONNECTIVITY::CONNECTIVITY(int numberOfTypes,medEntityMesh Entity /* =MED_CELL */):
@@ -45,8 +63,13 @@ CONNECTIVITY::CONNECTIVITY(int numberOfTypes,medEntityMesh Entity /* =MED_CELL *
                                _typeConnectivity(MED_NODAL),
                                _numberOfTypes(numberOfTypes),
                                _entityDimension(0),
                                _typeConnectivity(MED_NODAL),
                                _numberOfTypes(numberOfTypes),
                                _entityDimension(0),
+                               _numberOfNodes(0),
                                _nodal((MEDSKYLINEARRAY*)NULL),
                                _nodal((MEDSKYLINEARRAY*)NULL),
+                               _polygonsNodal((MEDSKYLINEARRAY*)NULL),
+                               _polyhedronNodal((POLYHEDRONARRAY*)NULL),
                                _descending((MEDSKYLINEARRAY*)NULL),
                                _descending((MEDSKYLINEARRAY*)NULL),
+                               _polygonsDescending((MEDSKYLINEARRAY*)NULL),
+                               _polyhedronDescending((MEDSKYLINEARRAY*)NULL),
                                _reverseNodalConnectivity((MEDSKYLINEARRAY*)NULL),
                                _reverseDescendingConnectivity((MEDSKYLINEARRAY*)NULL),
                                _neighbourhood((MEDSKYLINEARRAY*)NULL),
                                _reverseNodalConnectivity((MEDSKYLINEARRAY*)NULL),
                                _reverseDescendingConnectivity((MEDSKYLINEARRAY*)NULL),
                                _neighbourhood((MEDSKYLINEARRAY*)NULL),
@@ -100,11 +123,31 @@ CONNECTIVITY::CONNECTIVITY (const CONNECTIVITY & m):
  else
     _nodal = (MEDSKYLINEARRAY *) NULL;
 
  else
     _nodal = (MEDSKYLINEARRAY *) NULL;
 
+ if (m._polygonsNodal != NULL)
+   _polygonsNodal = new MEDSKYLINEARRAY(* m._polygonsNodal);
+ else
+   _polygonsNodal = (MEDSKYLINEARRAY *) NULL;
+
+ if (m._polyhedronNodal != NULL)
+   _polyhedronNodal = new POLYHEDRONARRAY(* m._polyhedronNodal);
+ else
+   _polyhedronNodal = (POLYHEDRONARRAY *) NULL;
+
  if (m._descending != NULL)
     _descending = new MEDSKYLINEARRAY(* m._descending);
  else
     _descending = (MEDSKYLINEARRAY *) NULL;
 
  if (m._descending != NULL)
     _descending = new MEDSKYLINEARRAY(* m._descending);
  else
     _descending = (MEDSKYLINEARRAY *) NULL;
 
+ if (m._polygonsDescending != NULL)
+   _polygonsDescending = new MEDSKYLINEARRAY(* m._polygonsDescending);
+ else
+   _polygonsDescending = (MEDSKYLINEARRAY *) NULL;
+
+ if (m._polyhedronDescending != NULL)
+   _polyhedronDescending = new MEDSKYLINEARRAY(* m._polyhedronDescending);
+ else
+   _polyhedronDescending = (MEDSKYLINEARRAY *) NULL;
+
  if (m._reverseNodalConnectivity != NULL)
     _reverseNodalConnectivity = new MEDSKYLINEARRAY(* m._reverseNodalConnectivity);
  else
  if (m._reverseNodalConnectivity != NULL)
     _reverseNodalConnectivity = new MEDSKYLINEARRAY(* m._reverseNodalConnectivity);
  else
@@ -127,7 +170,7 @@ CONNECTIVITY::CONNECTIVITY (const CONNECTIVITY & m):
 }
 
 /*!
 }
 
 /*!
-   Destructor.\n
+   Destructor./n
    desallocates existing pointers */
 //----------------------------//
 CONNECTIVITY::~CONNECTIVITY()
    desallocates existing pointers */
 //----------------------------//
 CONNECTIVITY::~CONNECTIVITY()
@@ -143,8 +186,16 @@ CONNECTIVITY::~CONNECTIVITY()
      delete [] _count;
   if (_nodal != NULL)
      delete _nodal;
      delete [] _count;
   if (_nodal != NULL)
      delete _nodal;
+  if (_polygonsNodal != NULL)
+     delete _polygonsNodal;
+  if (_polyhedronNodal != NULL)
+     delete _polyhedronNodal;
   if (_descending != NULL)
      delete _descending;
   if (_descending != NULL)
      delete _descending;
+  if (_polygonsDescending != NULL)
+     delete _polygonsDescending;
+  if (_polyhedronDescending != NULL)
+    delete _polyhedronDescending;
   if (_reverseNodalConnectivity != NULL)
      delete _reverseNodalConnectivity;
   if (_reverseDescendingConnectivity != NULL)
   if (_reverseNodalConnectivity != NULL)
      delete _reverseNodalConnectivity;
   if (_reverseDescendingConnectivity != NULL)
@@ -259,6 +310,74 @@ void CONNECTIVITY::setNodal(const int * Connectivity,
   }
 }
 
   }
 }
 
+
+//--------------------------------------------------------------------//
+void CONNECTIVITY::setPolygonsConnectivity(medConnectivity ConnectivityType, medEntityMesh Entity, const int* PolygonsConnectivity, const int* PolygonsConnectivityIndex, int ConnectivitySize, int NumberOfPolygons)
+//--------------------------------------------------------------------//
+{
+  const char* LOC = "CONNECTIVITY::setPolygonsConnectivity";
+  BEGIN_OF(LOC);
+
+  if (_entity == Entity)
+    {
+      MEDSKYLINEARRAY* Connectivity = new MEDSKYLINEARRAY(NumberOfPolygons,ConnectivitySize,PolygonsConnectivityIndex,PolygonsConnectivity);
+
+      if (ConnectivityType == MED_NODAL)
+       {
+         if (_polygonsNodal != (MEDSKYLINEARRAY*) NULL)
+           delete _polygonsNodal;
+         _polygonsNodal = Connectivity;
+       }
+      else
+       {
+         if (_typeConnectivity != MED_DESCENDING)
+           _typeConnectivity = MED_DESCENDING; //by default it is set to MED_NODAL
+         if (_polygonsDescending != (MEDSKYLINEARRAY*) NULL)
+           delete _polygonsDescending;
+         _polygonsDescending = Connectivity;
+       }
+    }
+  else
+    {
+      if (_constituent == (CONNECTIVITY*) NULL)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Entity not found !"));
+      _constituent->setPolygonsConnectivity(ConnectivityType, Entity, PolygonsConnectivity, PolygonsConnectivityIndex, ConnectivitySize, NumberOfPolygons);
+    }
+}
+
+
+//--------------------------------------------------------------------//
+void CONNECTIVITY::setPolyhedronConnectivity(medConnectivity ConnectivityType, const int* PolyhedronConnectivity, const int* PolyhedronIndex, int ConnectivitySize, int NumberOfPolyhedron, const int* PolyhedronFacesIndex /* =(int*)NULL */, int NumberOfFaces /* =0 */)
+//--------------------------------------------------------------------//
+{
+  const char* LOC = "CONNECTIVITY::setPolyhedronConnectivity";
+  BEGIN_OF(LOC);
+
+  if (_entity == MED_CELL)
+    {
+      if (ConnectivityType == MED_NODAL)
+       {
+         if (_polyhedronNodal != (POLYHEDRONARRAY*) NULL)
+           delete _polyhedronNodal;
+         _polyhedronNodal = new POLYHEDRONARRAY(NumberOfPolyhedron,NumberOfFaces,ConnectivitySize);
+         _polyhedronNodal->setPolyhedronIndex(PolyhedronIndex);
+         _polyhedronNodal->setFacesIndex(PolyhedronFacesIndex);
+         _polyhedronNodal->setNodes(PolyhedronConnectivity);
+       }
+      else
+       {
+         if (_typeConnectivity != MED_DESCENDING)
+           _typeConnectivity = MED_DESCENDING; //by default it is set to MED_NODAL
+         if (_polyhedronDescending != (MEDSKYLINEARRAY*) NULL)
+           delete _polyhedronDescending;
+         _polyhedronDescending = new MEDSKYLINEARRAY(NumberOfPolyhedron,ConnectivitySize,PolyhedronIndex,PolyhedronConnectivity);
+       }
+    }
+  else
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : _entity must be MED_CELL to set polyhedron !"));
+}
+
+
 /*! A DOCUMENTER */
 //------------------------------------------------------------------------------------------//
 void CONNECTIVITY::calculateConnectivity(medConnectivity ConnectivityType, medEntityMesh Entity)
 /*! A DOCUMENTER */
 //------------------------------------------------------------------------------------------//
 void CONNECTIVITY::calculateConnectivity(medConnectivity ConnectivityType, medEntityMesh Entity)
@@ -292,561 +411,157 @@ void CONNECTIVITY::calculateConnectivity(medConnectivity ConnectivityType, medEn
       and a %medGeometryElement (ie:MED_SEG3).  */
 
 //------------------------------------------------------------//
       and a %medGeometryElement (ie:MED_SEG3).  */
 
 //------------------------------------------------------------//
-void CONNECTIVITY::updateFamily(vector<FAMILY*> myFamilies) 
+void CONNECTIVITY::updateFamily(const vector<FAMILY*>& myFamilies) 
 //------------------------------------------------------------//
 {
   const char * LOC = "CONNECTIVITY::updateFamily(vector<FAMILY*>) ";
 //------------------------------------------------------------//
 {
   const char * LOC = "CONNECTIVITY::updateFamily(vector<FAMILY*>) ";
-  BEGIN_OF(LOC);
-
   int numberOfFamilies = myFamilies.size();
   int numberOfFamilies = myFamilies.size();
-  if (numberOfFamilies == 0 ) {
-    MESSAGE(LOC<<"No family");
+  if (numberOfFamilies == 0 || _constituent == NULL)
     return;
     return;
-  }
   // does we do an update ?
   // does we do an update ?
-  if ((_constituent != NULL)&(_descending != NULL)) {
-    MESSAGE(LOC<<"Constituent is already defined");
+  if ((_constituent != NULL) && (_descending != NULL))
     return;
     return;
-  }
-
-  if ((_constituent != NULL)&(_descending == NULL)) {
-    if (myFamilies[0]->getEntity() != _constituent->getEntity()) {
-      MESSAGE(LOC<<"Family and constituent entity are different. We do nothing");
-      return;
+  if (myFamilies[0]->getEntity() != _constituent->getEntity())
+    return;
+  CONNECTIVITY * oldConstituent = _constituent;
+  _constituent = (CONNECTIVITY *)NULL;
+  if (oldConstituent->_nodal==NULL)
+    throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"We have no nodal connectivity of sub cell"));
+
+  //Loc vars defined to treat polygons exactly the same as classic types. Not nice but necessary.
+  int oldNumberOfFaceTab[2];
+  const int * oldConstituentValueTab[2];
+  const int * oldConstituentIndexTab[2];
+  int * renumberingFromOldToNewTab[2];//Final mapping array between old numbers and new numbers.;
+
+  int oldNumberOfFace = oldConstituent->_nodal->getNumberOf(); oldNumberOfFaceTab[0]=oldNumberOfFace;
+  const int * oldConstituentValue = oldConstituent->_nodal->getValue(); oldConstituentValueTab[0]=oldConstituentValue;
+  const int * oldConstituentIndex = oldConstituent->_nodal->getIndex(); oldConstituentIndexTab[0]=oldConstituentIndex;
+  int * renumberingFromOldToNew= new int [oldNumberOfFace]; renumberingFromOldToNewTab[0]=renumberingFromOldToNew;
+  
+  int oldNumberOfFacePoly = oldConstituent->getNumberOfPolygons();
+  const int * oldConstituentValuePoly=0;
+  const int * oldConstituentIndexPoly=0;
+  int * renumberingFromOldToNewPoly=0;
+  
+  int nbOfTurnInGlobalLoop=1;//Defined to know if a second search on polygons is needed.
+  if(oldNumberOfFacePoly>0)
+    {
+      oldNumberOfFaceTab[1]=oldNumberOfFacePoly;
+      oldConstituentValuePoly = oldConstituent->_polygonsNodal->getValue(); oldConstituentValueTab[1]=oldConstituentValuePoly;
+      oldConstituentIndexPoly = oldConstituent->_polygonsNodal->getIndex(); oldConstituentIndexTab[1]=oldConstituentIndexPoly;
+      renumberingFromOldToNewPoly=new int[oldNumberOfFacePoly]; renumberingFromOldToNewTab[1]=renumberingFromOldToNewPoly;
+      nbOfTurnInGlobalLoop++;
     }
     }
+  
+  calculateDescendingConnectivity();//perform calculation of descending connectivity to update all connectivities after having taken into account of direction of faces... 
+  _constituent->calculateReverseNodalConnectivity();//getting d-1 nodal connectivity to find get new face numbers from nodes numbers... 
+  
+  const int * reverseFaceNodal = _constituent->getReverseNodalConnectivity(); //Common to polygons and classic geometric types
+  const int * reverseFaceNodalIndex = _constituent->getReverseNodalConnectivityIndex(); //Common to polygons and classic geometric types
 
 
-    // well we could go !
-    CONNECTIVITY * oldConstituent = _constituent;
-
-//      for(int i=0; i<numberOfFamilies; i++) {
-//        FAMILY * myFamily = myFamilies[i];
-//        MESSAGE(LOC<<"updating the family (BEGIN) : " << *myFamily);
-//      }
-
-    _constituent = (CONNECTIVITY *)NULL;
-    // for instance we must have nodal connectivity in constituent :
-    if (oldConstituent->_nodal == NULL)
-      {
-       MESSAGE(LOC<<"We have no nodal connectivity of sub cell");
-       throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"We have no nodal connectivity of sub cell"));
-      }
-    int oldNumberOfFace = oldConstituent->_nodal->getNumberOf();
-    const int * oldConstituentValue = oldConstituent->_nodal->getValue();
-    const int * oldConstituentIndex = oldConstituent->_nodal->getIndex();
-
-    calculateDescendingConnectivity();
-
-    MESSAGE(LOC << " Right after the call to calculateDescendingConnectivity");
-    //    int newNumberOfFace = _constituent->_nodal->getNumberOf();
-    const int * newConstituentValue = _constituent->_nodal->getValue();
-    const int * newConstituentIndex = _constituent->_nodal->getIndex();
-    
-    const int * newReverseDescendingIndex =
-      _reverseDescendingConnectivity->getIndex();
-    
-    const int * newDescendingIndex = _descending->getIndex();
-    //    const int * newDescendingValue = _descending->getValue();
-
-    // loop on all family,
-    //   for all constituent in family, we get it's old connectivity 
-    //   (with oldCconstituentValue and oldConstituentIndex)
-    //   and search the constituent in newConstituentValue with class 
-    //   ModulusArry
-    //
-    //   when a new face is found, replace old constituent 
-    //   number in family with new one
-    //   If face is not rigth oriented, we must change _descending attribute 
-    //   and _reverseDescendingConnectivity (see calculateDescendingConnectivity()).
-
-    // Voila a toi de jouer Nadir :-)
-
-    // First we get the renumbering from the oldCconstituentValue and
-    // oldConstituentIndex in the the new one, newConstituentValue and
-    // newConstituentIndex with a negative sign if the face is not
-    // right orented
-
-    int * renumberingFromOldToNew = new int [oldNumberOfFace];
-    int index1 = 0;
-    int indexm1 = 0;
-
-    MESSAGE(LOC << " Right before the call to _constituent->calculateReverseNodalConnectivity");
-    _constituent->calculateReverseNodalConnectivity();
-    MESSAGE(LOC << " Right after the call to _constituent->calculateReverseNodalConnectivity");
-    
-
-    SCRUTE(oldNumberOfFace);
-
-
-    for (int iOldFace=0;iOldFace<oldNumberOfFace;iOldFace++)
-      {
-       int index = 0;
-
-       renumberingFromOldToNew[iOldFace] = iOldFace+1;
-       //        renumberingFromOldToNew[iOldFace] = 999999;
-       
-       int face_it_beginOld = oldConstituentIndex[iOldFace];
-       int face_it_endOld = oldConstituentIndex[iOldFace+1];
-       int face_size_itOld = face_it_endOld - face_it_beginOld;
-
-       const int* NodesLists = oldConstituentValue + (face_it_beginOld-1);
-       int face_size_itNew;
-       
-       const int * reverseFaceNodal = _constituent->getReverseNodalConnectivity();
-       const int * reverseFaceNodalIndex = _constituent->getReverseNodalConnectivityIndex();
-
-       // set an array wich contains faces numbers arround first node 
-       int BeginIndexFaceArrayFirstNode=reverseFaceNodalIndex[NodesLists[0]-1];
-       int EndIndexFaceArrayFirstNode=reverseFaceNodalIndex[NodesLists[0]];
-       int NumberOfFacesInList=EndIndexFaceArrayFirstNode-BeginIndexFaceArrayFirstNode;
-
-       int * FacesList = new int[NumberOfFacesInList];
-
-       for (int l=BeginIndexFaceArrayFirstNode; l<EndIndexFaceArrayFirstNode; l++){
-         FacesList[l-BeginIndexFaceArrayFirstNode]=reverseFaceNodal[l-1];
-       }
-       // foreach node in sub cell, we search elements which are in common
-       // at the end, we must have only one !
-
-       for (int nodeFaceOld=1; nodeFaceOld<face_size_itOld; nodeFaceOld++)
-         {
-           int NewNumberOfFacesInList = 0;
-           int * NewFacesList = new int[NumberOfFacesInList];
-
-           for (int l1=0; l1<NumberOfFacesInList; l1++) {
-             for (int l2=reverseFaceNodalIndex[NodesLists[nodeFaceOld]-1]; l2<reverseFaceNodalIndex[NodesLists[nodeFaceOld]]; l2++) {
-               if (FacesList[l1]<reverseFaceNodal[l2-1])
-                 // increasing order : FacesList[l1] are not in elements list of node l
-                 break;
-               if (FacesList[l1]==reverseFaceNodal[l2-1]) {
-                 // we have found one
-                 NewFacesList[NewNumberOfFacesInList]=FacesList[l1];
-                 NewNumberOfFacesInList++;
-                 break;
+  for(int loop=0;loop<nbOfTurnInGlobalLoop;loop++)
+    {
+      int oldNumberOfFaceLoop=oldNumberOfFaceTab[loop];
+      const int * oldConstituentValueLoop=oldConstituentValueTab[loop];
+      const int * oldConstituentIndexLoop= oldConstituentIndexTab[loop];
+      int * renumberingFromOldToNewLoop=renumberingFromOldToNewTab[loop];
+      for(int iOldFace=0;iOldFace<oldNumberOfFaceLoop;iOldFace++)
+       {
+         const int *nodesOfCurrentFaceOld=oldConstituentValueLoop+oldConstituentIndexLoop[iOldFace]-1;
+         int nbOfNodesOfCurrentFaceOld=oldConstituentIndexLoop[iOldFace+1]-oldConstituentIndexLoop[iOldFace];
+
+         //retrieving new number of polygon face...
+         int sizeOfNewFaceNb=reverseFaceNodalIndex[nodesOfCurrentFaceOld[0]]-reverseFaceNodalIndex[nodesOfCurrentFaceOld[0]-1];
+         int *newFaceNb=new int[sizeOfNewFaceNb];
+         memcpy(newFaceNb,reverseFaceNodal+reverseFaceNodalIndex[nodesOfCurrentFaceOld[0]-1]-1,sizeOfNewFaceNb*sizeof(int));//all faces candidates are in newFaceNb !!!
+         for(int curNode=1;curNode<nbOfNodesOfCurrentFaceOld && sizeOfNewFaceNb>1;curNode++)
+           {
+             const int *newFacesNbForCurNode=reverseFaceNodal+reverseFaceNodalIndex[nodesOfCurrentFaceOld[curNode]-1]-1;
+             int sizeOfNewFacesNbForCurNode=reverseFaceNodalIndex[nodesOfCurrentFaceOld[curNode]]-reverseFaceNodalIndex[nodesOfCurrentFaceOld[curNode]-1];
+             for(int i=0;i<sizeOfNewFaceNb;)
+               {
+                 bool found=false;
+                 for(int j=0;j<sizeOfNewFacesNbForCurNode && !found;j++)
+                   {
+                     if(newFacesNbForCurNode[j]==newFaceNb[i])
+                       found=true;
+                   }
+                 if(found)
+                   i++;
+                 else
+                   newFaceNb[i]=newFaceNb[--sizeOfNewFaceNb];
                }
                }
-             }
            }
            }
-           NumberOfFacesInList = NewNumberOfFacesInList;
-           delete [] FacesList;
-           FacesList = NewFacesList;
-         }
-
-       if (!NumberOfFacesInList==0)
-         {
-           if (NumberOfFacesInList>1)
-             throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"More than one face found ("<<NumberOfFacesInList<<") ! " <<FacesList[0]<<" "<<FacesList[1] ));
-       
-           MEDMODULUSARRAY modulusArrayOld(face_size_itOld,NodesLists);
-
-           int face_it_beginNew = newConstituentIndex[FacesList[0]-1];
-           int face_it_endNew = newConstituentIndex[FacesList[0]];
-           face_size_itNew = face_it_endNew - face_it_beginNew;
-
-           const int * newNodesLists = newConstituentValue+newConstituentIndex[FacesList[0]-1]-1;
-           MEDMODULUSARRAY modulusArrayNew(face_size_itNew,newNodesLists);
-       
-           int retCompareNewOld = modulusArrayNew.compare(modulusArrayOld);
-
-           //SCRUTE(retCompareNewOld);
-
-           // Real new face found
-       
-           if(retCompareNewOld == 1)
-             {
-               renumberingFromOldToNew[iOldFace] = FacesList[0];
-               index = 1;
-               index1++;
-             }
-       
-           // Reverse new face found
-       
-           if(retCompareNewOld == -1)
-             {
-               renumberingFromOldToNew[iOldFace] = FacesList[0];
-               index = 1;
-               indexm1++;
-           
-               int face_it_begin = newReverseDescendingIndex[FacesList[0]-1];
-               int face_it_end = newReverseDescendingIndex[FacesList[0]];
-               int face_size_it = face_it_end - face_it_begin;
-
-               if (face_size_it == 1)
-                 throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"This is a boundary face/edge, it should not be renumbered and it is wrongly oriented."));
-           
-               if (face_size_it > 2)
-                 throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"This face/edge should not be a (d-1) cell because it has "<<face_size_it<<" neighbouring"));
-           
-               // we have always 2 neighbourings
-               int cell1 = _reverseDescendingConnectivity->getIJ(FacesList[0],1);
-               int cell2 = _reverseDescendingConnectivity->getIJ(FacesList[0],2);
-               // PROVISOIRE : en attendant que le SKYLINEARRAY de ReverseDescending soit correct (sans le zero)
-               //                  if (cell2 == 0)
-               //                    throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"This is a boundary face/edge, it should not be renumbered and it is wrongly oriented."));
-       
-               if (cell2 != 0) { // we are not on border !!!!
-             
-                 _reverseDescendingConnectivity->setIJ(FacesList[0],1,cell2);
-                 // Updating _constituent->_nodal because of reversity
-                 const int * oldArray = oldConstituentValue+face_it_beginOld-1;
-                 for(int iarray=1;iarray<=face_size_itNew;iarray++){
-                   _constituent->_nodal->setIJ(FacesList[0],iarray,oldArray[iarray-1]);
-                 }
-             
-                 // Updating _reverseDescendingConnectivity
-             
-             
-                 _reverseDescendingConnectivity->setIJ(FacesList[0],2,cell1);
-             
-                 // Updating _descending for cell1 and cell2
-                 for(int iface=newDescendingIndex[cell1-1];iface<=newDescendingIndex[cell1];iface++)
-                   if (_descending->getIndexValue(iface)==FacesList[0])
-                     _descending->setIndexValue(iface,-FacesList[0]);
-                   else if (_descending->getIndexValue(iface)==-FacesList[0])
-                     _descending->setIndexValue(iface,FacesList[0]);
-                 // else nothing to do
-             
-                 for(int iface=newDescendingIndex[cell2-1];iface<newDescendingIndex[cell2];iface++)
-                   if (_descending->getIndexValue(iface)==FacesList[0])
-                     _descending->setIndexValue(iface,-FacesList[0]);
-                   else if (_descending->getIndexValue(iface)==-FacesList[0])
-                     _descending->setIndexValue(iface,FacesList[0]);
-                 // else nothing to do
-
-               } else {// else we are on border and we do nothing !!!!!!!!
-                 MESSAGE("WARNING,WARNING,WARNING,WARNING,WARNING,WARNING");
-                 MESSAGE(LOC<<" Boudary FACE "<<iOldFace+1<<" are wrong oriented !");
-                 MESSAGE("WARNING,WARNING,WARNING,WARNING,WARNING,WARNING");
-               }
-             }
-       
-           if(index == 0)
-             {
-               MESSAGE(LOC<<"Renumbering problem with the Face connectivity given by the User and the new Connectivity computed");
-               throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"We have a Face connectivity problem"));
-             }
-         }
-       delete [] FacesList;
-      }
-    
-    MESSAGE(LOC<<"The Renumbering is finished and the status is");
-
-    // Updating the Family
-    
-    SCRUTE(numberOfFamilies);
-
-    for(int i=0; i<numberOfFamilies; i++) {
-      FAMILY * myFamily = myFamilies[i];
-
-      SCRUTE(myFamily);
-      //    MESSAGE(LOC<<(*myFamily));
-
-      if (myFamily->isOnAllElements()) {
-       // we build number
-       // we must have more constituent ?
-       if (oldNumberOfFace==_constituent->getNumberOf(_constituent->getEntity(),MED_ALL_ELEMENTS))
-         throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"We have a family which is already in all constituent !"));
-       myFamily->setAll(false);
-       // values array :
-       int * values = new int[oldNumberOfFace] ;
-       for (int ind=0;ind<oldNumberOfFace;ind++)
-         values[ind]=ind+1;
-       // index array
-       int NumberOfTypes = myFamily->getNumberOfTypes();
-       const int * count = oldConstituent->getGlobalNumberingIndex(_constituent->getEntity());
-       int * index = new int[NumberOfTypes+1] ;
-       memcpy(index,count,(NumberOfTypes+1)*sizeof(int));
-       // build new number attribut
-       myFamily->setNumber(index,values);
-      }
-
-      //    MESSAGE(LOC<<(*myFamily));
-      MEDSKYLINEARRAY * number = myFamily->getnumber();
-
-      int numberOfLines_skyline = number->getNumberOf();
-
-
-      SCRUTE(numberOfLines_skyline);
-
-      const int * index_skyline = number->getIndex();
-      
-      SCRUTE(index_skyline);
-
-      for (int i=0;i<numberOfLines_skyline;i++) {
-       for (int j=index_skyline[i]; j<index_skyline[i+1];j++) {
-         number->setIndexValue(j,renumberingFromOldToNew[number->getIndexValue(j)-1]);
+         if(sizeOfNewFaceNb!=1)
+           throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"unexisting face specified!!!"));
+         renumberingFromOldToNewLoop[iOldFace]=newFaceNb[0];
+         delete [] newFaceNb;
+         //end of retrieving new number of polygon face...
+         int nbOfNodesOfCurrentFaceNew;
+         const int *nodesOfCurrentFaceNew=_constituent->getConnectivityOfAnElementWithPoly(MED_NODAL,_constituent->getEntity(),
+                                                                                           renumberingFromOldToNewLoop[iOldFace],nbOfNodesOfCurrentFaceNew);
+         MEDMODULUSARRAY modulusArrayOld(nbOfNodesOfCurrentFaceOld,nodesOfCurrentFaceOld);
+         MEDMODULUSARRAY modulusArrayNew(nbOfNodesOfCurrentFaceNew,nodesOfCurrentFaceNew);
+         int retCompareNewOld=modulusArrayNew.compare(modulusArrayOld);
+         if(retCompareNewOld==0)
+           throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"Uncompatible given user face with calculated existing faces"));
+         if(retCompareNewOld==-1)
+           invertConnectivityForAFace(renumberingFromOldToNewLoop[iOldFace],nodesOfCurrentFaceOld,loop==1);
        }
        }
-      }
-      //    MESSAGE(LOC<<"updating the family (END) : " << *myFamily);
     }
     }
-
-    delete oldConstituent ;
-    delete [] renumberingFromOldToNew;
-  }
-  
-
-  END_OF(LOC);
+  // Updating the Family
+  for(vector<FAMILY*>::const_iterator iter=myFamilies.begin();iter!=myFamilies.end();iter++)
+    (*iter)->changeElementsNbs(_constituent->getEntity(),renumberingFromOldToNew,oldNumberOfFace,renumberingFromOldToNewPoly);
+  delete oldConstituent ;
+  delete [] renumberingFromOldToNew;
+  if(oldNumberOfFacePoly>0)
+    delete [] renumberingFromOldToNewPoly;
   return;
 }
 
   return;
 }
 
-// meme methode que updateFamily, mais avec des groupes. Il n'est pas possible d'utiliser
-// l'heritage car les pointeurs sont dans un conteneur.
-void CONNECTIVITY::updateGroup(vector<GROUP*> myFamilies)
-//------------------------------------------------------------//
+//------------------------------------------------------------------------------------------------------------------//
+const int * MEDMEM::CONNECTIVITY::getConnectivity(medConnectivity ConnectivityType, medEntityMesh Entity, medGeometryElement Type) 
+//------------------------------------------------------------------------------------------------------------------//
 {
 {
-  const char * LOC = "CONNECTIVITY::updateGroup(vector<GROUP*>) ";
+  const char * LOC = "CONNECTIVITY::getConnectivity";
   BEGIN_OF(LOC);
 
   BEGIN_OF(LOC);
 
-  int numberOfFamilies = myFamilies.size();
-  if (numberOfFamilies == 0 ) {
-    MESSAGE(LOC<<"No family");
-    return;
-  }
-  // does we do an update ?
-  if ((_constituent != NULL)&(_descending != NULL)) {
-    MESSAGE(LOC<<"Constituent is already defined");
-    return;
-  }
-
-  if ((_constituent != NULL)&(_descending == NULL)) {
-    if (myFamilies[0]->getEntity() != _constituent->getEntity()) {
-      MESSAGE(LOC<<"Family and constituent entity are different. We do nothing");
-      return;
-    }
-
-    // well we could go !
-    CONNECTIVITY * oldConstituent = _constituent;
-
-//      for(int i=0; i<numberOfFamilies; i++) {
-//        FAMILY * myFamily = myFamilies[i];
-//        MESSAGE(LOC<<"updating the family (BEGIN) : " << *myFamily);
-//      }
-
-    _constituent = (CONNECTIVITY *)NULL;
-    // for instance we must have nodal connectivity in constituent :
-    if (oldConstituent->_nodal == NULL)
+  MEDSKYLINEARRAY * Connectivity;
+  if (Entity==_entity) {
+    
+    if (ConnectivityType==MED_NODAL)
       {
       {
-       MESSAGE(LOC<<"We have no nodal connectivity of sub cell");
-       throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"We have no nodal connectivity of sub cell"));
+       calculateNodalConnectivity();
+       Connectivity=_nodal;
       }
       }
-    int oldNumberOfFace = oldConstituent->_nodal->getNumberOf();
-    const int * oldConstituentValue = oldConstituent->_nodal->getValue();
-    const int * oldConstituentIndex = oldConstituent->_nodal->getIndex();
-
-    calculateDescendingConnectivity();
-
-    //    int newNumberOfFace = _constituent->_nodal->getNumberOf();
-    const int * newConstituentValue = _constituent->_nodal->getValue();
-    const int * newConstituentIndex = _constituent->_nodal->getIndex();
-    
-    const int * newReverseDescendingIndex =
-      _reverseDescendingConnectivity->getIndex();
-    
-    const int * newDescendingIndex = _descending->getIndex();
-    //    const int * newDescendingValue = _descending->getValue();
-
-    // loop on all family,
-    //   for all constituent in family, we get it's old connectivity 
-    //   (with oldCconstituentValue and oldConstituentIndex)
-    //   and search the constituent in newConstituentValue with class 
-    //   ModulusArry
-    //
-    //   when a new face is found, replace old constituent 
-    //   number in family with new one
-    //   If face is not rigth oriented, we must change _descending attribute 
-    //   and _reverseDescendingConnectivity (see calculateDescendingConnectivity()).
-
-    // Voila a toi de jouer Nadir :-)
-
-    // First we get the renumbering from the oldCconstituentValue and
-    // oldConstituentIndex in the the new one, newConstituentValue and
-    // newConstituentIndex with a negative sign if the face is not
-    // right orented
-
-    int * renumberingFromOldToNew = new int [oldNumberOfFace];
-    int index1 = 0;
-    int indexm1 = 0;
-
-    _constituent->calculateReverseNodalConnectivity();
-    
-    for (int iOldFace=0;iOldFace<oldNumberOfFace;iOldFace++)
+    else
       {
       {
-       int index = 0;
-
-       renumberingFromOldToNew[iOldFace] = iOldFace+1;
-       //        renumberingFromOldToNew[iOldFace] = 999999;
-       
-       int face_it_beginOld = oldConstituentIndex[iOldFace];
-       int face_it_endOld = oldConstituentIndex[iOldFace+1];
-       int face_size_itOld = face_it_endOld - face_it_beginOld;
-
-       const int* NodesLists = oldConstituentValue + (face_it_beginOld-1);
-       int face_size_itNew;
-       
-       const int * reverseFaceNodal = _constituent->getReverseNodalConnectivity();
-       const int * reverseFaceNodalIndex = _constituent->getReverseNodalConnectivityIndex();
-
-       // set an array wich contains faces numbers arround first node 
-       int BeginIndexFaceArrayFirstNode=reverseFaceNodalIndex[NodesLists[0]-1];
-       int EndIndexFaceArrayFirstNode=reverseFaceNodalIndex[NodesLists[0]];
-       int NumberOfFacesInList=EndIndexFaceArrayFirstNode-BeginIndexFaceArrayFirstNode;
-
-       int * FacesList = new int[NumberOfFacesInList];
-
-       for (int l=BeginIndexFaceArrayFirstNode; l<EndIndexFaceArrayFirstNode; l++){
-         FacesList[l-BeginIndexFaceArrayFirstNode]=reverseFaceNodal[l-1];
-       }
-       // foreach node in sub cell, we search elements which are in common
-       // at the end, we must have only one !
-
-       for (int nodeFaceOld=1; nodeFaceOld<face_size_itOld; nodeFaceOld++)
-         {
-           int NewNumberOfFacesInList = 0;
-           int * NewFacesList = new int[NumberOfFacesInList];
-
-           for (int l1=0; l1<NumberOfFacesInList; l1++) {
-             for (int l2=reverseFaceNodalIndex[NodesLists[nodeFaceOld]-1]; l2<reverseFaceNodalIndex[NodesLists[nodeFaceOld]]; l2++) {
-               if (FacesList[l1]<reverseFaceNodal[l2-1])
-                 // increasing order : FacesList[l1] are not in elements list of node l
-                 break;
-               if (FacesList[l1]==reverseFaceNodal[l2-1]) {
-                 // we have found one
-                 NewFacesList[NewNumberOfFacesInList]=FacesList[l1];
-                 NewNumberOfFacesInList++;
-                 break;
-               }
-             }
-           }
-           NumberOfFacesInList = NewNumberOfFacesInList;
-           delete [] FacesList;
-           FacesList = NewFacesList;
-         }
-
-       if (!NumberOfFacesInList==0)
-         {
-           if (NumberOfFacesInList>1)
-             throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"More than one face found ("<<NumberOfFacesInList<<") ! " <<FacesList[0]<<" "<<FacesList[1] ));
-       
-           MEDMODULUSARRAY modulusArrayOld(face_size_itOld,NodesLists);
-
-           int face_it_beginNew = newConstituentIndex[FacesList[0]-1];
-           int face_it_endNew = newConstituentIndex[FacesList[0]];
-           face_size_itNew = face_it_endNew - face_it_beginNew;
-
-           const int * newNodesLists = newConstituentValue+newConstituentIndex[FacesList[0]-1]-1;
-           MEDMODULUSARRAY modulusArrayNew(face_size_itNew,newNodesLists);
-       
-           int retCompareNewOld = modulusArrayNew.compare(modulusArrayOld);
-
-           //SCRUTE(retCompareNewOld);
-
-           // Real new face found
-       
-           if(retCompareNewOld == 1)
-             {
-               renumberingFromOldToNew[iOldFace] = FacesList[0];
-               index = 1;
-               index1++;
-             }
-       
-           // Reverse new face found
-       
-           if(retCompareNewOld == -1)
-             {
-               renumberingFromOldToNew[iOldFace] = FacesList[0];
-               index = 1;
-               indexm1++;
-           
-               int face_it_begin = newReverseDescendingIndex[FacesList[0]-1];
-               int face_it_end = newReverseDescendingIndex[FacesList[0]];
-               int face_size_it = face_it_end - face_it_begin;
-
-               if (face_size_it == 1)
-                 throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"This is a boundary face/edge, it should not be renumbered and it is wrongly oriented."));
-           
-               if (face_size_it > 2)
-                 throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"This face/edge should not be a (d-1) cell because it has "<<face_size_it<<" neighbouring"));
-           
-               // we have always 2 neighbourings
-               int cell1 = _reverseDescendingConnectivity->getIJ(FacesList[0],1);
-               int cell2 = _reverseDescendingConnectivity->getIJ(FacesList[0],2);
-               // PROVISOIRE : en attendant que le SKYLINEARRAY de ReverseDescending soit correct (sans le zero)
-               //                  if (cell2 == 0)
-               //                    throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"This is a boundary face/edge, it should not be renumbered and it is wrongly oriented."));
-       
-               if (cell2 != 0) { // we are not on border !!!!
-             
-                 _reverseDescendingConnectivity->setIJ(FacesList[0],1,cell2);
-                 // Updating _constituent->_nodal because of reversity
-                 const int * oldArray = oldConstituentValue+face_it_beginOld-1;
-                 for(int iarray=1;iarray<=face_size_itNew;iarray++){
-                   _constituent->_nodal->setIJ(FacesList[0],iarray,oldArray[iarray-1]);
-                 }
-             
-                 // Updating _reverseDescendingConnectivity
-             
-             
-                 _reverseDescendingConnectivity->setIJ(FacesList[0],2,cell1);
-             
-                 // Updating _descending for cell1 and cell2
-                 for(int iface=newDescendingIndex[cell1-1];iface<=newDescendingIndex[cell1];iface++)
-                   if (_descending->getIndexValue(iface)==FacesList[0])
-                     _descending->setIndexValue(iface,-FacesList[0]);
-                   else if (_descending->getIndexValue(iface)==-FacesList[0])
-                     _descending->setIndexValue(iface,FacesList[0]);
-                 // else nothing to do
-             
-                 for(int iface=newDescendingIndex[cell2-1];iface<newDescendingIndex[cell2];iface++)
-                   if (_descending->getIndexValue(iface)==FacesList[0])
-                     _descending->setIndexValue(iface,-FacesList[0]);
-                   else if (_descending->getIndexValue(iface)==-FacesList[0])
-                     _descending->setIndexValue(iface,FacesList[0]);
-                 // else nothing to do
-
-               } else {// else we are on border and we do nothing !!!!!!!!
-                 MESSAGE("WARNING,WARNING,WARNING,WARNING,WARNING,WARNING");
-                 MESSAGE(LOC<<" Boudary FACE "<<iOldFace+1<<" are wrong oriented !");
-                 MESSAGE("WARNING,WARNING,WARNING,WARNING,WARNING,WARNING");
-               }
-             }
-       
-           if(index == 0)
-             {
-               MESSAGE(LOC<<"Renumbering problem with the Face connectivity given by the User and the new Connectivity computed");
-               throw MED_EXCEPTION(LOCALIZED(STRING(LOC)<<"We have a Face connectivity problem"));
-             }
-         }
-       delete [] FacesList;
+       calculateDescendingConnectivity();
+       Connectivity=_descending;
       }
     
       }
     
-    MESSAGE(LOC<<"The Renumbering is finished and the status is");
-
-    // Updating the Family
-    
-    for(int i=0; i<numberOfFamilies; i++) {
-      GROUP * myFamily = myFamilies[i];
-      
-      MEDSKYLINEARRAY * number = myFamily->getnumber();
-      int numberOfLines_skyline = number->getNumberOf();
-      const int * index_skyline = number->getIndex();
-      
-      for (int i=0;i<numberOfLines_skyline;i++) {
-       for (int j=index_skyline[i]; j<index_skyline[i+1];j++) {
-         number->setIndexValue(j,renumberingFromOldToNew[number->getIndexValue(j)-1]);
-       }
+    if (Connectivity!=NULL)
+      if (Type==MED_ALL_ELEMENTS)
+       return Connectivity->getValue();
+      else {
+       for (int i=0; i<_numberOfTypes; i++)
+         if (_geometricTypes[i]==Type)
+           //return Connectivity->getI(i+1);
+           return Connectivity->getI(_count[i]);
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Type not found !"));
       }
       }
-      MESSAGE(LOC<<"updating the family (END) : " << *myFamily);
-    }
-
-    delete oldConstituent ;
-    delete [] renumberingFromOldToNew;
-  }
+    else
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Connectivity not defined !"));
+  } else 
+    if (_constituent != NULL)
+      return _constituent->getConnectivity(ConnectivityType,Entity,Type);
   
   
-
-  END_OF(LOC);
-  return;
-}
+  throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Entity not defined !"));
+}  
 
 //------------------------------------------------------------------------------------------------------------------//
 
 //------------------------------------------------------------------------------------------------------------------//
-const int * CONNECTIVITY::getConnectivity(medConnectivity ConnectivityType, medEntityMesh Entity, medGeometryElement Type) 
+int CONNECTIVITY::getConnectivityLength(medConnectivity ConnectivityType, medEntityMesh Entity, medGeometryElement Type)
 //------------------------------------------------------------------------------------------------------------------//
 {
   const char * LOC = "CONNECTIVITY::getConnectivity";
 //------------------------------------------------------------------------------------------------------------------//
 {
   const char * LOC = "CONNECTIVITY::getConnectivity";
@@ -868,19 +583,19 @@ const int * CONNECTIVITY::getConnectivity(medConnectivity ConnectivityType, medE
     
     if (Connectivity!=NULL)
       if (Type==MED_ALL_ELEMENTS)
     
     if (Connectivity!=NULL)
       if (Type==MED_ALL_ELEMENTS)
-       return Connectivity->getValue();
+       return Connectivity->getLength();
       else {
        for (int i=0; i<_numberOfTypes; i++)
          if (_geometricTypes[i]==Type)
       else {
        for (int i=0; i<_numberOfTypes; i++)
          if (_geometricTypes[i]==Type)
-           //return Connectivity->getI(i+1);
-           return Connectivity->getI(_count[i]);
+           return Connectivity->getNumberOfI(_count[i]);
        throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Type not found !"));
       }
     else
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Connectivity not defined !"));
        throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Type not found !"));
       }
     else
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Connectivity not defined !"));
-  } else 
+  } 
+  else 
     if (_constituent != NULL)
     if (_constituent != NULL)
-      return _constituent->getConnectivity(ConnectivityType,Entity,Type);
+      return _constituent->getConnectivityLength(ConnectivityType,Entity,Type);
   
   throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Entity not defined !"));
 }  
   
   throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Entity not defined !"));
 }  
@@ -920,9 +635,198 @@ const int * CONNECTIVITY::getConnectivityIndex(medConnectivity ConnectivityType,
   throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Entity not defined !"));
 }
 
   throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Entity not defined !"));
 }
 
-/*! A DOCUMENTER */
-//--------------------------------------------------------------//
-const CELLMODEL & CONNECTIVITY::getType(medGeometryElement Type) const
+
+//-------------------------------------------------------------//
+const int* CONNECTIVITY::getPolygonsConnectivity(medConnectivity ConnectivityType, medEntityMesh Entity)
+//-------------------------------------------------------------//
+{
+  const char* LOC = "CONNECTIVITY::getPolygonsConnectivity";
+  BEGIN_OF(LOC);
+
+  MEDSKYLINEARRAY* Connectivity;
+  if (Entity == _entity)
+    {
+      if (ConnectivityType == MED_NODAL)
+       {
+         calculateNodalConnectivity();
+         Connectivity = _polygonsNodal;
+       }
+      else
+       {
+         calculateDescendingConnectivity();
+         Connectivity = _polygonsDescending;
+       }
+      if (Connectivity != NULL)
+       return Connectivity->getValue();
+      else
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Polygons Connectivity not defined !"));
+    }
+  else
+    if (_constituent != NULL)
+      return _constituent->getPolygonsConnectivity(ConnectivityType, Entity);
+  throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Entity not defined !"));
+}
+
+
+//-------------------------------------------------------------//
+const int* CONNECTIVITY::getPolygonsConnectivityIndex(medConnectivity ConnectivityType, medEntityMesh Entity)
+//-------------------------------------------------------------//
+{
+  const char* LOC = "CONNECTIVITY::getPolygonsConnectivityIndex";
+  BEGIN_OF(LOC);
+
+  MEDSKYLINEARRAY* Connectivity;
+  if (Entity == _entity)
+    {
+      if (ConnectivityType == MED_NODAL)
+       {
+         //      calculateNodalConnectivity();
+         Connectivity = _polygonsNodal;
+       }
+      else
+       {
+         //      calculateDescendingConnectivity();
+         Connectivity = _polygonsDescending;
+       }
+      if (Connectivity != NULL)
+       return Connectivity->getIndex();
+      else
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Polygons Connectivity not defined !"));
+    }
+  else
+    if (_constituent != NULL)
+      return _constituent->getPolygonsConnectivityIndex(ConnectivityType, Entity);
+  throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Entity not defined !"));
+}
+
+
+/*! We suppose in this method that nodal and descending connectivities
+  are coherent.*/
+//-------------------------------------------------------------//
+int CONNECTIVITY::getNumberOfPolygons() const
+//-------------------------------------------------------------//
+{
+  if (_polygonsNodal != (MEDSKYLINEARRAY*) NULL)
+    return _polygonsNodal->getNumberOf();
+  else if (_polygonsDescending != (MEDSKYLINEARRAY*) NULL)
+    return _polygonsDescending->getNumberOf();
+  else
+    return 0;
+}
+
+
+//--------------------------------------------------------------//
+const int* CONNECTIVITY::getPolyhedronConnectivity(medConnectivity ConnectivityType) const
+//--------------------------------------------------------------//
+{
+  const char* LOC = "CONNECTIVITY::getPolyhedronConnectivity";
+  BEGIN_OF(LOC);
+
+  if (_entity == MED_CELL) //polyhedron can only be MED_CELL
+    {
+      if (ConnectivityType == MED_NODAL)
+       {
+         ((CONNECTIVITY *)(this))->calculateNodalConnectivity();
+         if (_polyhedronNodal != (POLYHEDRONARRAY*) NULL)
+           return _polyhedronNodal->getNodes();
+         else
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Polyhedron Nodal Connectivity not defined !"));
+       }
+      else
+       {
+         ((CONNECTIVITY *)(this))->calculateDescendingConnectivity();
+         if (_polyhedronDescending != (MEDSKYLINEARRAY*) NULL)
+           return _polyhedronDescending->getValue();
+         else
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Polyhedron Descending Connectivity not defined !"));
+       }
+    }
+  throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : No polyhedron for _entity different from MED_CELL !"));
+}
+
+
+//---------------------------------------------------------------//
+const int* CONNECTIVITY::getPolyhedronFacesIndex() const
+//---------------------------------------------------------------//
+{
+  const char* LOC = "CONNECTIVITY::getPolyhedronFacesIndex";
+  BEGIN_OF(LOC);
+
+  if (_entity == MED_CELL) //polyhedron can only be MED_CELL
+    {
+      //      calculateNodalConnectivity();
+      if (_polyhedronNodal != (POLYHEDRONARRAY*) NULL)
+       return _polyhedronNodal->getFacesIndex();
+      else
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : No Polyhedron in that Connectivity !"));
+    }
+  throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : No polyhedron for _entity different from MED_CELL !"));
+}
+
+
+//--------------------------------------------------------------//
+const int* CONNECTIVITY::getPolyhedronIndex(medConnectivity ConnectivityType) const
+//--------------------------------------------------------------//
+{
+  const char* LOC = "CONNECTIVITY::getPolyhedronIndex";
+  BEGIN_OF(LOC);
+
+  if (_entity == MED_CELL) //polyhedron can only be MED_CELL
+    {
+      if (ConnectivityType == MED_NODAL)
+       {
+         //      calculateNodalConnectivity();
+         if (_polyhedronNodal != (POLYHEDRONARRAY*) NULL)
+           return _polyhedronNodal->getPolyhedronIndex();
+         else
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Polyhedron Nodal Connectivity not defined !"));
+       }
+      else
+       {
+         //      calculateDescendingConnectivity();
+         if (_polyhedronDescending != (MEDSKYLINEARRAY*) NULL)
+           return _polyhedronDescending->getIndex();
+         else
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : Polyhedron Descending Connectivity not defined !"));
+       }
+    }
+  throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : No polyhedron for _entity different from MED_CELL !"));
+}
+
+
+/*! We suppose in this method that nodal and descending connectivities
+  are coherent.*/
+//-------------------------------------------------------------//
+int CONNECTIVITY::getNumberOfPolyhedronFaces() const
+//-------------------------------------------------------------//
+{
+  //  if (_polyhedronNodal == (POLYHEDRONARRAY*) NULL)
+  //    calculateNodalConnectivity();
+  if (_polyhedronNodal != (POLYHEDRONARRAY*) NULL)
+    return _polyhedronNodal->getNumberOfFaces();
+  else
+    return 0;
+}
+
+
+/*! We suppose in this method that nodal and descending connectivities
+  are coherent.*/
+//--------------------------------------------------------------//
+int CONNECTIVITY::getNumberOfPolyhedron() const
+//--------------------------------------------------------------//
+{
+  if (_polyhedronNodal != (POLYHEDRONARRAY*) NULL)
+    return _polyhedronNodal->getNumberOfPolyhedron();
+  else if (_polyhedronDescending != (MEDSKYLINEARRAY*) NULL)
+    return _polyhedronDescending->getNumberOf();
+  else
+    return 0;
+}
+
+
+/*! A DOCUMENTER */
+//--------------------------------------------------------------//
+const CELLMODEL & CONNECTIVITY::getType(medGeometryElement Type) const
 //--------------------------------------------------------------//
 {
   const char * LOC = "CONNECTIVITY::getType";
 //--------------------------------------------------------------//
 {
   const char * LOC = "CONNECTIVITY::getType";
@@ -978,14 +882,11 @@ int CONNECTIVITY::getNumberOf(medEntityMesh Entity, medGeometryElement Type) con
 //-----------------------------------------------------------------------------------//
 {
   const char * LOC = "CONNECTIVITY::getNumberOf";
 //-----------------------------------------------------------------------------------//
 {
   const char * LOC = "CONNECTIVITY::getNumberOf";
-  BEGIN_OF(LOC);
-
-  MESSAGE(LOC<<" Entity = "<< Entity << ", _entity = "<<_entity);
-
   if (Entity==_entity) {
     if (Type==MED_NONE)
       return 0; // not defined !
     //throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : medGeometryElement must be different of MED_NONE"));
   if (Entity==_entity) {
     if (Type==MED_NONE)
       return 0; // not defined !
     //throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" : medGeometryElement must be different of MED_NONE"));
+    if (!existConnectivity(MED_NODAL,Entity) && !existConnectivity(MED_DESCENDING,Entity)) return 0; //case with only polygons for example
     if (Type==MED_ALL_ELEMENTS)
       return _count[_numberOfTypes]-1;
     for (int i=0; i<_numberOfTypes; i++)
     if (Type==MED_ALL_ELEMENTS)
       return _count[_numberOfTypes]-1;
     for (int i=0; i<_numberOfTypes; i++)
@@ -1109,11 +1010,11 @@ const int* CONNECTIVITY::getReverseDescendingConnectivityIndex()
 void CONNECTIVITY::calculateNodalConnectivity()
 //--------------------------------------------//
 {
 void CONNECTIVITY::calculateNodalConnectivity()
 //--------------------------------------------//
 {
-  if (_nodal==NULL) 
+  if (_nodal==NULL && _polygonsNodal==NULL && _polyhedronNodal==NULL
     {
     {
-      if (_descending==NULL)
+      if (_descending==NULL && _polygonsDescending==NULL && _polyhedronDescending==NULL)
        throw MEDEXCEPTION("CONNECTIVITY::calculateNodalConnectivity : No connectivity found !");
        throw MEDEXCEPTION("CONNECTIVITY::calculateNodalConnectivity : No connectivity found !");
-      // calculate _nodal from _descending
+      // calculate _nodal, _polygonsNodal and _polyhedronNodal from _descending, _polygonsDescending and _polyhedronDescending
     }
 }
 
     }
 }
 
@@ -1129,63 +1030,81 @@ void CONNECTIVITY::calculateReverseNodalConnectivity()
   SCRUTE(_nodal);
   SCRUTE(_reverseNodalConnectivity);
 
   SCRUTE(_nodal);
   SCRUTE(_reverseNodalConnectivity);
 
-
   if (_nodal==NULL) 
     calculateNodalConnectivity();
   
   if (_nodal==NULL) 
     calculateNodalConnectivity();
   
-  if(_reverseNodalConnectivity==NULL)
-    {
-      int node_number = 0;
-      vector <vector <int> > reverse_connectivity; 
-      reverse_connectivity.resize(_numberOfNodes+1);
+  if(_reverseNodalConnectivity==NULL) {
+
+    int node_number = 0;
+    vector <vector <int> > reverse_connectivity; 
+    reverse_connectivity.resize(_numberOfNodes+1);
   
   
-      // Treat all cells types
+  // Treat all cells types
   
   
-      for (int j = 0; j < _numberOfTypes; j++)
-       {
-         // node number of the cell type
-         node_number = _type[j].getNumberOfNodes();
-         // treat all cells of a particular type
-         for (int k = _count[j]; k < _count[j+1]; k++)
-           // treat all nodes of the cell type
-           for (int local_node_number = 1;
-                local_node_number < node_number+1;
-                local_node_number++)
-             {
-               int global_node = _nodal->getIJ(k,local_node_number);
-               reverse_connectivity[global_node].push_back(k);
-             }
-       }
-  
-      // Full reverse_nodal_connectivity and reverse_nodal_connectivity_index
+    for (int j = 0; j < _numberOfTypes; j++)
+      {
+       // node number of the cell type
+       node_number = _type[j].getNumberOfNodes();
+       // treat all cells of a particular type
+       for (int k = _count[j]; k < _count[j+1]; k++)
+         // treat all nodes of the cell type
+         for (int local_node_number = 1; local_node_number < node_number+1; local_node_number++)
+           {
+             int global_node = _nodal->getIJ(k,local_node_number);
+             reverse_connectivity[global_node].push_back(k);
+           }
+      }
+
+    if(_polygonsNodal != NULL && _entityDimension==2)
+      {
+       int nbOfPolygons=_polygonsNodal->getNumberOf();
+       int offset=getNumberOf(_entity,MED_ALL_ELEMENTS);
+       const int *index=_polygonsNodal->getIndex();
+       const int *value=_polygonsNodal->getValue();
+       for (int local_polyg_number = 0; local_polyg_number < nbOfPolygons; local_polyg_number++)
+         {
+           for(int i=index[local_polyg_number];i<index[local_polyg_number+1];i++)
+             reverse_connectivity[value[i-1]].push_back(offset+local_polyg_number+1);
+         }
+      }
 
 
-      //calculate size of reverse_nodal_connectivity array
-      int size_reverse_nodal_connectivity  = 0;
-      for (int i = 1; i < _numberOfNodes+1; i++)
-       size_reverse_nodal_connectivity += reverse_connectivity[i].size();
+    if(_polyhedronNodal != NULL && _entityDimension==3)
+      {
+       int nbOfPolyhedra=_polyhedronNodal->getNumberOfPolyhedron();
+       int offset=getNumberOf(_entity,MED_ALL_ELEMENTS);
+       for (int local_polyh_number = 0; local_polyh_number < nbOfPolyhedra; local_polyh_number++)
+           {
+             int nbOfNodes;
+             int global_polyh_number=offset+local_polyh_number+1;
+             int *nodes=getNodesOfPolyhedron(global_polyh_number,nbOfNodes);
+             for(int i=0;i<nbOfNodes;i++)
+               reverse_connectivity[nodes[i]].push_back(global_polyh_number);
+             delete [] nodes;
+           }
+      }
   
   
-    //MEDSKYLINEARRAY * ReverseConnectivity = new MEDSKYLINEARRAY(_numberOfNodes,size_reverse_nodal_connectivity);
+    // Full reverse_nodal_connectivity and reverse_nodal_connectivity_index
+
+  //calculate size of reverse_nodal_connectivity array
+    int size_reverse_nodal_connectivity  = 0;
+    for (int i = 1; i < _numberOfNodes+1; i++)
+      size_reverse_nodal_connectivity += reverse_connectivity[i].size();
+
     int * reverse_nodal_connectivity_index = new int[_numberOfNodes+1];
     int * reverse_nodal_connectivity = new int[size_reverse_nodal_connectivity];
     int * reverse_nodal_connectivity_index = new int[_numberOfNodes+1];
     int * reverse_nodal_connectivity = new int[size_reverse_nodal_connectivity];
-    //const int * reverse_nodal_connectivity = ReverseConnectivity->getValue();
-    //const int * reverse_nodal_connectivity_index = ReverseConnectivity->getIndex();
 
 
-      reverse_nodal_connectivity_index[0] = 1;
-      for (int i = 1; i < _numberOfNodes+1; i++)
-       {
-         int size = reverse_connectivity[i].size(); 
-         reverse_nodal_connectivity_index[i] =
-           reverse_nodal_connectivity_index[i-1] + size;
-         for (int j = 0; j < size; j++)
-           reverse_nodal_connectivity[reverse_nodal_connectivity_index[i-1]-1+j]= reverse_connectivity[i][j];
-       }
-  
-      //_reverseNodalConnectivity = ReverseConnectivity;
-      _reverseNodalConnectivity = new MEDSKYLINEARRAY(_numberOfNodes,size_reverse_nodal_connectivity,
-                                                     reverse_nodal_connectivity_index,
-                                                     reverse_nodal_connectivity);
-    delete [] reverse_nodal_connectivity_index;
-    delete [] reverse_nodal_connectivity;
+    reverse_nodal_connectivity_index[0] = 1;
+    for (int i = 1; i < _numberOfNodes+1; i++)
+      {
+       int size = reverse_connectivity[i].size(); 
+       reverse_nodal_connectivity_index[i] = reverse_nodal_connectivity_index[i-1] + size;
+       for (int j = 0; j < size; j++)
+         reverse_nodal_connectivity[reverse_nodal_connectivity_index[i-1]-1+j]= reverse_connectivity[i][j];
+      }
+
+    _reverseNodalConnectivity = new MEDSKYLINEARRAY(_numberOfNodes,size_reverse_nodal_connectivity,
+                                                   reverse_nodal_connectivity_index,
+                                                   reverse_nodal_connectivity,true);
   }
   END_OF(LOC);
 }
   }
   END_OF(LOC);
 }
@@ -1193,12 +1112,12 @@ void CONNECTIVITY::calculateReverseNodalConnectivity()
 /*! If not yet done, calculate the Descending Connectivity */
 //-------------------------------------------------//
 void CONNECTIVITY::calculateDescendingConnectivity()
 /*! If not yet done, calculate the Descending Connectivity */
 //-------------------------------------------------//
 void CONNECTIVITY::calculateDescendingConnectivity()
-//-------------------------------------------------//
-{
+  //-------------------------------------------------//
+  {
   const char * LOC = "CONNECTIVITY::calculateDescendingConnectivity() : ";
   BEGIN_OF(LOC);
   
   const char * LOC = "CONNECTIVITY::calculateDescendingConnectivity() : ";
   BEGIN_OF(LOC);
   
-  if (_descending==NULL)
+  if (_descending==NULL && _polygonsDescending==NULL && _polyhedronDescending==NULL)
     {
       if (_nodal==NULL)
        {
     {
       if (_nodal==NULL)
        {
@@ -1284,16 +1203,16 @@ void CONNECTIVITY::calculateDescendingConnectivity()
       int * ConstituentNodalConnectivityIndex = new int[TotalNumberOfConstituents+1];
       ConstituentNodalConnectivityIndex[0]=1;
 
       int * ConstituentNodalConnectivityIndex = new int[TotalNumberOfConstituents+1];
       ConstituentNodalConnectivityIndex[0]=1;
 
-      _constituent->_entityDimension=ConstituentsTypes[0]/100;
+      _constituent->_entityDimension = _entityDimension-1;
       if (ConstituentsTypes[1]==MED_NONE)
        _constituent->_numberOfTypes = 1;
       else
        _constituent->_numberOfTypes = 2;
       _constituent->_geometricTypes = new medGeometryElement[_constituent->_numberOfTypes];
       _constituent->_type = new CELLMODEL[_constituent->_numberOfTypes];
       if (ConstituentsTypes[1]==MED_NONE)
        _constituent->_numberOfTypes = 1;
       else
        _constituent->_numberOfTypes = 2;
       _constituent->_geometricTypes = new medGeometryElement[_constituent->_numberOfTypes];
       _constituent->_type = new CELLMODEL[_constituent->_numberOfTypes];
-      _constituent->_count = new int[_constituent->_numberOfTypes+1];
+      _constituent->_count = new med_int[_constituent->_numberOfTypes+1];
       _constituent->_count[0]=1;
       _constituent->_count[0]=1;
-      int* tmp_NumberOfConstituentsForeachType = new int[_constituent->_numberOfTypes+1];
+      int* tmp_NumberOfConstituentsForeachType = new med_int[_constituent->_numberOfTypes+1];
       tmp_NumberOfConstituentsForeachType[0]=0; // to count constituent of each type
       for (int i=0; i<_constituent->_numberOfTypes;i++) {
        _constituent->_geometricTypes[i]=ConstituentsTypes[i];
       tmp_NumberOfConstituentsForeachType[0]=0; // to count constituent of each type
       for (int i=0; i<_constituent->_numberOfTypes;i++) {
        _constituent->_geometricTypes[i]=ConstituentsTypes[i];
@@ -1325,95 +1244,77 @@ void CONNECTIVITY::calculateDescendingConnectivity()
          for (int j=_count[i]; j<_count[i+1]; j++) // we loop on all cell of this type
            for (int k=1; k<=NumberOfConstituentPerCell; k++)
              { // we loop on all sub cell of it
          for (int j=_count[i]; j<_count[i+1]; j++) // we loop on all cell of this type
            for (int k=1; k<=NumberOfConstituentPerCell; k++)
              { // we loop on all sub cell of it
-               if (descend_connectivity[descend_connectivity_index[j-1]+k-2]==0)
-                 {
-                   // it is a new sub cell !
-                   //      TotalNumberOfSubCell++;
-                   // Which type ?
-                   if (Type.getConstituentType(1,k)==_constituent->_geometricTypes[0])
-                     {
-                       tmp_NumberOfConstituentsForeachType[0]++;
-                       TotalNumberOfSubCell=tmp_NumberOfConstituentsForeachType[0];
-                     }
-                   else
-                     {
-                       tmp_NumberOfConstituentsForeachType[1]++;
-                       TotalNumberOfSubCell=tmp_NumberOfConstituentsForeachType[1];
-                     }
-                   //we have maximum two types
+               if (descend_connectivity[descend_connectivity_index[j-1]+k-2]==0) {
+                 // it is a new sub cell !
+                 //        TotalNumberOfSubCell++;
+                 // Which type ?
+                 if (Type.getConstituentType(1,k)==_constituent->_geometricTypes[0]){
+                   tmp_NumberOfConstituentsForeachType[0]++;
+                   TotalNumberOfSubCell=tmp_NumberOfConstituentsForeachType[0];
+                 } else {
+                   tmp_NumberOfConstituentsForeachType[1]++;
+                   TotalNumberOfSubCell=tmp_NumberOfConstituentsForeachType[1];
+                 }
+                 //we have maximum two types
                
                
-                   descend_connectivity[descend_connectivity_index[j-1]+k-2]=
-                     TotalNumberOfSubCell;
-                   ReverseDescendingConnectivityValue[(TotalNumberOfSubCell-1)*2]=j;
-
-                   int NumberOfNodesPerConstituent = Type.getConstituentType(1,k)%100;
+                 descend_connectivity[descend_connectivity_index[j-1]+k-2]=TotalNumberOfSubCell;
+                 ReverseDescendingConnectivityValue[(TotalNumberOfSubCell-1)*2]=j;
+                 int NumberOfNodesPerConstituent = Type.getConstituentType(1,k)%100;
            
            
-                   int * NodesLists = new int[NumberOfNodesPerConstituent];
-                   for (int l=0; l<NumberOfNodesPerConstituent; l++)
-                     {
-                       NodesLists[l]=_nodal->getIJ(j,Type.getNodeConstituent(1,k,l+1));
-                       ConstituentNodalConnectivity[ConstituentNodalConnectivityIndex[TotalNumberOfSubCell-1]-1+l] =
-                         NodesLists[l];
-                     }
-                   // we use reverse_nodal_connectivity to find the other element which contain this sub cell
-
-                   // all elements which contains first node of sub cell :
-                   int ReverseNodalConnectivityIndex_0 =
-                     ReverseNodalConnectivityIndex[NodesLists[0]-1];
-                   int ReverseNodalConnectivityIndex_1 =
-                     ReverseNodalConnectivityIndex[NodesLists[0]];
-                   int NumberOfCellsInList =
-                     ReverseNodalConnectivityIndex_1-ReverseNodalConnectivityIndex_0;
-
-                   if (NumberOfCellsInList > 0)
-                     { // we could have no element !
-                       int * CellsList = new int[NumberOfCellsInList];
-                       for (int l=ReverseNodalConnectivityIndex_0;
-                            l<ReverseNodalConnectivityIndex_1; l++)
-                         CellsList[l-ReverseNodalConnectivityIndex_0]=
-                           ReverseNodalConnectivityValue[l-1];
+                 int * NodesLists = new int[NumberOfNodesPerConstituent];
+                 for (int l=0; l<NumberOfNodesPerConstituent; l++) {
+                   NodesLists[l]=_nodal->getIJ(j,Type.getNodeConstituent(1,k,l+1));
+                   ConstituentNodalConnectivity[ConstituentNodalConnectivityIndex[TotalNumberOfSubCell-1]-1+l]=NodesLists[l];
+                 }
+                 // we use reverse_nodal_connectivity to find the other element which contain this sub cell
+
+                 // all elements which contains first node of sub cell :
+                 int ReverseNodalConnectivityIndex_0 = ReverseNodalConnectivityIndex[NodesLists[0]-1];
+                 int ReverseNodalConnectivityIndex_1 = getIndexOfEndClassicElementInReverseNodal(ReverseNodalConnectivityValue,ReverseNodalConnectivityIndex,NodesLists[0]-1);
+                 //ReverseNodalConnectivityIndex[NodesLists[0]];
+                 int NumberOfCellsInList = ReverseNodalConnectivityIndex_1-ReverseNodalConnectivityIndex_0;
+
+                 if (NumberOfCellsInList > 0)
+                   { // we could have no element !
+                     int * CellsList = new int[NumberOfCellsInList];
+                     for (int l=ReverseNodalConnectivityIndex_0; l<ReverseNodalConnectivityIndex_1; l++)
+                       CellsList[l-ReverseNodalConnectivityIndex_0]=ReverseNodalConnectivityValue[l-1];
                  
                  
-                       // foreach node in sub cell, we search elements which are in common
-                       // at the end, we must have only one !
-
-                       for (int l=1; l<NumberOfNodesPerConstituent; l++)
-                         {
-                           int NewNumberOfCellsInList = 0;
-                           int * NewCellsList = new int[NumberOfCellsInList];
-                           for (int l1=0; l1<NumberOfCellsInList; l1++)
-                             for (int l2=ReverseNodalConnectivityIndex[NodesLists[l]-1];
-                                  l2<ReverseNodalConnectivityIndex[NodesLists[l]];
-                                  l2++)
-                               {
-                                 if (CellsList[l1]<ReverseNodalConnectivityValue[l2-1])
-                                   // increasing order : CellsList[l1] are not in elements list of node l
-                                   break;
-                                 if ((CellsList[l1]==
-                                      ReverseNodalConnectivityValue[l2-1])&
-                                     (CellsList[l1]!=j))
-                                   {
-                                     // we have found one
-                                     NewCellsList[NewNumberOfCellsInList] =
-                                       CellsList[l1];
-                                     NewNumberOfCellsInList++;
-                                     break;
-                                   }
-                               }
-                           NumberOfCellsInList = NewNumberOfCellsInList;
-
-                           delete [] CellsList;
-                           CellsList = NewCellsList;
-                         }
-
-                       if (NumberOfCellsInList > 0)
-                         { // We have found some elements !
-                           if (NumberOfCellsInList>1)
-                             throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"More than one other Cell ("<<NumberOfCellsInList<<") !"));
+                     // foreach node in sub cell, we search elements which are in common
+                     // at the end, we must have only one !
+
+                     for (int l=1; l<NumberOfNodesPerConstituent; l++) {
+                       int NewNumberOfCellsInList = 0;
+                       int * NewCellsList = new int[NumberOfCellsInList];
+                       for (int l1=0; l1<NumberOfCellsInList; l1++)
+                         for (int l2=ReverseNodalConnectivityIndex[NodesLists[l]-1]; l2<getIndexOfEndClassicElementInReverseNodal(ReverseNodalConnectivityValue,ReverseNodalConnectivityIndex,NodesLists[l]-1); l2++)
+                         //for (int l2=ReverseNodalConnectivityIndex[NodesLists[l]-1]; l2<ReverseNodalConnectivityIndex[NodesLists[l]]; l2++)
+                           {
+                             if (CellsList[l1]<ReverseNodalConnectivityValue[l2-1])
+                               // increasing order : CellsList[l1] are not in elements list of node l
+                               break;
+                             if ((CellsList[l1]==ReverseNodalConnectivityValue[l2-1])&(CellsList[l1]!=j)) {
+                               // we have found one
+                               NewCellsList[NewNumberOfCellsInList]=CellsList[l1];
+                               NewNumberOfCellsInList++;
+                               break;
+                             }
+                           }
+                       NumberOfCellsInList = NewNumberOfCellsInList;
 
 
-                           int CellNumber = CellsList[0];
+                       delete [] CellsList;
+                       CellsList = NewCellsList;
+                     }
+           
+                     if (NumberOfCellsInList > 0) { // We have found some elements !
+                       int CellNumber = CellsList[0];
+                       //delete [] CellsList;
+                       if (NumberOfCellsInList>1)
+                         throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"More than one other Cell ("<<NumberOfCellsInList<<") !"));
 
 
-                           ReverseDescendingConnectivityValue[(TotalNumberOfSubCell-1)*2+1] =
-                             CellNumber;
+                       if (NumberOfCellsInList==1)
+                         {
+                           ReverseDescendingConnectivityValue[(TotalNumberOfSubCell-1)*2+1]=CellNumber;
                      
                            // we search sub cell number in this cell to not calculate it another time
                            // which type ?
                      
                            // we search sub cell number in this cell to not calculate it another time
                            // which type ?
@@ -1426,53 +1327,42 @@ void CONNECTIVITY::calculateDescendingConnectivity()
                            //int sub_cell_count2 = Type2.get_entities_count(1);
                            //int nodes_cell_count2 = Type2.get_nodes_count();
                            bool find2 = false;
                            //int sub_cell_count2 = Type2.get_entities_count(1);
                            //int nodes_cell_count2 = Type2.get_nodes_count();
                            bool find2 = false;
-                           for (int l=1; l<=Type2.getNumberOfConstituents(1);l++)
-                             { // on all sub cell
-                               int counter = 0;
-                               for (int m=1; m<=Type2.getConstituentType(1,l)%100;
-                                    m++)
-                                 for (int n=1; n<=Type.getConstituentType(1,k)%100;
-                                      n++)
-                                   {
-                                     if (_nodal->getIJ(CellNumber,Type2.getNodeConstituent(1,l,m)) ==
-                                         NodesLists[n-1])
-                                       counter++;
-                                   }
-                               if (counter==Type.getConstituentType(1,k)%100)
-                                 {
-                                   descend_connectivity[descend_connectivity_index[CellNumber-1]+l-2]=
-                                     -1*TotalNumberOfSubCell; // because, see it in other side !
-                                   find2 = true;
+                           for (int l=1; l<=Type2.getNumberOfConstituents(1);l++) { // on all sub cell
+                             int counter = 0;
+                             for (int m=1; m<=Type2.getConstituentType(1,l)%100; m++)
+                               for (int n=1; n<=Type.getConstituentType(1,k)%100; n++)
+                                 { 
+                                   if (_nodal->getIJ(CellNumber,Type2.getNodeConstituent(1,l,m)) == NodesLists[n-1])
+                                     counter++;
                                  }
                                  }
-                               if (find2)
-                                 break;
-                             }
+                             if (counter==Type.getConstituentType(1,k)%100)
+                               {
+                                 descend_connectivity[descend_connectivity_index[CellNumber-1]+l-2]=-1*TotalNumberOfSubCell; // because, see it in other side !
+                                 find2 = true;
+                               }
+                             if (find2)
+                               break;
+                           }
                            if (!find2)
                            if (!find2)
-                             {
-                               MESSAGE(LOC<<"ERROR ERROR ERROR ERROR ERROR : we find any subcell !!!"); // exception ?
-                             }
-                         }
-                       else
-                         {
-                           ReverseDescendingConnectivityValue[(TotalNumberOfSubCell-1)*2+1]=0;
-                         }
-                       delete [] CellsList;
+                             MESSAGE(LOC<<"ERROR ERROR ERROR ERROR ERROR : we find any subcell !!!"); // exception ?
+                         } 
+                     } else {
+                       ReverseDescendingConnectivityValue[(TotalNumberOfSubCell-1)*2+1]=0;
                      }
                      }
-                   
-                   delete [] NodesLists;
-                 }
+                     delete [] CellsList;
+                   }
+
+                 delete [] NodesLists;
+               }
              }
        }
       // we adjust _constituent
       int NumberOfConstituent=0;
       int SizeOfConstituentNodal=0;
              }
        }
       // we adjust _constituent
       int NumberOfConstituent=0;
       int SizeOfConstituentNodal=0;
-      for (int i=0;i<_constituent->_numberOfTypes; i++)
-       {
-         NumberOfConstituent +=
-           tmp_NumberOfConstituentsForeachType[i]-_constituent->_count[i]+1;
-         SizeOfConstituentNodal +=
-           (tmp_NumberOfConstituentsForeachType[i]-_constituent->_count[i]+1)*_constituent->_type[i].getNumberOfNodes();
-       }
+      for (int i=0;i<_constituent->_numberOfTypes; i++) {
+       NumberOfConstituent += tmp_NumberOfConstituentsForeachType[i]-_constituent->_count[i]+1;
+       SizeOfConstituentNodal += (tmp_NumberOfConstituentsForeachType[i]-_constituent->_count[i]+1)*_constituent->_type[i].getNumberOfNodes();
+      }
       // we built new _nodal attribute in _constituent
       //MEDSKYLINEARRAY *ConstituentNodal = new MEDSKYLINEARRAY(NumberOfConstituent,SizeOfConstituentNodal);
       //const int *ConstituentNodalValue = ConstituentNodal->getValue();
       // we built new _nodal attribute in _constituent
       //MEDSKYLINEARRAY *ConstituentNodal = new MEDSKYLINEARRAY(NumberOfConstituent,SizeOfConstituentNodal);
       //const int *ConstituentNodalValue = ConstituentNodal->getValue();
@@ -1489,59 +1379,44 @@ void CONNECTIVITY::calculateDescendingConnectivity()
       reverseDescendingConnectivityIndex[0]=1;
 
       // first constituent type
       reverseDescendingConnectivityIndex[0]=1;
 
       // first constituent type
-      for(int j=0; j<tmp_NumberOfConstituentsForeachType[0]; j++)
-       {
-         ConstituentNodalIndex[j+1]=ConstituentNodalConnectivityIndex[j+1];
-         for(int k=ConstituentNodalIndex[j]; k<ConstituentNodalIndex[j+1]; k++)
-           {
-             ConstituentNodalValue[k-1]=ConstituentNodalConnectivity[k-1];
-           }
-         reverseDescendingConnectivityIndex[j+1] =
-           reverseDescendingConnectivityIndex[j]+2;
-         for(int k=reverseDescendingConnectivityIndex[j];
-             k<reverseDescendingConnectivityIndex[j+1]; k++)
-           {
-             reverseDescendingConnectivityValue[k-1] =
-               ReverseDescendingConnectivityValue[k-1];
-           }
+      for(int j=0; j<tmp_NumberOfConstituentsForeachType[0]; j++) {
+       ConstituentNodalIndex[j+1]=ConstituentNodalConnectivityIndex[j+1];
+       for(int k=ConstituentNodalIndex[j]; k<ConstituentNodalIndex[j+1]; k++){
+         ConstituentNodalValue[k-1]=ConstituentNodalConnectivity[k-1];
+       }
+       reverseDescendingConnectivityIndex[j+1]=reverseDescendingConnectivityIndex[j]+2;
+       for(int k=reverseDescendingConnectivityIndex[j]; k<reverseDescendingConnectivityIndex[j+1]; k++){
+         reverseDescendingConnectivityValue[k-1]=ReverseDescendingConnectivityValue[k-1];
        }
        }
+      }
       // second type if any
       // second type if any
-      if (_constituent->_numberOfTypes==2)
-       {
-         int offset = _constituent->_count[1]-tmp_NumberOfConstituentsForeachType[0]-1;
-         int offset1=offset*_constituent->_type[0].getNumberOfNodes();
-         int offset2=offset*2;
-         int NumberOfNodesPerConstituent = _constituent->_type[1].getNumberOfNodes();
-         for(int j=tmp_NumberOfConstituentsForeachType[0]; j<NumberOfConstituent; j++)
-           {
-             ConstituentNodalIndex[j+1]=
-               ConstituentNodalIndex[j]+NumberOfNodesPerConstituent;
-             for(int k=ConstituentNodalIndex[j]; k<ConstituentNodalIndex[j+1]; k++)
-               {
-                 ConstituentNodalValue[k-1]=ConstituentNodalConnectivity[offset1+k-1];
-               }
-             reverseDescendingConnectivityIndex[j+1] =
-               reverseDescendingConnectivityIndex[j]+2;
-             for(int k=reverseDescendingConnectivityIndex[j];
-                 k<reverseDescendingConnectivityIndex[j+1]; k++)
-               {
-                 reverseDescendingConnectivityValue[k-1] =
-                   ReverseDescendingConnectivityValue[offset2+k-1];
-               }
-           }
-         _constituent->_count[2]=NumberOfConstituent+1;
-         // we correct _descending to adjust face number
-         for(int j=0;j<DescendingSize;j++)
-           {
-             if (descend_connectivity[j]>tmp_NumberOfConstituentsForeachType[0])
-               descend_connectivity[j]-=offset;
-             else if (descend_connectivity[j]<-tmp_NumberOfConstituentsForeachType[0])
-               descend_connectivity[j]+=offset;
-           }
+      if (_constituent->_numberOfTypes==2) {
+       int offset = _constituent->_count[1]-tmp_NumberOfConstituentsForeachType[0]-1;
+       int offset1=offset*_constituent->_type[0].getNumberOfNodes();
+       int offset2=offset*2;
+       int NumberOfNodesPerConstituent = _constituent->_type[1].getNumberOfNodes();
+       for(int j=tmp_NumberOfConstituentsForeachType[0]; j<NumberOfConstituent; j++) {
+         ConstituentNodalIndex[j+1]=ConstituentNodalIndex[j]+NumberOfNodesPerConstituent;
+         for(int k=ConstituentNodalIndex[j]; k<ConstituentNodalIndex[j+1]; k++){
+           ConstituentNodalValue[k-1]=ConstituentNodalConnectivity[offset1+k-1];
+         }
+         reverseDescendingConnectivityIndex[j+1]=reverseDescendingConnectivityIndex[j]+2;
+         for(int k=reverseDescendingConnectivityIndex[j]; k<reverseDescendingConnectivityIndex[j+1]; k++){
+           reverseDescendingConnectivityValue[k-1]=ReverseDescendingConnectivityValue[offset2+k-1];
+         }
        }
        }
+       _constituent->_count[2]=NumberOfConstituent+1;
+       // we correct _descending to adjust face number
+       for(int j=0;j<DescendingSize;j++)
+         if (descend_connectivity[j]>tmp_NumberOfConstituentsForeachType[0])
+           descend_connectivity[j]-=offset;
+      }
 
       delete [] ConstituentNodalConnectivityIndex;
       delete [] ConstituentNodalConnectivity;
 
       delete [] ConstituentNodalConnectivityIndex;
       delete [] ConstituentNodalConnectivity;
+      delete [] ReverseDescendingConnectivityValue;
+      _constituent->_count[1]=tmp_NumberOfConstituentsForeachType[0]+1;
+      delete [] tmp_NumberOfConstituentsForeachType;
 
       _descending = new MEDSKYLINEARRAY(_count[_numberOfTypes]-1,
                                        DescendingSize,
 
       _descending = new MEDSKYLINEARRAY(_count[_numberOfTypes]-1,
                                        DescendingSize,
@@ -1549,42 +1424,185 @@ void CONNECTIVITY::calculateDescendingConnectivity()
                                        descend_connectivity);
       delete [] descend_connectivity_index;
       delete [] descend_connectivity;
                                        descend_connectivity);
       delete [] descend_connectivity_index;
       delete [] descend_connectivity;
-      _reverseDescendingConnectivity = new MEDSKYLINEARRAY(NumberOfConstituent,
-                                                          2*NumberOfConstituent,
-                                                          reverseDescendingConnectivityIndex,
-                                                          reverseDescendingConnectivityValue);
-      delete [] reverseDescendingConnectivityIndex;
+
+      ////
+      vector<int> PolyDescending;
+      vector<int> Reversedescendingconnectivityvalue(reverseDescendingConnectivityValue,reverseDescendingConnectivityValue + 2*NumberOfConstituent);
+      vector<int> Reversedescendingconnectivityindex(reverseDescendingConnectivityIndex,reverseDescendingConnectivityIndex + NumberOfConstituent);
       delete [] reverseDescendingConnectivityValue;
       delete [] reverseDescendingConnectivityValue;
+      delete [] reverseDescendingConnectivityIndex;
 
 
-      _constituent->_count[1]=tmp_NumberOfConstituentsForeachType[0]+1;
-      delete [] tmp_NumberOfConstituentsForeachType;
-      
-      //delete _constituent->_nodal;
+
+      // polygons (2D mesh)
+
+      vector<int> Constituentnodalvalue(ConstituentNodalValue,ConstituentNodalValue + SizeOfConstituentNodal);
+      vector<int> Constituentnodalindex(ConstituentNodalIndex,ConstituentNodalIndex + NumberOfConstituent+1);
+      delete [] ConstituentNodalValue;
+      delete [] ConstituentNodalIndex;
+      int NumberOfNewSeg = 0;
+
+      for (int i=0; i <getNumberOfPolygons(); i++) // for each polygon
+       {
+         const int * vector_begin = &_polygonsNodal->getValue()[_polygonsNodal->getIndex()[i]-1];
+         int vector_size = _polygonsNodal->getIndex()[i+1]-_polygonsNodal->getIndex()[i]+1;
+         vector<int> myPolygon(vector_begin, vector_begin+vector_size);
+         myPolygon[myPolygon.size()-1] = myPolygon[0]; // because first and last point make a segment
+
+         for (int j=0; j<myPolygon.size()-1; j++) // for each segment of polygon
+           {
+             MEDMODULUSARRAY segment_poly(2,&myPolygon[j]);
+             int ret_compare = 0;
+
+             // we search it in existing segments
+
+             for (int k=0; k<Constituentnodalindex.size()-1; k++)
+               {
+                 MEDMODULUSARRAY segment(2,&Constituentnodalvalue[0] + Constituentnodalindex[k]-1);
+                 ret_compare = segment_poly.compare(segment);
+                 if (ret_compare) // segment_poly already exists
+                   {
+                     PolyDescending.push_back(ret_compare*(k+1)); // we had it to the connectivity
+                     insert_vector(Reversedescendingconnectivityvalue, 2*k+1, i+1 + getNumberOf(MED_CELL,MED_ALL_ELEMENTS)); // add polygon i to reverse descending connectivity for segment_poly (in 2sd place)
+                     break;
+                   }
+               }
+
+             // segment_poly must be created
+
+             if (!ret_compare)
+               {
+                 NumberOfNewSeg++;
+                 PolyDescending.push_back(NumberOfConstituent+NumberOfNewSeg); // we had it to the connectivity
+                 Constituentnodalvalue.push_back(segment_poly[0]);
+                 Constituentnodalvalue.push_back(segment_poly[1]);
+                 Constituentnodalindex.push_back(Constituentnodalindex[Constituentnodalindex.size()-1] + 2); // we have only segments
+                 insert_vector(Reversedescendingconnectivityvalue, 2*(NumberOfConstituent+NumberOfNewSeg-1), i+1 + getNumberOf(MED_CELL,MED_ALL_ELEMENTS)); // add polygon i to reverse descending connectivity for segment_poly (in 1st place)
+                 insert_vector(Reversedescendingconnectivityindex, NumberOfConstituent+NumberOfNewSeg-1, 2*(NumberOfConstituent+NumberOfNewSeg-1)+1); // idem with index
+               }
+           }
+       }
+
+      if (getNumberOfPolygons() > 0)
+       {
+         _polygonsDescending = new MEDSKYLINEARRAY(getNumberOfPolygons(),_polygonsNodal->getLength(),_polygonsNodal->getIndex(),&PolyDescending[0]); // index are the same for polygons nodal and descending connectivities
+
+         NumberOfConstituent += NumberOfNewSeg;
+         SizeOfConstituentNodal += 2*NumberOfNewSeg;
+         _constituent->_count[1] = NumberOfConstituent+1;
+       }
+
+
+      // polyhedron (3D mesh)
+
+      vector<int> Constituentpolygonsnodalvalue;
+      vector<int> Constituentpolygonsnodalindex(1,1);
+      int NumberOfNewFaces = 0; // by convention new faces are polygons
+
+      for (int i=0; i<getNumberOfPolyhedron(); i++) // for each polyhedron
+       {
+         // we create a POLYHEDRONARRAY containing only this polyhedra
+         int myNumberOfFaces = _polyhedronNodal->getPolyhedronIndex()[i+1]-_polyhedronNodal->getPolyhedronIndex()[i];
+         int myNumberOfNodes = _polyhedronNodal->getFacesIndex()[_polyhedronNodal->getPolyhedronIndex()[i+1]-1]-_polyhedronNodal->getFacesIndex()[_polyhedronNodal->getPolyhedronIndex()[i]-1];
+         POLYHEDRONARRAY myPolyhedra(1,myNumberOfFaces,myNumberOfNodes);
+         vector<int> myFacesIndex(_polyhedronNodal->getFacesIndex() + _polyhedronNodal->getPolyhedronIndex()[i]-1, _polyhedronNodal->getFacesIndex() + _polyhedronNodal->getPolyhedronIndex()[i]-1 + myNumberOfFaces+1);
+         for (int j=myNumberOfFaces; j>=0; j--)
+           myFacesIndex[j] -= myFacesIndex[0]-1;
+         myPolyhedra.setFacesIndex(&myFacesIndex[0]);
+         myPolyhedra.setNodes(_polyhedronNodal->getNodes() + _polyhedronNodal->getFacesIndex()[_polyhedronNodal->getPolyhedronIndex()[i]-1]-1);
+
+         for (int j=0; j<myPolyhedra.getNumberOfFaces(); j++) // for each face of polyhedra
+           {
+             int myFaceNumberOfNodes = myPolyhedra.getFacesIndex()[j+1]-myPolyhedra.getFacesIndex()[j];
+             MEDMODULUSARRAY face_poly(myFaceNumberOfNodes,myPolyhedra.getNodes() + myPolyhedra.getFacesIndex()[j]-1);
+             int ret_compare = 0;
+
+             // we search it in existing faces
+
+             // we search first in TRIA3 and QUAD4
+             if (myFaceNumberOfNodes == 3 || myFaceNumberOfNodes == 4)
+               {
+                 int Begin = -1; // first TRIA3 or QUAD4
+                 int Number = 0; // number of TRIA3 or QUAD4
+                 for (int k=0; k<Constituentnodalindex.size()-1; k++)
+                   if (Constituentnodalindex[k+1]-Constituentnodalindex[k] == myFaceNumberOfNodes)
+                     {
+                       if (Begin == -1)
+                         Begin = k;
+                       Number++;
+                     }
+
+                 for (int k=0; k<Number; k++)
+                   {
+                     MEDMODULUSARRAY face(myFaceNumberOfNodes,&Constituentnodalvalue[0] + Constituentnodalindex[Begin+k]-1);
+                     ret_compare = face_poly.compare(face);
+                     if (ret_compare)
+                       {
+                         PolyDescending.push_back(ret_compare*(Begin+k+1)); // we had it to the connectivity
+                         insert_vector(Reversedescendingconnectivityvalue, 2*(Begin+k)+1, i+1 + getNumberOf(MED_CELL,MED_ALL_ELEMENTS)); // add polyhedra i to reverse descending connectivity for face_poly (in 2sd place)
+                         break;
+                       }
+                   }
+               }
+
+             // we search last in POLYGONS
+             if (!ret_compare)
+               {
+                 for (int k=0; k<static_cast<int>(Constituentpolygonsnodalindex.size())-1; k++) // we must cast the unsigned int into int before doing -1
+                   {
+                     if (Constituentpolygonsnodalindex[k+1]-Constituentpolygonsnodalindex[k] == myFaceNumberOfNodes)
+                       {
+                         MEDMODULUSARRAY face(myFaceNumberOfNodes,&Constituentpolygonsnodalvalue[0] + Constituentpolygonsnodalindex[k]-1);
+                         ret_compare = face_poly.compare(face);
+                         if (ret_compare)
+                           {
+                             PolyDescending.push_back(ret_compare*(NumberOfConstituent+k+1)); // we had it to the connectivity
+                             insert_vector(Reversedescendingconnectivityvalue, 2*(NumberOfConstituent+k)+1, i+1 + getNumberOf(MED_CELL,MED_ALL_ELEMENTS)); // add polyhedra i to reverse descending connectivity for face_poly (in 2sd place)
+                             break;
+                           }
+                       }
+                   }
+               }
+
+             // if not found, face_poly must be created
+
+             if (!ret_compare)
+               {
+                 NumberOfNewFaces++;
+                 PolyDescending.push_back(NumberOfConstituent+NumberOfNewFaces); // we had it to the connectivity
+                 for (int k=0; k<myFaceNumberOfNodes; k++)
+                   Constituentpolygonsnodalvalue.push_back(face_poly[k]);
+                 Constituentpolygonsnodalindex.push_back(Constituentpolygonsnodalindex[Constituentpolygonsnodalindex.size()-1]+myFaceNumberOfNodes);
+                 insert_vector(Reversedescendingconnectivityvalue, 2*(NumberOfConstituent+NumberOfNewFaces-1), i+1 + getNumberOf(MED_CELL,MED_ALL_ELEMENTS)); // add polyhedra i to reverse descending connectivity for face_poly (in 1st place)
+                 insert_vector(Reversedescendingconnectivityindex, NumberOfConstituent+NumberOfNewFaces-1, 2*(NumberOfConstituent+NumberOfNewFaces-1)+1); // idem with index
+               }
+           }
+       }
+
+      if (getNumberOfPolyhedron() > 0)
+       {
+         _polyhedronDescending = new MEDSKYLINEARRAY(getNumberOfPolyhedron(),_polyhedronNodal->getNumberOfFaces(),_polyhedronNodal->getPolyhedronIndex(),&PolyDescending[0]); // polyhedron index are the same for nodal and descending connectivities
+
+         if (_constituent->_polygonsNodal != NULL)
+           delete [] _constituent->_polygonsNodal;
+         _constituent->_polygonsNodal = new MEDSKYLINEARRAY(Constituentpolygonsnodalindex.size()-1,Constituentpolygonsnodalvalue.size(),&Constituentpolygonsnodalindex[0],&Constituentpolygonsnodalvalue[0]);
+       }
+
+      // delete _constituent->_nodal
       _constituent->_nodal = new MEDSKYLINEARRAY(NumberOfConstituent,
                                                 SizeOfConstituentNodal,
       _constituent->_nodal = new MEDSKYLINEARRAY(NumberOfConstituent,
                                                 SizeOfConstituentNodal,
-                                                ConstituentNodalIndex,
-                                                ConstituentNodalValue);
-    
-      delete [] ConstituentNodalIndex;
-      delete [] ConstituentNodalValue;
-      
-      delete [] ReverseDescendingConnectivityValue;
+                                                &Constituentnodalindex[0],
+                                                &Constituentnodalvalue[0]);
+
+      int NumberOfConstituentWithPolygons = NumberOfConstituent + NumberOfNewFaces;
+      Reversedescendingconnectivityindex.push_back(Reversedescendingconnectivityindex[Reversedescendingconnectivityindex.size()-1]+2); // we complete the index
+      _reverseDescendingConnectivity = new MEDSKYLINEARRAY(NumberOfConstituentWithPolygons+1,
+                                                          2*NumberOfConstituentWithPolygons,
+                                                          &Reversedescendingconnectivityindex[0],
+                                                          &Reversedescendingconnectivityvalue[0]);
+      ////
     }
   END_OF(LOC);
     }
   END_OF(LOC);
-}
-
-//-----------------------------------------------------------------------------------------//
-//  void CONNECTIVITY::calculateReverseDescendingConnectivity(CONNECTIVITY *myConnectivity)
-//-----------------------------------------------------------------------------------------//
-//  {
-//    if (_entity==MED_CELL)
-//      throw MEDEXCEPTION("CONNECTIVITY::calculateReverseDescending
-//        Connectivity : we could not do that with MED_CELL entity !");
-//    if (myConnectivity->getEntity()!=MED_CELL)
-//      throw MEDEXCEPTION("CONNECTIVITY::calculateReverseDescending
-//             Connectivity : we need MED_CELL connectivity !");
-//    return;
-//  }
+  }
 
 /*! Not implemented yet */
 //--------------------------------------------------------------------//
 
 /*! Not implemented yet */
 //--------------------------------------------------------------------//
@@ -1641,6 +1659,47 @@ medGeometryElement CONNECTIVITY::getElementType(medEntityMesh Entity,int globalN
   END_OF(LOC);
 }
 
   END_OF(LOC);
 }
 
+/*! 
+  Idem as getElementType method except that it manages polygon and polyhedron.
+*/
+//--------------------------------------------------------------------//
+medGeometryElement CONNECTIVITY::getElementTypeWithPoly(medEntityMesh Entity,int globalNumber) const
+//--------------------------------------------------------------------//
+{
+  int globalNumberMaxOfClassicType;
+  if(_entity==Entity)
+    {
+      globalNumberMaxOfClassicType=_count[_numberOfTypes];
+      if(globalNumber>=1)
+       {
+         if(globalNumber<globalNumberMaxOfClassicType)
+           {
+             for(int i=1; i<=_numberOfTypes;i++)
+               if (globalNumber<_count[i])
+                 return _geometricTypes[i-1];
+             throw MEDEXCEPTION("never happens just for compilo");
+           }
+         else
+           {
+             int localNumberInPolyArray=globalNumber-globalNumberMaxOfClassicType;
+             int nbOfPol=getNumberOfElementOfPolyType(_entity);
+             if(localNumberInPolyArray<nbOfPol)
+               return getPolyTypeRelativeTo();
+             else
+               throw MEDEXCEPTION("getElementTypeWithPoly : unexisting element type");
+           }
+       }
+      else
+       throw MEDEXCEPTION("getElementTypeWithPoly : globalNumber < 1");
+    }
+  else
+    {
+      if(_constituent!=NULL)
+       return _constituent->getElementTypeWithPoly(Entity,globalNumber);
+      else
+       throw MEDEXCEPTION("getElementTypeWithPoly : Entity not defined !");
+    }
+}
 
 ostream & MEDMEM::operator<<(ostream &os, CONNECTIVITY &co)
 {
 
 ostream & MEDMEM::operator<<(ostream &os, CONNECTIVITY &co)
 {
@@ -1701,20 +1760,91 @@ ostream & MEDMEM::operator<<(ostream &os, CONNECTIVITY &co)
                os << endl;
            }
        }
                os << endl;
            }
        }
+
+       os << endl << "MED_POLYGON : " << co.getNumberOfPolygons() << " polygons" << endl;
+       if (co.getNumberOfPolygons() > 0)
+         {
+           const int* polygonsconnectivity = co.getPolygonsConnectivity(MED_NODAL,co.getEntity());
+           const int* polygonsconnectivityindex = co.getPolygonsConnectivityIndex(MED_NODAL,co.getEntity());
+
+           for (int i=0; i<co.getNumberOfPolygons(); i++)
+             {
+               int numberofnodesperpolygon = polygonsconnectivityindex[i+1]-polygonsconnectivityindex[i];
+               for (int j=0; j<numberofnodesperpolygon; j++)
+                 os << polygonsconnectivity[polygonsconnectivityindex[i]-1+j] << " ";
+               os << endl;
+             }
+         }
+
+       os << endl << "MED_POLYHEDRA : " << co.getNumberOfPolyhedron() << " polyhedron" << endl;
+       if (co.getNumberOfPolyhedron() > 0)
+         {
+           const int* polyhedronconnectivity = co.getPolyhedronConnectivity(MED_NODAL);
+           const int* polyhedronfacesindex = co.getPolyhedronFacesIndex();
+           const int* polyhedronindex = co.getPolyhedronIndex(MED_NODAL);
+
+           for (int i=0; i<co.getNumberOfPolyhedron(); i++)
+             {
+               int numberoffacesperpolyhedra = polyhedronindex[i+1]-polyhedronindex[i];
+               for (int j=0; j<numberoffacesperpolyhedra; j++)
+                 {
+                   int numberofnodesperface = polyhedronfacesindex[polyhedronindex[i]-1+j+1]-polyhedronfacesindex[polyhedronindex[i]-1+j];
+                   for (int k=0; k<numberofnodesperface; k++)
+                     os << polyhedronconnectivity[polyhedronfacesindex[polyhedronindex[i]-1+j]-1+k] << " ";
+                   if (j != numberoffacesperpolyhedra-1) os << "| ";
+                 }
+               os << endl;
+             }
+         }
+
     }
     else if (co._typeConnectivity == MED_DESCENDING)
     {
        int numberofelements = co.getNumberOf( co._entity , MED_ALL_ELEMENTS);
     }
     else if (co._typeConnectivity == MED_DESCENDING)
     {
        int numberofelements = co.getNumberOf( co._entity , MED_ALL_ELEMENTS);
-       const int *connectivity =  co.getConnectivity( co._typeConnectivity, co._entity, MED_ALL_ELEMENTS);
-       const int *connectivity_index =  co.getConnectivityIndex( co._typeConnectivity, co._entity );
+       if (numberofelements > 0)
+         {
+           const int *connectivity =  co.getConnectivity( co._typeConnectivity, co._entity, MED_ALL_ELEMENTS);
+           const int *connectivity_index =  co.getConnectivityIndex( co._typeConnectivity, co._entity );
        
        
-       for ( int j=0; j!=numberofelements; j++ ) 
-       {
-           os << "Element " << j+1 << " : ";
-           for ( int k=connectivity_index[j]; k!=connectivity_index[j+1]; k++ )
-               os << connectivity[k-1] << " ";
-           os << endl;
-       }
+           for ( int j=0; j!=numberofelements; j++ ) 
+             {
+               os << "Element " << j+1 << " : ";
+               for ( int k=connectivity_index[j]; k!=connectivity_index[j+1]; k++ )
+                 os << connectivity[k-1] << " ";
+               os << endl;
+             }
+         }
+
+       os << endl << "MED_POLYGON : " << co.getNumberOfPolygons() << " polygons" << endl;
+       if (co.getNumberOfPolygons() > 0)
+         {
+           const int* polygonsconnectivity = co.getPolygonsConnectivity(MED_DESCENDING,co.getEntity());
+           const int* polygonsconnectivityindex = co.getPolygonsConnectivityIndex(MED_DESCENDING,co.getEntity());
+
+           for (int i=0; i<co.getNumberOfPolygons(); i++)
+             {
+               int numberofedgesperpolygon = polygonsconnectivityindex[i+1]-polygonsconnectivityindex[i];
+               for (int j=0; j<numberofedgesperpolygon; j++)
+                 os << polygonsconnectivity[polygonsconnectivityindex[i]-1+j] << " ";
+               os << endl;
+             }
+         }
+
+       os << endl << "MED_POLYHEDRA : " << co.getNumberOfPolyhedron() << " polyhedron" << endl;
+       if (co.getNumberOfPolyhedron() > 0)
+         {
+           const int* polyhedronconnectivity = co.getPolyhedronConnectivity(MED_DESCENDING);
+           const int* polyhedronindex = co.getPolyhedronIndex(MED_DESCENDING);
+
+           for (int i=0; i<co.getNumberOfPolyhedron(); i++)
+             {
+               int numberoffacesperpolyhedra = polyhedronindex[i+1]-polyhedronindex[i];
+               for (int j=0; j<numberoffacesperpolyhedra; j++)
+                 os << polyhedronconnectivity[polyhedronindex[i]-1+j] << " ";
+               os << endl;
+             }
+         }
+
     }
 
     if (co._constituent)
     }
 
     if (co._constituent)
@@ -1722,3 +1852,307 @@ ostream & MEDMEM::operator<<(ostream &os, CONNECTIVITY &co)
 
     return os;
 }
 
     return os;
 }
+
+/*!
+  method that adds to vector 'nodes' all the nodes of polyhedron with id 'polyhedronId'.
+  WARNING the returned pointer should be deallocated. Returned nodes and polyhedronId are in form [1,...]
+ */
+int *CONNECTIVITY::getNodesOfPolyhedron(int polyhedronId, int& lgthOfTab) const
+{
+  const int *nodes=getPolyhedronConnectivity(MED_EN::MED_NODAL);
+  const int *faces=getPolyhedronFacesIndex();
+  const int *glob=getPolyhedronIndex(MED_EN::MED_NODAL);
+  int offsetWithClassicType=getNumberOf(_entity,MED_ALL_ELEMENTS);
+  set<int> retInSet;
+  int startFace=glob[polyhedronId-offsetWithClassicType-1]-1;
+  int endFace=glob[polyhedronId-offsetWithClassicType]-1;
+  int i;
+  for(i=startFace;i!=endFace;i++)
+    {
+      for(int j=faces[i];j<faces[i+1];j++)
+       retInSet.insert(nodes[j-1]);
+    }
+  lgthOfTab=retInSet.size();
+  int *ret=new int[lgthOfTab];
+  set<int>::iterator iter=retInSet.begin();
+  i=0;
+  for(iter=retInSet.begin();iter!=retInSet.end();iter++)
+    ret[i++]=*iter;
+  return ret;
+}
+
+/*!
+  Idem as MESH::getNodesOfPolyhedron except that returned nodes are sorted by face. 'nbOfNodesPerFaces' is an array of size 'nbOfFaces'. 
+  Returned int** has a size of 'nbOfNodesPerFaces' too, and for each element j in int** the size is  nbOfNodesPerFaces[j].
+  Warning both returned 'nbOfNodesPerFaces' and returned value should be deallocated. Returned nodes and 'polyhedronId' are in form [1,...]
+ */
+int **CONNECTIVITY::getNodesPerFaceOfPolyhedron(int polyhedronId, int& nbOfFaces, int* & nbOfNodesPerFaces) const
+{
+  int i;
+  const int *nodes=getPolyhedronConnectivity(MED_EN::MED_NODAL);
+  const int *faces=getPolyhedronFacesIndex();
+  const int *glob=getPolyhedronIndex(MED_EN::MED_NODAL);
+  int offsetWithClassicType=getNumberOf(_entity,MED_ALL_ELEMENTS);
+
+  int startFace=glob[polyhedronId-offsetWithClassicType-1]-1;
+  nbOfFaces=glob[polyhedronId-offsetWithClassicType]-startFace-1;
+  nbOfNodesPerFaces=new int[nbOfFaces];
+  int **ret=new int* [nbOfFaces];
+  for(i=0;i<nbOfFaces;i++)
+    {
+      int startNode=faces[startFace+i]-1;
+      nbOfNodesPerFaces[i]=faces[startFace+i+1]-startNode-1;
+      ret[i]=(int *)(nodes)+startNode;
+    }
+  return ret;
+}
+
+int CONNECTIVITY::getNumberOfTypesWithPoly(MED_EN::medEntityMesh Entity) const
+{
+  if (_entity==Entity)
+    return _numberOfTypes+getNumberOfPolyType(); 
+  else if (_constituent!=NULL)
+    return _constituent->getNumberOfTypesWithPoly(Entity);
+  else
+    return 0;
+}
+
+int CONNECTIVITY::getNumberOfPolyType()  const
+{
+  if (_entity==MED_CELL && _entityDimension==3)
+    {
+      if(getNumberOfPolyhedron()>0)
+       return 1;
+    }
+  else if ((_entity==MED_CELL && _entityDimension==2) || (_entity==MED_FACE && _entityDimension==2))
+    if(getNumberOfPolygons()>0)
+      return 1;
+  return 0;
+}
+
+int CONNECTIVITY::getNumberOfElementOfPolyType(MED_EN::medEntityMesh Entity)  const
+{
+  if(_entity==Entity)
+    {
+      if (_entity==MED_CELL && _entityDimension==3)
+       return getNumberOfPolyhedron();
+      else if ((_entity==MED_CELL && _entityDimension==2) || (_entity==MED_FACE && _entityDimension==2))
+       return getNumberOfPolygons();
+      return 0;
+    }
+  else
+    {
+      if(_constituent!=NULL)
+       return _constituent->getNumberOfElementOfPolyType(Entity);
+      else
+       throw MEDEXCEPTION("_constituent required to evaluate getNumberOfElementOfPolyType");
+    }
+}
+
+/*
+  Method equivalent to getGeometricTypes except that it includes not only classical Types but polygons/polyhedra also.
+  WARNING the returned array MUST be deallocated.
+ */
+MED_EN::medGeometryElement * CONNECTIVITY::getGeometricTypesWithPoly(MED_EN::medEntityMesh Entity) const throw (MEDEXCEPTION)
+{
+  if(_entity==Entity)
+    {
+      int nbOfTypesTotal=getNumberOfTypesWithPoly(Entity);
+      int nbOfTypesWithoutPoly=getNumberOfTypes(Entity);
+      medGeometryElement *ret=new medGeometryElement[nbOfTypesTotal];
+      memcpy(ret,getGeometricTypes(Entity),nbOfTypesWithoutPoly*sizeof(medGeometryElement));
+      if(nbOfTypesTotal>nbOfTypesWithoutPoly)
+       {
+         if (Entity==MED_CELL && _entityDimension==3)
+           ret[nbOfTypesWithoutPoly]=MED_EN::MED_POLYHEDRA;
+         else if((Entity==MED_CELL && _entityDimension==2) || (Entity==MED_FACE && _entityDimension==2))
+           ret[nbOfTypesWithoutPoly]=MED_EN::MED_POLYGON;
+       }
+      return ret;
+    }
+  else
+    {
+      if(_constituent)
+       return _constituent->getGeometricTypesWithPoly(Entity);
+      throw MEDEXCEPTION("_constituent required to evaluate getGeometricTypesWithPoly");
+    }
+}
+
+/*
+  Method used in CalculateDescendingConnectivity. So it's typically a private method.
+  The aim of this method is to hide to CalculateDescendingConnectivity algorithm the fact that in reverse connectivity polygons and polyhedrons 
+  are not in separate data structure, contrary to not reverse connectivities.
+ */
+int CONNECTIVITY::getIndexOfEndClassicElementInReverseNodal(const int *reverseNodalValue, const int *reverseNodalIndex, int rk)  const
+{
+  int nbOfLastElt=getNumberOf(_entity,MED_ALL_ELEMENTS);
+  int ret=reverseNodalIndex[rk];
+  for(int i=reverseNodalIndex[rk];i<reverseNodalIndex[rk+1];i++)
+    {
+      if(reverseNodalValue[i-1]<=nbOfLastElt)
+       ret++;
+    }
+  return ret;
+}
+
+/*
+  Method that inverts the face with faceId 'faceId' in the data structure. If it's a polygon face 'faceId' is a value between 1 and nbOfPolygons.
+  This method has to be applied on a instance of MEDMEM::CONNECTIVITY with _entityDimension==3.
+  WARNING calculateDescendingConnectivity must have been called before.
+ */
+void CONNECTIVITY::invertConnectivityForAFace(int faceId, const int *nodalConnForFace, bool polygonFace)
+{
+  // we have always 2 neighbourings
+  int cell1 = _reverseDescendingConnectivity->getIJ(faceId,1);
+  int cell2 = _reverseDescendingConnectivity->getIJ(faceId,2);
+       
+  if (cell2 != 0) { // we are not on border, update compulsary. If we aren't on border no update necessary so WARNING because user specified a bad oriented face
+    // Updating _reverseDescendingConnectivity    
+    _reverseDescendingConnectivity->setIJ(faceId,1,cell2);
+    _reverseDescendingConnectivity->setIJ(faceId,2,cell1);
+    // Updating _constituent->_nodal because of reversity
+    MEDSKYLINEARRAY *currentNodal=(!polygonFace)?_constituent->_nodal:_constituent->_polygonsNodal;
+    MEDSKYLINEARRAY *currentDescending=(!polygonFace)?_descending:_polygonsDescending;
+    const int *descendingNodalIndex=(!polygonFace)?_constituent->_nodal->getIndex():_constituent->_polygonsNodal->getIndex();
+    const int *newDescendingIndex=(!polygonFace)?_descending->getIndex():_polygonsDescending->getIndex();
+    for(int iarray=1;iarray<=(descendingNodalIndex[faceId]-descendingNodalIndex[faceId-1]);iarray++)
+      currentNodal->setIJ(faceId,iarray,nodalConnForFace[iarray-1]);
+      
+    // Updating _descending for cell1 and cell2
+    for(int iface=newDescendingIndex[cell1-1];iface<=newDescendingIndex[cell1];iface++)
+      if (currentDescending->getIndexValue(iface)==faceId)
+       currentDescending->setIndexValue(iface,-faceId);
+      else if (currentDescending->getIndexValue(iface)==-faceId)
+       currentDescending->setIndexValue(iface,faceId);
+             
+    for(int iface=newDescendingIndex[cell2-1];iface<newDescendingIndex[cell2];iface++)
+      if (currentDescending->getIndexValue(iface)==faceId)
+       currentDescending->setIndexValue(iface,-faceId);
+      else if (_descending->getIndexValue(iface)==-faceId)
+       currentDescending->setIndexValue(iface,faceId);
+  } 
+}
+
+/*
+  Method with 2 output : the connectivity required and its length 'lgth'. This method gives the connectivity independently it is a polygons/polyhedrons or normal
+  element.
+ */
+const int * CONNECTIVITY::getConnectivityOfAnElementWithPoly(MED_EN::medConnectivity ConnectivityType, MED_EN::medEntityMesh Entity, int Number, int &lgth)
+{
+  if(Entity==MED_EN::MED_NODE)
+    throw  MEDEXCEPTION("No connectivity attached to a node entity");
+  if(Entity==_entity)
+    {
+      if(_entity==MED_EDGE && _entityDimension==1)
+       {
+         const int * newConstituentValue = 0;
+         const int * newConstituentIndex = 0;
+         newConstituentValue = getConnectivity(ConnectivityType,Entity,MED_ALL_ELEMENTS);
+         newConstituentIndex = getConnectivityIndex(ConnectivityType,Entity);
+         lgth=newConstituentIndex[Number]-newConstituentIndex[Number-1];
+         return newConstituentValue+newConstituentIndex[Number-1]-1;
+       }
+      int nbOfClassicalElements=getNumberOf(_entity,MED_ALL_ELEMENTS);
+      if((_entity==MED_FACE && _entityDimension==2) || (_entity==MED_CELL && _entityDimension==2))
+       {
+         const int * newConstituentValue = 0;
+         const int * newConstituentIndex = 0;
+         if(Number<=nbOfClassicalElements)
+           {
+             newConstituentValue = getConnectivity(ConnectivityType,Entity,MED_ALL_ELEMENTS);
+             newConstituentIndex = getConnectivityIndex(ConnectivityType,Entity);
+             lgth=newConstituentIndex[Number]-newConstituentIndex[Number-1];
+             return newConstituentValue+newConstituentIndex[Number-1]-1;
+           }
+         else
+           {
+             int localNumber=Number-nbOfClassicalElements-1;
+             if(localNumber<getNumberOfPolygons())
+               {
+                 newConstituentValue = getPolygonsConnectivity(ConnectivityType,Entity);
+                 newConstituentIndex = getPolygonsConnectivityIndex(ConnectivityType,Entity);
+                 lgth=newConstituentIndex[localNumber+1]-newConstituentIndex[localNumber];
+                 return newConstituentValue+newConstituentIndex[localNumber]-1;
+               }
+             else
+               throw  MEDEXCEPTION("Unknown number");
+           }
+       }
+      else if(_entity==MED_CELL && _entityDimension==3)
+       {
+         const int * newConstituentValue = 0;
+         const int * newConstituentIndex = 0;
+         if(Number<=nbOfClassicalElements)
+           {
+             newConstituentValue = getConnectivity(ConnectivityType,Entity,MED_ALL_ELEMENTS);
+             newConstituentIndex = getConnectivityIndex(ConnectivityType,Entity);
+             lgth=newConstituentIndex[Number]-newConstituentIndex[Number-1];
+             return newConstituentValue+newConstituentIndex[Number-1]-1;
+           }
+         else
+           {
+             int localNumber=Number-nbOfClassicalElements-1;
+             if(localNumber<getNumberOfPolyhedron())
+               {
+                 if(ConnectivityType==MED_NODAL)
+                   throw  MEDEXCEPTION("NODAL Connectivity required for a polyhedron");
+                 newConstituentValue = _polyhedronDescending->getValue();
+                 newConstituentIndex = _polyhedronDescending->getIndex();
+                 lgth=newConstituentIndex[localNumber+1]-newConstituentIndex[localNumber];
+                 return newConstituentValue+newConstituentIndex[localNumber]-1;
+               }
+             else
+               throw  MEDEXCEPTION("Unknown number");
+           }
+       }
+      else
+       throw MEDEXCEPTION("No connectivity available");
+    }
+  else
+    {
+      if(_constituent==NULL)
+       calculateDescendingConnectivity();
+      return _constituent->getConnectivityOfAnElementWithPoly(ConnectivityType,Entity,Number,lgth);
+    }
+}
+
+int CONNECTIVITY::getNumberOfElementsWithPoly(MED_EN::medEntityMesh Entity, MED_EN::medGeometryElement Type) const
+{
+  if(Entity==MED_EN::MED_NODE)
+    return _numberOfNodes;
+  if(Entity==_entity)
+    {
+      if(Type==MED_POLYGON || Type==MED_POLYHEDRA)
+       return getNumberOfElementOfPolyType(_entity);
+      else
+       return getNumberOf(_entity,Type);       
+    }
+  else
+    {
+      if(_constituent)
+       return _constituent->getNumberOfElementsWithPoly(Entity,Type);
+      else
+       throw MEDEXCEPTION("CONNECTIVITY::getNumberOfElementsWithPoly : _constituent needed");
+    }
+}
+
+/*! 
+  Perform a deep comparison of the 2 connectivities in NODAL mode and on all elements.
+*/
+bool CONNECTIVITY::deepCompare(const CONNECTIVITY& other) const
+{
+  CONNECTIVITY* temp=(CONNECTIVITY* )this;
+  const int *conn1=temp->getConnectivity(MED_NODAL,_entity,MED_ALL_ELEMENTS);
+  int size1=temp->getConnectivityLength(MED_NODAL,_entity,MED_ALL_ELEMENTS);
+  temp=(CONNECTIVITY* )(&other);
+  const int *conn2=temp->getConnectivity(MED_NODAL,_entity,MED_ALL_ELEMENTS);
+  int size2=temp->getConnectivityLength(MED_NODAL,_entity,MED_ALL_ELEMENTS);
+  if(size1!=size2)
+    return false;
+  bool ret=true;
+  for(int i=0;i<size1 && ret;i++)
+    {
+      ret=(conn1[i]==conn2[i]);
+    }
+  return ret;
+}
index 9613fc55f85d005f5f7a2cc68022559572111574..3e568055e2f461288a52f99f2e0a272a2c0e2608 100644 (file)
@@ -6,6 +6,7 @@
 #include "utilities.h"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_define.hxx"
 #include "utilities.h"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_define.hxx"
+#include "MEDMEM_PolyhedronArray.hxx"
 
 namespace MEDMEM {
 class MEDSKYLINEARRAY;
 
 namespace MEDMEM {
 class MEDSKYLINEARRAY;
@@ -60,9 +61,17 @@ protected:
 
                                        /*! pointer to an array which stores the nodal connectivity */
   MEDSKYLINEARRAY* _nodal;
 
                                        /*! pointer to an array which stores the nodal connectivity */
   MEDSKYLINEARRAY* _nodal;
+                                        /*! pointer to an array which stores the nodal connectivity only for polygons */
+  MEDSKYLINEARRAY* _polygonsNodal;
+                                        /*! pointer to an array which stores the nodal connectivity only for polyhedron */
+  POLYHEDRONARRAY* _polyhedronNodal;
                                        /*! pointer to an array which stores 
                                            the descending connectivity */
   MEDSKYLINEARRAY* _descending;
                                        /*! pointer to an array which stores 
                                            the descending connectivity */
   MEDSKYLINEARRAY* _descending;
+                                        /*!  pointer to an array which stores the descending connectivity only for polygons */
+  MEDSKYLINEARRAY* _polygonsDescending;
+                                        /*!  pointer to an array which stores the descending connectivity only for polyhedron */
+  MEDSKYLINEARRAY* _polyhedronDescending;
                                        /*! pointer to an array which stores 
                                            the reverse nodal connectivity */
   MEDSKYLINEARRAY* _reverseNodalConnectivity;
                                        /*! pointer to an array which stores 
                                            the reverse nodal connectivity */
   MEDSKYLINEARRAY* _reverseNodalConnectivity;
@@ -112,10 +121,18 @@ private:
                                            evaluates _neighbourhood from _descending */
   void calculateNeighbourhood(CONNECTIVITY &myConnectivity);
 
                                            evaluates _neighbourhood from _descending */
   void calculateNeighbourhood(CONNECTIVITY &myConnectivity);
 
+  int getIndexOfEndClassicElementInReverseNodal(const int *reverseNodalValue, const int *reverseNodalIndex, int rk)  const;
+
 public:
 
 public:
 
-  friend class MED_MESH_RDONLY_DRIVER;
-  friend class MED_MESH_WRONLY_DRIVER;
+  friend class IMED_MESH_RDONLY_DRIVER;
+  friend class MED_MESH_RDONLY_DRIVER21;
+  friend class IMED_MESH_WRONLY_DRIVER;
+  friend class MED_MESH_WRONLY_DRIVER21;
+  friend class MED_MESH_RDONLY_DRIVER22;
+  friend class MED_MESH_WRONLY_DRIVER22;
+
+
   friend ostream & operator<<(ostream &os, CONNECTIVITY &connectivity);
 
   // in order to fill CONNECTIVITY of MESH
   friend ostream & operator<<(ostream &os, CONNECTIVITY &connectivity);
 
   // in order to fill CONNECTIVITY of MESH
@@ -147,28 +164,73 @@ public:
 
   inline void setEntityDimension(int EntityDimension);
 
 
   inline void setEntityDimension(int EntityDimension);
 
+  void setPolygonsConnectivity(MED_EN::medConnectivity ConnectivityType,
+                              MED_EN::medEntityMesh Entity,
+                              const int* PolygonsConnectivity,
+                              const int* PolygonsConnectivityIndex,
+                              int ConnectivitySize, int NumberOfPolygons);
+
+  void setPolyhedronConnectivity(MED_EN::medConnectivity ConnectivityType,
+                                const int* PolyhedronConnectivity,
+                                const int* PolyhedronIndex, int ConnectivitySize,
+                                int NumberOfPolyhedron,
+                                const int* PolyhedronFacesIndex= (int*) NULL,
+                                int NumberOfFaces=0);
+
   inline bool   existConnectivity     (MED_EN::medConnectivity connectivityType, MED_EN::medEntityMesh Entity) const;
   inline bool   existConnectivity     (MED_EN::medConnectivity connectivityType, MED_EN::medEntityMesh Entity) const;
+  
+  inline bool existPolygonsConnectivity(MED_EN::medConnectivity connectivityType,
+                                       MED_EN::medEntityMesh Entity) const;
+
+  inline bool existPolyhedronConnectivity(MED_EN::medConnectivity connectivityType,
+                                         MED_EN::medEntityMesh Entity) const;
 
   virtual void          calculateConnectivity (MED_EN::medConnectivity connectivityType, MED_EN::medEntityMesh Entity);
 
 
   virtual void          calculateConnectivity (MED_EN::medConnectivity connectivityType, MED_EN::medEntityMesh Entity);
 
-  virtual void          updateFamily (vector<FAMILY*> myFamilies);
-  virtual void          updateGroup (vector<GROUP*> myFamilies);
+  virtual void          updateFamily (const vector<FAMILY*>& myFamilies);
 
   inline MED_EN::medEntityMesh              getEntity               ()                     const;
   inline int                    getNumberOfTypes        (MED_EN::medEntityMesh Entity) const;
 
   inline MED_EN::medEntityMesh              getEntity               ()                     const;
   inline int                    getNumberOfTypes        (MED_EN::medEntityMesh Entity) const;
+  int                    getNumberOfTypesWithPoly(MED_EN::medEntityMesh Entity) const;
+  const int * getConnectivityOfAnElementWithPoly(MED_EN::medConnectivity ConnectivityType,
+                                                MED_EN::medEntityMesh Entity,
+                                                int Number, int &lgth);
+  int getNumberOfPolyType()  const;
+  int getNumberOfElementsWithPoly(MED_EN::medEntityMesh Entity, MED_EN::medGeometryElement Type) const;
+  int getNumberOfElementOfPolyType(MED_EN::medEntityMesh Entity)  const;
   inline const MED_EN::medGeometryElement * getGeometricTypes       (MED_EN::medEntityMesh Entity) const
                                                             throw (MEDEXCEPTION);
   inline const MED_EN::medGeometryElement * getGeometricTypes       (MED_EN::medEntityMesh Entity) const
                                                             throw (MEDEXCEPTION);
+  MED_EN::medGeometryElement * getGeometricTypesWithPoly       (MED_EN::medEntityMesh Entity) const
+                                                            throw (MEDEXCEPTION);
   MED_EN::medGeometryElement                getElementType          (MED_EN::medEntityMesh Entity,
                                                             int Number)           const;
   MED_EN::medGeometryElement                getElementType          (MED_EN::medEntityMesh Entity,
                                                             int Number)           const;
+  MED_EN::medGeometryElement                getElementTypeWithPoly          (MED_EN::medEntityMesh Entity,
+                                                            int Number)           const;
+  inline MED_EN::medGeometryElement                getPolyTypeRelativeTo() const;
   virtual inline const int *                getGlobalNumberingIndex (MED_EN::medEntityMesh Entity) const
                                                             throw (MEDEXCEPTION);
 
   virtual const int *     getConnectivity      (MED_EN::medConnectivity ConnectivityType, 
                                            MED_EN::medEntityMesh Entity,
                                             MED_EN::medGeometryElement Type);
   virtual inline const int *                getGlobalNumberingIndex (MED_EN::medEntityMesh Entity) const
                                                             throw (MEDEXCEPTION);
 
   virtual const int *     getConnectivity      (MED_EN::medConnectivity ConnectivityType, 
                                            MED_EN::medEntityMesh Entity,
                                             MED_EN::medGeometryElement Type);
+  virtual int getConnectivityLength        (MED_EN::medConnectivity ConnectivityType, 
+                                           MED_EN::medEntityMesh Entity,
+                                            MED_EN::medGeometryElement Type);
   virtual const int *     getConnectivityIndex (MED_EN::medConnectivity ConnectivityType,
                                            MED_EN::medEntityMesh Entity);
   virtual const int *     getConnectivityIndex (MED_EN::medConnectivity ConnectivityType,
                                            MED_EN::medEntityMesh Entity);
+
+  const int* getPolygonsConnectivity(MED_EN::medConnectivity ConnectivityType,
+                                    MED_EN::medEntityMesh Entity);
+  const int* getPolygonsConnectivityIndex(MED_EN::medConnectivity ConnectivityType,
+                                         MED_EN::medEntityMesh Entity);
+  int getNumberOfPolygons() const;
+  const int* getPolyhedronConnectivity(MED_EN::medConnectivity ConnectivityType) const;
+  const int* getPolyhedronFacesIndex() const;
+  const int* getPolyhedronIndex(MED_EN::medConnectivity ConnectivityType) const;
+  int getNumberOfPolyhedronFaces() const;
+  int getNumberOfPolyhedron() const;
+  int *getNodesOfPolyhedron(int polyhedronId, int& lgthOfTab) const;
+  int **getNodesPerFaceOfPolyhedron(int polyhedronId, int& nbOfFaces, int* & nbOfNodesPerFaces) const;
   const CELLMODEL &   getType              (MED_EN::medGeometryElement Type) const; 
   const CELLMODEL *   getCellsTypes        (MED_EN::medEntityMesh Entity)    const 
                                            throw (MEDEXCEPTION);
   const CELLMODEL &   getType              (MED_EN::medGeometryElement Type) const; 
   const CELLMODEL *   getCellsTypes        (MED_EN::medEntityMesh Entity)    const 
                                            throw (MEDEXCEPTION);
@@ -189,7 +251,8 @@ public:
                                                     throw (MEDEXCEPTION);
 
   const int*      getNeighbourhood() const;
                                                     throw (MEDEXCEPTION);
 
   const int*      getNeighbourhood() const;
-
+  void invertConnectivityForAFace(int faceId, const int *nodalConnForFace, bool polygonFace=false);
+  bool deepCompare(const CONNECTIVITY& other) const;
 };
 /*----------------------*/
 /* Methodes Inline     */
 };
 /*----------------------*/
 /* Methodes Inline     */
@@ -215,35 +278,35 @@ inline int CONNECTIVITY::getNumberOfTypes(MED_EN::medEntityMesh Entity) const
     return _numberOfTypes; 
   else if (_constituent!=NULL)
     return _constituent->getNumberOfTypes(Entity);
     return _numberOfTypes; 
   else if (_constituent!=NULL)
     return _constituent->getNumberOfTypes(Entity);
-//   else if (_constituent == NULL)
-//     {
-//       MESSAGE("CONNECTIVITY::getNumberOfTypes : _constituent == NULL");
-//       try
-//     {
-//       (const_cast <CONNECTIVITY *> (this))->calculateDescendingConnectivity();
-//     }
-//       catch (MEDEXCEPTION & ex)
-//     {
-//       return 0 ;
-//     }
-
-//       SCRUTE(_entityDimension);
-
-//       if (_entityDimension != 2 && _entityDimension != 3) return 0;
-
-//       try
-//     {
-//       _constituent->calculateConnectivity(MED_NODAL,Entity);
-//     }
-//       catch (MEDEXCEPTION & ex)
-//     {
-//       return 0 ;
-//     }
-
-//       return _constituent->getNumberOfTypes(Entity);
-//     }
+  else if (_constituent == NULL)
+    {
+      MESSAGE("CONNECTIVITY::getNumberOfTypes : _constituent == NULL");
+      try
+       {
+         (const_cast <CONNECTIVITY *> (this))->calculateDescendingConnectivity();
+       }
+      catch (MEDEXCEPTION & ex)
+       {
+         return 0 ;
+       }
+
+      SCRUTE(_entityDimension);
+
+      if (_entityDimension != 2 && _entityDimension != 3) return 0;
+
+      try
+       {
+         _constituent->calculateConnectivity(MED_EN::MED_NODAL,Entity);
+       }
+      catch (MEDEXCEPTION & ex)
+       {
+         return 0 ;
+       }
+
+      return _constituent->getNumberOfTypes(Entity);
+    }
   else
   else
-    return 0; // because it is the right information (no exception needed)!
+       return 0; // because it is the right information (no exception needed)!
 }
 
 /*!  Returns an array of all %medGeometryElement types existing in the mesh 
 }
 
 /*!  Returns an array of all %medGeometryElement types existing in the mesh 
@@ -297,7 +360,6 @@ inline bool CONNECTIVITY::existConnectivity( MED_EN::medConnectivity Connectivit
 //-----------------------------------------------------------------------------//
 {
   if (_entity==Entity) { 
 //-----------------------------------------------------------------------------//
 {
   if (_entity==Entity) { 
-    MESSAGE("existConnectivity : _entity==Entity="<<Entity);
     if ((ConnectivityType==MED_EN::MED_NODAL)&(_nodal!=(MEDSKYLINEARRAY*)NULL))
       return true;
     if ((ConnectivityType==MED_EN::MED_DESCENDING)&(_descending!=(MEDSKYLINEARRAY*)NULL))
     if ((ConnectivityType==MED_EN::MED_NODAL)&(_nodal!=(MEDSKYLINEARRAY*)NULL))
       return true;
     if ((ConnectivityType==MED_EN::MED_DESCENDING)&(_descending!=(MEDSKYLINEARRAY*)NULL))
@@ -307,6 +369,44 @@ inline bool CONNECTIVITY::existConnectivity( MED_EN::medConnectivity Connectivit
   return false;
 }
 
   return false;
 }
 
+/*! Returns true if a polygons connectivity exists on elements of type "Entity" */
+//-----------------------------------------------------------------------------//
+inline bool CONNECTIVITY::existPolygonsConnectivity(MED_EN::medConnectivity ConnectivityType,
+                                                   MED_EN::medEntityMesh Entity) const
+//-----------------------------------------------------------------------------//
+{
+  if (_entity == Entity)
+    {
+      MESSAGE("existPolygonsConnectivity : _entity == Entity = "<<Entity);
+      if (ConnectivityType == MED_EN::MED_NODAL && _polygonsNodal != (MEDSKYLINEARRAY*) NULL)
+       return true;
+      if (ConnectivityType == MED_EN::MED_DESCENDING && _polygonsDescending != (MEDSKYLINEARRAY*) NULL)
+       return true;
+    }
+  else if (_constituent != (CONNECTIVITY*) NULL)
+    return _constituent->existPolygonsConnectivity(ConnectivityType,Entity);
+  return false;
+}
+
+/*! Returns true if a polyhedron connectivity exists on elements of type "Entity" */
+//-----------------------------------------------------------------------------//
+inline bool CONNECTIVITY::existPolyhedronConnectivity(MED_EN::medConnectivity ConnectivityType,
+                                                     MED_EN::medEntityMesh Entity) const
+//-----------------------------------------------------------------------------//
+{
+  if (_entity == Entity)
+    {
+      MESSAGE("existPolyhedronConnectivity : _entity == Entity = "<<Entity);
+      if (ConnectivityType == MED_EN::MED_NODAL && _polyhedronNodal != (POLYHEDRONARRAY*) NULL)
+       return true;
+      if (ConnectivityType == MED_EN::MED_DESCENDING && _polyhedronDescending != (MEDSKYLINEARRAY*) NULL)
+       return true;
+    }
+  else if (_constituent != (CONNECTIVITY*) NULL)
+    return _constituent->existPolyhedronConnectivity(ConnectivityType,Entity);
+  return false;
+}
+
 /*! 
 Returns an array containing CELLMODEL foreach element type present 
 in connectivity for given medEntityMesh (similar as getGeometricTypes).\n
 /*! 
 Returns an array containing CELLMODEL foreach element type present 
 in connectivity for given medEntityMesh (similar as getGeometricTypes).\n
@@ -388,6 +488,16 @@ int CONNECTIVITY::getEntityDimension() const
   return _entityDimension;
 }
 
   return _entityDimension;
 }
 
+MED_EN::medGeometryElement CONNECTIVITY::getPolyTypeRelativeTo() const
+{
+  if(_entity==MED_EN::MED_CELL && _entityDimension==3)
+    return MED_EN::MED_POLYHEDRA;
+  else if((_entity==MED_EN::MED_CELL && _entityDimension==2) || (_entity==MED_EN::MED_FACE && _entityDimension==2))
+    return MED_EN::MED_POLYGON;
+  else
+    throw MEDEXCEPTION("getPolyTypeRelativeTo : ");
+}
+
 }//End namespace MEDMEM
 
 #endif /* CONNECTIVITY_HXX */
 }//End namespace MEDMEM
 
 #endif /* CONNECTIVITY_HXX */
index 741b68278473abd0bddfd9db7e978b23a093e770..4e28af261e34d7d49dd34ab86ca70d477e621841 100644 (file)
@@ -55,8 +55,12 @@ protected:
 
 public :
 
 
 public :
 
-  friend class MED_MESH_RDONLY_DRIVER;
-  friend class MED_MESH_WRONLY_DRIVER;
+  friend class IMED_MESH_RDONLY_DRIVER;
+  friend class MED_MESH_RDONLY_DRIVER21;
+  friend class IMED_MESH_WRONLY_DRIVER;
+  friend class MED_MESH_WRONLY_DRIVER21;
+  friend class MED_MESH_RDONLY_DRIVER22;
+  friend class MED_MESH_WRONLY_DRIVER22;
 
 
   COORDINATE();
 
 
   COORDINATE();
index f6e8037e9357f111fe35b431a2c61efb0d2e22f5..28491c69c8fd5c80a526f73e38a597b81ecdd452 100644 (file)
@@ -1,24 +1,47 @@
 #include "MEDMEM_DriverFactory.hxx"
 #include "MEDMEM_DriverFactory.hxx"
-
-#include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_MedMedDriver.hxx"
 #include "MEDMEM_MedMeshDriver.hxx"
 #include "MEDMEM_MedMeshDriver.hxx"
+#include "MEDMEM_Mesh.hxx"
 #include "MEDMEM_GibiMeshDriver.hxx"
 #include "MEDMEM_PorflowMeshDriver.hxx"
 #include "MEDMEM_VtkMeshDriver.hxx"
 #include "MEDMEM_GibiMeshDriver.hxx"
 #include "MEDMEM_PorflowMeshDriver.hxx"
 #include "MEDMEM_VtkMeshDriver.hxx"
-
-#include "MEDMEM_Med.hxx"
-#include "MEDMEM_MedMedDriver.hxx"
 #include "MEDMEM_VtkMedDriver.hxx"
 
 #include "MEDMEM_VtkMedDriver.hxx"
 
-//#include "MEDMEM_Field.hxx"
-
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_Exception.hxx"
-//#include "MEDMEM_STRING.hxx"
-//#include "utilities.h"
+
+#include "MEDMEM_MedVersion.hxx"
+#include "MEDMEM_Compatibility21_22.hxx"
+#include "MEDMEM_MedMedDriver21.hxx"
+#include "MEDMEM_MedMedDriver22.hxx"
+#include "MEDMEM_MedMeshDriver21.hxx"
+#include "MEDMEM_MedMeshDriver22.hxx"
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
+template<>
+void fill<-1,0x3>(double *a, const double *b)
+{
+}
+
+template<>
+bool compare<-1>(const double *a, const double *b)
+{
+  return false;
+}
+
+MED_EN::medFileVersion DRIVERFACTORY::globalMedFileVersionForWriting = MED_EN::V22;
+
+medFileVersion DRIVERFACTORY::getMedFileVersionForWriting()
+{
+  return DRIVERFACTORY::globalMedFileVersionForWriting;
+}
+
+void DRIVERFACTORY::setMedFileVersionForWriting(medFileVersion version)
+{
+  DRIVERFACTORY::globalMedFileVersionForWriting = version;
+}
+
 GENDRIVER *DRIVERFACTORY::buildDriverForMesh(driverTypes driverType,
                                             const std::string & fileName,
                                             MESH *mesh,
 GENDRIVER *DRIVERFACTORY::buildDriverForMesh(driverTypes driverType,
                                             const std::string & fileName,
                                             MESH *mesh,
@@ -32,21 +55,19 @@ GENDRIVER *DRIVERFACTORY::buildDriverForMesh(driverTypes driverType,
       switch(access)
        {
        case MED_LECT : {
       switch(access)
        {
        case MED_LECT : {
-         MED_MESH_RDONLY_DRIVER *retmed=new MED_MESH_RDONLY_DRIVER(fileName,
-                                                                   mesh);
-         retmed->setMeshName(driverName);
-         return retmed;
+         ret = new MED_MESH_RDONLY_DRIVER(fileName, mesh);
+         ret->setMeshName(driverName);
+         return ret;
        }
        case MED_ECRI : {
        }
        case MED_ECRI : {
-         MED_MESH_WRONLY_DRIVER *retmed=new MED_MESH_WRONLY_DRIVER(fileName,
-                                                                   mesh);
-         retmed->setMeshName(driverName);
-         return retmed;
+         ret = new MED_MESH_WRONLY_DRIVER(fileName, mesh);
+         ret->setMeshName(driverName);
+         return ret;
        }
        case MED_REMP : {
        }
        case MED_REMP : {
-         MED_MESH_RDWR_DRIVER *retmed=new MED_MESH_RDWR_DRIVER(fileName,mesh);
-         retmed->setMeshName(driverName);
-         return retmed;
+         ret = new MED_MESH_RDWR_DRIVER(fileName, mesh);
+         ret->setMeshName(driverName);
+         return ret;
        }
        default:
          throw MED_EXCEPTION ("access type has not been properly specified to the method");
        }
        default:
          throw MED_EXCEPTION ("access type has not been properly specified to the method");
@@ -189,3 +210,136 @@ GENDRIVER *DRIVERFACTORY::buildDriverForMed(driverTypes driverType,
   return ret;
 }
 
   return ret;
 }
 
+GENDRIVER * DRIVERFACTORY::buildMedDriverFromFile(const string & fileName,
+                                                 MED * const ptrMed,
+                                                 MED_EN::med_mode_acces access)
+{
+  medFileVersion version;
+
+  try
+    {
+      version = getMedFileVersion(fileName);
+    }
+  catch (MEDEXCEPTION & ex)
+    {
+      version = DRIVERFACTORY::globalMedFileVersionForWriting;
+    }
+
+  MESSAGE("buildMedDriverFromFile version of the file " << version);
+
+  GENDRIVER * driver;
+
+  switch(access)
+    {
+    case MED_LECT : {
+      if (version == V21)
+       driver = new MED_MED_RDONLY_DRIVER21(fileName,ptrMed);
+      else if (version == V22)
+       driver = new MED_MED_RDONLY_DRIVER22(fileName,ptrMed);
+      return driver;
+    }
+    case MED_ECRI : {
+      if (version == V21)
+       driver = new MED_MED_WRONLY_DRIVER21(fileName,ptrMed);
+      else if (version == V22)
+       driver = new MED_MED_WRONLY_DRIVER22(fileName,ptrMed);
+      return driver;
+    }
+    case MED_REMP : {
+      if (version == V21)
+       driver = new MED_MED_RDWR_DRIVER21(fileName,ptrMed);
+      else if (version == V22)
+       driver = new MED_MED_RDWR_DRIVER22(fileName,ptrMed);
+      return driver;
+    }
+    default:
+      throw MED_EXCEPTION ("access type has not been properly specified to the method");
+    }
+}
+
+GENDRIVER * DRIVERFACTORY::buildMeshDriverFromFile(const string & fileName,
+                                                  MESH * ptrMesh,
+                                                  MED_EN::med_mode_acces access)
+{
+  medFileVersion version;
+
+  try
+    {
+      version = getMedFileVersion(fileName);
+    }
+  catch (MEDEXCEPTION & ex)
+    {
+      version = DRIVERFACTORY::globalMedFileVersionForWriting;
+    }
+
+  MESSAGE("buildMeshDriverFromFile version of the file " << version);
+
+  GENDRIVER * driver;
+
+  switch(access)
+    {
+    case MED_LECT : {
+      if (version == V21)
+       driver = new MED_MESH_RDONLY_DRIVER21(fileName,ptrMesh);
+      else if (version == V22)
+       driver = new MED_MESH_RDONLY_DRIVER22(fileName,ptrMesh);
+      return driver;
+    }
+    case MED_ECRI : {
+      if (version == V21)
+       driver = new MED_MESH_WRONLY_DRIVER21(fileName,ptrMesh);
+      else if (version == V22)
+       driver = new MED_MESH_WRONLY_DRIVER22(fileName,ptrMesh);
+      return driver;
+    }
+    case MED_REMP : {
+      if (version == V21)
+       driver = new MED_MESH_RDWR_DRIVER21(fileName,ptrMesh);
+      else if (version == V22)
+       driver = new MED_MESH_RDWR_DRIVER22(fileName,ptrMesh);
+      return driver;
+    }
+    default:
+      throw MED_EXCEPTION ("access type has not been properly specified to the method");
+    }
+}
+
+GENDRIVER * DRIVERFACTORY::buildConcreteMedDriverForMesh(const std::string & fileName,
+                                                        MESH *ptrMesh,const string &  driverName,
+                                                        MED_EN::med_mode_acces access,
+                                                        MED_EN::medFileVersion version)
+{
+  GENDRIVER * driver;
+
+  MESSAGE("buildConcreteMedDriverForMesh version of the file " << version);
+
+  switch(access)
+    {
+    case MED_LECT : {
+      if (version == V21)
+       driver = new MED_MESH_RDONLY_DRIVER21(fileName,ptrMesh);
+      else if (version == V22)
+       driver = new MED_MESH_RDONLY_DRIVER22(fileName,ptrMesh);
+      driver->setMeshName(driverName);
+      return driver;
+    }
+    case MED_ECRI : {
+      if (version == V21)
+       driver = new MED_MESH_WRONLY_DRIVER21(fileName,ptrMesh);
+      else if (version == V22)
+       driver = new MED_MESH_WRONLY_DRIVER22(fileName,ptrMesh);
+      driver->setMeshName(driverName);
+      return driver;
+    }
+    case MED_REMP : {
+      if (version == V21)
+       driver = new MED_MESH_RDWR_DRIVER21(fileName,ptrMesh);
+      else if (version == V22)
+       driver = new MED_MESH_RDWR_DRIVER22(fileName,ptrMesh);
+      driver->setMeshName(driverName);
+      return driver;
+    }
+    default:
+      throw MED_EXCEPTION ("access type has not been properly specified to the method");
+    }
+}
index b3ad300a61c0c5cceaf7d3331788cd48d0e86bde..26295f0765d57b27541db6325f5be2232b12155e 100644 (file)
@@ -1,9 +1,10 @@
 #ifndef DRIVERFACTORY_HXX
 #define DRIVERFACTORY_HXX
 
 #ifndef DRIVERFACTORY_HXX
 #define DRIVERFACTORY_HXX
 
+#include "MEDMEM_MedVersion.hxx"
 #include "MEDMEM_GenDriver.hxx"
 #include "MEDMEM_GenDriver.hxx"
-#include "MEDMEM_VtkFieldDriver.hxx"
-#include "MEDMEM_MedFieldDriver.hxx"
+#include "MEDMEM_define.hxx"
+
 #include <string>
 
 namespace MEDMEM {
 #include <string>
 
 namespace MEDMEM {
@@ -11,94 +12,234 @@ namespace MEDMEM {
   class MESH;
   template<class T> class FIELD;
   class MED;
   class MESH;
   template<class T> class FIELD;
   class MED;
+  class GENDRIVER;
 
   namespace DRIVERFACTORY {
 
   namespace DRIVERFACTORY {
-    GENDRIVER *buildDriverForMesh(driverTypes driverType,
+
+    /*
+      definition of static variable across the Med Memory of a Med File version
+      for the writing of Med File set to V22
+    */
+
+    extern MED_EN::medFileVersion globalMedFileVersionForWriting;
+
+    MED_EN::medFileVersion getMedFileVersionForWriting();
+
+    void setMedFileVersionForWriting(MED_EN::medFileVersion version);
+
+    GENDRIVER * buildDriverForMesh(driverTypes driverType,
+                                  const std::string & fileName,
+                                  MESH *mesh,const string &  driverName,
+                                  MED_EN::med_mode_acces access);
+    template<class T>
+    GENDRIVER * buildDriverForField(driverTypes driverType,
+                                   const std::string & fileName,
+                                   FIELD<T> *fielde,
+                                   MED_EN::med_mode_acces access);
+    GENDRIVER * buildDriverForMed(driverTypes driverType,
                                  const std::string & fileName,
                                  const std::string & fileName,
-                                 MESH *mesh,const string &  driverName,
+                                 MED *mede,
                                  MED_EN::med_mode_acces access);
                                  MED_EN::med_mode_acces access);
+    GENDRIVER * buildMedDriverFromFile(const string & fileName,
+                                      MED * const ptrMed,
+                                      MED_EN::med_mode_acces access);
+    GENDRIVER * buildMeshDriverFromFile(const string & fileName,
+                                       MESH * ptrMesh,
+                                       MED_EN::med_mode_acces access);
     template<class T>
     template<class T>
-    GENDRIVER *buildDriverForField(driverTypes driverType,
-                                  const std::string & fileName,
-                                  FIELD<T> *fielde,
-                                  MED_EN::med_mode_acces access);
-    GENDRIVER *buildDriverForMed(driverTypes driverType,
-                                const std::string & fileName,
-                                MED *mede,
-                                MED_EN::med_mode_acces access);
+    GENDRIVER * buildFieldDriverFromFile(const string & fileName,
+                                        FIELD<T> * ptrField,
+                                        MED_EN::med_mode_acces access);
+    GENDRIVER * buildConcreteMedDriverForMesh(const std::string & fileName,
+                                             MESH *mesh,
+                                             const string & driverName,
+                                             MED_EN::med_mode_acces access,
+                                             MED_EN::medFileVersion version);
+    template<class T>
+    GENDRIVER * buildConcreteMedDriverForField(const std::string & fileName,
+                                              FIELD<T> *fielde,
+                                              MED_EN::med_mode_acces access,
+                                              MED_EN::medFileVersion version);
   }
   }
-
-template<class T>
-GENDRIVER *DRIVERFACTORY::buildDriverForField(driverTypes driverType,
-                                             const std::string & fileName,
-                                             FIELD<T> *field,
-                                             MED_EN::med_mode_acces access)
-{
-  GENDRIVER *ret;
-  switch(driverType)
-    {
-    case MED_DRIVER : {
-      switch(access)
-       {
-       case MED_EN::MED_LECT : {
-         ret=new MED_FIELD_RDONLY_DRIVER<T>(fileName,field);
-         break;
-       }
-       case MED_EN::MED_ECRI : {
-         ret=new MED_FIELD_WRONLY_DRIVER<T>(fileName,field);
-         break;
-       }
-       case MED_EN::MED_REMP : {
-         ret=new MED_FIELD_RDWR_DRIVER<T>(fileName,field);
-         break;
-       }
-       default:
-         throw MED_EXCEPTION ("access type has not been properly specified to the method");
-       }
-      break;
-    }
-
-    case VTK_DRIVER : {
-      switch(access)
-       {
-       case MED_EN::MED_LECT : {
-         throw MED_EXCEPTION ("access mode other than MED_ECRI and MED_REMP has been specified with the VTK_DRIVER type which is not allowed because VTK_DRIVER is only a write access driver");
-         break;
-       }
-       case MED_EN::MED_ECRI : {
-         ret=new VTK_FIELD_DRIVER<T>(fileName,field);
-         break;
-       }
-       case MED_EN::MED_REMP : {
-         ret=new VTK_FIELD_DRIVER<T>(fileName,field);
-         break ;
-       }
-       default:
-         throw MED_EXCEPTION ("access type has not been properly specified to the method");
-       }
-      break;
-    }
-
-    case GIBI_DRIVER : {
-      throw MED_EXCEPTION ("driverType other than MED_DRIVER and VTK_DRIVER has been specified to the method which is not allowed for the object FIELD");
-      break;
-    }
-
-    case PORFLOW_DRIVER : {
-      throw MED_EXCEPTION ("driverType other than MED_DRIVER and VTK_DRIVER has been specified to the method which is not allowed for the object FIELD");
-      break;
-    }
-
-    case NO_DRIVER : {
-      throw MED_EXCEPTION ("driverType other than MED_DRIVER and VTK_DRIVER has been specified to the method which is not allowed for the object FIELD");
-      break;
-    }
-    default:
-    MED_EXCEPTION ("driverType other than MED_DRIVER and VTK_DRIVER has been specified to the method which is not allowed for the object FIELD");
-    }
-  return ret;
 }
 
 }
 
+#include "MEDMEM_VtkFieldDriver.hxx"
+#include "MEDMEM_MedFieldDriver.hxx"
+#include "MEDMEM_MedFieldDriver21.hxx"
+#include "MEDMEM_MedFieldDriver22.hxx"
+#include "MEDMEM_AsciiFieldDriver.hxx"
+
+namespace MEDMEM {
+  template<class T>
+  GENDRIVER * DRIVERFACTORY::buildDriverForField(driverTypes driverType,
+                                                const std::string & fileName,
+                                                FIELD<T> *field,
+                                                MED_EN::med_mode_acces access)
+  {
+    GENDRIVER *ret;
+    switch(driverType)
+      {
+      case MED_DRIVER : {
+       switch(access)
+         {
+         case MED_EN::MED_LECT : {
+           ret = new MED_FIELD_RDONLY_DRIVER<T>(fileName,field);
+           break;
+         }
+         case MED_EN::MED_ECRI : {
+           ret= new MED_FIELD_WRONLY_DRIVER<T>(fileName,field);
+           break;
+         }
+         case MED_EN::MED_REMP : {
+           ret = new MED_FIELD_RDWR_DRIVER<T>(fileName,field);
+           break;
+         }
+         default:
+           throw MED_EXCEPTION ("access type has not been properly specified to the method");
+         }
+       break;
+      }
+
+      case VTK_DRIVER : {
+       switch(access)
+         {
+         case MED_EN::MED_LECT : {
+           throw MED_EXCEPTION ("access mode other than MED_ECRI and MED_REMP has been specified with the VTK_DRIVER type which is not allowed because VTK_DRIVER is only a write access driver");
+           break;
+         }
+         case MED_EN::MED_ECRI : {
+           ret=new VTK_FIELD_DRIVER<T>(fileName,field);
+           break;
+         }
+         case MED_EN::MED_REMP : {
+           ret=new VTK_FIELD_DRIVER<T>(fileName,field);
+           break ;
+         }
+         default:
+           throw MED_EXCEPTION ("access type has not been properly specified to the method");
+         }
+       break;
+      }
+
+      case GIBI_DRIVER : {
+       throw MED_EXCEPTION ("driverType other than MED_DRIVER and VTK_DRIVER has been specified to the method which is not allowed for the object FIELD");
+       break;
+      }
+
+      case PORFLOW_DRIVER : {
+       throw MED_EXCEPTION ("driverType other than MED_DRIVER and VTK_DRIVER has been specified to the method which is not allowed for the object FIELD");
+       break;
+      }
+
+      case ASCII_DRIVER : {
+       switch(access)
+         {
+         case MED_EN::MED_ECRI : {
+           ret=new ASCII_FIELD_DRIVER<T>(fileName,field);
+           break;
+         }
+         default:
+           throw MED_EXCEPTION ("driver ASCII_DRIVER on FIELD only in write mod");
+         }
+       break;
+      }
+
+      case NO_DRIVER : {
+       throw MED_EXCEPTION ("driverType other than MED_DRIVER and VTK_DRIVER has been specified to the method which is not allowed for the object FIELD");
+       break;
+      }
+      default:
+       MED_EXCEPTION ("driverType other than MED_DRIVER and VTK_DRIVER has been specified to the method which is not allowed for the object FIELD");
+      }
+    return ret;
+  }
+
+  template<class T>
+  GENDRIVER * DRIVERFACTORY::buildFieldDriverFromFile(const string & fileName,
+                                                     FIELD<T> * ptrField,
+                                                     MED_EN::med_mode_acces access)
+  {
+    MED_EN::medFileVersion version;
+
+    try
+      {
+       version = getMedFileVersion(fileName);
+      }
+    catch (MEDEXCEPTION & ex)
+      {
+       version = DRIVERFACTORY::globalMedFileVersionForWriting;
+      }
+
+    MESSAGE("buildFieldDriverFromFile version of the file " << version);
+
+    GENDRIVER * driver;
+
+    switch(access)
+      {
+      case MED_EN::MED_LECT : {
+       if (version == MED_EN::V21)
+         driver = new MED_FIELD_RDONLY_DRIVER21<T>(fileName,ptrField);
+       else if (version == MED_EN::V22)
+         driver = new MED_FIELD_RDONLY_DRIVER22<T>(fileName,ptrField);
+       return driver;
+      }
+      case MED_EN::MED_ECRI : {
+       if (version == MED_EN::V21)
+         driver = new MED_FIELD_WRONLY_DRIVER21<T>(fileName,ptrField);
+       else if (version == MED_EN::V22)
+         driver = new MED_FIELD_WRONLY_DRIVER22<T>(fileName,ptrField);
+       return driver;
+      }
+      case MED_EN::MED_REMP : {
+       if (version == MED_EN::V21)
+         driver = new MED_FIELD_RDWR_DRIVER21<T>(fileName,ptrField);
+       else if (version == MED_EN::V22)
+         driver = new MED_FIELD_RDWR_DRIVER22<T>(fileName,ptrField);
+       return driver;
+      }
+      default:
+       throw MED_EXCEPTION ("access type has not been properly specified to the method");
+      }
+  }
+
+  template<class T>
+  GENDRIVER * DRIVERFACTORY::buildConcreteMedDriverForField(const std::string & fileName,
+                                                           FIELD<T> *ptrField,
+                                                           MED_EN::med_mode_acces access,
+                                                           MED_EN::medFileVersion version)
+  {
+
+    MESSAGE("buildConcreteMedDriverForField version of the file " << version);
+
+    GENDRIVER * driver;
+
+    switch(access)
+      {
+      case MED_EN::MED_LECT : {
+       if (version == MED_EN::V21)
+         driver = new MED_FIELD_RDONLY_DRIVER21<T>(fileName,ptrField);
+       else if (version == MED_EN::V22)
+         driver = new MED_FIELD_RDONLY_DRIVER22<T>(fileName,ptrField);
+       return driver;
+      }
+      case MED_EN::MED_ECRI : {
+       if (version == MED_EN::V21)
+         driver = new MED_FIELD_WRONLY_DRIVER21<T>(fileName,ptrField);
+       else if (version == MED_EN::V22)
+         driver = new MED_FIELD_WRONLY_DRIVER22<T>(fileName,ptrField);
+       return driver;
+      }
+      case MED_EN::MED_REMP : {
+       if (version == MED_EN::V21)
+         driver = new MED_FIELD_RDWR_DRIVER21<T>(fileName,ptrField);
+       else if (version == MED_EN::V22)
+         driver = new MED_FIELD_RDWR_DRIVER22<T>(fileName,ptrField);
+       return driver;
+      }
+      default:
+       throw MED_EXCEPTION ("access type has not been properly specified to the method");
+      }
+  }
 }
 
 #endif
 }
 
 #endif
index 2a6ed3cbdeb321f44ea80a42f1cd51c131357082..cae3f592c46b725ec6a00f444417eb37424b43d3 100644 (file)
@@ -10,6 +10,8 @@ using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
+#define DUMP_LINES_LIMIT 100
+
 // Cet opérateur permet d'ordonner les mailles dans un set suivant l'ordre requis par MED
 bool _maille::operator < (const _maille& ma) const
 {
 // Cet opérateur permet d'ordonner les mailles dans un set suivant l'ordre requis par MED
 bool _maille::operator < (const _maille& ma) const
 {
@@ -37,7 +39,15 @@ bool _maille::operator < (const _maille& ma) const
     else
        return geometricType<ma.geometricType;
 };
     else
        return geometricType<ma.geometricType;
 };
-
+_link _maille::link(int i) const
+{
+  ASSERT ( i >= 0 && i < sommets.size() );
+  int i2 = ( i + 1 == sommets.size() ) ? 0 : i + 1;
+  if ( reverse )
+    return make_pair( sommets[i2]->first, sommets[i]->first );
+  else
+    return make_pair( sommets[i]->first, sommets[i2]->first );
+}
 
 // retourne l'entité d'une maille en fonction de la dimension du maillage.
 MED_EN::medEntityMesh _maille::getEntity(const int meshDimension) const throw (MEDEXCEPTION)
 
 // retourne l'entité d'une maille en fonction de la dimension du maillage.
 MED_EN::medEntityMesh _maille::getEntity(const int meshDimension) const throw (MEDEXCEPTION)
@@ -86,14 +96,19 @@ std::ostream& MEDMEM::operator << (std::ostream& os, const _groupe& gr)
     os << " -> liste des sous-groupes : ";
     for( std::vector<int>::const_iterator i=gr.groupes.begin(); i!=gr.groupes.end(); ++i)
        os << *i << " ";
     os << " -> liste des sous-groupes : ";
     for( std::vector<int>::const_iterator i=gr.groupes.begin(); i!=gr.groupes.end(); ++i)
        os << *i << " ";
-    os << std::endl << " -> liste des mailles : " << std::endl;
-    std::set< std::set< _maille, std::less< _maille >,
-    std::allocator< _maille > >::iterator,
-    _mailleIteratorCompare,
-    std::allocator< std::set< _maille, std::less< _maille >,
-    std::allocator< _maille > >::iterator > >::const_iterator i ;
-    for( i=gr.mailles.begin(); i!=gr.mailles.end(); i++)
-       os << "    " << *(*i) << std::endl;
+    os << std::endl << " -> liste des "<< gr.mailles.size() << " mailles : " << std::endl;
+    _groupe::mailleIter i=gr.mailles.begin();
+    int l;
+    for(l = 0; l < DUMP_LINES_LIMIT && i!=gr.mailles.end(); i++, l++)
+       os << setw(3) << l+1 << " " << *(*i) << std::endl;
+    if ( l == DUMP_LINES_LIMIT )
+      os << "   ... skip " << gr.mailles.size() - l << " mailles" << endl;
+    os << " relocMap, size=" << gr.relocMap.size() << endl;
+    map<const _maille*,int>::const_iterator it = gr.relocMap.begin();
+    for ( l = 0; l < DUMP_LINES_LIMIT && it != gr.relocMap.end(); ++it, ++l )
+      os << " (" << it->first << "," << it->second << ")";
+    if ( gr.relocMap.size() > 0 )
+      os << endl;
     return os;
 }
 
     return os;
 }
 
@@ -108,38 +123,191 @@ std::ostream& MEDMEM::operator << (std::ostream& os, const _noeud& no)
     return os;
 }
 
     return os;
 }
 
+void MEDMEM::_fieldBase::dump(std::ostream& os) const
+{
+  os << "field " << "<" << name << ">" << endl <<
+    "  nb sub: " << nb_subcomponents << endl <<
+      "  nb comp: " << nb_components << endl <<
+        "  group index: " << group_id << endl <<
+          "  type: " << type << endl;
+  os << "  comp names: ";
+  for ( int i = 0; i < comp_names.size(); ++i )
+    os << " |" << comp_names[ i ] << "|";
+}
+
+std::ostream& MEDMEM::operator << (std::ostream& os, const _fieldBase * f)
+{
+  f->dump( os );
+  return os;
+}
+
 std::ostream& MEDMEM::operator << (std::ostream& os, const _intermediateMED& mi)
 {
 std::ostream& MEDMEM::operator << (std::ostream& os, const _intermediateMED& mi)
 {
-    os << "Set des mailles : " << std::endl;
-    for( std::set<_maille>::const_iterator i=mi.maillage.begin(); i!=mi.maillage.end(); ++i)
-       os << *i << std::endl;
+    os << "Set des " << mi.maillage.size() << " mailles : " << std::endl;
+    std::set<_maille>::const_iterator i=mi.maillage.begin();
+    int l;
+    for( l = 0; l < DUMP_LINES_LIMIT && i!=mi.maillage.end(); ++i, ++l)
+       os << setw(3) << l+1 << " " <<*i << std::endl;
+    if ( l == DUMP_LINES_LIMIT )
+      os << "   ... skip " << mi.maillage.size() - l << " mailles" << endl;
     
     
-    os << std::endl << "Vector des groupes : " << std::endl;
-   // for( std::vector<_groupe>::const_iterator i=mi.groupes.begin(); i!=mi.groupes.end(); ++i)
-    for (unsigned int i=0; i!=mi.groupes.size(); i++)
-      os << std::setw(3) << i << " " << mi.groupes[i] << std::endl;
+    os << std::endl << "Vector des " << mi.groupes.size() << " groupes : " << std::endl;
+    for (unsigned int k=0; k!=mi.groupes.size(); k++)
+      os << std::setw(3) << k << " " << mi.groupes[k] << std::endl;
     
     
-    os << std::endl << "map des noeuds : " << std::endl;
-    for( std::map<int,_noeud>::const_iterator i=mi.points.begin(); i!=mi.points.end(); ++i)
-       os << i->second << std::endl;
+    os << std::endl << "map des " << mi.points.size() << " noeuds : " << std::endl;
+    std::map<int,_noeud>::const_iterator j=mi.points.begin();
+    for( l = 0; l < DUMP_LINES_LIMIT && j!=mi.points.end(); ++j, ++l)
+       os << j->second << std::endl;
+    if ( l == DUMP_LINES_LIMIT )
+      os << "   ... skip " << mi.points.size() - l << " noeuds" << endl;
+
+    os << endl << mi.fields.size() << " fields:" << endl;
+    std::list<_fieldBase* >::const_iterator fIt = mi.fields.begin();
+    for ( l = 0; fIt != mi.fields.end(); ++fIt, ++l )
+      os << " - " << l+1 << " " << *fIt << endl;
+
     return os;
 }
 
     return os;
 }
 
+
+//=======================================================================
+//function : treatGroupes
+//purpose  : detect groupes of mixed dimension and erase groupes that
+//           won't be converted
+//=======================================================================
+
+void _intermediateMED::treatGroupes()
+{
+  const char * LOC = "_intermediateMED::treatGroupes() : ";
+  BEGIN_OF(LOC);
+  
+  // --------------------
+  // erase useless group
+  // --------------------
+
+  // decrease hierarchical depth of subgroups
+  vector<int>::iterator j;
+  for (unsigned int i=0; i!=this->groupes.size(); ++i)
+  {
+    _groupe& grp = groupes[i];
+    //INFOS( i << " " << grp.nom );
+    j = grp.groupes.begin();
+    while( j!=grp.groupes.end() ) {
+      int grpInd = *j-1;
+      if ( grpInd < 0 || grpInd >= groupes.size() ) {
+        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad subgroup index: " << grpInd <<
+                                     ", in " << i << " groupe.nom=" << grp.nom));
+      }
+      _groupe & sub_grp = groupes[ grpInd ];
+      if ( !sub_grp.groupes.empty() ) {
+        MESSAGE("High hierarchical depth of subgroups in group " << i );
+        *j = sub_grp.groupes[0]; // replace j with its 1st subgroup
+        // push back the rest subs
+        for ( int k = 1; k < sub_grp.groupes.size(); ++k )
+          grp.groupes.push_back( sub_grp.groupes[ k ]);
+        // vector maybe is reallocated: restart iterator
+        j = grp.groupes.begin();
+      }
+      else
+        j++;
+    }
+    // remove empty sub-groupes
+    j = grp.groupes.begin();
+    while ( j!=grp.groupes.end() ) {
+      if ( groupes[*j-1].empty() ) {
+        grp.groupes.erase( j );
+        j = grp.groupes.begin();
+      }
+      else
+        j++;
+    }
+  }
+  // get indices of groups that are field support -
+  // do not erase them and their subgroups
+  std::set<int> groups2convert;
+  std::list< _fieldBase* >::const_iterator fIt = fields.begin();
+  for ( ; fIt != fields.end(); ++fIt )
+  {
+    groups2convert.insert( (*fIt)->group_id );
+    _groupe& grp = groupes[ (*fIt)->group_id ];
+    for( j = grp.groupes.begin(); j!=grp.groupes.end(); ++j)
+      groups2convert.insert( *j-1 );
+  }
+  // keep named groups and their subgroups
+  for (unsigned int i=0; i!=this->groupes.size(); ++i)
+  {
+    _groupe& grp = groupes[i];
+    if ( grp.empty() || grp.nom.empty() )
+      continue;
+    groups2convert.insert( i );
+    for( j = grp.groupes.begin(); j!=grp.groupes.end(); ++j)
+      groups2convert.insert( *j-1 );
+  }
+  // erase groups that are not in groups2convert
+  for (unsigned int i=0; i!=this->groupes.size(); ++i)
+  {
+    if ( groups2convert.find( i ) == groups2convert.end() ) {
+      _groupe& grp = groupes[i];
+      grp.mailles.clear();
+      grp.groupes.clear();
+      //INFOS( "Erase " << i << "-th group " << grp.nom );
+    }
+  }
+
+  // ---------------------------------------------------
+  // define if there are groups with mixed entity types
+  // ---------------------------------------------------
+
+  hasMixedCells = false;  
+  for (unsigned int i=0; i!=this->groupes.size(); ++i)
+  {
+    _groupe& grp = groupes[i];
+    if ( grp.groupes.empty() )
+      continue;
+
+    // check if sub-groups have different dimension
+    j = grp.groupes.begin();
+    int dim = groupes[*j-1].mailles[0]->dimension();
+    for( j++; !hasMixedCells && j!=grp.groupes.end(); ++j)
+      hasMixedCells = ( dim != groupes[*j-1].mailles[0]->dimension() );
+  }
+
+  if ( hasMixedCells )
+    INFOS( "There will be groups of mixed dimention" );
+  END_OF(LOC);
+}
+
 void _intermediateMED::numerotationMaillage()
 {
 void _intermediateMED::numerotationMaillage()
 {
-    // numerotation des mailles par entité
+  const char * LOC = "_intermediateMED::numerotationMaillage() : ";
+  BEGIN_OF(LOC);
+
+  treatGroupes();
+
+  // numerotation mailles of type MED_POINT1 by node number
+  std::set<_maille>::iterator i=maillage.begin();
+  if ( i->geometricType == MED_POINT1 ) {
+    numerotationPoints();
+    while ( i!=maillage.end() && i->geometricType == MED_POINT1 ) {
+      i->ordre = i->sommets[0]->second.number;
+      i++;
+    }
+  }
+  // numerotation des mailles par entité
     int i_maille=0;
     int i_maille=0;
-    std::set<_maille>::iterator i=maillage.begin();
     int dimension=i->dimension();
     for( ; i!=maillage.end(); ++i)
     {
     int dimension=i->dimension();
     for( ; i!=maillage.end(); ++i)
     {
-       if ( dimension!=i->dimension() ) // on change d'entite
+       if ( !hasMixedCells && dimension!=i->dimension() ) // on change d'entite
        {
        {
+          MESSAGE( "NB dim " << dimension << " entities: " << i_maille);
            dimension=i->dimension();
            i_maille=0;
        }
        (*i).ordre=++i_maille;
     }
            dimension=i->dimension();
            i_maille=0;
        }
        (*i).ordre=++i_maille;
     }
+  END_OF(LOC);
 }
 
 void _intermediateMED::numerotationPoints()
 }
 
 void _intermediateMED::numerotationPoints()
@@ -227,7 +395,7 @@ _intermediateMED::getConnectivity()
        vtype.push_back(type);
        // Boucle sur i de parcours des mailles d'une entite
        // Une entite se termine lorsqu'on atteint la fin de maillage ou lorsque la dimension des mailles change
        vtype.push_back(type);
        // Boucle sur i de parcours des mailles d'une entite
        // Une entite se termine lorsqu'on atteint la fin de maillage ou lorsque la dimension des mailles change
-       for( ; i!=maillage.end() && dimension==i->dimension() ; ++i)
+       for( ; i!=maillage.end() && ( hasMixedCells || dimension==i->dimension()) ; ++i)
        {
            if (type != i->geometricType) // si changement de type geometrique
            {
        {
            if (type != i->geometricType) // si changement de type geometrique
            {
@@ -239,8 +407,7 @@ _intermediateMED::getConnectivity()
 
            ++nbtype;
        }
 
            ++nbtype;
        }
-       vcount.push_back(nbtype); // n'a pas Ã©té stocké dans la boucle
-
+       vcount.push_back(dimension ? nbtype : numberOfNodes); // n'a pas Ã©té stocké dans la boucle
        
        // Pour l'entite qu'on vient de parcourir, allocation des tableau et creation de la connectivite
 //     cout << "Dimension = " << dimension << endl;
        
        // Pour l'entite qu'on vient de parcourir, allocation des tableau et creation de la connectivite
 //     cout << "Dimension = " << dimension << endl;
@@ -273,26 +440,40 @@ _intermediateMED::getConnectivity()
        for (unsigned int k=0; k!=vcount.size(); ++k )
          count[k+1]=count[k]+vcount[k];
        Connectivity->setCount (count, entity);
        for (unsigned int k=0; k!=vcount.size(); ++k )
          count[k+1]=count[k]+vcount[k];
        Connectivity->setCount (count, entity);
+       SCRUTE( entity );
+       SCRUTE(numberOfTypes);
+       SCRUTE(count[numberOfTypes]-1);
        delete [] count;
 
        for (int k=0; k!=numberOfTypes; ++k )
          {
            // pour chaque type géometrique k, copie des sommets dans connectivity et set dans Connectivity
            int nbSommetsParMaille = j->sommets.size();
        delete [] count;
 
        for (int k=0; k!=numberOfTypes; ++k )
          {
            // pour chaque type géometrique k, copie des sommets dans connectivity et set dans Connectivity
            int nbSommetsParMaille = j->sommets.size();
-           int nbSommets = vcount[k] * j->sommets.size();
+           int n, nbSommets = vcount[k] * j->sommets.size();
            connectivity = new int[ nbSommets ];
            connectivity = new int[ nbSommets ];
-           for (int l=0; l!=vcount[k]; ++l, ++j)
+           for (int l=0; l!=vcount[k]; ++l)
            {
            {
-               for ( unsigned n=0; n != j->sommets.size(); ++n)
-                   connectivity[nbSommetsParMaille*l+n] = j->sommets[n]->second.number;
-               //CCRT maillage.erase(j);    ; // dangereux, mais optimise la mémoire consommée!
-           }
+                if ( entity==MED_NODE )
+                  connectivity[l] = l+1;
+                else
+                {
+                  for ( n=0; n != nbSommetsParMaille; ++n) {
+                   connectivity[nbSommetsParMaille*l+n] =
+                      j->sommets[ j->reverse ? nbSommetsParMaille-n-1 : n ]->second.number;
+                  }
+                // DO NOT ERASE, maillage will be used while fields construction
+               //maillage.erase(j);    ; // dangereux, mais optimise la mémoire consommée!
+                  j++;
+                }
+           }      
 
            Connectivity->setNodal  (connectivity, entity, vtype[k]);
            delete [] connectivity;
          }
 
            Connectivity->setNodal  (connectivity, entity, vtype[k]);
            delete [] connectivity;
          }
-               
-       if (i!=j)
+
+        if ( entity==MED_NODE )
+          j = i;               
+       else if (i!=j)
            throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Erreur de lecture des mailles ."));
 
        if ( ! first)
            throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Erreur de lecture des mailles ."));
 
        if ( ! first)
@@ -321,115 +502,361 @@ _intermediateMED::getConnectivity()
 void
 _intermediateMED::getGroups(std::vector<GROUP *> & _groupCell, std::vector<GROUP *> & _groupFace, std::vector<GROUP *> & _groupEdge, std::vector<GROUP *> & _groupNode, MESH * _ptrMesh)
 {
 void
 _intermediateMED::getGroups(std::vector<GROUP *> & _groupCell, std::vector<GROUP *> & _groupFace, std::vector<GROUP *> & _groupEdge, std::vector<GROUP *> & _groupNode, MESH * _ptrMesh)
 {
-    const char * LOC = "_intermediateMED::getGroups() : ";
-    BEGIN_OF(LOC);
-    if (maillage.size() == 0)
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Erreur : il n'y a plus de mailles (appeler getConnectivity apres getGroups!)."));
+  const char * LOC = "_intermediateMED::getGroups() : ";
+  BEGIN_OF(LOC);
+  if (maillage.size() == 0) {
+    INFOS( "Erreur : il n'y a plus de mailles");
+    return;
+  }
+
+  // get indices of groups that are field support - do not skip them
+  std::set<int> support_groups;
+  std::list< _fieldBase* >::const_iterator fIt = fields.begin();
+  for ( ; fIt != fields.end(); ++fIt )
+    support_groups.insert( (*fIt)->group_id );
+
+  numerotationMaillage(); // Renumerotation des mailles par entite
+
+  int dimension_maillage=maillage.rbegin()->dimension();
+
+  for (unsigned int i=0; i!=this->groupes.size(); ++i)
+  {
+    _groupe& grp = groupes[i];
+    // si le groupe est vide, ou si le groupe n'est pas nommé : on passe au suivant
+    if ( grp.empty() ||
+        ( grp.nom.empty() && support_groups.find( i ) == support_groups.end() )) {
+      if ( !grp.nom.empty() )
+        INFOS("Skip group " << grp.nom );
+      medGroupes.push_back( NULL );
+      continue;
+    }
+
+    // Build a set of mailles: sort mailles by type and exclude maille doubling
+    typedef set< set<_maille>::iterator, _mailleIteratorCompare > TMailleSet;
+    TMailleSet mailleSet;
+    if( grp.groupes.size() ) {// le groupe i contient des sous-maillages
+      int nb_elem = 0;
+      for( vector<int>::iterator j=grp.groupes.begin(); j!=grp.groupes.end(); ++j)
+      {
+        nb_elem += groupes[*j-1].mailles.size();
+        _groupe::mailleIter maIt=groupes[*j-1].mailles.begin();
+        for( ; maIt!=groupes[*j-1].mailles.end(); ++maIt) {
+//           TMailleSet::const_iterator ma_it = mailleSet.find( *maIt );
+//           if ( ma_it != mailleSet.end() ) {
+//             MESSAGE("EQUAL ELEMS: " << *ma_it << " AND " << *maIt);
+//           }
+//           else
+            mailleSet.insert( *maIt );
+        }
+      }
+      if ( nb_elem != mailleSet.size() ) {
+        INFOS("Self intersecting group: " << i+1 << " <" << grp.nom << ">"
+              << ", mailleSet.size = " << mailleSet.size() << ", sum nb elems = " << nb_elem);
+        for( vector<int>::iterator j=grp.groupes.begin(); j!=grp.groupes.end(); ++j)
+          INFOS(" in sub-group "<<  *j << " <" << groupes[*j-1].nom << "> "
+                << groupes[*j-1].mailles.size() << " mailles of type "
+                << groupes[*j-1].mailles[0]->geometricType);
+      }
+    }
+    else {
+      _groupe::mailleIter maIt=grp.mailles.begin();
+      for(; maIt!=grp.mailles.end(); ++maIt)
+        mailleSet.insert( *maIt );
+      if ( grp.mailles.size() != mailleSet.size() )
+        INFOS( "Self intersecting group: " << i+1 << " <" << grp.nom << ">"
+              << ", mailleSet.size = " << mailleSet.size() << ", nb elems = " << grp.mailles.size());
+    }
+
+    // 1. Build a map _maille* -> index in MEDMEM::GROUP.getNumber(MED_ALL_ELEMENTS).
+    // It is used while fields building.
+    // 2. make mailles know the groups they belong to, that is used in getFamilies()
+    TMailleSet::iterator maIt = mailleSet.begin();
+    int iMa;
+    for ( iMa = 0; maIt != mailleSet.end(); maIt++ ) {
+      grp.relocMap.insert( make_pair( &(**maIt), ++iMa ));
+      (*maIt)->groupes.push_back( i );
+    }
+    ASSERT( iMa == grp.relocMap.size() );
+
+    int nb_geometric_types=1;
+    TMailleSet::iterator j=mailleSet.begin(); 
+    // initialise groupe_entity a l'entite de la premiere maille du groupe
+    medEntityMesh groupe_entity = (**mailleSet.rbegin()).getEntity(dimension_maillage);
+    if ( hasMixedCells )
+      groupe_entity = MED_CELL;
+    medGeometryElement geometrictype=(**j).geometricType;
+
+    //Parcours des mailles (a partir de la deuxieme) pour compter les types geometriques
+    for ( ++j ; j!=mailleSet.end(); ++j )
+    {
+      //Compte nombre de types geometriques
+      if ( (**j).geometricType != geometrictype ) // si on change de type geometrique
+      {
+        nb_geometric_types++;
+        geometrictype=(**j).geometricType;
+      }
+    }
 
 
-    int dimension_maillage=maillage.rbegin()->dimension();
+    MED_EN::medGeometryElement * tab_types_geometriques = new MED_EN::medGeometryElement[nb_geometric_types];
+    int * tab_index_types_geometriques = new int[nb_geometric_types+1];
+    int * tab_numeros_elements = new int[mailleSet.size()];
+    int * tab_nombres_elements = new int[nb_geometric_types];
+
+    //Remplit tableaux entree des methodes set
+    int indice_mailles=0/*, maxOrdre = -1*/;
+    j=mailleSet.begin();
+    geometrictype=(**j).geometricType;
+    tab_index_types_geometriques[0]=1;
+    int indice_types_geometriques=1;
+    tab_types_geometriques[0]=geometrictype;
+    //parcours des mailles du groupe
+    for (  ; j!=mailleSet.end(); ++j , ++indice_mailles)
+    {
+      const _maille& ma = **j;
+      tab_numeros_elements[indice_mailles]= ma.ordre;
+//       if ( maxOrdre < tab_numeros_elements[indice_mailles] )
+//         maxOrdre = tab_numeros_elements[indice_mailles];
+      if (ma.geometricType != geometrictype)
+      {
+        tab_index_types_geometriques[indice_types_geometriques]=indice_mailles+1;
+        geometrictype=ma.geometricType;
+        tab_types_geometriques[indice_types_geometriques]=geometrictype;
+        ++indice_types_geometriques;
+      }
+    }
+    tab_index_types_geometriques[indice_types_geometriques]=indice_mailles+1;
+    for (int k=0; k != nb_geometric_types; ++k)
+    {
+      tab_nombres_elements[k] = tab_index_types_geometriques[k+1]-tab_index_types_geometriques[k];
+    }
+    //INFOS( "MAX ORDRE in grp " << grp.nom << " entity " << groupe_entity << " : " << maxOrdre);
 
 
-    numerotationMaillage(); // Renumerotation des mailles par entite
+    //Determination type entite du groupe
+    vector <GROUP *> * vect_group;
+    switch ( groupe_entity )
+    {
+    case MED_CELL :
+      vect_group= & _groupCell;
+      break;
+    case MED_FACE :
+      vect_group= & _groupFace;
+      break;
+    case MED_EDGE :
+      vect_group= & _groupEdge;
+      break;
+    case MED_NODE :
+      vect_group= & _groupNode;
+      break;
+    }
+    //Creation nouveau groupe MED
+    GROUP * new_group = new GROUP();
+    //Appel methodes set
+    new_group->setTotalNumberOfElements(mailleSet.size());
+    new_group->setName(grp.nom);
+    new_group->setMesh(_ptrMesh);
+    new_group->setNumberOfGeometricType(nb_geometric_types);
+    new_group->setGeometricType(tab_types_geometriques);
+    new_group->setNumberOfElements(tab_nombres_elements);
+    new_group->setNumber(tab_index_types_geometriques,tab_numeros_elements);
+    new_group->setEntity(groupe_entity);
+    new_group->setAll(mailleSet.size() == maillage.size());
+
+    vector<int> nbGaussPnt( nb_geometric_types, 1 );
+    new_group->setNumberOfGaussPoint( &nbGaussPnt[0] );
+
+    vect_group->push_back(new_group);
+    medGroupes.push_back( new_group );
+
+    delete [] tab_types_geometriques;
+    delete [] tab_index_types_geometriques;
+    delete [] tab_numeros_elements;
+    delete [] tab_nombres_elements;
+  }
+  SCRUTE( medGroupes.size() );
+
+  END_OF(LOC);
+}
 
 
-    for (unsigned int i=0; i!=this->groupes.size(); ++i)
+//=======================================================================
+//function : getFamilies
+//purpose  : create families like MESH::createFamilies() but preserves
+//           the order of elements in GROUPs defined by constituent families
+//           order. Call it after getGroups()
+//=======================================================================
+
+void _intermediateMED::getFamilies(std::vector<FAMILY *> & _famCell,
+                                   std::vector<FAMILY *> & _famFace, 
+                                   std::vector<FAMILY *> & _famEdge,
+                                   std::vector<FAMILY *> & _famNode, MESH * _ptrMesh)
+{
+  const char * LOC = "_intermediateMED::getFamilies() : ";
+  BEGIN_OF(LOC);
+  
+  int nbElemFam = 0, nbNodeFam = 0;
+  std::map< GROUP*, vector< FAMILY * > > grpFamsMap;
+  int dimension_maillage=maillage.rbegin()->dimension();
+
+  std::set<_maille>::const_iterator i=maillage.begin(); // iterateurs sur les mailles
+  std::set<_maille>::const_iterator j=maillage.begin();
+
+  do
+  {
+    // make a family containing mailles shared by the same set of groups
+    std::list<unsigned>&  grList = i->groupes;  // to define the family end
+    int           dimension = i->dimension();        // to define the entity end
+    medGeometryElement type = i->geometricType;
+    medEntityMesh    entity = i->getEntity( dimension_maillage );
+
+    std::vector<medGeometryElement> tab_types_geometriques;
+    std::vector<int> tab_index_types_geometriques;
+    std::vector<int> tab_nombres_elements;
+    std::vector<int> tab_numeros_elements;
+
+    int iMa = 1, nbtype = 0;
+    tab_types_geometriques.push_back( type );
+    tab_index_types_geometriques.push_back( iMa );
+
+    // scan family cells and fill the tab that are needed by the create a MED FAMILY
+    while (i != maillage.end() &&
+           i->groupes == grList &&
+           i->dimension() == dimension)
     {
     {
-       // si le groupe est vide, ou si le groupe n'est pas nommé : on passe au suivant
-       if (groupes[i].mailles.empty() || groupes[i].nom.empty())
-           continue; 
-
-       int nb_geometric_types=1;
-       std::set< std::set< _maille, std::less< _maille >,
-        std::allocator< _maille > >::iterator,
-        _mailleIteratorCompare,
-        std::allocator< std::set< _maille, std::less<_maille >,
-        std::allocator< _maille > >::iterator > >::iterator j ;
-       j=groupes[i].mailles.begin(); 
-       // initialise groupe_entity a l'entite de la premiere maille du groupe
-       medEntityMesh groupe_entity = (**j).getEntity(dimension_maillage);
-       medGeometryElement geometrictype=(**j).geometricType;
-
-       //Parcours des mailles (a partir de la deuxieme) pour compter les types geometriques
-       for ( ++j ; j!=groupes[i].mailles.end(); ++j )
-       {
-           //Compte nombre de types geometriques
-           if ( (**j).geometricType != geometrictype ) // si on change de type geometrique
-           {
-               nb_geometric_types++;
-               geometrictype=(**j).geometricType;
-           }
+      if (type != i->geometricType) // si changement de type geometrique
+      {
+        tab_index_types_geometriques.push_back(iMa);
+        tab_nombres_elements.push_back(nbtype);
+        nbtype=0;
+        type=i->geometricType;
+        tab_types_geometriques.push_back(type); // stocke le nouveau type geometrique rencontre
+      }
+      ++nbtype;
+      ++iMa;
+      ++i;
+    }
+    tab_index_types_geometriques.push_back(iMa);
+    tab_nombres_elements.push_back(nbtype); // n'a pas Ã©té stocké dans la boucle
+
+    tab_numeros_elements.resize( iMa - 1 );
+    for ( iMa = 0; j != i; j++, iMa++ )
+      tab_numeros_elements[ iMa ] = j->ordre;
+
+    int id = ( entity == MED_NODE ? ++nbNodeFam : -(++nbElemFam) );
+
+    ostringstream name;
+    name << "FAM_" << id;
+
+    // create a empty MED FAMILY and fill it with the tabs we constructed
+    FAMILY* newFam = new FAMILY();
+    newFam->setTotalNumberOfElements( iMa );
+    newFam->setName( name.str() );
+    newFam->setMesh( _ptrMesh );
+    newFam->setNumberOfGeometricType( tab_types_geometriques.size() );
+    newFam->setGeometricType( &tab_types_geometriques[0] ); // we know the tab is not empy
+    newFam->setNumberOfElements( &tab_nombres_elements[0] );
+    newFam->setNumber( &tab_index_types_geometriques[0], &tab_numeros_elements[0] );
+    newFam->setEntity( entity );
+    newFam->setAll( false );
+    newFam->setIdentifier( id );
+    newFam->setNumberOfGroups( grList.size() );
+
+    // Update links between families and groups
+    if ( ! grList.empty() )
+    {
+      std::string * groupNames = new string[ grList.size() ];
+      std::list<unsigned>::iterator g = grList.begin();
+      for ( int i = 0; g != grList.end(); ++g, ++i ) {
+        GROUP * medGROUP = getGroup( *g );
+        groupNames[ i ] = medGROUP->getName();
+        grpFamsMap[ medGROUP ].push_back( newFam );
+      }
+      newFam->setGroupsNames(groupNames);
+    }
+    // store newFam
+    std::vector<FAMILY*>* families = 0;
+    switch ( entity )
+    {
+    case MED_CELL :
+      families = & _famCell; break;
+    case MED_FACE :
+      families = & _famFace; break;
+    case MED_EDGE :
+      families = & _famEdge; break;
+    case MED_NODE :
+      families = & _famNode; break;
+    }
+    if ( families )
+      families->push_back( newFam );
+
+  } while ( i != maillage.end() );
+
+  // update references in groups
+  std::map< GROUP*, vector< FAMILY * > >::iterator gf = grpFamsMap.begin();
+  for ( ; gf != grpFamsMap.end(); ++gf )
+  {
+    gf->first->setNumberOfFamilies( gf->second.size() );
+    gf->first->setFamilies( gf->second );
+  }
+}
 
 
-           //Test si groupe valide : le groupe doit pointer vers des entites de meme dimension
-           if ((**j).dimension() != dimension_maillage)
-               continue;
-       }
+//=======================================================================
+//function : getGroup
+//purpose  : 
+//=======================================================================
 
 
-       // le groupe est valide -> on le traite
-       MED_EN::medGeometryElement * tab_types_geometriques = new MED_EN::medGeometryElement[nb_geometric_types];
-       int * tab_index_types_geometriques = new int[nb_geometric_types+1];
-       int * tab_numeros_elements = new int[groupes[i].mailles.size()];
-       int * tab_nombres_elements = new int[nb_geometric_types];
-
-       //Remplit tableaux entree des methodes set
-       int indice_mailles=0;
-       j=groupes[i].mailles.begin();
-       geometrictype=(**j).geometricType;
-       tab_index_types_geometriques[0]=1;
-       int indice_types_geometriques=1;
-       tab_types_geometriques[0]=geometrictype;
-       //parcours des mailles du groupe
-       for (  ; j!=groupes[i].mailles.end(); ++j , ++indice_mailles)
-       {
-           tab_numeros_elements[indice_mailles]=((**j).ordre);
-           if ((**j).geometricType != geometrictype)
-           {
-               tab_index_types_geometriques[indice_types_geometriques]=indice_mailles+1;
-               geometrictype=(**j).geometricType;
-               tab_types_geometriques[indice_types_geometriques]=geometrictype;
-               ++indice_types_geometriques;
-           }
-       }
-       tab_index_types_geometriques[indice_types_geometriques]=indice_mailles+1;
-       for (int k=0; k != nb_geometric_types; ++k)
-       {
-           tab_nombres_elements[k] = tab_index_types_geometriques[k+1]-tab_index_types_geometriques[k];
-       }
+GROUP * _intermediateMED::getGroup( int i )
+{
+  if ( i < medGroupes.size() )
+    return medGroupes[ i ];
+  throw MEDEXCEPTION
+    (LOCALIZED(STRING("_intermediateMED::getGroup(): WRONG GROUP INDEX: ")
+               << medGroupes.size() << " <= " << i ));
+}
 
 
-       //Determination type entite du groupe
-       vector <GROUP *> * vect_group;
-       switch ( groupe_entity )
-       {
-           case MED_CELL :
-               vect_group= & _groupCell;
-               break;
-           case MED_FACE :
-               vect_group= & _groupFace;
-               break;
-           case MED_EDGE :
-               vect_group= & _groupEdge;
-               break;
-           case MED_NODE :
-               vect_group= & _groupNode;
-               break;
-       }
-       //Creation nouveau groupe MED
-       GROUP * new_group = new GROUP();
-       //Appel methodes set
-       new_group->setTotalNumberOfElements(groupes[i].mailles.size());
-       new_group->setName(groupes[i].nom);
-       new_group->setMesh(_ptrMesh);
-       new_group->setNumberOfGeometricType(nb_geometric_types);
-       new_group->setGeometricType(tab_types_geometriques);
-       new_group->setNumberOfElements(tab_nombres_elements);
-       new_group->setNumber(tab_index_types_geometriques,tab_numeros_elements);
-       new_group->setEntity(groupe_entity);
-       new_group->setAll(groupes[i].mailles.size() == maillage.size());
-       vect_group->push_back(new_group);
-       delete [] tab_types_geometriques;
-       delete [] tab_index_types_geometriques;
-       delete [] tab_numeros_elements;
-       delete [] tab_nombres_elements;
+//=======================================================================
+//function : getFields
+//purpose  : 
+//=======================================================================
+
+void _intermediateMED::getFields(std::list< FIELD_* >& theFields)
+{
+  const char * LOC = "_intermediateMED::getFields() : ";
+  BEGIN_OF(LOC);
+  std::list< _fieldBase* >::const_iterator fIt = fields.begin();
+  for ( ; fIt != fields.end(); fIt++ )
+  {
+    const _fieldBase* fb = *fIt;
+    SUPPORT* sup = getGroup( fb->group_id );
+    if ( !sup )
+      throw MEDEXCEPTION
+        (LOCALIZED(STRING(LOC) <<"_intermediateMED::getFields(), NULL field support: "
+                   << " group index: " << fb->group_id));
+    int nb_elems = sup->getNumberOfElements( MED_ALL_ELEMENTS );
+
+    std::list< FIELD_* > ff = fb->getField(groupes);
+    std::list< FIELD_* >::iterator it = ff.begin();
+    for (int j = 1 ; it != ff.end(); it++, ++j )
+    {
+      FIELD_* f = *it;
+      if ( nb_elems != f->getNumberOfValues() )
+        throw MEDEXCEPTION
+          (LOCALIZED(STRING("_intermediateMED::getFields(), field support size (")
+                     << nb_elems  << ") != NumberOfValues (" << f->getNumberOfValues()));
+      theFields.push_back( f );
+      f->setSupport( sup );
+      //f->setIterationNumber( j );
+      f->setOrderNumber( j );
     }
     }
+  }
+  END_OF(LOC);
+}
 
 
-    END_OF(LOC);
+_intermediateMED::~_intermediateMED()
+{
+  MESSAGE( "~_intermediateMED()");
+  std::list< _fieldBase* >::const_iterator fIt = fields.begin();
+  for ( ; fIt != fields.end(); fIt++ )
+    delete *fIt;
 }
 
 }
 
+
 /////
 /////
index e75f22d32eceaf0441aa7183e48bd62a6fac45c6..d9d21f5a5bcdade5781342eac14c71fdbcf93658 100644 (file)
@@ -4,35 +4,42 @@
 
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_Exception.hxx"
 
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_Exception.hxx"
+#include "MEDMEM_Field.hxx"
 #include <string>
 #include <vector>
 #include <set>
 #include <list>
 #include <map>
 #include <iostream>
 #include <string>
 #include <vector>
 #include <set>
 #include <list>
 #include <map>
 #include <iostream>
+#include <iomanip>
 
 namespace MEDMEM {
 class MESH;
 class CONNECTIVITY;
 class COORDINATE;
 class GROUP;
 
 namespace MEDMEM {
 class MESH;
 class CONNECTIVITY;
 class COORDINATE;
 class GROUP;
+class FAMILY;
 struct _noeud
 {
     mutable int number;
     std::vector<double> coord;
 };
 
 struct _noeud
 {
     mutable int number;
     std::vector<double> coord;
 };
 
+typedef pair<int,int> _link; // a pair of node numbers
+
 struct _maille
 {
     typedef std::map<int,_noeud>::iterator iter;
     MED_EN::medGeometryElement geometricType;
     std::vector< iter > sommets;
     mutable unsigned ordre; // l'ordre est fixé après insertion dans le set, et ne change ni l'état, ni l'ordre -> mutable
 struct _maille
 {
     typedef std::map<int,_noeud>::iterator iter;
     MED_EN::medGeometryElement geometricType;
     std::vector< iter > sommets;
     mutable unsigned ordre; // l'ordre est fixé après insertion dans le set, et ne change ni l'état, ni l'ordre -> mutable
+    mutable bool reverse; // to reverse sommets of a face
+    mutable list<unsigned> groupes; // the GROUPs maille belongs to, used to create families
 
 
-    _maille() : geometricType(MED_EN::MED_NONE),ordre(0)
+    _maille() : geometricType(MED_EN::MED_NONE),ordre(0),reverse(false)
     {
     };
     {
     };
-    _maille(MED_EN::medGeometryElement _geometricType, size_t nelem) : geometricType(_geometricType),ordre(0)
+    _maille(MED_EN::medGeometryElement _geometricType, size_t nelem) : geometricType(_geometricType),ordre(0),reverse(false)
     {
        sommets.reserve(nelem);
     };
     {
        sommets.reserve(nelem);
     };
@@ -42,6 +49,7 @@ struct _maille
     };
     bool operator < (const _maille& ma) const;
     MED_EN::medEntityMesh getEntity(const int meshDimension) const throw (MEDEXCEPTION);
     };
     bool operator < (const _maille& ma) const;
     MED_EN::medEntityMesh getEntity(const int meshDimension) const throw (MEDEXCEPTION);
+   _link link(int i) const;
 };
 
 struct _mailleIteratorCompare // pour ordonner le set d'iterateurs sur mailles
 };
 
 struct _mailleIteratorCompare // pour ordonner le set d'iterateurs sur mailles
@@ -54,10 +62,39 @@ struct _mailleIteratorCompare // pour ordonner le set d'iterateurs sur mailles
 
 struct _groupe
 {
 
 struct _groupe
 {
-    typedef std::set< std::set<_maille>::iterator>::const_iterator mailleIter;
+    typedef std::vector< std::set<_maille>::iterator>::const_iterator mailleIter;
     std::string nom;
     std::string nom;
-    std::set< std::set<_maille>::iterator, _mailleIteratorCompare > mailles; // iterateurs sur les mailles composant le groupe
+    std::vector< std::set<_maille>::iterator > mailles; // iterateurs sur les mailles composant le groupe
+//     std::set< std::set<_maille>::iterator, _mailleIteratorCompare > mailles; // iterateurs sur les mailles composant le groupe
     std::vector<int> groupes; // indices des sous-groupes composant le groupe
     std::vector<int> groupes; // indices des sous-groupes composant le groupe
+    std::map<const _maille*,int> relocMap; // map _maille* -> index in MEDMEM::GROUP.getNumber(MED_ALL_ELEMENTS). It is built by _intermediateMED::getGroups()
+    bool empty() const { return mailles.empty() && groupes.empty(); }
+};
+
+class _fieldBase {
+ public:
+  int                      nb_subcomponents;
+  int                      nb_components;
+  int                      group_id;
+  MED_EN::med_type_champ   type;
+  string                   name;
+  std::vector<std::string> comp_names;
+  _fieldBase( MED_EN::med_type_champ theType )
+    : nb_subcomponents(0), nb_components(0),group_id(-1),type(theType) {}
+  virtual std::list<FIELD_*> getField(std::vector<_groupe>& groupes) const = 0;
+  virtual void dump(std::ostream&) const;
+  virtual ~_fieldBase() {}
+};
+
+template< class T > class _field: public _fieldBase
+{
+  std::vector< std::vector< T > > comp_values;
+  std::vector< int >              comp_supp_ids;
+ public:
+  _field< T > ( MED_EN::med_type_champ theType ): _fieldBase( theType ) {}
+  std::vector< T >& addComponent( int support_id, int nb_values );
+  std::list<FIELD_*> getField(std::vector<_groupe>& groupes) const;
+  virtual void dump(std::ostream&) const;
 };
 
 /*!
 };
 
 /*!
@@ -74,24 +111,140 @@ struct _intermediateMED
 {
     std::set<_maille> maillage;
     std::vector<_groupe> groupes;
 {
     std::set<_maille> maillage;
     std::vector<_groupe> groupes;
+    std::vector<GROUP *> medGroupes;
     std::map< int, _noeud > points;
     std::map< int, _noeud > points;
+    std::list< _fieldBase* > fields;
+    bool hasMixedCells; // true if there are groups with mixed entity types
 
     CONNECTIVITY * getConnectivity(); // set MED connectivity from the intermediate structure
     COORDINATE * getCoordinate(const string & coordinateSystem="CARTESIAN"); // set MED coordinate from the 
                                                                              // intermediate structure
 
     CONNECTIVITY * getConnectivity(); // set MED connectivity from the intermediate structure
     COORDINATE * getCoordinate(const string & coordinateSystem="CARTESIAN"); // set MED coordinate from the 
                                                                              // intermediate structure
+    void getFamilies(std::vector<FAMILY *> & _famCell, std::vector<FAMILY *> & _famFace, 
+                     std::vector<FAMILY *> & _famEdge, std::vector<FAMILY *> & _famNode, MESH * _ptrMesh);
     void getGroups(std::vector<GROUP *> & _groupCell, std::vector<GROUP *> & _groupFace, 
            std::vector<GROUP *> & _groupEdge, std::vector<GROUP *> & _groupNode, MESH * _ptrMesh);
     void getGroups(std::vector<GROUP *> & _groupCell, std::vector<GROUP *> & _groupFace, 
            std::vector<GROUP *> & _groupEdge, std::vector<GROUP *> & _groupNode, MESH * _ptrMesh);
+    GROUP * getGroup( int i );
+
+    void getFields(std::list< FIELD_* >& fields);
 
     // used by previous functions to renumber points & mesh.
 
     // used by previous functions to renumber points & mesh.
+    void treatGroupes(); // detect groupes of mixed dimention
     void numerotationMaillage(); 
     void numerotationPoints();
 
     void numerotationMaillage(); 
     void numerotationPoints();
 
+    ~_intermediateMED();
 };
 
 std::ostream& operator << (std::ostream& , const _maille& );
 std::ostream& operator << (std::ostream& , const _groupe& );
 std::ostream& operator << (std::ostream& , const _noeud& );
 std::ostream& operator << (std::ostream& , const _intermediateMED& );
 };
 
 std::ostream& operator << (std::ostream& , const _maille& );
 std::ostream& operator << (std::ostream& , const _groupe& );
 std::ostream& operator << (std::ostream& , const _noeud& );
 std::ostream& operator << (std::ostream& , const _intermediateMED& );
+std::ostream& operator << (std::ostream& , const _fieldBase* );
 
 };
 
 };
+
+template <class T>
+  std::vector< T >& MEDMEM::_field< T >::addComponent( int support_id, int nb_values )
+{
+  if ( comp_supp_ids.empty() ) {
+    comp_supp_ids.reserve( nb_subcomponents * nb_components );
+    comp_values.reserve( nb_subcomponents * nb_components );
+  }
+  comp_supp_ids.push_back( support_id );
+  comp_values.push_back( std::vector< T >() );
+  std::vector< T >& res = comp_values.back();
+  res.resize( nb_values );
+  return res;
+}
+
+
+template <class T> 
+std::list<MEDMEM::FIELD_*> MEDMEM::_field< T >::getField(std::vector<_groupe> & groupes) const
+{
+  std::list<FIELD_*> res;
+  int i, j, i_comp, last_comp = 0;
+  while ( last_comp < comp_values.size() )
+  {
+    // find the first array of the next field - last_comp
+    int first_comp = last_comp;
+    std::set<int> id_set;
+    for ( i = first_comp + nb_components - 1; i < comp_values.size(); i += nb_components )
+      if ( id_set.insert( comp_supp_ids[ i ] ).second ) // unique support
+        last_comp = i + 1;
+
+    _groupe& grp = groupes[ group_id ];
+    if ( grp.empty () )
+      continue;
+    int nb_val = grp.relocMap.size();
+    ASSERT ( nb_val );
+
+    //create a filed
+    FIELD< T > * f = new FIELD< T >;
+    f->setNumberOfComponents( nb_components );
+    f->setComponentsNames( &comp_names[0] );
+    f->setNumberOfValues ( nb_val );
+    f->setName( name );
+    f->setValueType( type );
+    vector<string> str( nb_components );
+    f->setComponentsDescriptions( &str[0] );
+    f->setMEDComponentsUnits( &str[0] );
+    res.push_back( f );
+
+    MESSAGE(" make field <" << name << "> on group_id " << group_id <<
+            " relocMap.size: " << nb_val << " nb mailles: " << grp.mailles.size());
+    // set values
+    MEDARRAY< T > * medarray = new MEDARRAY< T >( nb_components, nb_val, MED_EN::MED_NO_INTERLACE );
+    f->setValue( medarray );
+    for ( j = 1; j <= nb_components; ++j ) {
+      // loop on arrays of j-th component
+      for ( i_comp = first_comp++; i_comp < last_comp; i_comp += nb_components )
+      {
+        // get nb elements in a group
+        int gr_id = comp_supp_ids[ i_comp ] - 1;
+        if ( gr_id < 0 || gr_id >= groupes.size() )
+          throw MEDEXCEPTION
+            (LOCALIZED(STRING("_field< T >::getField(), invalid group id: ")
+                              << gr_id << ", nb groups: " << groupes.size()));
+        _groupe & sub_grp = groupes[ gr_id ];
+        int nb_supp_elems = sub_grp.mailles.size();
+        MESSAGE(" comp_group_id " << gr_id << " nb values " << comp_values[ i_comp ].size() <<
+                " relocMap.size: " << sub_grp.relocMap.size() << " nb mailles: " << nb_supp_elems);
+
+        // store values
+        const std::vector< T > & values = comp_values[ i_comp ];
+        bool oneValue = ( values.size() == 1 );
+        ASSERT( oneValue || values.size() == nb_supp_elems );
+        for ( int k = 0; k < nb_supp_elems; ++k )
+        {
+          const T& val = oneValue ? values[ 0 ] : values[ k ];
+          const _maille* ma = &(*sub_grp.mailles[ k ]);
+          std::map<const _maille*,int>::const_iterator ma_i = grp.relocMap.find( ma );
+          if ( ma_i == grp.relocMap.end() )
+            throw MEDEXCEPTION
+              (LOCALIZED(STRING("_field< T >::getField(), cant find elem index. ")
+                         << k << "-th elem: " << ma));
+          if ( ma_i->second > nb_val )
+            throw MEDEXCEPTION
+              (LOCALIZED(STRING("_field< T >::getField(), wrong elem position. ")
+                         << k << "-th elem: " << ma
+                         << ", pos (" << ma_i->second << ") must be <= " << nb_val));
+          medarray->setIJ( ma_i->second, j, val );
+        }
+      }
+    }
+  }
+  return res;
+}
+
+
+template <class T> void MEDMEM::_field< T >::dump(std::ostream& os) const
+{
+  _fieldBase::dump(os);
+  os << endl;
+  for ( int i = 0 ; i < comp_values.size(); ++i )
+  {
+    os << "  group: " << setw(3) << comp_supp_ids[ i ] <<
+      "  nb values: " << comp_values[ i ].size() << endl;
+  }
+}
 #endif /* DRIVERTOOLS_HXX */
 #endif /* DRIVERTOOLS_HXX */
index 5a8f99fb442f8e7b93364971022e73f5c8ed0a4c..158b34335832cdd1929f7a08b74817d9bac37e77 100644 (file)
@@ -10,6 +10,13 @@ using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
+/*
+  Those defines are from the med File V2.1 and for this class they are fixed.
+*/
+
+#define MED_TAILLE_DESC 200
+#define MED_TAILLE_LNOM  80
+
 FAMILY::FAMILY():_identifier(0), _numberOfAttribute(0), 
                  _attributeIdentifier((int*)NULL),_attributeValue((int*)NULL), _attributeDescription((string*)NULL),
                 _numberOfGroup(0), _groupName((string*)NULL) 
 FAMILY::FAMILY():_identifier(0), _numberOfAttribute(0), 
                  _attributeIdentifier((int*)NULL),_attributeValue((int*)NULL), _attributeDescription((string*)NULL),
                 _numberOfGroup(0), _groupName((string*)NULL) 
@@ -300,8 +307,8 @@ bool FAMILY::build(medEntityMesh Entity,int **FamilyNumber /* from MED file */)
   MESSAGE("FAMILY::build(medEntityMesh Entity,int **FamilyNumber /* from MED file */)");
   bool Find = false ;
   // Get types information from <_mesh>
   MESSAGE("FAMILY::build(medEntityMesh Entity,int **FamilyNumber /* from MED file */)");
   bool Find = false ;
   // Get types information from <_mesh>
-  int    numberOfTypes             = _mesh->getNumberOfTypes(Entity) ;
-  const medGeometryElement * types       = _mesh->getTypes(Entity) ;
+  int    numberOfTypes             = _mesh->getNumberOfTypesWithPoly(Entity) ;
+  medGeometryElement * types       = _mesh->getTypesWithPoly(Entity) ;
   
   int *  numberOfElementsInFamily         = new int[numberOfTypes] ;
   int    numberOfElementTypesInFamily     = 0 ;
   
   int *  numberOfElementsInFamily         = new int[numberOfTypes] ;
   int    numberOfElementTypesInFamily     = 0 ;
@@ -317,7 +324,7 @@ bool FAMILY::build(medEntityMesh Entity,int **FamilyNumber /* from MED file */)
   // we search for all elements in this family
   for (int TypeNumber=0; TypeNumber < numberOfTypes; TypeNumber++) {
     
   // we search for all elements in this family
   for (int TypeNumber=0; TypeNumber < numberOfTypes; TypeNumber++) {
     
-    int NumberOfElements             = _mesh->getNumberOfElements(Entity,types[TypeNumber]) ;
+    int NumberOfElements             = _mesh->getNumberOfElementsWithPoly(Entity,types[TypeNumber]) ;
     int NumberOfElementsInThisFamily = 0 ;
     int * ElementsOfThisFamilyNumber = FamilyNumber[TypeNumber];
     int * tmp_ElementsList           = new int[NumberOfElements];
     int NumberOfElementsInThisFamily = 0 ;
     int * ElementsOfThisFamilyNumber = FamilyNumber[TypeNumber];
     int * tmp_ElementsList           = new int[NumberOfElements];
@@ -375,7 +382,7 @@ bool FAMILY::build(medEntityMesh Entity,int **FamilyNumber /* from MED file */)
     //    delete[] GeometricTypeNumber;
       
     // family on all ELEMENT ?
     //    delete[] GeometricTypeNumber;
       
     // family on all ELEMENT ?
-    if (_totalNumberOfElements == _mesh->getNumberOfElements(Entity,MED_ALL_ELEMENTS)) {
+    if (_totalNumberOfElements == _mesh->getNumberOfElementsWithPoly(Entity,MED_ALL_ELEMENTS) && Entity==MED_EN::MED_CELL) {
       _isOnAllElts = true ;
       // all others attributs are rights !
       for (int i=0; i<_numberOfGeometricType; i++)
       _isOnAllElts = true ;
       // all others attributs are rights !
       for (int i=0; i<_numberOfGeometricType; i++)
@@ -397,6 +404,7 @@ bool FAMILY::build(medEntityMesh Entity,int **FamilyNumber /* from MED file */)
     }
   }
   delete[] tmp_Types;
     }
   }
   delete[] tmp_Types;
+  delete[] types;
   delete[] numberOfElementsInFamily;
 
   delete[] tmp_ElementsLists;
   delete[] numberOfElementsInFamily;
 
   delete[] tmp_ElementsLists;
index cfaef1e862e8258c647e416976275210dfbcd532..7a22a063ab8a2d01b408706e72f4ada7de7f9631 100644 (file)
@@ -48,39 +48,9 @@ FIELD_::FIELD_(const FIELD_ &m)
   _support = m._support;
   _numberOfComponents = m._numberOfComponents;
   _numberOfValues = m._numberOfValues;
   _support = m._support;
   _numberOfComponents = m._numberOfComponents;
   _numberOfValues = m._numberOfValues;
-
-  if (m._componentsTypes != NULL)
-    {
-      _componentsTypes = new int[m._numberOfComponents] ;
-      memcpy(_componentsTypes,m._componentsTypes,sizeof(int)*m._numberOfComponents);
-      /*
-      _componentsTypes = new int[m._numberOfComponents] ;
-      for(int i=0;i<m._numberOfComponents;i++) {
-       _componentsTypes[i] = m._componentsTypes[i] ;
-      }
-      */
-    }
-  else _componentsTypes = (int *) NULL;
-
-  _componentsNames = new string[m._numberOfComponents];
-  for (int i=0; i<m._numberOfComponents; i++)
-    {_componentsNames[i]=m._componentsNames[i];}
-  _componentsDescriptions = new string[m._numberOfComponents];
-  for (int i=0; i<m._numberOfComponents; i++)
-    {_componentsDescriptions[i]=m._componentsDescriptions[i];}
-  _componentsUnits = new UNIT[m._numberOfComponents];
-  for (int i=0; i<m._numberOfComponents; i++)
-    {_componentsUnits[i] = m._componentsUnits[i];}
-  // L'operateur '=' est defini dans la classe UNIT
-  _MEDComponentsUnits = new string[m._numberOfComponents];
-  for (int i=0; i<m._numberOfComponents; i++)
-    {_MEDComponentsUnits[i] = m._MEDComponentsUnits[i];}
-  _iterationNumber = m._iterationNumber;
-  _time = m._time;
-  _orderNumber = m._orderNumber;
+  copyGlobalInfo(m);
   _valueType = m._valueType;
   //_drivers = m._drivers ; // PG : Well, same driver, what about m destructor !
   _valueType = m._valueType;
   //_drivers = m._drivers ; // PG : Well, same driver, what about m destructor !
-
 }
 
 FIELD_::~FIELD_()
 }
 
 FIELD_::~FIELD_()
@@ -207,7 +177,7 @@ void FIELD_::_checkNormCompatibility(const FIELD<double>* support_volume) const
    Check up the compatibility of fields before performing an arithmetic operation
   \endif
 */
    Check up the compatibility of fields before performing an arithmetic operation
   \endif
 */
-void FIELD_::_checkFieldCompatibility(const FIELD_& m, const FIELD_& n ) throw (MEDEXCEPTION)
+void FIELD_::_checkFieldCompatibility(const FIELD_& m, const FIELD_& n, bool checkUnit) throw (MEDEXCEPTION)
 {
     string diagnosis;
 
 {
     string diagnosis;
 
@@ -223,20 +193,23 @@ void FIELD_::_checkFieldCompatibility(const FIELD_& m, const FIELD_& n ) throw (
       diagnosis+="They don't have the same number of values!";
     else
       {
       diagnosis+="They don't have the same number of values!";
     else
       {
-       for(int i=0; i<m._numberOfComponents; i++)
-       {
-// Not yet implemented   
-//         if(m._componentsTypes[i] != n._componentsTypes[i])
-//         {
-//             diagnosis+="Components don't have the same types!";
-//             break;
-//         }
-         if(m._MEDComponentsUnits[i] != n._MEDComponentsUnits[i])
-           {
-             diagnosis+="Components don't have the same units!";
-             break;
-           }
-       }
+       if(checkUnit)
+         {
+           for(int i=0; i<m._numberOfComponents; i++)
+             {
+               // Not yet implemented   
+               //          if(m._componentsTypes[i] != n._componentsTypes[i])
+               //          {
+               //              diagnosis+="Components don't have the same types!";
+               //              break;
+               //          }
+               if(m._MEDComponentsUnits[i] != n._MEDComponentsUnits[i])
+                 {
+                   diagnosis+="Components don't have the same units!";
+                   break;
+                 }
+             }
+         }
       }
 
     if(diagnosis.size()) // if fields are not compatible : complete diagnosis and throw exception
       }
 
     if(diagnosis.size()) // if fields are not compatible : complete diagnosis and throw exception
@@ -255,9 +228,49 @@ void FIELD_::_checkFieldCompatibility(const FIELD_& m, const FIELD_& n ) throw (
 
 }
 
 
 }
 
-//  void     FIELD_::setIterationNumber (int IterationNumber)           {};
-//  void     FIELD_::setOrderNumber     (int OrderNumber)               {}; 
-//  void     FIELD_::setFieldName       (string& fieldName)             {}; 
+void FIELD_::_deepCheckFieldCompatibility(const FIELD_& m, const FIELD_& n , bool checkUnit ) throw (MEDEXCEPTION)
+{
+  string diagnosis;
+
+    // check-up, fill diagnosis if some incompatibility is found.
+    if(m._support != n._support)
+      {
+       if(!(m._support->deepCompare(*n._support)))
+         diagnosis+="They don't have the same support!";
+      }
+    else if(m._numberOfComponents != n._numberOfComponents)
+      diagnosis+="They don't have the same number of components!";
+    else if(m._numberOfValues != n._numberOfValues)
+      diagnosis+="They don't have the same number of values!";
+    else
+      {
+       if(checkUnit)
+         {
+           for(int i=0; i<m._numberOfComponents; i++)
+             {
+               if(m._MEDComponentsUnits[i] != n._MEDComponentsUnits[i])
+                 {
+                   diagnosis+="Components don't have the same units!";
+                   break;
+                 }
+             }
+         }
+      }
+
+    if(diagnosis.size()) // if fields are not compatible : complete diagnosis and throw exception
+    {
+       diagnosis="Field's operation not allowed!\nThe fields " + m._name + " and " 
+                + n._name + " are not compatible.\n" + diagnosis;
+       throw MEDEXCEPTION(diagnosis.c_str());
+    }
+
+    if( m.getNumberOfValues()<=0 || m.getNumberOfComponents()<=0) // check up the size is strictly positive
+    {
+       diagnosis="Field's operation not allowed!\nThe fields " + m._name + " and " 
+                + n._name + " are empty! (size<=0).\n";
+       throw MEDEXCEPTION(diagnosis.c_str());
+    }
+} 
          
 void     FIELD_::rmDriver      (int index)
 {
          
 void     FIELD_::rmDriver      (int index)
 {
@@ -283,6 +296,37 @@ void     FIELD_::read          (const GENDRIVER &)                    {};
 void     FIELD_::write         (int , const string & ) {};
 void     FIELD_::writeAppend   (int , const string & ) {};
 void     FIELD_::read          (int )                                  {};
 void     FIELD_::write         (int , const string & ) {};
 void     FIELD_::writeAppend   (int , const string & ) {};
 void     FIELD_::read          (int )                                  {};
+void     FIELD_::copyGlobalInfo(const FIELD_& m)
+{  
+  if (m._componentsTypes != NULL)
+    {
+      _componentsTypes = new int[m._numberOfComponents] ;
+      memcpy(_componentsTypes,m._componentsTypes,sizeof(int)*m._numberOfComponents);
+    }
+  else
+    _componentsTypes = (int *) NULL;
+
+  _componentsNames = new string[m._numberOfComponents];
+  for (int i=0; i<m._numberOfComponents; i++)
+    _componentsNames[i]=m._componentsNames[i];
+  _componentsDescriptions = new string[m._numberOfComponents];
+  for (int i=0; i<m._numberOfComponents; i++)
+    _componentsDescriptions[i]=m._componentsDescriptions[i];
 
 
-//  void                     FIELD_::setValueType(med_type_champ ValueType) {};
-//  med_type_champ FIELD_::getValueType() {};
+  if (m._componentsUnits != NULL)
+    {
+      _componentsUnits = new UNIT[m._numberOfComponents];
+      for (int i=0; i<m._numberOfComponents; i++)
+       _componentsUnits[i] = m._componentsUnits[i];
+    }
+  else
+    _componentsUnits=(UNIT*)NULL;
+  
+  // L'operateur '=' est defini dans la classe UNIT
+  _MEDComponentsUnits = new string[m._numberOfComponents];
+  for (int i=0; i<m._numberOfComponents; i++)
+    {_MEDComponentsUnits[i] = m._MEDComponentsUnits[i];}
+  _iterationNumber = m._iterationNumber;
+  _time = m._time;
+  _orderNumber = m._orderNumber;
+}
index cde465b131bfe34f50d0686e77b6bc26e14a3842..0665ed84e8e2fa9c5d17361c4f5f36f11c24a7d2 100644 (file)
 #include "utilities.h"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_define.hxx"
 #include "utilities.h"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_define.hxx"
-
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_Unit.hxx"
 #include "MEDMEM_Array.hxx"
 #include "MEDMEM_GenDriver.hxx"
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_Unit.hxx"
 #include "MEDMEM_Array.hxx"
 #include "MEDMEM_GenDriver.hxx"
-#include "MEDMEM_DriverFactory.hxx"
 
 /*!
 
 
 /*!
 
@@ -127,15 +125,19 @@ protected:
   MED_EN::med_type_champ _valueType ;
 
   vector<GENDRIVER *> _drivers; // Storage of the drivers currently in use
   MED_EN::med_type_champ _valueType ;
 
   vector<GENDRIVER *> _drivers; // Storage of the drivers currently in use
-  static void _checkFieldCompatibility(const FIELD_& m, const FIELD_& n ) throw (MEDEXCEPTION);
+  static void _checkFieldCompatibility(const FIELD_& m, const FIELD_& n, bool checkUnit=true) throw (MEDEXCEPTION);
+  static void _deepCheckFieldCompatibility(const FIELD_& m, const FIELD_& n, bool checkUnit=true ) throw (MEDEXCEPTION);
   void _checkNormCompatibility(const FIELD<double>* p_field_volume=NULL) const  throw (MEDEXCEPTION);
   FIELD<double>* _getFieldSize() const;
 
 public:
 
   void _checkNormCompatibility(const FIELD<double>* p_field_volume=NULL) const  throw (MEDEXCEPTION);
   FIELD<double>* _getFieldSize() const;
 
 public:
 
-  friend class MED_MED_RDONLY_DRIVER;
-  friend class MED_MED_WRONLY_DRIVER;
-  friend class MED_MED_RDWR_DRIVER;
+  friend class MED_MED_RDONLY_DRIVER21;
+  friend class MED_MED_WRONLY_DRIVER21;
+  friend class MED_MED_RDWR_DRIVER21;
+  friend class MED_MED_RDONLY_DRIVER22;
+  friend class MED_MED_WRONLY_DRIVER22;
+  friend class MED_MED_RDWR_DRIVER22;
 
   friend class VTK_MED_DRIVER;
 
 
   friend class VTK_MED_DRIVER;
 
@@ -161,7 +163,7 @@ public:
 //    virtual  void     setOrderNumber     (int OrderNumber);
 //    virtual  void     setFieldName       (string& fieldName);
 
 //    virtual  void     setOrderNumber     (int OrderNumber);
 //    virtual  void     setFieldName       (string& fieldName);
 
-  virtual  void     rmDriver(int index);
+  virtual  void     rmDriver(int index=0);
   virtual   int     addDriver(driverTypes driverType,
                               const string & fileName="Default File Name.med",
                              const string & driverFieldName="Default Field Nam",
   virtual   int     addDriver(driverTypes driverType,
                               const string & fileName="Default File Name.med",
                              const string & driverFieldName="Default Field Nam",
@@ -217,7 +219,8 @@ public:
 
   inline void     setValueType (const MED_EN::med_type_champ ValueType) ;
   inline MED_EN::med_type_champ getValueType () const;
 
   inline void     setValueType (const MED_EN::med_type_champ ValueType) ;
   inline MED_EN::med_type_champ getValueType () const;
-
+protected:
+  void copyGlobalInfo(const FIELD_& m);
 };
 
 // ---------------------------------
 };
 
 // ---------------------------------
@@ -538,8 +541,10 @@ inline void FIELD_::setValueType (const MED_EN::med_type_champ ValueType)
 
 namespace MEDMEM {
 
 
 namespace MEDMEM {
 
-  template<class T2> class MED_FIELD_RDONLY_DRIVER;
-  template<class T2> class MED_FIELD_WRONLY_DRIVER;
+  template<class T2> class MED_FIELD_RDONLY_DRIVER21;
+  template<class T2> class MED_FIELD_WRONLY_DRIVER21;
+  template<class T2> class MED_FIELD_RDONLY_DRIVER22;
+  template<class T2> class MED_FIELD_WRONLY_DRIVER22;
   template<class T2> class VTK_FIELD_DRIVER;
   
 template <class T> class FIELD : public FIELD_
   template<class T2> class VTK_FIELD_DRIVER;
   
 template <class T> class FIELD : public FIELD_
@@ -549,7 +554,8 @@ protected:
 
   // array of value of type T
   MEDARRAY<T> *_value ;
 
   // array of value of type T
   MEDARRAY<T> *_value ;
-
+  static T _scalarForPow;
+  static T pow(T x);
 private:
   void _operation(const FIELD& m,const FIELD& n, const MED_EN::medModeSwitch mode, char* Op);
   void _operationInitialize(const FIELD& m,const FIELD& n, char* Op);
 private:
   void _operation(const FIELD& m,const FIELD& n, const MED_EN::medModeSwitch mode, char* Op);
   void _operationInitialize(const FIELD& m,const FIELD& n, char* Op);
@@ -580,21 +586,29 @@ public:
   FIELD& operator*=(const FIELD& m);
   FIELD& operator/=(const FIELD& m);
   static FIELD* add(const FIELD& m, const FIELD& n);
   FIELD& operator*=(const FIELD& m);
   FIELD& operator/=(const FIELD& m);
   static FIELD* add(const FIELD& m, const FIELD& n);
+  static FIELD* addDeep(const FIELD& m, const FIELD& n);
   static FIELD* sub(const FIELD& m, const FIELD& n);
   static FIELD* sub(const FIELD& m, const FIELD& n);
+  static FIELD* subDeep(const FIELD& m, const FIELD& n);
   static FIELD* mul(const FIELD& m, const FIELD& n);
   static FIELD* mul(const FIELD& m, const FIELD& n);
+  static FIELD* mulDeep(const FIELD& m, const FIELD& n);
   static FIELD* div(const FIELD& m, const FIELD& n);
   static FIELD* div(const FIELD& m, const FIELD& n);
+  static FIELD* divDeep(const FIELD& m, const FIELD& n);
   double normMax() const throw (MEDEXCEPTION);
   double norm2() const throw (MEDEXCEPTION);
   void   applyLin(T a, T b);
   template <T T_function(T)> void applyFunc();
   double normMax() const throw (MEDEXCEPTION);
   double norm2() const throw (MEDEXCEPTION);
   void   applyLin(T a, T b);
   template <T T_function(T)> void applyFunc();
-  static FIELD* scalarProduct(const FIELD& m, const FIELD& n);
+  void applyPow(T scalar);
+  static FIELD* scalarProduct(const FIELD& m, const FIELD& n, bool deepCheck=false);
   double normL2(int component, const FIELD<double> * p_field_volume=NULL) const;
   double normL2(const FIELD<double> * p_field_volume=NULL) const;
   double normL1(int component, const FIELD<double> * p_field_volume=NULL) const;
   double normL1(const FIELD<double> * p_field_volume=NULL) const;
   double normL2(int component, const FIELD<double> * p_field_volume=NULL) const;
   double normL2(const FIELD<double> * p_field_volume=NULL) const;
   double normL1(int component, const FIELD<double> * p_field_volume=NULL) const;
   double normL1(const FIELD<double> * p_field_volume=NULL) const;
+  FIELD* extract(const SUPPORT *subSupport) const throw (MEDEXCEPTION);
 
 
-  friend class MED_FIELD_RDONLY_DRIVER<T>;
-  friend class MED_FIELD_WRONLY_DRIVER<T>;
+  friend class MED_FIELD_RDONLY_DRIVER21<T>;
+  friend class MED_FIELD_WRONLY_DRIVER21<T>;
+  friend class MED_FIELD_RDONLY_DRIVER22<T>;
+  friend class MED_FIELD_WRONLY_DRIVER22<T>;
   friend class VTK_FIELD_DRIVER<T>;
   //friend class MED_FIELD_RDWR_DRIVER  <T>;
 
   friend class VTK_FIELD_DRIVER<T>;
   //friend class MED_FIELD_RDWR_DRIVER  <T>;
 
@@ -627,6 +641,7 @@ public:
   inline const T*       getValue(MED_EN::medModeSwitch Mode) const;
   inline const T*       getValueI(MED_EN::medModeSwitch Mode,int i) const;
   inline T        getValueIJ(int i,int j) const;
   inline const T*       getValue(MED_EN::medModeSwitch Mode) const;
   inline const T*       getValueI(MED_EN::medModeSwitch Mode,int i) const;
   inline T        getValueIJ(int i,int j) const;
+  bool getValueOnElement(int eltIdInSup,T* retValues) const;
 
   inline void setValue(MED_EN::medModeSwitch mode, T* value);
   inline void setValueI(MED_EN::medModeSwitch mode, int i, T* value);
 
   inline void setValue(MED_EN::medModeSwitch mode, T* value);
   inline void setValueI(MED_EN::medModeSwitch mode, int i, T* value);
@@ -683,7 +698,16 @@ public:
     setValueType(MED_REEL64) call.
    */
   void getBarycenter() const throw (MEDEXCEPTION) ;
     setValueType(MED_REEL64) call.
    */
   void getBarycenter() const throw (MEDEXCEPTION) ;
+  template<void T_Analytic(const double *,T*)>
+  void fillFromAnalytic();
 };
 };
+}
+
+#include "MEDMEM_DriverFactory.hxx"
+
+namespace MEDMEM {
+
+template <class T> T FIELD<T>::_scalarForPow=1;
 
 // --------------------
 // Implemented Methods
 
 // --------------------
 // Implemented Methods
@@ -710,7 +734,7 @@ template <class T>  FIELD<T>::FIELD(const SUPPORT * Support,
   SCRUTE(this);
 
   try {
   SCRUTE(this);
 
   try {
-    _numberOfValues = Support->getNumberOfElements(MED_ALL_ELEMENTS);
+    _numberOfValues = Support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
   }
   catch (MEDEXCEPTION &ex) {
     MESSAGE("No value defined ! ("<<ex.what()<<")");
   }
   catch (MEDEXCEPTION &ex) {
     MESSAGE("No value defined ! ("<<ex.what()<<")");
@@ -861,6 +885,30 @@ FIELD<T>* FIELD<T>::add(const FIELD& m, const FIELD& n)
     return result;
 }
 
     return result;
 }
 
+/*! Same as add method except that field check is deeper.
+ */
+template <class T>
+FIELD<T>* FIELD<T>::addDeep(const FIELD& m, const FIELD& n)
+{
+    BEGIN_OF("FIELD<T>::addDeep(const FIELD & m, const FIELD& n)");
+    FIELD_::_deepCheckFieldCompatibility(m, n); // may throw exception
+
+    // Select mode : avoid if possible any calculation of other mode for fields m or *this
+    MED_EN::medModeSwitch mode;
+    if(m.getvalue()->getMode()==n.getvalue()->getMode() || n.getvalue()->isOtherCalculated())
+       mode=m.getvalue()->getMode();
+    else
+       mode=n.getvalue()->getMode();
+    
+    // Creation of a new field
+    FIELD<T>* result = new FIELD<T>(m.getSupport(),m.getNumberOfComponents(),mode);
+    result->_operationInitialize(m,n,"+"); // perform Atribute's initialization
+    result->_add_in_place(m,n,mode); // perform addition
+
+    END_OF("FIELD<T>::addDeep(const FIELD & m, const FIELD& n)");
+    return result;
+}
+
 /*!
      Overload substraction operator.
      This operation is authorized only for compatible fields that have the same support.
 /*!
      Overload substraction operator.
      This operation is authorized only for compatible fields that have the same support.
@@ -990,6 +1038,30 @@ FIELD<T>* FIELD<T>::sub(const FIELD& m, const FIELD& n)
     return result;
 }
 
     return result;
 }
 
+/*! Same as sub method except that field check is deeper.
+ */
+template <class T>
+FIELD<T>* FIELD<T>::subDeep(const FIELD& m, const FIELD& n)
+{
+    BEGIN_OF("FIELD<T>::subDeep(const FIELD & m, const FIELD& n)");
+    FIELD_::_deepCheckFieldCompatibility(m, n); // may throw exception
+
+    // Select mode : avoid if possible any calculation of other mode for fields m or *this
+    MED_EN::medModeSwitch mode;
+    if(m.getvalue()->getMode()==n.getvalue()->getMode() || n.getvalue()->isOtherCalculated())
+       mode=m.getvalue()->getMode();
+    else
+       mode=n.getvalue()->getMode();
+    
+    // Creation of a new field
+    FIELD<T>* result = new FIELD<T>(m.getSupport(),m.getNumberOfComponents(),mode);
+    result->_operationInitialize(m,n,"-"); // perform Atribute's initialization
+    result->_sub_in_place(m,n,mode); // perform substraction
+
+    END_OF("FIELD<T>::subDeep(const FIELD & m, const FIELD& n)");
+    return result;
+}
+
 /*!
      Overload multiplication operator.
      This operation is authorized only for compatible fields that have the same support.
 /*!
      Overload multiplication operator.
      This operation is authorized only for compatible fields that have the same support.
@@ -1014,7 +1086,7 @@ template <class T>
 const FIELD<T> FIELD<T>::operator*(const FIELD & m) const
 {
     BEGIN_OF("FIELD<T>::operator*(const FIELD & m)");
 const FIELD<T> FIELD<T>::operator*(const FIELD & m) const
 {
     BEGIN_OF("FIELD<T>::operator*(const FIELD & m)");
-    FIELD_::_checkFieldCompatibility(*this, m); // may throw exception
+    FIELD_::_checkFieldCompatibility(*this, m, false); // may throw exception
 
     // Select mode : avoid if possible any calculation of other mode for fields m or *this
     MED_EN::medModeSwitch mode;
 
     // Select mode : avoid if possible any calculation of other mode for fields m or *this
     MED_EN::medModeSwitch mode;
@@ -1041,7 +1113,7 @@ template <class T>
 FIELD<T>& FIELD<T>::operator*=(const FIELD & m)
 {
     BEGIN_OF("FIELD<T>::operator*=(const FIELD & m)");
 FIELD<T>& FIELD<T>::operator*=(const FIELD & m)
 {
     BEGIN_OF("FIELD<T>::operator*=(const FIELD & m)");
-    FIELD_::_checkFieldCompatibility(*this, m); // may throw exception
+    FIELD_::_checkFieldCompatibility(*this, m, false); // may throw exception
 
     // We choose to keep *this mode, even if it may cost a re-calculation for m
     MED_EN::medModeSwitch mode=this->getvalue()->getMode();
 
     // We choose to keep *this mode, even if it may cost a re-calculation for m
     MED_EN::medModeSwitch mode=this->getvalue()->getMode();
@@ -1070,7 +1142,7 @@ template <class T>
 FIELD<T>* FIELD<T>::mul(const FIELD& m, const FIELD& n)
 {
     BEGIN_OF("FIELD<T>::mul(const FIELD & m, const FIELD& n)");
 FIELD<T>* FIELD<T>::mul(const FIELD& m, const FIELD& n)
 {
     BEGIN_OF("FIELD<T>::mul(const FIELD & m, const FIELD& n)");
-    FIELD_::_checkFieldCompatibility(m, n); // may throw exception
+    FIELD_::_checkFieldCompatibility(m, n, false); // may throw exception
 
     // Select mode : avoid if possible any calculation of other mode for fields m or *this
     MED_EN::medModeSwitch mode;
 
     // Select mode : avoid if possible any calculation of other mode for fields m or *this
     MED_EN::medModeSwitch mode;
@@ -1088,6 +1160,29 @@ FIELD<T>* FIELD<T>::mul(const FIELD& m, const FIELD& n)
     return result;
 }
 
     return result;
 }
 
+/*! Same as mul method except that field check is deeper.
+ */
+template <class T>
+FIELD<T>* FIELD<T>::mulDeep(const FIELD& m, const FIELD& n)
+{
+    BEGIN_OF("FIELD<T>::mulDeep(const FIELD & m, const FIELD& n)");
+    FIELD_::_deepCheckFieldCompatibility(m, n, false); // may throw exception
+
+    // Select mode : avoid if possible any calculation of other mode for fields m or *this
+    MED_EN::medModeSwitch mode;
+    if(m.getvalue()->getMode()==n.getvalue()->getMode() || n.getvalue()->isOtherCalculated())
+       mode=m.getvalue()->getMode();
+    else
+       mode=n.getvalue()->getMode();
+    
+    // Creation of a new field
+    FIELD<T>* result = new FIELD<T>(m.getSupport(),m.getNumberOfComponents(),mode);
+    result->_operationInitialize(m,n,"*"); // perform Atribute's initialization
+    result->_mul_in_place(m,n,mode); // perform multiplication
+
+    END_OF("FIELD<T>::mulDeep(const FIELD & m, const FIELD& n)");
+    return result;
+}
 
 /*!
      Overload division operator.
 
 /*!
      Overload division operator.
@@ -1113,7 +1208,7 @@ template <class T>
 const FIELD<T> FIELD<T>::operator/(const FIELD & m) const
 {
     BEGIN_OF("FIELD<T>::operator/(const FIELD & m)");
 const FIELD<T> FIELD<T>::operator/(const FIELD & m) const
 {
     BEGIN_OF("FIELD<T>::operator/(const FIELD & m)");
-    FIELD_::_checkFieldCompatibility(*this, m); // may throw exception
+    FIELD_::_checkFieldCompatibility(*this, m, false); // may throw exception
 
     // Select mode : avoid if possible any calculation of other mode for fields m or *this
     MED_EN::medModeSwitch mode;
 
     // Select mode : avoid if possible any calculation of other mode for fields m or *this
     MED_EN::medModeSwitch mode;
@@ -1141,7 +1236,7 @@ template <class T>
 FIELD<T>& FIELD<T>::operator/=(const FIELD & m)
 {
     BEGIN_OF("FIELD<T>::operator/=(const FIELD & m)");
 FIELD<T>& FIELD<T>::operator/=(const FIELD & m)
 {
     BEGIN_OF("FIELD<T>::operator/=(const FIELD & m)");
-    FIELD_::_checkFieldCompatibility(*this, m); // may throw exception
+    FIELD_::_checkFieldCompatibility(*this, m, false); // may throw exception
 
     // We choose to keep *this mode, even if it may cost a re-calculation for m
     MED_EN::medModeSwitch mode=this->getvalue()->getMode();
 
     // We choose to keep *this mode, even if it may cost a re-calculation for m
     MED_EN::medModeSwitch mode=this->getvalue()->getMode();
@@ -1170,7 +1265,7 @@ template <class T>
 FIELD<T>* FIELD<T>::div(const FIELD& m, const FIELD& n)
 {
     BEGIN_OF("FIELD<T>::div(const FIELD & m, const FIELD& n)");
 FIELD<T>* FIELD<T>::div(const FIELD& m, const FIELD& n)
 {
     BEGIN_OF("FIELD<T>::div(const FIELD & m, const FIELD& n)");
-    FIELD_::_checkFieldCompatibility(m, n); // may throw exception
+    FIELD_::_checkFieldCompatibility(m, n, false); // may throw exception
 
     // Select mode : avoid if possible any calculation of other mode for fields m or *this
     MED_EN::medModeSwitch mode;
 
     // Select mode : avoid if possible any calculation of other mode for fields m or *this
     MED_EN::medModeSwitch mode;
@@ -1188,6 +1283,29 @@ FIELD<T>* FIELD<T>::div(const FIELD& m, const FIELD& n)
     return result;
 }
 
     return result;
 }
 
+/*! Same as div method except that field check is deeper.
+ */
+template <class T>
+FIELD<T>* FIELD<T>::divDeep(const FIELD& m, const FIELD& n)
+{
+  BEGIN_OF("FIELD<T>::divDeep(const FIELD & m, const FIELD& n)");
+  FIELD_::_deepCheckFieldCompatibility(m, n, false); // may throw exception
+
+  // Select mode : avoid if possible any calculation of other mode for fields m or *this
+  MED_EN::medModeSwitch mode;
+  if(m.getvalue()->getMode()==n.getvalue()->getMode() || n.getvalue()->isOtherCalculated())
+    mode=m.getvalue()->getMode();
+  else
+    mode=n.getvalue()->getMode();
+    
+  // Creation of a new field
+  FIELD<T>* result = new FIELD<T>(m.getSupport(),m.getNumberOfComponents(),mode);
+  result->_operationInitialize(m,n,"/"); // perform Atribute's initialization
+  result->_div_in_place(m,n,mode); // perform division
+
+  END_OF("FIELD<T>::divDeep(const FIELD & m, const FIELD& n)");
+  return result;
+}
 
 /*!
   \if developper
 
 /*!
   \if developper
@@ -1403,7 +1521,24 @@ void FIELD<T>::applyFunc()
        getvalue()->clearOtherMode();
     }
 }
        getvalue()->clearOtherMode();
     }
 }
-    
+
+template <class T> T FIELD<T>::pow(T x)
+{
+  return (T)::pow(x,FIELD<T>::_scalarForPow);
+}
+
+/*!  Apply to each (scalar) field component the math function pow.
+ *   calculation is done "in place".
+ *   Use examples : 
+ *   
+ *   \code  myField.applyFunc<std::sqrt>();  // apply sqare root function \endcode
+ *     \code myField.applyFunc<myFunction>(); // apply your own created function \endcode
+ */
+template <class T> void FIELD<T>::applyPow(T scalar)
+{
+  FIELD<T>::_scalarForPow=scalar;
+  applyFunc<FIELD<T>::pow>();
+}
   
 /*!  Apply to each (scalar) field component the linear function x -> ax+b.
  *   calculation is done "in place".
   
 /*!  Apply to each (scalar) field component the linear function x -> ax+b.
  *   calculation is done "in place".
@@ -1441,10 +1576,13 @@ template <class T> void FIELD<T>::applyLin(T a, T b)
  *   Each value of it is the scalar product of the two argument's fields.
  *   The user is in charge of memory deallocation.
  */
  *   Each value of it is the scalar product of the two argument's fields.
  *   The user is in charge of memory deallocation.
  */
-template <class T> FIELD<T>* FIELD<T>::scalarProduct(const FIELD & m, const FIELD & n)
+template <class T> FIELD<T>* FIELD<T>::scalarProduct(const FIELD & m, const FIELD & n, bool deepCheck)
 {
 {
-    FIELD_::_checkFieldCompatibility( m, n); // may throw exception
-    // we need a MED_FULL_INTERLACE representation of m & n to compute the scalar product
+  if(!deepCheck)
+    FIELD_::_checkFieldCompatibility( m, n, false); // may throw exception
+  else
+    FIELD_::_deepCheckFieldCompatibility(m, n, false);
+  // we need a MED_FULL_INTERLACE representation of m & n to compute the scalar product
     const MED_EN::medModeSwitch mode=MED_EN::MED_FULL_INTERLACE; 
 
     const int numberOfElements=m.getNumberOfValues(); // strictly positive
     const MED_EN::medModeSwitch mode=MED_EN::MED_FULL_INTERLACE; 
 
     const int numberOfElements=m.getNumberOfValues(); // strictly positive
@@ -1489,8 +1627,8 @@ template <class T> double FIELD<T>::normL2(int component, const FIELD<double> *
        p_field_size=_getFieldSize(); // we calculate the volume [PROVISOIRE, en attendant l'implémentation dans mesh]
 
     // get pointer to the element's volumes. MED_FULL_INTERLACE is the default mode for p_field_size
        p_field_size=_getFieldSize(); // we calculate the volume [PROVISOIRE, en attendant l'implémentation dans mesh]
 
     // get pointer to the element's volumes. MED_FULL_INTERLACE is the default mode for p_field_size
-    const double* vol=p_field_size->getValue(MED_FULL_INTERLACE); 
-    const T* value=getValueI( MED_NO_INTERLACE, component); // get pointer to the component's values
+    const double* vol=p_field_size->getValue(MED_EN::MED_FULL_INTERLACE); 
+    const T* value=getValueI( MED_EN::MED_NO_INTERLACE, component); // get pointer to the component's values
     const T* lastvalue=value+getNumberOfValues(); // pointing just after the end of column
 
     double integrale=0.0;
     const T* lastvalue=value+getNumberOfValues(); // pointing just after the end of column
 
     double integrale=0.0;
@@ -1521,9 +1659,9 @@ template <class T> double FIELD<T>::normL2(const FIELD<double> * p_field_volume)
        p_field_size=_getFieldSize(); // we calculate the volume [PROVISOIRE, en attendant l'implémentation dans mesh]
 
     // get pointer to the element's volumes. MED_FULL_INTERLACE is the default mode for p_field_size
        p_field_size=_getFieldSize(); // we calculate the volume [PROVISOIRE, en attendant l'implémentation dans mesh]
 
     // get pointer to the element's volumes. MED_FULL_INTERLACE is the default mode for p_field_size
-    const double* vol=p_field_size->getValue(MED_FULL_INTERLACE); 
+    const double* vol=p_field_size->getValue(MED_EN::MED_FULL_INTERLACE); 
     const double* lastvol=vol+getNumberOfValues(); // pointing just after the end of vol
     const double* lastvol=vol+getNumberOfValues(); // pointing just after the end of vol
-    const T* value=getValue( MED_NO_INTERLACE); // get pointer to the field's values
+    const T* value=getValue( MED_EN::MED_NO_INTERLACE); // get pointer to the field's values
 
     double totVol=0.0;
     const double* p_vol=vol;
 
     double totVol=0.0;
     const double* p_vol=vol;
@@ -1558,8 +1696,8 @@ template <class T> double FIELD<T>::normL1(int component, const FIELD<double> *
        p_field_size=_getFieldSize(); // we calculate the volume [PROVISOIRE, en attendant l'implémentation dans mesh]
 
     // get pointer to the element's volumes. MED_FULL_INTERLACE is the default mode for p_field_size
        p_field_size=_getFieldSize(); // we calculate the volume [PROVISOIRE, en attendant l'implémentation dans mesh]
 
     // get pointer to the element's volumes. MED_FULL_INTERLACE is the default mode for p_field_size
-    const double* vol=p_field_size->getValue(MED_FULL_INTERLACE); 
-    const T* value=getValueI( MED_NO_INTERLACE, component); // get pointer to the component's values
+    const double* vol=p_field_size->getValue(MED_EN::MED_FULL_INTERLACE); 
+    const T* value=getValueI( MED_EN::MED_NO_INTERLACE, component); // get pointer to the component's values
     const T* lastvalue=value+getNumberOfValues(); // pointing just after the end of column
 
     double integrale=0.0;
     const T* lastvalue=value+getNumberOfValues(); // pointing just after the end of column
 
     double integrale=0.0;
@@ -1590,9 +1728,9 @@ template <class T> double FIELD<T>::normL1(const FIELD<double> * p_field_volume)
        p_field_size=_getFieldSize(); // we calculate the volume [PROVISOIRE, en attendant l'implémentation dans mesh]
 
     // get pointer to the element's volumes. MED_FULL_INTERLACE is the default mode for p_field_size
        p_field_size=_getFieldSize(); // we calculate the volume [PROVISOIRE, en attendant l'implémentation dans mesh]
 
     // get pointer to the element's volumes. MED_FULL_INTERLACE is the default mode for p_field_size
-    const double* vol=p_field_size->getValue(MED_FULL_INTERLACE); 
+    const double* vol=p_field_size->getValue(MED_EN::MED_FULL_INTERLACE); 
     const double* lastvol=vol+getNumberOfValues(); // pointing just after the end of vol
     const double* lastvol=vol+getNumberOfValues(); // pointing just after the end of vol
-    const T* value=getValue( MED_NO_INTERLACE); // get pointer to the field's values
+    const T* value=getValue( MED_EN::MED_NO_INTERLACE); // get pointer to the field's values
 
     double totVol=0.0;
     const double* p_vol=vol;
 
     double totVol=0.0;
     const double* p_vol=vol;
@@ -1612,8 +1750,34 @@ template <class T> double FIELD<T>::normL1(const FIELD<double> * p_field_volume)
     return integrale/totVol;
 }
 
     return integrale/totVol;
 }
 
-
-
+/*! Return a new field (to deallocate with delete) lying on subSupport that is included by
+ *   this->_support with corresponding values extracting from this->_value.
+ */
+template <class T> FIELD<T>* FIELD<T>::extract(const SUPPORT *subSupport) const throw (MEDEXCEPTION)
+{
+  if(!subSupport->belongsTo(*_support))
+    throw MEDEXCEPTION("FIELD<T>::extract : subSupport not included in this->_support !");
+  if(_support->isOnAllElements() && subSupport->isOnAllElements())
+    return new FIELD<T>(*this);
+  FIELD<T> *ret=new FIELD<T>(subSupport,_numberOfComponents,MED_EN::MED_FULL_INTERLACE);
+  if(!ret->_value)
+    throw MEDEXCEPTION("FIELD<T>::extract : unvalid support detected !");
+  T* valuesToSet=(T*)ret->_value->get(MED_EN::MED_FULL_INTERLACE);
+  int nbOfEltsSub=subSupport->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
+  const int *eltsSub=subSupport->getNumber(MED_EN::MED_ALL_ELEMENTS);
+  T* tempVals=new T[_numberOfComponents];
+  for(int i=0;i<nbOfEltsSub;i++)
+    {
+      if(!getValueOnElement(eltsSub[i],tempVals))
+       throw MEDEXCEPTION("Problem in belongsTo function !!!");
+      for(int j=0;j<_numberOfComponents;j++)
+       valuesToSet[i*_numberOfComponents+j]=tempVals[j];
+    }
+  delete [] tempVals;
+  ret->setValueType(_valueType);
+  ret->copyGlobalInfo(*this);
+  return ret;
+}
 
 /*!
   Constructor with parameters; the object is set via a file and its associated
 
 /*!
   Constructor with parameters; the object is set via a file and its associated
@@ -1646,7 +1810,7 @@ template <class T> FIELD<T>::FIELD(const SUPPORT * Support,
   _time = 0.0;
   _orderNumber = orderNumber;
 
   _time = 0.0;
   _orderNumber = orderNumber;
 
-  current = addDriver(driverType,fileName,fieldDriverName,MED_LECT);
+  current = addDriver(driverType,fileName,fieldDriverName,MED_EN::MED_LECT);
 
 //   switch(driverType)
 //     {
 
 //   switch(driverType)
 //     {
@@ -1715,7 +1879,7 @@ template <class T> void FIELD<T>::allocValue(const int NumberOfComponents)
   }
 
   try {
   }
 
   try {
-    _numberOfValues = _support->getNumberOfElements(MED_ALL_ELEMENTS);
+    _numberOfValues = _support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
     MESSAGE(LOC <<" : "<<_numberOfValues <<" et "<< NumberOfComponents);
 
     _value = new MEDARRAY<T>(_numberOfComponents,_numberOfValues);
     MESSAGE(LOC <<" : "<<_numberOfValues <<" et "<< NumberOfComponents);
 
     _value = new MEDARRAY<T>(_numberOfComponents,_numberOfValues);
@@ -1790,7 +1954,7 @@ template <class T> int FIELD<T>::addDriver(driverTypes driverType,
                                           const string & driverName/*="Default Field Name"*/,
                                           MED_EN::med_mode_acces access)
 {
                                           const string & driverName/*="Default Field Name"*/,
                                           MED_EN::med_mode_acces access)
 {
-  const char * LOC = "FIELD<T>::addDriver(driverTypes driverType, const string & fileName=\"Default File Name.med\",const string & driverName=\"Default Field Name\,MED_EN::med_mode_acces access) : ";
+  const char * LOC = "FIELD<T>::addDriver(driverTypes driverType, const string & fileName=\"Default File Name.med\",const string & driverName=\"Default Field Name,MED_EN::med_mode_acces access) : ";
 
   GENDRIVER * driver;
 
 
   GENDRIVER * driver;
 
@@ -1997,6 +2161,44 @@ template <class T> inline void FIELD<T>::read(const GENDRIVER & genDriver)
 
 }
 
 
 }
 
+/*!
+  Fills in already allocated retValues array the values related to eltIdInSup.
+  If the element does not exist in this->_support false is returned, true otherwise.
+ */
+template <class T> bool FIELD<T>::getValueOnElement(int eltIdInSup,T* retValues) const
+{
+  if(eltIdInSup<1)
+    return false;
+  if(_support->isOnAllElements())
+    {
+      int nbOfEltsThis=_support->getMesh()->getNumberOfElements(_support->getEntity(),MED_EN::MED_ALL_ELEMENTS);
+      if(eltIdInSup>nbOfEltsThis)
+       return false;
+      const T* valsThis=getValue(MED_EN::MED_FULL_INTERLACE);
+      for(int j=0;j<_numberOfComponents;j++)
+       retValues[j]=valsThis[(eltIdInSup-1)*_numberOfComponents+j];
+      return true;
+    }
+  else
+    {
+      int nbOfEltsThis=_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
+      const int *eltsThis=_support->getNumber(MED_EN::MED_ALL_ELEMENTS);
+      int iThis;
+      bool found=false;
+      for(iThis=0;iThis<nbOfEltsThis && !found;)
+       if(eltsThis[iThis]==eltIdInSup)
+         found=true;
+       else
+         iThis++;
+      if(!found)
+       return false;
+      const T* valsThis=getValue(MED_EN::MED_FULL_INTERLACE);
+      for(int j=0;j<_numberOfComponents;j++)
+       retValues[j]=valsThis[iThis*_numberOfComponents+j];
+      return true;
+    }
+}
+
 /*!
   \if developper
   Destroy the MEDARRAY<T> in FIELD and put the new one without copy.
 /*!
   \if developper
   Destroy the MEDARRAY<T> in FIELD and put the new one without copy.
@@ -2103,7 +2305,7 @@ template <class T> void FIELD<T>::getVolume() const throw (MEDEXCEPTION)
   // number of components = 1 and its value type has to be set to MED_REEL64
   // (ie a FIELD<double>)
 
   // number of components = 1 and its value type has to be set to MED_REEL64
   // (ie a FIELD<double>)
 
-  if ((_support == (SUPPORT *) NULL) || (_numberOfComponents != 1) || (_valueType != MED_REEL64))
+  if ((_support == (SUPPORT *) NULL) || (_numberOfComponents != 1) || (_valueType != MED_EN::MED_REEL64))
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to 1 and a value type set to MED_REEL64"));
 
   END_OF(LOC);
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to 1 and a value type set to MED_REEL64"));
 
   END_OF(LOC);
@@ -2121,7 +2323,7 @@ template <class T> void FIELD<T>::getArea() const throw (MEDEXCEPTION)
   // number of components = 1 and its value type has to be set to MED_REEL64
   // (ie a FIELD<double>)
 
   // number of components = 1 and its value type has to be set to MED_REEL64
   // (ie a FIELD<double>)
 
-  if ((_support == (SUPPORT *) NULL) || (_numberOfComponents != 1) || (_valueType != MED_REEL64))
+  if ((_support == (SUPPORT *) NULL) || (_numberOfComponents != 1) || (_valueType != MED_EN::MED_REEL64))
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to 1 and a value type set to MED_REEL64"));
 
   END_OF(LOC);
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to 1 and a value type set to MED_REEL64"));
 
   END_OF(LOC);
@@ -2139,7 +2341,7 @@ template <class T> void FIELD<T>::getLength() const throw (MEDEXCEPTION)
   // number of components = 1 and its value type has to be set to MED_REEL64
   // (ie a FIELD<double>)
 
   // number of components = 1 and its value type has to be set to MED_REEL64
   // (ie a FIELD<double>)
 
-  if ((_support == (SUPPORT *) NULL) || (_numberOfComponents != 1) || (_valueType != MED_REEL64))
+  if ((_support == (SUPPORT *) NULL) || (_numberOfComponents != 1) || (_valueType != MED_EN::MED_REEL64))
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to 1 and a value type set to MED_REEL64"));
 
   END_OF(LOC);
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to 1 and a value type set to MED_REEL64"));
 
   END_OF(LOC);
@@ -2162,7 +2364,7 @@ template <class T> void FIELD<T>::getNormal() const throw (MEDEXCEPTION)
 
   int dim_space = _support->getMesh()->getSpaceDimension();
 
 
   int dim_space = _support->getMesh()->getSpaceDimension();
 
-  if ((_numberOfComponents != dim_space) || (_valueType != MED_REEL64))
+  if ((_numberOfComponents != dim_space) || (_valueType != MED_EN::MED_REEL64))
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to the space dimension and a value type set to MED_REEL64"));
 
   END_OF(LOC);
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to the space dimension and a value type set to MED_REEL64"));
 
   END_OF(LOC);
@@ -2185,12 +2387,74 @@ template <class T> void FIELD<T>::getBarycenter() const throw (MEDEXCEPTION)
 
   int dim_space = _support->getMesh()->getSpaceDimension();
 
 
   int dim_space = _support->getMesh()->getSpaceDimension();
 
-  if ((_numberOfComponents != dim_space) || (_valueType != MED_REEL64))
+  if ((_numberOfComponents != dim_space) || (_valueType != MED_EN::MED_REEL64))
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to the space dimension and a value type set to MED_REEL64"));
 
   END_OF(LOC);
 }
 
       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"The field has to be initialised with a non empty support, a number of components set to the space dimension and a value type set to MED_REEL64"));
 
   END_OF(LOC);
 }
 
+/*!
+  Fill array by using T_Analytic. 
+  WARNING : "this" must have allocated its array by setting this->_support and this->_numberOfComponents properly.
+  Typically you should use it on a field built with constructor FIELD<T>::FIELD<T>(SUPPORT *,int nbOfComponents)
+ */
+template <class T> 
+template<void T_Analytic(const double *,T*)>
+void FIELD<T>::fillFromAnalytic()
+{
+  int i,j;
+  MESH * mesh = _support->getMesh();
+  int spaceDim = mesh->getSpaceDimension();
+  const double * coord;
+  FIELD<double> * barycenterField=0;
+  double ** xyz=new double* [spaceDim];
+  bool deallocateXyz=false;
+  if(_support->getEntity()==MED_EN::MED_NODE)
+    {
+      if (_support->isOnAllElements())
+       {
+         coord=mesh->getCoordinates(MED_EN::MED_NO_INTERLACE);
+         for(i=0; i<spaceDim; i++)
+           xyz[i]=(double *)coord+i*_numberOfValues;  
+       }
+      else
+       {
+         coord = mesh->getCoordinates(MED_EN::MED_FULL_INTERLACE);
+         const int * nodesNumber=_support->getNumber(MED_EN::MED_ALL_ELEMENTS);
+         for(i=0; i<spaceDim; i++)
+           xyz[i]=new double[_numberOfValues];
+         deallocateXyz=true;
+         for(i=0;i<_numberOfValues;i++)
+           {
+             for(j=0;j<spaceDim;j++)
+               xyz[j][i]=coord[(nodesNumber[i]-1)*spaceDim+j];
+           }
+       }
+    }
+  else
+    {
+      barycenterField = mesh->getBarycenter(_support);
+      coord=barycenterField->getValue(MED_EN::MED_NO_INTERLACE);
+      for(i=0; i<spaceDim; i++)
+       xyz[i]=(double *)(coord+i*_numberOfValues);
+    }
+  T* valsToSet=(T*)getValue(MED_EN::MED_FULL_INTERLACE);
+  double *temp=new double[spaceDim];
+  for(i=0;i<_numberOfValues;i++)
+  {
+    for(j=0;j<spaceDim;j++)
+      temp[j]=xyz[j][i];
+    T_Analytic(temp,valsToSet+i*_numberOfComponents);
+  }
+  delete [] temp;
+  if(barycenterField)
+    delete barycenterField;
+  if(deallocateXyz)
+    for(j=0;j<spaceDim;j++)
+      delete [] xyz[j];
+  delete [] xyz;
+}
+
 }//End namespace MEDMEM
 
 #endif /* FIELD_HXX */
 }//End namespace MEDMEM
 
 #endif /* FIELD_HXX */
diff --git a/src/MEDMEM/MEDMEM_Formulae.hxx b/src/MEDMEM/MEDMEM_Formulae.hxx
new file mode 100644 (file)
index 0000000..acdcef4
--- /dev/null
@@ -0,0 +1,348 @@
+#ifndef MEDMEM_FORMULAE
+#define MEDMEM_FORMULAE
+
+#include <math.h>
+
+inline void CalculateBarycenterDyn(const double **pts, int nbPts, int dim, double *bary);
+
+inline double CalculateAreaForPolyg(const double **coords, int nbOfPtsInPolygs, int spaceDim);
+
+inline double CalculateAreaForTria(const double *p1, const double *p2, const double *p3,int spaceDim)
+{
+  if (spaceDim==2)
+    return (-((p2[0]-p1[0])*(p3[1]-p1[1]) - (p3[0]-p1[0])*(p2[1]-p1[1]))/2.0);
+  else
+    return (sqrt(((p2[1]-p1[1])*(p3[2]-p1[2]) - (p3[1]-p1[1])*(p2[2]-p1[2]))*
+                ((p2[1]-p1[1])*(p3[2]-p1[2]) - (p3[1]-p1[1])*(p2[2]-p1[2])) +
+                ((p3[0]-p1[0])*(p2[2]-p1[2]) - (p2[0]-p1[0])*(p3[2]-p1[2]))*
+                ((p3[0]-p1[0])*(p2[2]-p1[2]) - (p2[0]-p1[0])*(p3[2]-p1[2])) +
+                ((p2[0]-p1[0])*(p3[1]-p1[1]) - (p3[0]-p1[0])*(p2[1]-p1[1]))*
+                ((p2[0]-p1[0])*(p3[1]-p1[1]) - (p3[0]-p1[0])*(p2[1]-p1[1])))/2.0);
+}
+
+inline double CalculateAreaForQuad(const double *p1, const double *p2, const double *p3, const double *p4, int spaceDim)
+{
+  if (spaceDim==2)
+    {
+      double a1 = (p2[0]-p1[0])/4.0, a2 = (p2[1]-p1[1])/4.0;
+      double b1 = (p3[0]-p4[0])/4.0, b2 = (p3[1]-p4[1])/4.0;
+      double c1 = (p3[0]-p2[0])/4.0, c2 = (p3[1]-p2[1])/4.0;
+      double d1 = (p4[0]-p1[0])/4.0, d2 = (p4[1]-p1[1])/4.0;
+
+      return  (- 4.0*(b1*c2 - c1*b2 + a1*c2 - c1*a2 + b1*d2 -
+                     d1*b2 + a1*d2 - d1*a2));
+    }
+  else
+    {
+      return ((sqrt(((p2[1]-p1[1])*(p4[2]-p1[2]) - (p4[1]-p1[1])*(p2[2]-p1[2]))*
+                  ((p2[1]-p1[1])*(p4[2]-p1[2]) - (p4[1]-p1[1])*(p2[2]-p1[2])) +
+                  ((p4[0]-p1[0])*(p2[2]-p1[2]) - (p2[0]-p1[0])*(p4[2]-p1[2]))*
+                  ((p4[0]-p1[0])*(p2[2]-p1[2]) - (p2[0]-p1[0])*(p4[2]-p1[2])) +
+                  ((p2[0]-p1[0])*(p4[1]-p1[1]) - (p4[0]-p1[0])*(p2[1]-p1[1]))*
+                  ((p2[0]-p1[0])*(p4[1]-p1[1]) - (p4[0]-p1[0])*(p2[1]-p1[1]))) +
+             sqrt(((p4[1]-p3[1])*(p2[2]-p3[2]) - (p2[1]-p3[1])*(p4[2]-p3[2]))*
+                  ((p4[1]-p3[1])*(p2[2]-p3[2]) - (p2[1]-p3[1])*(p4[2]-p3[2])) +
+                  ((p2[0]-p3[0])*(p4[2]-p3[2]) - (p4[0]-p3[0])*(p2[2]-p3[2]))*
+                  ((p2[0]-p3[0])*(p4[2]-p3[2]) - (p4[0]-p3[0])*(p2[2]-p3[2])) +
+                  ((p4[0]-p3[0])*(p2[1]-p3[1]) - (p2[0]-p3[0])*(p4[1]-p3[1]))*
+                  ((p4[0]-p3[0])*(p2[1]-p3[1]) - (p2[0]-p3[0])*(p4[1]-p3[1]))))/2.0);
+    }
+}
+
+inline void CalculateNormalForTria(const double *p1, const double *p2, const double *p3, double *normal)
+{
+  normal[0] = ((p2[1]-p1[1])*(p3[2]-p1[2]) - (p3[1]-p1[1])*(p2[2]-p1[2]))/2.0;
+  normal[1] = ((p3[0]-p1[0])*(p2[2]-p1[2]) - (p2[0]-p1[0])*(p3[2]-p1[2]))/2.0;
+  normal[2] = ((p2[0]-p1[0])*(p3[1]-p1[1]) - (p3[0]-p1[0])*(p2[1]-p1[1]))/2.0;
+}
+
+inline void CalculateNormalForQuad(const double *p1, const double *p2, const double *p3, const double *p4, double *normal)
+{
+  double xnormal1 = (p2[1]-p1[1])*(p4[2]-p1[2]) - (p4[1]-p1[1])*(p2[2]-p1[2]);
+  double xnormal2 = (p4[0]-p1[0])*(p2[2]-p1[2]) - (p2[0]-p1[0])*(p4[2]-p1[2]);
+  double xnormal3 = (p2[0]-p1[0])*(p4[1]-p1[1]) - (p4[0]-p1[0])*(p2[1]-p1[1]);
+  double xarea = sqrt(xnormal1*xnormal1 + xnormal2*xnormal2 + xnormal3*xnormal3);
+  xnormal1 = xnormal1/xarea;
+  xnormal2 = xnormal2/xarea;
+  xnormal3 = xnormal3/xarea;
+  xarea = CalculateAreaForQuad(p1,p2,p3,p4,3);
+  normal[0] = xnormal1*xarea ;
+  normal[1] = xnormal2*xarea ;
+  normal[2] = xnormal3*xarea ;
+}
+
+inline void CalculateNormalForPolyg(const double **coords, int nbOfPtsInPolygs, double *normal)
+{
+  double coordOfBary[3];
+  CalculateBarycenterDyn(coords,nbOfPtsInPolygs,3,coordOfBary);
+  double xnormal1 = (coords[0][1]-coords[1][1])*(coordOfBary[2]-coords[1][2])-(coords[0][2]-coords[1][2])*(coordOfBary[1]-coords[1][1]);
+  double xnormal2 = (coords[0][2]-coords[1][2])*(coordOfBary[0]-coords[1][0])-(coords[0][0]-coords[1][0])*(coordOfBary[2]-coords[1][2]);
+  double xnormal3 = (coords[0][0]-coords[1][0])*(coordOfBary[1]-coords[1][1])-(coords[0][1]-coords[1][1])*(coordOfBary[0]-coords[1][0]);
+  double xarea = sqrt(xnormal1*xnormal1 + xnormal2*xnormal2 + xnormal3*xnormal3);
+  xnormal1 = xnormal1/xarea;
+  xnormal2 = xnormal2/xarea;
+  xnormal3 = xnormal3/xarea;
+  xarea = CalculateAreaForPolyg(coords,nbOfPtsInPolygs,3);
+  normal[0] = xnormal1*xarea ;
+  normal[1] = xnormal2*xarea ;
+  normal[2] = xnormal3*xarea ;
+}
+
+inline double CalculateAreaForPolyg(const double **coords, int nbOfPtsInPolygs, int spaceDim)
+{
+  double coordOfBary[3];
+  CalculateBarycenterDyn(coords,nbOfPtsInPolygs,spaceDim,coordOfBary);
+  double ret=0.;
+  for(int i=0;i<nbOfPtsInPolygs;i++)
+    {
+      double tmp=CalculateAreaForTria(coords[i],coords[(i+1)%nbOfPtsInPolygs],coordOfBary,spaceDim);
+      ret+=tmp;
+    }
+  return ret;
+}
+
+inline double CalculateVolumeForTetra(const double *p1, const double *p2, const double *p3, const double *p4)
+{
+  return  ((p3[0]-p1[0])*((p2[1]-p1[1])*(p4[2]-p1[2]) - (p2[2]-p1[2])*(p4[1]-p1[1])) -
+          (p2[0]-p1[0])*((p3[1]-p1[1])*(p4[2]-p1[2]) - (p3[2]-p1[2])*(p4[1]-p1[1])) +
+          (p4[0]-p1[0])*((p3[1]-p1[1])*(p2[2]-p1[2]) - (p3[2]-p1[2])*(p2[1]-p1[1])))/6.0;
+}
+
+inline double CalculateVolumeForPyra(const double *p1, const double *p2, const double *p3, const double *p4, const double *p5)
+{
+  return (((p3[0]-p1[0])*((p2[1]-p1[1])*(p5[2]-p1[2]) - (p2[2]-p1[2])*(p5[1]-p1[1])) -
+          (p2[0]-p1[0])*((p3[1]-p1[1])*(p5[2]-p1[2]) - (p3[2]-p1[2])*(p5[1]-p1[1])) +
+          (p5[0]-p1[0])*((p3[1]-p1[1])*(p2[2]-p1[2]) - (p3[2]-p1[2])*(p2[1]-p1[1]))) +
+         ((p4[0]-p1[0])*((p3[1]-p1[1])*(p5[2]-p1[2]) - (p3[2]-p1[2])*(p5[1]-p1[1])) -
+          (p3[0]-p1[0])*((p4[1]-p1[1])*(p5[2]-p1[2]) - (p4[2]-p1[2])*(p5[1]-p1[1])) +
+          (p5[0]-p1[0])*((p4[1]-p1[1])*(p3[2]-p1[2]) - (p4[2]-p1[2])*(p3[1]-p1[1])))
+         )/6.0;
+}
+
+inline double CalculateVolumeForPenta(const double *p1, const double *p2, const double *p3, const double *p4, const double *p5, const double *p6)
+{
+  double a1 = (p2[0]-p3[0])/2.0, a2 = (p2[1]-p3[1])/2.0, a3 = (p2[2]-p3[2])/2.0;
+  double b1 = (p5[0]-p6[0])/2.0, b2 = (p5[1]-p6[1])/2.0, b3 = (p5[2]-p6[2])/2.0;
+  double c1 = (p4[0]-p1[0])/2.0, c2 = (p4[1]-p1[1])/2.0, c3 = (p4[2]-p1[2])/2.0;
+  double d1 = (p5[0]-p2[0])/2.0, d2 = (p5[1]-p2[1])/2.0, d3 = (p5[2]-p2[2])/2.0;
+  double e1 = (p6[0]-p3[0])/2.0, e2 = (p6[1]-p3[1])/2.0, e3 = (p6[2]-p3[2])/2.0;
+  double f1 = (p1[0]-p3[0])/2.0, f2 = (p1[1]-p3[1])/2.0, f3 = (p1[2]-p3[2])/2.0;
+  double h1 = (p4[0]-p6[0])/2.0, h2 = (p4[1]-p6[1])/2.0, h3 = (p4[2]-p6[2])/2.0;
+
+  double A = a1*c2*f3 - a1*c3*f2 - a2*c1*f3 + a2*c3*f1 +
+    a3*c1*f2 - a3*c2*f1;
+  double B = b1*c2*h3 - b1*c3*h2 - b2*c1*h3 + b2*c3*h1 +
+    b3*c1*h2 - b3*c2*h1;
+  double C = (a1*c2*h3 + b1*c2*f3) - (a1*c3*h2 + b1*c3*f2) -
+    (a2*c1*h3 + b2*c1*f3) + (a2*c3*h1 + b2*c3*f1) +
+    (a3*c1*h2 + b3*c1*f2) - (a3*c2*h1 + b3*c2*f1);
+  double D = a1*d2*f3 - a1*d3*f2 - a2*d1*f3 + a2*d3*f1 +
+    a3*d1*f2 - a3*d2*f1;
+  double E = b1*d2*h3 - b1*d3*h2 - b2*d1*h3 + b2*d3*h1 +
+    b3*d1*h2 - b3*d2*h1;
+  double F = (a1*d2*h3 + b1*d2*f3) - (a1*d3*h2 + b1*d3*f2) -
+    (a2*d1*h3 + b2*d1*f3) + (a2*d3*h1 + b2*d3*f1) +
+    (a3*d1*h2 + b3*d1*f2) - (a3*d2*h1 + b3*d2*f1);
+  double G = a1*e2*f3 - a1*e3*f2 - a2*e1*f3 + a2*e3*f1 +
+    a3*e1*f2 - a3*e2*f1;
+  double H = b1*e2*h3 - b1*e3*h2 - b2*e1*h3 + b2*e3*h1 +
+    b3*e1*h2 - b3*e2*h1;
+  double P = (a1*e2*h3 + b1*e2*f3) - (a1*e3*h2 + b1*e3*f2) -
+    (a2*e1*h3 + b2*e1*f3) + (a2*e3*h1 + b2*e3*f1) +
+    (a3*e1*h2 + b3*e1*f2) - (a3*e2*h1 + b3*e2*f1);
+
+  return (-2.0*(2.0*(A + B + D + E + G + H) + C + F + P)/9.0);
+}
+
+inline double CalculateVolumeForHexa(const double *pt1, const double *pt2, const double *pt3, const double *pt4, const double *pt5, const double *pt6, const double *pt7, const double *pt8)
+{
+  double a1 = (pt3[0]-pt4[0])/8.0, a2 = (pt3[1]-pt4[1])/8.0, a3 = (pt3[2]-pt4[2])/8.0;
+  double b1 = (pt2[0]-pt1[0])/8.0, b2 = (pt2[1]-pt1[1])/8.0, b3 = (pt2[2]-pt1[2])/8.0;
+  double c1 = (pt7[0]-pt8[0])/8.0, c2 = (pt7[1]-pt8[1])/8.0, c3 = (pt7[2]-pt8[2])/8.0;
+  double d1 = (pt6[0]-pt5[0])/8.0, d2 = (pt6[1]-pt5[1])/8.0, d3 = (pt6[2]-pt5[2])/8.0;
+  double e1 = (pt3[0]-pt2[0])/8.0, e2 = (pt3[1]-pt2[1])/8.0, e3 = (pt3[2]-pt2[2])/8.0;
+  double f1 = (pt4[0]-pt1[0])/8.0, f2 = (pt4[1]-pt1[1])/8.0, f3 = (pt4[2]-pt1[2])/8.0;
+  double h1 = (pt7[0]-pt6[0])/8.0, h2 = (pt7[1]-pt6[1])/8.0, h3 = (pt7[2]-pt6[2])/8.0;
+  double p1 = (pt8[0]-pt5[0])/8.0, p2 = (pt8[1]-pt5[1])/8.0, p3 = (pt8[2]-pt5[2])/8.0;
+  double q1 = (pt3[0]-pt7[0])/8.0, q2 = (pt3[1]-pt7[1])/8.0, q3 = (pt3[2]-pt7[2])/8.0;
+  double r1 = (pt4[0]-pt8[0])/8.0, r2 = (pt4[1]-pt8[1])/8.0, r3 = (pt4[2]-pt8[2])/8.0;
+  double s1 = (pt2[0]-pt6[0])/8.0, s2 = (pt2[1]-pt6[1])/8.0, s3 = (pt2[2]-pt6[2])/8.0;
+  double t1 = (pt1[0]-pt5[0])/8.0, t2 = (pt1[1]-pt5[1])/8.0, t3 = (pt1[2]-pt5[2])/8.0;
+
+  double A = a1*e2*q3 - a1*e3*q2 - a2*e1*q3 + a2*e3*q1 +
+    a3*e1*q2 - a3*e2*q1;
+  double B = c1*h2*q3 - c1*h3*q2 - c2*h1*q3 + c2*h3*q1 +
+    c3*h1*q2 - c3*h2*q1;
+  double C = (a1*h2 + c1*e2)*q3 - (a1*h3 + c1*e3)*q2 -
+    (a2*h1 + c2*e1)*q3 + (a2*h3 + c2*e3)*q1 +
+    (a3*h1 + c3*e1)*q2 - (a3*h2 + c3*e2)*q1;
+  double D = b1*e2*s3 - b1*e3*s2 - b2*e1*s3 + b2*e3*s1 +
+    b3*e1*s2 - b3*e2*s1;
+  double E = d1*h2*s3 - d1*h3*s2 - d2*h1*s3 + d2*h3*s1 +
+    d3*h1*s2 - d3*h2*s1;
+  double F = (b1*h2 + d1*e2)*s3 - (b1*h3 + d1*e3)*s2 -
+    (b2*h1 + d2*e1)*s3 + (b2*h3 + d2*e3)*s1 +
+    (b3*h1 + d3*e1)*s2 - (b3*h2 + d3*e2)*s1;
+  double G = (a1*e2*s3 + b1*e2*q3) - (a1*e3*s2 + b1*e3*q2) -
+    (a2*e1*s3 + b2*e1*q3) + (a2*e3*s1 + b2*e3*q1) +
+    (a3*e1*s2 + b3*e1*q2) - (a3*e2*s1 + b3*e2*q1);
+  double H = (c1*h2*s3 + d1*h2*q3) - (c1*h3*s2 + d1*h3*q2) -
+    (c2*h1*s3 + d2*h1*q3) + (c2*h3*s1 + d2*h3*q1) +
+    (c3*h1*s2 + d3*h1*q2) - (c3*h2*s1 + d3*h2*q1);
+  double I = ((a1*h2 + c1*e2)*s3 + (b1*h2 + d1*e2)*q3) -
+    ((a1*h3 + c1*e3)*s2 + (b1*h3 + d1*e3)*q2) -
+    ((a2*h1 + c2*e1)*s3 + (b2*h1 + d2*e1)*q3) +
+    ((a2*h3 + c2*e3)*s1 + (b2*h3 + d2*e3)*q1) +
+    ((a3*h1 + c3*e1)*s2 + (b3*h1 + d3*e1)*q2) -
+    ((a3*h2 + c3*e2)*s1 + (b3*h2 + d3*e2)*q1);
+  double J = a1*f2*r3 - a1*f3*r2 - a2*f1*r3 + a2*f3*r1 +
+    a3*f1*r2 - a3*f2*r1;
+  double K = c1*p2*r3 - c1*p3*r2 - c2*p1*r3 + c2*p3*r1 +
+    c3*p1*r2 - c3*p2*r1;
+  double L = (a1*p2 + c1*f2)*r3 - (a1*p3 + c1*f3)*r2 -
+    (a2*p1 + c2*f1)*r3 + (a2*p3 + c2*f3)*r1 +
+    (a3*p1 + c3*f1)*r2 - (a3*p2 + c3*f2)*r1;
+  double M = b1*f2*t3 - b1*f3*t2 - b2*f1*t3 + b2*f3*t1 +
+    b3*f1*t2 - b3*f2*t1;
+  double N = d1*p2*t3 - d1*p3*t2 - d2*p1*t3 + d2*p3*t1 +
+    d3*p1*t2 - d3*p2*t1;
+  double O = (b1*p2 + d1*f2)*t3 - (b1*p3 + d1*f3)*t2 -
+    (b2*p1 + d2*f1)*t3 + (b2*p3 + d2*f3)*t1 +
+    (b3*p1 + d3*f1)*t2 - (b3*p2 + d3*f2)*t1;
+  double P = (a1*f2*t3 + b1*f2*r3) - (a1*f3*t2 + b1*f3*r2) -
+    (a2*f1*t3 + b2*f1*r3) + (a2*f3*t1 + b2*f3*r1) +
+    (a3*f1*t2 + b3*f1*r2) - (a3*f2*t1 + b3*f2*r1);
+  double Q = (c1*p2*t3 + d1*p2*r3) - (c1*p3*t2 + d1*p3*r2) -
+    (c2*p1*t3 + d2*p1*r3) + (c2*p3*t1 + d2*p3*r1) +
+    (c3*p1*t2 + d3*p1*r2) - (c3*p2*t1 + d3*p2*r1);
+  double R = ((a1*p2 + c1*f2)*t3 + (b1*p2 + d1*f2)*r3) -
+    ((a1*p3 + c1*f3)*t2 + (b1*p3 + d1*f3)*r2) -
+    ((a2*p1 + c2*f1)*t3 + (b2*p1 + d2*f1)*r3) +
+    ((a2*p3 + c2*f3)*t1 + (b2*p3 + d2*f3)*r1) +
+    ((a3*p1 + c3*f1)*t2 + (b3*p1 + d3*f1)*r2) -
+    ((a3*p2 + c3*f2)*t1 + (b3*p2 + d3*f2)*r1);
+  double S = (a1*e2*r3 + a1*f2*q3) - (a1*e3*r2 + a1*f3*q2) -
+    (a2*e1*r3 + a2*f1*q3) + (a2*e3*r1 + a2*f3*q1) +
+    (a3*e1*r2 + a3*f1*q2) - (a3*e2*r1 + a3*f2*q1);
+  double T = (c1*h2*r3 + c1*p2*q3) - (c1*h3*r2 + c1*p3*q2) -
+    (c2*h1*r3 + c2*p1*q3) + (c2*h3*r1 + c2*p3*q1) +
+    (c3*h1*r2 + c3*p1*q2) - (c3*h2*r1 + c3*p2*q1);
+  double U = ((a1*h2 + c1*e2)*r3 + (a1*p2 + c1*f2)*q3) -
+    ((a1*h3 + c1*e3)*r2 + (a1*p3 + c1*f3)*q2) -
+    ((a2*h1 + c2*e1)*r3 + (a2*p1 + c2*f1)*q3) +
+    ((a2*h3 + c2*e3)*r1 + (a2*p3 + c2*f3)*q1) +
+    ((a3*h1 + c3*e1)*r2 + (a3*p1 + c3*f1)*q2) -
+    ((a3*h2 + c3*e2)*r1 + (a3*p2 + c3*f2)*q1);
+  double V = (b1*e2*t3 + b1*f2*s3) - (b1*e3*t2 + b1*f3*s2) -
+    (b2*e1*t3 + b2*f1*s3) + (b2*e3*t1 + b2*f3*s1) +
+    (b3*e1*t2 + b3*f1*s2) - (b3*e2*t1 + b3*f2*s1);
+  double W = (d1*h2*t3 + d1*p2*s3) - (d1*h3*t2 + d1*p3*s2) -
+    (d2*h1*t3 + d2*p1*s3) + (d2*h3*t1 + d2*p3*s1) +
+    (d3*h1*t2 + d3*p1*s2) - (d3*h2*t1 + d3*p2*s1);
+  double X = ((b1*h2 + d1*e2)*t3 + (b1*p2 + d1*f2)*s3) -
+    ((b1*h3 + d1*e3)*t2 + (b1*p3 + d1*f3)*s2) -
+    ((b2*h1 + d2*e1)*t3 + (b2*p1 + d2*f1)*s3) +
+    ((b2*h3 + d2*e3)*t1 + (b2*p3 + d2*f3)*s1) +
+    ((b3*h1 + d3*e1)*t2 + (b3*p1 + d3*f1)*s2) -
+    ((b3*h2 + d3*e2)*t1 + (b3*p2 + d3*f2)*s1);
+  double Y = (a1*e2*t3 + a1*f2*s3 + b1*e2*r3 + b1*f2*q3) -
+    (a1*e3*t2 + a1*f3*s2 + b1*e3*r2 + b1*f3*q2) -
+    (a2*e1*t3 + a2*f1*s3 + b2*e1*r3 + b2*f1*q3) +
+    (a2*e3*t1 + a2*f3*s1 + b2*e3*r1 + b2*f3*q1) +
+    (a3*e1*t2 + a3*f1*s2 + b3*e1*r2 + b3*f1*q2) -
+    (a3*e2*t1 + a3*f2*s1 + b3*e2*r1 + b3*f2*q1);
+  double Z = (c1*h2*t3 + c1*p2*s3 + d1*h2*r3 + d1*p2*q3) -
+    (c1*h3*t2 + c1*p3*s2 + d1*h3*r2 + d1*p3*q2) -
+    (c2*h1*t3 + c2*p1*s3 + d2*h1*r3 + d2*p1*q3) +
+    (c2*h3*t1 + c2*p3*s1 + d2*h3*r1 + d2*p3*q1) +
+    (c3*h1*t2 + c3*p1*s2 + d3*h1*r2 + d3*p1*q2) -
+    (c3*h2*t1 + c3*p2*s1 + d3*h2*r1 + d3*p2*q1);
+  double AA = ((a1*h2 + c1*e2)*t3 + (a1*p2 + c1*f2)*s3 +
+              (b1*h2 + d1*e2)*r3 + (b1*p2 + d1*f2)*q3) -
+    ((a1*h3 + c1*e3)*t2 + (a1*p3 + c1*f3)*s2 +
+     (b1*h3 + d1*e3)*r2 + (b1*p3 + d1*f3)*q2) -
+    ((a2*h1 + c2*e1)*t3 + (a2*p1 + c2*f1)*s3 +
+     (b2*h1 + d2*e1)*r3 + (b2*p1 + d2*f1)*q3) +
+    ((a2*h3 + c2*e3)*t1 + (a2*p3 + c2*f3)*s1 +
+     (b2*h3 + d2*e3)*r1 + (b2*p3 + d2*f3)*q1) +
+    ((a3*h1 + c3*e1)*t2 + (a3*p1 + c3*f1)*s2 +
+     (b3*h1 + d3*e1)*r2 + (b3*p1 + d3*f1)*q2) -
+    ((a3*h2 + c3*e2)*t1 + (a3*p2 + c3*f2)*s1 +
+     (b3*h2 + d3*e2)*r1 + (b3*p2 + d3*f2)*q1);
+
+  return  64.0*(8.0*(A + B + D + E + J + K + M + N) +
+               4.0*(C + F + G + H + L + O + P + Q + S + T +
+                    V + W) + 2.0*(I + R + U + X + Y + Z) +
+               AA)/27.0;
+}
+
+inline double CalculateVolumeForPolyh(const double ***pts, const int *nbOfNodesPerFaces, int nbOfFaces, const double *bary)
+{
+  double volume=0.;
+  for(int i=0;i<nbOfFaces;i++)
+    {
+      double normal[3];
+      CalculateNormalForPolyg(pts[i],nbOfNodesPerFaces[i],normal);
+      double vecForAlt[3];
+      vecForAlt[0]=bary[0]-pts[i][0][0];
+      vecForAlt[1]=bary[1]-pts[i][0][1];
+      vecForAlt[2]=bary[2]-pts[i][0][2];
+      volume+=fabs(vecForAlt[0]*normal[0]+vecForAlt[1]*normal[1]+vecForAlt[2]*normal[2]);
+    }
+  return volume/3.;
+}
+
+template<int N>
+inline double addComponentsOfVec(const double **pts, int rk)
+{
+  return pts[N-1][rk]+addComponentsOfVec<N-1>(pts,rk);
+}
+
+template<>
+inline double addComponentsOfVec<1>(const double **pts, int rk)
+{
+  return pts[0][rk];
+}
+
+template<int N, int DIM>
+inline void CalculateBarycenter(const double **pts, double *bary)
+{
+  bary[DIM-1]=addComponentsOfVec<N>(pts,DIM-1)/N;
+  CalculateBarycenter<N,DIM-1>(pts,bary);
+}
+
+template<>
+inline void CalculateBarycenter<2,0>(const double **pts, double *bary) { }
+
+template<>
+inline void CalculateBarycenter<3,0>(const double **pts, double *bary) { }
+
+template<>
+inline void CalculateBarycenter<4,0>(const double **pts, double *bary) { }
+
+template<>
+inline void CalculateBarycenter<5,0>(const double **pts, double *bary) { }
+
+template<>
+inline void CalculateBarycenter<6,0>(const double **pts, double *bary) { }
+
+template<>
+inline void CalculateBarycenter<7,0>(const double **pts, double *bary) { }
+
+template<>
+inline void CalculateBarycenter<8,0>(const double **pts, double *bary) { }
+
+inline void CalculateBarycenterDyn(const double **pts, int nbPts, int dim, double *bary)
+{
+  for(int i=0;i<dim;i++)
+    {
+      double temp=0.;
+      for(int j=0;j<nbPts;j++)
+       {
+         temp+=pts[j][i];
+       }
+      bary[i]=temp/nbPts;
+    }
+}
+
+#endif
index c7a31b9776d72223400286ce3752e77646338ccd..a953ef58ac7180136671215866323b64623d2618 100644 (file)
@@ -18,7 +18,7 @@ using namespace std;
 namespace MEDMEM {
 
 /* Modify the following line to add a new driver type (step 1) */
 namespace MEDMEM {
 
 /* Modify the following line to add a new driver type (step 1) */
-typedef enum { MED_DRIVER = 0, GIBI_DRIVER = 1, PORFLOW_DRIVER = 2, VTK_DRIVER = 254, NO_DRIVER = 255 } driverTypes;
+typedef enum { MED_DRIVER = 0, GIBI_DRIVER = 1, PORFLOW_DRIVER = 2, VTK_DRIVER = 254, ASCII_DRIVER = 3, NO_DRIVER = 255 } driverTypes;
 class GENDRIVER {
 
 protected :
 class GENDRIVER {
 
 protected :
index 1b683759bd8f037a7dc0be150a9fd3c3da9bec7c..1d46e531826cac9b1dd8b49d40d0c475e6f339db 100644 (file)
@@ -1,10 +1,13 @@
 #include <algorithm>
 #include <algorithm>
+#include <queue>
 
 #include "MEDMEM_GibiMeshDriver.hxx"
 
 #include "MEDMEM_DriversDef.hxx"
 
 
 #include "MEDMEM_GibiMeshDriver.hxx"
 
 #include "MEDMEM_DriversDef.hxx"
 
+#include "MEDMEM_Med.hxx"
 #include "MEDMEM_Family.hxx"
 #include "MEDMEM_Family.hxx"
+#include "MEDMEM_Field.hxx"
 #include "MEDMEM_Group.hxx"
 #include "MEDMEM_Coordinate.hxx"
 #include "MEDMEM_Connectivity.hxx"
 #include "MEDMEM_Group.hxx"
 #include "MEDMEM_Coordinate.hxx"
 #include "MEDMEM_Connectivity.hxx"
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_DriverTools.hxx"
 
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_DriverTools.hxx"
 
+#include <stdio.h>
+#include <fcntl.h>
+#ifdef WNT
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+#include <float.h>
+
 /////
 using namespace std;
 using namespace MED_EN;
 /////
 using namespace std;
 using namespace MED_EN;
@@ -20,6 +33,8 @@ using namespace MEDMEM;
 /////
 
 
 /////
 
 
+// Every memory allocation made in the MedDriver members function are desallocated in the Mesh destructor 
+
 /////
 const size_t GIBI_MESH_DRIVER::nb_geometrie_gibi;
 
 /////
 const size_t GIBI_MESH_DRIVER::nb_geometrie_gibi;
 
@@ -34,16 +49,601 @@ const medGeometryElement GIBI_MESH_DRIVER::geomGIBItoMED[nb_geometrie_gibi] =
        /*36*/ MED_NONE   ,/*37*/ MED_NONE   ,/*38*/ MED_NONE   ,/*39*/ MED_NONE   ,/*40*/ MED_NONE   ,
        /*41*/ MED_NONE   ,/*42*/ MED_NONE   ,/*43*/ MED_NONE   ,/*44*/ MED_NONE   ,/*45*/ MED_NONE   ,
        /*46*/ MED_NONE   ,/*47*/ MED_NONE   };
        /*36*/ MED_NONE   ,/*37*/ MED_NONE   ,/*38*/ MED_NONE   ,/*39*/ MED_NONE   ,/*40*/ MED_NONE   ,
        /*41*/ MED_NONE   ,/*42*/ MED_NONE   ,/*43*/ MED_NONE   ,/*44*/ MED_NONE   ,/*45*/ MED_NONE   ,
        /*46*/ MED_NONE   ,/*47*/ MED_NONE   };
-/////
 
 
-// Every memory allocation made in the MedDriver members function are desallocated in the Mesh destructor 
+//=======================================================================
+//function : gibi2medGeom
+//purpose  : 
+//=======================================================================
+
+medGeometryElement GIBI_MESH_DRIVER::gibi2medGeom( size_t gibiTypeNb )
+{
+  if ( gibiTypeNb < 1 || gibiTypeNb > 47 )
+    return MED_NONE;
+
+  return geomGIBItoMED[ gibiTypeNb - 1 ];
+}
+
+//=======================================================================
+//function : med2gibiGeom
+//purpose  : 
+//=======================================================================
+
+int GIBI_MESH_DRIVER::med2gibiGeom( medGeometryElement medGeomType )
+{
+  for ( int i = 0; i < nb_geometrie_gibi; i++ )
+    if ( geomGIBItoMED[ i ] == medGeomType )
+      return i + 1;
+
+  return -1;
+}
+
+//=======================================================================
+//function : getGroupId
+//purpose  : 
+//=======================================================================
+
+static int getGroupId(const vector<int>& support_ids, _intermediateMED*  medi)
+{
+  int group_id = 0;
+  vector<int>::const_iterator sb = support_ids.begin(), se = support_ids.end();
+  if (support_ids.size() == 1 || // one or equal support ids
+      *std::max_element( sb, se ) == *std::min_element( sb, se ))
+    group_id = support_ids[0] - 1;
+  else {
+    // try to find an existing group with the same sub-groups
+    set<int> sup_set;
+    for ( ; sb != se; sb++ )
+      sup_set.insert( *sb );
+    for ( group_id = 0; group_id < medi->groupes.size(); ++group_id ) {
+      if (sup_set.size() == medi->groupes[ group_id ].groupes.size() &&
+          std::equal (sup_set.begin(), sup_set.end(),
+                      medi->groupes[ group_id ].groupes.begin()))
+        break;
+    }
+    if ( group_id == medi->groupes.size() )
+    {
+      // no such a group, add a new one
+      medi->groupes.push_back( _groupe() );
+      _groupe& new_grp = medi->groupes.back();
+      //new_grp.nom = string( group_id % 10 + 1, 'G' );
+      new_grp.groupes.reserve( sup_set.size() );
+      for ( set<int>::iterator it = sup_set.begin(); it != sup_set.end(); it++ ) {
+        new_grp.groupes.push_back( *it );
+        //new_grp.nom += "_" + medi->groupes[ *it - 1 ].nom;
+      }
+    }
+  }
+  return group_id;
+}
+
+//=======================================================================
+//function : read
+//purpose  : 
+//=======================================================================
+
+#define GIBI_EQUAL(var_str, stat_str) \
+  (strncmp (var_str, stat_str, sizeof(stat_str)-1) == 0)
+#define DUMP_LINE_NB " on line " << _lineNb
+
+bool GIBI_MESH_RDONLY_DRIVER::readFile (_intermediateMED* medi, bool readFields )
+{
+  const char * LOC = "GIBI_MESH_RDONLY_DRIVER::readFile() : " ;
+  BEGIN_OF(LOC);
+
+  // LECTURE DES DONNEES DS FICHIER GIBI
+
+  enum Readable_Piles {
+    PILE_SOUS_MAILLAGE=1,
+    PILE_NODES_FIELD  =2,
+    PILE_NOEUDS       =32,
+    PILE_COORDONNEES  =33,
+    PILE_FIELD        =39,
+    PILE_LAST_READABLE=39
+    };
+  Readable_Piles readable_Piles [] = {
+    PILE_SOUS_MAILLAGE,
+    PILE_NODES_FIELD,
+    PILE_NOEUDS,
+    PILE_COORDONNEES,
+    PILE_FIELD,
+    PILE_LAST_READABLE
+    };
+  char* ligne; // pour lire une ligne
+  const char* enregistrement_type=" ENREGISTREMENT DE TYPE";
+  vector<int> numero_noeuds; // tableau de travail (indices)
+  set<int> donePiles; // already read piles
+  unsigned space_dimension = 0;
+
+  while ( getNextLine(ligne, false)) // boucle externe de recherche de "ENREGISTREMENT DE TYPE"
+  {
+    if ( !GIBI_EQUAL( ligne, enregistrement_type ))
+      continue; // "ENREGISTREMENT DE TYPE" non trouvé -> on lit la ligne suivante
+
+    // lecture du numéro d'enregistrement
+    int numero_enregistrement = atoi( ligne + strlen(enregistrement_type) + 1 );
+
+    enum { ENREG_TYPE_2=2, ENREG_TYPE_4=4}; // Ã©numération des types d'enregistrement traités
+    int numero_pile, nb_objets_nommes, nb_objets, nb_indices;
+    vector<int> indices_objets_nommes;
+    vector<string> objets_nommes;
+
+    if (numero_enregistrement == ENREG_TYPE_4)
+    {
+      getNextLine(ligne);
+      const char* s = " NIVEAU  15 NIVEAU ERREUR   0 DIMENSION";
+      space_dimension = atoi( ligne + strlen( s ) + 1 );
+      if ( !GIBI_EQUAL( ligne, " NIVEAU" ) || space_dimension < 1 ) {
+        INFOS( " Could not read file: syntax error in type 4 record");
+        return false;
+      }
+    }
+    else if (numero_enregistrement == ENREG_TYPE_2 )
+    {
+      if ( space_dimension == 0 ) {
+        INFOS( "Missing ENREGISTREMENT DE TYPE   4");
+        return false;
+      }
+      // FORMAT(' PILE NUMERO',I4,'NBRE OBJETS NOMMES',I8,'NBRE OBJETS',I8)
+      getNextLine(ligne);
+      const char *s1 = " PILE NUMERO", *s2 = "NBRE OBJETS NOMMES", *s3 = "NBRE OBJETS";
+      if ( ! GIBI_EQUAL( ligne, s1 ) ) {
+        INFOS( " Could not read file: error in type 2 record. " << ligne);
+        return false;
+      }
+      ligne = ligne + strlen(s1);
+      numero_pile = atoi( ligne );
+      ligne = ligne + 4 + strlen(s2);
+      nb_objets_nommes = atoi( ligne );
+      ligne = ligne + 8 + strlen(s3);
+      nb_objets = atoi( ligne );
+      if ( nb_objets_nommes<0 || nb_objets<0  ) {
+        INFOS(" Could not read file: " << nb_objets << " " <<nb_objets_nommes);
+        return false;
+      }
+      if ( !donePiles.insert( numero_pile ).second ) // piles may repeat
+        continue;
+
+      if ( numero_pile > PILE_LAST_READABLE )
+        break; // stop file reading
+
+      // skip not readable piles
+      int i = -1;
+      while ( readable_Piles[ ++i ] != PILE_LAST_READABLE )
+        if ( readable_Piles[ i ] == numero_pile )
+          break;
+      if ( readable_Piles[ i ] != numero_pile )
+        continue;
+
+      // lecture des objets nommés et de leurs indices
+      objets_nommes.resize(nb_objets_nommes);
+      indices_objets_nommes.resize(nb_objets_nommes);
+      for ( initNameReading( nb_objets_nommes ); more(); next() ) {
+        objets_nommes[ index() ] = getName();
+      }
+      for ( initIntReading( nb_objets_nommes ); more(); next() )
+        indices_objets_nommes[ index() ] = getInt();
+
+      // boucle interne : lecture de la pile
+
+      MESSAGE(LOC << "---- Traitement pile " << numero_pile);
+
+      // -----------------------------------
+      //                        MESH GROUPS
+      // -----------------------------------
+
+      if (numero_pile == PILE_SOUS_MAILLAGE )
+      {
+        map<int,int> strangeGroupType;
+        medi->groupes.reserve(nb_objets*2); // fields may add some groups
+        for (int objet=0; objet!=nb_objets; ++objet) // pour chaque groupe
+        {
+          initIntReading( 5 );
+          unsigned type_geom_castem = getInt(); next();
+          unsigned nb_sous_maillage = getInt(); next();
+          unsigned nb_reference     = getInt(); next();
+          unsigned nb_noeud         = getInt(); next();
+          unsigned nb_elements      = getInt();
+
+          // le cas type_geom_castem=0 correspond aux maillages composites
+          if (type_geom_castem<0) {
+            INFOS(" Error while reading file, bad geometric type:" << type_geom_castem);
+            return false;
+          }
+
+          medi->groupes.push_back(_groupe());
+          _groupe & groupe = medi->groupes.back();
+
+          // si le groupe se compose de sous-maillages (ie groupe composite) 
+          if (type_geom_castem==0 && nb_sous_maillage>0) 
+          {
+            // lecture des indices des sous-maillages, stockage.
+            // les mailles correspondant a ces sous_maillages seront inserees a la fin du case
+            groupe.groupes.resize( nb_sous_maillage );
+            for ( initIntReading( nb_sous_maillage ); more(); next() ) {
+              groupe.groupes[ index() ] = getInt();
+            }
+            if ( readFields )
+              std::sort( groupe.groupes.begin(), groupe.groupes.end() );
+          }
+          // lecture des references (non utilisé pour MED)
+          for ( i = 0; i < nb_reference; i += 10 ) {// FORMAT(10I8)
+            getNextLine(ligne);
+          }
+          // lecture des couleurs (non utilisé pour MED)
+          for ( i = 0; i < nb_elements; i += 10 ) {
+            getNextLine(ligne);
+          }
+          // not a composit group
+          if (type_geom_castem>0 && nb_sous_maillage==0) 
+          {
+            medGeometryElement medType = gibi2medGeom(type_geom_castem);
+            bool goodType = ( medType!=MED_NONE );
+            if ( !goodType )
+              strangeGroupType.insert( make_pair( objet, type_geom_castem ));
+
+            pair<set<_maille>::iterator,bool> p;
+            pair<map<int,_noeud>::iterator,bool> p_no;
+            _noeud no;
+            no.coord.resize(space_dimension);
+            _maille ma( medType, nb_noeud );
+            ma.sommets.resize(nb_noeud);
+            if ( goodType )
+              groupe.mailles.resize( nb_elements );
+
+            // lecture pour chaque maille des sommets et insertions
+            initIntReading( nb_elements * nb_noeud );
+            if ( !goodType ) {
+              while ( more() )
+                next();
+            }
+            else {
+              for ( i = 0; i < nb_elements; ++i )
+              {
+                for (unsigned n = 0; n < nb_noeud; ++n, next() )
+                {
+                  if ( !more() ) {
+                    INFOS( " Error while reading elem nodes ");
+                    return false;
+                  }
+                  no.number = getInt();
+                  p_no=medi->points.insert(make_pair(no.number, no));
+                  ma.sommets[n]=p_no.first;
+                }
+                p=medi->maillage.insert(ma);
+                groupe.mailles[i] = p.first; // on stocke dans le groupe un iterateur sur la maille
+              }
+            }
+          }
+        } // loop on groups
+
+        // set group names
+        for (i=0; i!=nb_objets_nommes; ++i) {
+          int grpID = indices_objets_nommes[i];
+          _groupe & grp = medi->groupes[ grpID-1 ];
+          if ( !grp.nom.empty() ) // a group has several names
+          { // create a group with subgroup grp and named grp.nom
+            medi->groupes.push_back(_groupe());
+            medi->groupes.back().groupes.push_back( grpID );
+            medi->groupes.back().nom = grp.nom;
+          }
+          grp.nom=objets_nommes[i];
+          map<int,int>::iterator it = strangeGroupType.find( grpID - 1 );
+          if ( it != strangeGroupType.end() ) {
+            //INFOS( "Skip " << grp.nom << " of not supported CASTEM type: " << it->second );
+          }
+        }
+
+      }// Fin case PILE_SOUS_MAILLAGE
+
+      // ---------------------------------
+      //                            NODES
+      // ---------------------------------
+
+      else if ( numero_pile == PILE_NOEUDS )
+      {
+        getNextLine( ligne );
+        std::vector<int> place_noeuds;
+        nb_indices = atoi ( ligne );
+        if (nb_indices != nb_objets)
+        {
+          INFOS("Erreur de lecture dans enregistrement de pile " << PILE_NOEUDS);
+          return false;
+        }
+
+        place_noeuds.resize(nb_objets);
+        for ( initIntReading( nb_objets ); more(); next() )
+          place_noeuds[ index() ] = getInt();
+        int max=(* std::max_element(place_noeuds.begin(),place_noeuds.end()));
+
+        // numero_noeuds contient pour chacun des max noeuds qu'on va lire dans le case PILE_COORDONNEES
+        // son indice dans la connectivite du maillage. Cet indice correspond egalement a la cle du map
+        // medi->points ou l'on stocke les noeuds.
+        numero_noeuds.resize(max,-1);
+        for (unsigned i=0; i!=place_noeuds.size(); ++i)
+          numero_noeuds[place_noeuds[i]-1]=i+1;
+      }
+
+      // ---------------------------------------
+      //                            COORDINATES
+      // ---------------------------------------
+
+      else if ( numero_pile == PILE_COORDONNEES )
+      {
+        getNextLine( ligne );
+        unsigned nb_reels = atoi( ligne );
+        // PROVISOIRE : certains fichier gibi n`ont 
+        if (nb_reels < numero_noeuds.size()*(space_dimension)) {
+          INFOS("Erreur de lecture dans enregistrement de pile " << PILE_COORDONNEES);
+          return false;
+        }
+        initDoubleReading( nb_reels );
+        map< int, _noeud >::iterator pIt;
+        for (unsigned i=0; i!=numero_noeuds.size(); ++i)
+        {
+          // si le noeud est utilisé dans le maillage,
+          //on lit ses coordonnées et on les stocke dans la structure
+          if (( numero_noeuds[i] != -1 ) &&
+              (( pIt = medi->points.find(numero_noeuds[i])) != medi->points.end()))
+          {
+            for (unsigned j=0; j!=space_dimension; ++j, next())
+              pIt->second.coord[j] = getDouble();
+            next(); // on ne conserve pas la densite
+          }
+          else // sinon, on passe au noeud suivant
+          {
+            for (unsigned j=0; j!=space_dimension+1; ++j)
+              next();
+          }
+        }
+      }
+
+      // ---------------------------------------
+      //                            NODE FIELDS
+      // ---------------------------------------
+
+      else if ( numero_pile == PILE_NODES_FIELD && readFields )
+      {
+        vector< _fieldBase* > fields( nb_objets );
+        for (int objet=0; objet!=nb_objets; ++objet) // pour chaque field
+        {
+          initIntReading( 4 ); // nb subcomponents, nb components, IFOUR, nb attributes
+          int i_sub,  nb_sub  = getInt(); next();
+          int i_comp, nb_comp = getInt(); next(); next();
+          int nb_attr = getInt();
+          if ( nb_sub < 0 || nb_comp < 0 ) {
+            INFOS("Error of field reading: wrong nb of components "
+                  << nb_sub << " " << nb_comp << DUMP_LINE_NB);
+            return false;
+          }
+          _field<double>* fdouble = 0;
+          if ( nb_sub > 0 && nb_comp > 0 ) {
+            fdouble = new _field<double>(MED_REEL64);
+            medi->fields.push_back( fdouble );
+            fdouble->nb_subcomponents = nb_sub;
+            fdouble->nb_components    = nb_comp;
+            fdouble->comp_names.resize( nb_comp );
+          }
+          fields[ objet ] = fdouble;
+
+          // loop on subcomponents of a field, each of which refers to
+          // a certain support and has the same number of components
+          vector<int>     support_ids( nb_sub );
+          vector<int>     nb_values( nb_sub );
+          vector<string>  comp_names( nb_comp );
+          initIntReading( nb_sub * 3 );
+          for ( i_sub = 0; i_sub < nb_sub; ++i_sub )
+          {
+            support_ids[ i_sub ] = -getInt(); next(); // reference to support
+            if ( support_ids[ i_sub ] < 1 || support_ids[ i_sub ] > medi->groupes.size() ) {
+              INFOS("Error of field reading: wrong mesh reference "<< support_ids[ i_sub ]);
+              return false;
+            }
+            nb_values[ i_sub ] = getInt(); next();    // nb points
+            if ( nb_values[ i_sub ] < 0 ) {
+              INFOS(" Wrong nb of points: " << nb_values[ i_sub ] );
+              return false;
+            }
+            next(); // skip nb of comp names equal to nb_comp
+          }
+          initNameReading( nb_sub * nb_comp, 4 );
+          for ( i_sub = 0; i_sub < nb_sub; ++i_sub )
+          {
+            for ( i_comp = 0; i_comp < nb_comp; ++i_comp, next() ) {
+              ASSERT( more() );
+              fdouble->comp_names[ i_comp ] = getName();// component names
+            }
+          }
+          
+          for ( initIntReading( nb_sub ); more(); next() )// nb harmonics ( ignored )
+            ;
+
+          getNextLine( ligne );                             // TYPE ( ignored )
+          getNextLine( ligne );                             // TITRE ( ignored )
+          for ( initIntReading( nb_attr ); more(); next() ) // attributes ( ignored )
+            ;
+
+          for ( i_sub = 0; i_sub < nb_sub; ++i_sub )
+          {
+            // loop on components: read values
+            initDoubleReading( nb_values[ i_sub ] * nb_comp );
+            for ( i_comp = 0; i_comp < nb_comp; ++i_comp ) {
+              vector<double> & vals =
+                fdouble->addComponent( support_ids[ i_sub ], nb_values[ i_sub ] );
+              for ( int i = 0; more() && i < nb_values[ i_sub ]; next(), ++i ) {
+                vals[ i ] = getDouble();
+              }
+            }
+          } // loop on subcomponents of a field
+
+          // supporting group id
+          if ( fdouble )
+            fdouble->group_id = getGroupId( support_ids, medi );
+
+        } // end loop on field objects
+
+        // set field names
+        for ( i = 0; i < nb_objets_nommes; ++i ) {
+          int fieldIndex = indices_objets_nommes[ i ];
+          if ( fields[ fieldIndex - 1 ] )
+            fields[ fieldIndex - 1 ]->name = objets_nommes[ i ];
+        }
+
+      }  // Fin numero_pile == PILE_NODES_FIELD
+      
+      // -------------------------------------------------
+      //                                           FIELDS
+      // -------------------------------------------------
+
+      else if ( numero_pile == PILE_FIELD && readFields )
+      {
+        vector< _fieldBase* > fields( nb_objets, (_fieldBase*)NULL );
+        for (int objet=0; objet!=nb_objets; ++objet) // pour chaque field
+        {
+          initIntReading( 1 );
+          int i_sub, nb_sub = getInt(); // <nb_sub> -1 6 <title length>
+          if ( nb_sub < 1 ) {
+            INFOS("Error of field reading: wrong nb of subcomponents " << nb_sub);
+            return false;
+          }
+          getNextLine( ligne ); // title
+          // look for a line starting with '-' : <reference to support>
+          do {
+            initIntReading( nb_sub * 9 );
+          } while ( getInt() >= 0 );
+
+          int i_comp, nb_comp = 0;
+          vector<int> support_ids( nb_sub );
+          for ( i_sub = 0; i_sub < nb_sub; ++i_sub )
+          {
+            support_ids[ i_sub ] = -getInt(); next(); // <reference to support>
+            next();                                   // skip <address>
+            nb_comp = getInt(); next();               // <nb of components in the field>
+            for ( i = 0; i < 6; ++i )                 //  0 0 0 -1 0 2
+              next();
+            if ( support_ids[ i_sub ] < 1 || support_ids[ i_sub ] > medi->groupes.size() ) {
+              INFOS("Error of field reading: wrong mesh reference "<< support_ids[ i_sub ]);
+              return false;
+            }
+            if ( nb_comp < 1 ) {
+              INFOS("Error of field reading: wrong nb of components " << nb_comp);
+              return false;
+            }
+          }
+          for ( initNameReading( nb_sub, 17 ); more(); next() )
+            ; // dummy strings
+          for ( initNameReading( nb_sub ); more(); next() )
+            ; // dummy strings
+
+          // loop on subcomponents of a field, each of which refers to
+          // a certain support and has the same number of components
+          _field<double>* fdouble = 0;
+          _field<int>*    fint    = 0;
+          vector<string> comp_names( nb_comp ), comp_type( nb_comp );
+          for ( i_sub = 0; i_sub < nb_sub; ++ i_sub )
+          {
+            getNextLine( ligne );  // skip nb_comp addresses of MELVAL structure
+
+            // component names
+            for ( initNameReading( nb_comp ); more(); next() )
+              comp_names[ index() ] = getName();
+
+            // component type
+            for ( initNameReading( nb_comp, 17 ); more(); next() ) { // 17 is name width
+              comp_type[ index() ] = getName();
+              // component types must be the same
+              if ( index() > 0 && comp_type[ index() ] != comp_type[ index() - 1] ) {
+                INFOS( "Error of field reading: diff component types <"
+                      << comp_type[ index() ] << "> != <" << comp_type[ index() - 1 ] << ">");
+                return false;
+              }
+            }
+            // now type is known, create a field
+            bool isReal = ( comp_type[0] == "REAL*8" );
+            if ( !fdouble && !fint ) {
+              _fieldBase * fbase;
+              if ( !isReal ) {
+                fbase = fint = new _field<int>(MED_INT32);
+                INFOS( "Warning: read NOT REAL field, type <" << comp_type[0] << ">"
+                      << DUMP_LINE_NB);
+              }
+              else
+                fbase = fdouble = new _field<double>(MED_REEL64);
+              medi->fields.push_back( fbase ); // medi->fields is a std::list
+              fields[ objet ]         = fbase;
+              fbase->nb_subcomponents = nb_sub;
+              fbase->nb_components    = nb_comp;
+              fbase->comp_names       = comp_names;
+              fbase->group_id         = getGroupId( support_ids, medi );
+            }
+
+            // loop on components: read values
+            for ( i_comp = 0; i_comp < nb_comp; ++i_comp ) {
+              // nb of values
+              initIntReading( 2 );
+              int nb_val_by_elem = getInt(); next();
+              int nb_values      = getInt();
+              if ( nb_val_by_elem != 1 ) {
+                INFOS("Error of field reading: nb of values by element "
+                      << " != 1 : " << nb_val_by_elem << DUMP_LINE_NB );
+                return false;
+              }
+              if ( isReal ) {
+                vector<double> & vals =
+                  fdouble->addComponent( support_ids[ i_sub ], nb_values );
+                for ( initDoubleReading( nb_values ); more(); next()) {
+                  vals[ index() ] = getDouble();
+                }
+              }
+              else {
+                vector<int> & vals =
+                  fint->addComponent( support_ids[ i_sub ], nb_values );
+                for ( initIntReading( nb_values ); more(); next() ) {
+                  vals[ index() ] = getInt();
+                }
+              }
+            }
+          } // loop on subcomponents of a field
+
+        } // end loop on field objects
+
+        // set field names
+        for ( i = 0; i < nb_objets_nommes; ++i ) {
+          int fieldIndex = indices_objets_nommes[ i ];
+          fields[ fieldIndex - 1 ]->name = objets_nommes[ i ];
+        }
+
+      } // numero_pile == PILE_FIELD && readFields
+
+      else if ( numero_pile >= PILE_LAST_READABLE )
+        break; // stop file reading
+
+    } // Fin case ENREG_TYPE_2
+  } //  fin de la boucle while de lecture externe
+
+  // check if all needed piles present
+  if ( donePiles.find( PILE_SOUS_MAILLAGE ) != donePiles.end() )
+  {
+    if (donePiles.find( PILE_NOEUDS ) == donePiles.end() ) {
+      INFOS( " Missing pile " << PILE_NOEUDS );
+      return false;
+    }
+    if (donePiles.find( PILE_COORDONNEES ) == donePiles.end()) {
+      INFOS( " Missing pile " << PILE_COORDONNEES );
+      return false;
+    }
+  }
+
+  END_OF(LOC);
+  return true;
+}
 
 GIBI_MESH_DRIVER::GIBI_MESH_DRIVER():
 
 GIBI_MESH_DRIVER::GIBI_MESH_DRIVER():
-  GENDRIVER(),
-  _ptrMesh(( MESH *)MED_NULL),
-  // A VOIR _medIdt(MED_INVALID),
-  _meshName("")
+       GENDRIVER(),
+       _ptrMesh(( MESH *)MED_NULL),
+       // A VOIR _medIdt(MED_INVALID),
+       _meshName("")
 {
 {
+  MESSAGE("GIBI_MESH_DRIVER()");
 }
 
 GIBI_MESH_DRIVER::GIBI_MESH_DRIVER(const string & fileName,
 }
 
 GIBI_MESH_DRIVER::GIBI_MESH_DRIVER(const string & fileName,
@@ -53,6 +653,7 @@ GIBI_MESH_DRIVER::GIBI_MESH_DRIVER(const string & fileName,
   _ptrMesh(ptrMesh)
   // A VOIR _medIdt(MED_INVALID), 
 {
   _ptrMesh(ptrMesh)
   // A VOIR _medIdt(MED_INVALID), 
 {
+  MESSAGE( "GIBI_MESH_DRIVER(" << fileName <<","<<accessMode );
 //   _meshName=fileName.substr(0,fileName.rfind("."));
     // mesh name construction from fileName
     const string ext=".sauve"; // expected extension
 //   _meshName=fileName.substr(0,fileName.rfind("."));
     // mesh name construction from fileName
     const string ext=".sauve"; // expected extension
@@ -68,347 +669,691 @@ GIBI_MESH_DRIVER::GIBI_MESH_DRIVER(const GIBI_MESH_DRIVER & driver):
   // A VOIR _medIdt(MED_INVALID), 
   _meshName(driver._meshName)
 {
   // A VOIR _medIdt(MED_INVALID), 
   _meshName(driver._meshName)
 {
+  MESSAGE("GIBI_MESH_DRIVER(const GIBI_MESH_DRIVER & driver)");
 }
 
 GIBI_MESH_DRIVER::~GIBI_MESH_DRIVER()
 {
 }
 
 GIBI_MESH_DRIVER::~GIBI_MESH_DRIVER()
 {
+  MESSAGE("~GIBI_MESH_DRIVER()");
 }
 }
+void    GIBI_MESH_DRIVER::setMeshName(const string & meshName) { _meshName = meshName; };
+string  GIBI_MESH_DRIVER::getMeshName() const { return _meshName; };
 
 
-void GIBI_MESH_DRIVER::open()
-  throw (MEDEXCEPTION)
+
+//---------------------------------- RDONLY PART -------------------------------------------------------------
+
+GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_RDONLY_DRIVER():
+       GIBI_MESH_DRIVER(),
+       _File (-1),_start(0L),_ptr  (0L),_eptr (0L)       
 {
 {
-    const char * LOC = "GIBI_MESH_DRIVER::open()" ;
-    BEGIN_OF(LOC);
+}
+GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_RDONLY_DRIVER(const string & fileName,MESH * ptrMesh):
+       GIBI_MESH_DRIVER(fileName,ptrMesh,MED_RDONLY),
+       _File (-1),_start(0L),_ptr  (0L),_eptr (0L)
+{ 
+    MESSAGE("GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_RDONLY_DRIVER"
+            "(const string & fileName, MESH * ptrMesh) has been created, "
+            << fileName << ", " << MED_RDONLY);
+}
+GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_RDONLY_DRIVER(const GIBI_MESH_RDONLY_DRIVER & driver): 
+GIBI_MESH_DRIVER(driver)
+{
+}
+GIBI_MESH_RDONLY_DRIVER::~GIBI_MESH_RDONLY_DRIVER()
+{
+  BEGIN_OF( "~GIBI_MESH_RDONLY_DRIVER()");
+  if (_File >= 0)
+  {
+    ::close (_File);
+    if (_start != 0L)
+      delete [] _start;
+  }
+  MESSAGE("GIBI_MESH_RDONLY_DRIVER::~GIBI_MESH_RDONLY_DRIVER() has been destroyed");
+}
+GENDRIVER * GIBI_MESH_RDONLY_DRIVER::copy(void) const
+{
+  return new GIBI_MESH_RDONLY_DRIVER(*this);
+}
 
 
-    _gibi.open(_fileName.c_str(), ios::in);
-    if(_gibi)
-       _status = MED_OPENED;
-    else
-    {
-       _status = MED_CLOSED;
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Could not open file "<<_fileName<<" in mode ios::in"));
-    }
+//=======================================================================
+//function : open
+//purpose  : 
+//=======================================================================
+
+const int GIBI_MaxOutputLen   = 150;
+const int GIBI_BufferSize     = 16184; // for non-stream input
+
+void GIBI_MESH_RDONLY_DRIVER::open()
+  //     throw (MEDEXCEPTION)
+{
+  const char * LOC = "GIBI_MESH_RDONLY_DRIVER::open()" ;
+  BEGIN_OF(LOC);
+
+//   MED_EN::med_mode_acces aMode = getAccessMode();
+//   if ( aMode != MED_EN::MED_LECT && aMode != MED_EN::MED_REMP )
+//     throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << " Bad file mode access ! " << aMode));
+
+#ifdef WNT
+  _File = ::_open (_fileName.c_str(), _O_RDONLY|_O_BINARY);
+#else
+  _File = ::open (_fileName.c_str(), O_RDONLY);
+#endif
+  if (_File >= 0)
+  {
+    _start = new char [GIBI_BufferSize];
+    _ptr   = _start;
+    _eptr  = _start;
+    _status = MED_OPENED;
+    _lineNb = 0;
+  }
+  else
+  {
+    _status = MED_CLOSED;
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Could not open file "<<_fileName
+                                 << " fd: " << _File));
+  }
   END_OF(LOC);
 }
   END_OF(LOC);
 }
-  
-void GIBI_MESH_DRIVER::close()
-  throw (MEDEXCEPTION)
+
+//=======================================================================
+//function : close
+//purpose  : 
+//=======================================================================
+
+void GIBI_MESH_RDONLY_DRIVER::close()
 {
     const char * LOC = "GIBI_MESH_DRIVER::close() " ;
     BEGIN_OF(LOC);
     if ( _status == MED_OPENED) 
     {
 {
     const char * LOC = "GIBI_MESH_DRIVER::close() " ;
     BEGIN_OF(LOC);
     if ( _status == MED_OPENED) 
     {
-       _gibi.close();
-       _status = MED_CLOSED;
+      if (_File >= 0)
+      {
+        ::close (_File);
+        if (_start != 0L)
+          delete [] _start;
+        _File = -1;
+      }
+      _status = MED_CLOSED;
     }
     END_OF(LOC);
 }
 
     }
     END_OF(LOC);
 }
 
-void    GIBI_MESH_DRIVER::setMeshName(const string & meshName) { _meshName = meshName; };
-string  GIBI_MESH_DRIVER::getMeshName() const { return _meshName; };
+//=======================================================================
+//function : getLine
+//purpose  : 
+//=======================================================================
 
 
-
-//---------------------------------- RDONLY PART -------------------------------------------------------------
-
-GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_RDONLY_DRIVER(): GIBI_MESH_DRIVER()
+bool GIBI_MESH_RDONLY_DRIVER::getLine(char* & aLine)
 {
 {
+  bool aResult = true;
+  // Check the state of the buffer;
+  // if there is too little left, read the next portion of data
+  int nBytesRest = _eptr - _ptr;
+  if (nBytesRest < GIBI_MaxOutputLen)
+  {
+    if (nBytesRest > 0) {
+      memcpy (_start, _ptr, nBytesRest);
+    } else
+      nBytesRest = 0;
+    _ptr = _start;
+    const int nBytesRead = ::read (_File,
+                                   &_start [nBytesRest],
+                                   GIBI_BufferSize - nBytesRest);
+    nBytesRest += nBytesRead;
+    _eptr = &_start [nBytesRest];
+  }
+  // Check the buffer for the end-of-line
+  char * ptr = _ptr;
+  while (~0)
+  {
+    // Check for end-of-the-buffer, the ultimate criterion for termination
+    if (ptr >= _eptr)
+    {
+      if (nBytesRest <= 0)
+        aResult = false;
+      else
+        _eptr[-1] = '\0';
+      break;
+    }
+    // seek the line-feed character
+    if (ptr[0] == '\n')
+    {
+      if (ptr[-1] == '\r')
+        ptr[-1] = '\0';
+      ptr[0] = '\0';
+      ++ptr;
+      break;
+    }
+    ++ptr;
+  }
+  // Output the result
+  aLine = _ptr;
+  _ptr = ptr;
+  _lineNb++;
+
+  return aResult;
 }
 
 }
 
-GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_RDONLY_DRIVER(const string & fileName,
-       MESH * ptrMesh):
-GIBI_MESH_DRIVER(fileName,ptrMesh,MED_RDONLY)
-{ 
-    MESSAGE("GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
-}
+//=======================================================================
+//function : init
+//purpose  : 
+//=======================================================================
 
 
-    GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_RDONLY_DRIVER(const GIBI_MESH_RDONLY_DRIVER & driver): 
-GIBI_MESH_DRIVER(driver)
+void GIBI_MESH_RDONLY_DRIVER::init( int nbToRead, int nbPosInLine, int width, int shift )
 {
 {
+  _nbToRead = nbToRead;
+  _nbPosInLine = nbPosInLine;
+  _width = width;
+  _shift = shift;
+  _iPos = _iRead = 0;
+  if ( _nbToRead ) {
+    getNextLine( _curPos );
+    _curPos = _curPos + _shift;
+  }
+  else
+    _curPos = 0;
 }
 
 }
 
-GIBI_MESH_RDONLY_DRIVER::~GIBI_MESH_RDONLY_DRIVER()
+//=======================================================================
+//function : next
+//purpose  : line getting
+//=======================================================================
+
+void GIBI_MESH_RDONLY_DRIVER::next()
 {
 {
-    //MESSAGE("GIBI_MESH_RDONLY_DRIVER::~GIBI_MESH_RDONLY_DRIVER() has been destroyed");
+  if ( !more() ) throw MEDEXCEPTION(LOCALIZED("!more()"));
+  ++_iRead;
+  ++_iPos;
+  if ( _iRead < _nbToRead ) {
+    if ( _iPos >= _nbPosInLine ) {
+      getNextLine( _curPos );
+      _curPos = _curPos + _shift;
+      _iPos = 0;
+    }
+    else
+      _curPos = _curPos + _width + _shift;
+  }
+  else
+    _curPos = 0;
 }
 }
-  
-GENDRIVER * GIBI_MESH_RDONLY_DRIVER::copy(void) const
+
+//=======================================================================
+//function : getName
+//purpose  : names reading
+//=======================================================================
+
+string GIBI_MESH_RDONLY_DRIVER::getName() const
 {
 {
-    return new GIBI_MESH_RDONLY_DRIVER(*this);
+  int len = _width;
+  while (( _curPos[len-1] == ' ' || _curPos[len-1] == 0) && len > 0 )
+    len--;
+  return string( _curPos, len );
 }
 
 }
 
+//=======================================================================
+//function : read
+//purpose  :
+//=======================================================================
+
 void GIBI_MESH_RDONLY_DRIVER::read(void) throw (MEDEXCEPTION)
 {
 void GIBI_MESH_RDONLY_DRIVER::read(void) throw (MEDEXCEPTION)
 {
-    const char * LOC = "GIBI_MESH_RDONLY_DRIVER::read() : " ;
-    BEGIN_OF(LOC);
-
-    if (_status!=MED_OPENED)
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The _idt of file " << _fileName << " is : "  
-                                                <<  " (the file is not opened)." )) ;
+  const char * LOC = "_GIBI_RDONLY_DRIVER::read() : " ;
+
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The _idt of file " << _fileName << " is : "  
+                                 <<  " (the file is not opened)." )) ;
+  if ( ! _ptrMesh->isEmpty() )
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Mesh object not empty : can't fill it!"));
+
+  _intermediateMED medi;
+  try {
+    if ( readFile( &medi, false )) {
+      // impression résultats
+      MESSAGE(LOC << "GIBI_MESH_RDONLY_DRIVER::read : RESULTATS STRUCTURE INTERMEDIAIRES : ");
+      MESSAGE(LOC <<  medi );
+
+      fillMesh( &medi );
+    }
+  }
+  catch (MEDEXCEPTION &ex)
+  {
+    INFOS( ex.what() );
+  }
 
 
-    // LECTURE DES DONNEES DS FICHIER GIBI
+}
 
 
-    _intermediateMED medi; // structure de données intermédiaire pour conversion gibi->med
-    string buf_ligne; // pour lire une ligne
-    const char* enregistrement_type="ENREGISTREMENT DE TYPE";
-    std::vector<int> numero_noeuds; // tableau de travail (indices)
+//=======================================================================
+//function : getReverseVector
+//purpose  : 
+//=======================================================================
 
 
+static void getReverseVector (const medGeometryElement type,
+                              vector<pair<int,int> > & swapVec )
+{
+  BEGIN_OF("void getReverseVector()");
+  swapVec.clear();
+
+  switch ( type ) {
+  case MED_TETRA4:
+    swapVec.resize(1);
+    swapVec[0] = make_pair( 1, 2 );
+    break;
+  case MED_PYRA5:
+    swapVec.resize(1);
+    swapVec[0] = make_pair( 1, 3 );
+    break;
+  case MED_PENTA6:
+    swapVec.resize(2);
+    swapVec[0] = make_pair( 1, 2 );
+    swapVec[1] = make_pair( 4, 5 );
+    break;
+  case MED_HEXA8:
+    swapVec.resize(2);
+    swapVec[0] = make_pair( 1, 3 );
+    swapVec[1] = make_pair( 5, 7 );
+    break;
+  case MED_TETRA10:
+    swapVec.resize(3);
+    swapVec[0] = make_pair( 1, 2 );
+    swapVec[1] = make_pair( 4, 5 );
+    swapVec[2] = make_pair( 8, 9 );
+    break;
+  case MED_PYRA13:
+    swapVec.resize(4);
+    swapVec[0] = make_pair( 1, 3 );
+    swapVec[1] = make_pair( 5, 8 );
+    swapVec[2] = make_pair( 6, 7 );
+    swapVec[3] = make_pair( 10, 12 );
+    break;
+  case MED_PENTA15:
+    swapVec.resize(4);
+    swapVec[0] = make_pair( 1, 2 );
+    swapVec[1] = make_pair( 4, 5 );
+    swapVec[2] = make_pair( 6, 8 );
+    swapVec[3] = make_pair( 9, 11 );
+    break;
+  case MED_HEXA20:
+    swapVec.resize(7);
+    swapVec[0] = make_pair( 1, 3 );
+    swapVec[1] = make_pair( 5, 7 );
+    swapVec[2] = make_pair( 8, 11 );
+    swapVec[3] = make_pair( 9, 10 );
+    swapVec[4] = make_pair( 12, 15 );
+    swapVec[5] = make_pair( 13, 14 );
+    swapVec[6] = make_pair( 17, 19 );
+  default:;
+  }
+  END_OF("void getReverseVector()");
+}
 
 
-    while ( getline(_gibi, buf_ligne) ) // boucle externe de recherche de "ENREGISTREMENT DE TYPE"
-    {
-       string::size_type pos = buf_ligne.find(enregistrement_type);
-       if ( pos==string::npos ){
-           continue; // "ENREGISTREMENT DE TYPE" non trouvé -> on lit la ligne suivante
-       }
-       // lecture du numéro d'enregistrement
-       int numero_enregistrement;
-       istringstream buf(buf_ligne.c_str()+strlen(enregistrement_type)+1);
-       buf >> numero_enregistrement;
-
-       enum { ENREG_TYPE_2=2, ENREG_TYPE_4=4}; // Ã©numération des types d'enregistrement traités
-       int niveau, niveau_erreur;
-       unsigned space_dimension,nb_reels;
-       int numero_pile, nb_objets_nommes, nb_objets, nb_indices;
-       string s1,s2,s3,s4,s5,s6,s7; // temporary strings
-       int i1; //temporary int
-       double d1; //temporary double
-       vector<int> indices_objets_nommes;
-       vector<string> objets_nommes;
-
-       switch (numero_enregistrement)
-         {
-         case ENREG_TYPE_4:
-           MESSAGE(LOC << "---- Traitement enregistrement de type 4");
-           _gibi >> s1 >> niveau >> s2 >> s3 >> niveau_erreur >> s4 >> space_dimension;
-           if ( !_gibi || s1!="NIVEAU" || s3!="ERREUR" || s4!="DIMENSION" ) // verification mots -cles
-             throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << " Could not read file " << _fileName 
-                                          << " : syntax error in type 4 record"));
-           break;
-
-         case ENREG_TYPE_2:
-           {
-             MESSAGE(LOC << "---- Traitement enregistrement de type 2");
-             _gibi >> s1 >> s2 >> numero_pile >> s3 >> s4 >> s5 >> nb_objets_nommes >> s6 >> s7 >> nb_objets;
-             if ( !_gibi || s1!="PILE"   || s2!="NUMERO"       || s3!="NBRE"  // verification mots -cles
-                  || s4!="OBJETS" || s5!="NOMMES"       || s6!="NBRE"   
-                  || s7!="OBJETS" || nb_objets_nommes<0 || nb_objets<0  )
-               {
-                 throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << " Could not read file " << _fileName 
-                                              << " : error in type 2 record"));
-               }
-
-             // lecture des objets nommés et de leurs indices
-             objets_nommes.resize(nb_objets_nommes);
-             indices_objets_nommes.resize(nb_objets_nommes);
-             for (int i=0; i!=nb_objets_nommes; ++i)
-               _gibi >> objets_nommes[i];
-
-             for (int i=0; i!=nb_objets_nommes; ++i)
-               _gibi >> indices_objets_nommes[i];
-               
-             // boucle interne : lecture de la pile
-             enum {PILE_SOUS_MAILLAGE=1, PILE_NOEUDS=32, PILE_COORDONNEES=33};
-             switch(numero_pile)
-               {
-               case PILE_SOUS_MAILLAGE:
-                 {
-                   medi.groupes.reserve(nb_objets);
-                   for (int objet=0; objet!=nb_objets; ++objet) // pour chaque groupe
-                     {
-                       unsigned type_geom_castem, nb_reference,nb_noeud,nb_elements, nb_sous_maillage;
-                       _gibi >> type_geom_castem >> nb_sous_maillage >> nb_reference >> nb_noeud >> nb_elements;
-                       
-                       // le cas type_geom_castem=0 correspond aux maillages composites
-                       if (type_geom_castem<0 || (type_geom_castem>0 && geomGIBItoMED[type_geom_castem-1]==MED_NONE) )
-                         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << " Error while reading file " << _fileName 
-                                                      << "\nCastem geometric type " << type_geom_castem 
-                                                      << " does not have a correspondant MED geometric type!" ));
-
-                       // lecture des references (non utilisé pour MED)
-                       for( unsigned i=0; i!=nb_reference; ++i)
-                         _gibi >> i1;
-                       
-                       // lecture des couleurs (non utilisé pour MED)
-                       for( unsigned i=0; i!=nb_elements; ++i)
-                         _gibi >> i1;
-                       
-                       _groupe groupe;
-                       // si le groupe se compose de sous-maillages (ie groupe composite) 
-                       if (type_geom_castem==0 && nb_sous_maillage>0) 
-                         {
-                           // lecture des indices des sous-maillages, stockage.
-                           // les mailles correspondant a ces sous_maillages seront inserees a la fin du case
-                           for (unsigned i=0; i!=nb_sous_maillage; ++i)
-                             {
-                               _gibi >> i1;
-                               groupe.groupes.push_back(i1);
-                             }
-                         }
-                       else
-                         {
-                           pair<set<_maille>::iterator,bool> p;
-                           pair<map<int,_noeud>::iterator,bool> p_no;
-                           _noeud no;
-                           no.coord.reserve(space_dimension);
-                           no.coord.resize(space_dimension);
-                           _maille ma(geomGIBItoMED[type_geom_castem-1], nb_noeud);
-                           ma.sommets.resize(nb_noeud);
-
-                           // lecture pour chaque maille des sommets et insertions
-                           for( unsigned i=0; i!=nb_elements; ++i)
-                             {
-                               for (unsigned n=0; n!=nb_noeud; ++n)
-                                 {
-                                   _gibi >> i1;
-                                   no.number=i1;
-                                   p_no=medi.points.insert(make_pair(i1, no));
-                                   ma.sommets[n]=p_no.first;
-                                 }
-
-                               p=medi.maillage.insert(ma);
-                               groupe.mailles.insert(p.first); // on stocke dans le groupe un iterateur sur la maille
-
-//                                 cout << "   " << p.second << ": ";
-//                                 for (unsigned n=0; n!=nb_noeud; ++n)
-//                                     cout <<  ma.sommets[n]->second.number << " ";
-//                                 cout << endl;
-                               
-                             }
-                         }
-                       medi.groupes.push_back(groupe);
-                     }
-
-                   for (int i=0; i!=nb_objets_nommes; ++i)
-                     medi.groupes[indices_objets_nommes[i]-1].nom=objets_nommes[i];
-                   
-                   // scanne les groupes Ã  la recherche de groupes composites
-                   for( std::vector<_groupe>::iterator i=medi.groupes.begin(); i!=medi.groupes.end(); ++i)
-                     {
-                       if( i->groupes.size() ) // le groupe i contient des sous-maillages
-                         {
-                           for( std::vector<int>::iterator j=i->groupes.begin(); j!=i->groupes.end(); ++j)
-                             {
-                               // pour chacun des sous-maillages j, on recupere les iterateurs *k sur les  maille 
-                               // contenues et on les insere dans le groupe i
-                               std::set< std::set<_maille, std::less<_maille>,
-                                std::allocator<_maille> >::iterator,
-                                _mailleIteratorCompare,
-                                std::allocator< std::set<_maille, std::less<_maille>,
-                                std::allocator<_maille> >::iterator> >::iterator k=medi.groupes[*j-1].mailles.begin();
-                               for( ; k!=medi.groupes[*j-1].mailles.end(); ++k)
-                                 i->mailles.insert(*k);
-                             }
-                           i->groupes.clear(); // après avoir inséré leur mailles, on efface les groupes composites
-                         }
-                     }
-                   
-                   break;
-                 }// Fin case PILE_SOUS_MAILLAGE
-                       
-               case PILE_NOEUDS:
-                 {
-                   std::vector<int> place_noeuds;
-                   _gibi >> nb_indices;
-                   if (nb_indices != nb_objets)
-                     {
-                       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << " Could not read file " << _fileName 
-                                                    << "Erreur de lecture dans enregistrement de type " << (int)ENREG_TYPE_2 
-                                                    << " (pile " << (int)PILE_NOEUDS << ")" ));
-                     }
-                   
-                   place_noeuds.resize(nb_objets);
-                   for (unsigned i=0; i!=place_noeuds.size(); ++i)
-                     _gibi >> place_noeuds[i];
-                   int max=(* std::max_element(place_noeuds.begin(),place_noeuds.end()));
-
-                   // numero_noeuds contient pour chacun des max noeuds qu'on va lire dans le case PILE_COORDONNEES
-                   // son indice dans la connectivite du maillage. Cet indice correspond egalement a la cle du map
-                   // medi.points ou l'on stocke les noeuds.
-                   numero_noeuds.resize(max,-1);
-                   for (unsigned i=0; i!=place_noeuds.size(); ++i)
-                     numero_noeuds[place_noeuds[i]-1]=i+1;
-                   break;
-                 }
-                 
-               case PILE_COORDONNEES:
-                 _gibi >> nb_reels;
-                 // PROVISOIRE : certains fichier gibi n'ont 
-                 if (nb_reels < numero_noeuds.size()*(space_dimension))
-                   throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << " Could not read file " << _fileName 
-                                                << "Erreur de lecture dans enregistrement de type " << (int)ENREG_TYPE_2 
-                                                << " (pile " << (int)PILE_COORDONNEES << ")" ));
-
-                 for (unsigned i=0; i!=numero_noeuds.size(); ++i)
-                   {
-                     // si le noeud est utilisé dans le maillage, on lit ses coordonnées et on les stocke dans la structure
-                     if ( (numero_noeuds[i] != -1) && (medi.points.find(numero_noeuds[i])!=medi.points.end()) ) 
-                       {
-                         for (unsigned j=0; j!=space_dimension; ++j)
-                           _gibi >> medi.points[numero_noeuds[i]].coord[j];
-                         _gibi >> d1; // on ne conserve pas la densite
-                       }
-                     else // sinon, on passe au noeud suivant
-                       {
-                         for (unsigned j=0; j!=space_dimension+1; ++j)
-                           _gibi >> d1;
-                       }
-                   }
-                 break;
-
-               } // Fin switch numero_pile
-             break;
-           } // Fin case ENREG_TYPE_2
-         }
-
-    } //  fin de la boucle while de lecture externe
-
-    // impression résultats
-    MESSAGE(LOC << "GIBI_MESH_RDONLY_DRIVER::read : RESULTATS STRUCTURE INTERMEDIAIRES : ");
-    MESSAGE(LOC <<  medi );
+//=======================================================================
+//function : orientElements
+//purpose  : 
+//=======================================================================
 
 
-           // TRANSFORMATION EN STRUCTURES MED
-    if ( ! _ptrMesh->isEmpty() )
-    {
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Mesh object not empty : can't fill it!"));
-    }
-    else if ( medi.maillage.size()==0 || medi.groupes.size()==0 || medi.points.size()==0)
+static void orientElements( _intermediateMED& medi )
+{
+  MESSAGE("orientElements()");
+  set<_maille>::iterator elemIt = medi.maillage.begin();
+
+  if ( elemIt->sommets[0]->second.coord.size() == 2 ) { // space dimension
+
+    // --------------------------
+    // Orient 2D faces clockwise
+    // --------------------------
+
+    for ( ; elemIt != medi.maillage.end(); elemIt++ )
+      if ( elemIt->dimension() == 2 )
+      {
+        // look for index of the most left node 
+        int iLeft = 0, iNode, nbNodes = elemIt->sommets.size();
+        double minX = elemIt->sommets[0]->second.coord[0];
+        for ( iNode = 1; iNode < nbNodes; ++iNode )
+        {
+          if ( minX > elemIt->sommets[ iNode ]->second.coord[ 0 ]) {
+            minX = elemIt->sommets[ iNode ]->second.coord[ 0 ];
+            iLeft = iNode;
+          }
+        }
+        // indeces of the nodes neighboring the most left one
+        int iPrev = ( iLeft - 1 < 0 ) ? nbNodes - 1 : iLeft - 1;
+        int iNext = ( iLeft + 1 == nbNodes ) ? 0 : iLeft + 1;
+        // find components of prev-left and left-next vectors
+        double xP = elemIt->sommets[ iPrev ]->second.coord[ 0 ];
+        double yP = elemIt->sommets[ iPrev ]->second.coord[ 1 ];
+        double xN = elemIt->sommets[ iNext ]->second.coord[ 0 ];
+        double yN = elemIt->sommets[ iNext ]->second.coord[ 1 ];
+        double xL = elemIt->sommets[ iLeft ]->second.coord[ 0 ];
+        double yL = elemIt->sommets[ iLeft ]->second.coord[ 1 ];
+        double xPL = xL - xP, yPL = yL - yP; // components of prev-left vector
+        double xLN = xN - xL, yLN = yN - yL; // components of left-next vector
+        // normalise y of the vectors
+        double modPL = sqrt ( xPL * xPL + yPL * yPL );
+        double modLN = sqrt ( xLN * xLN + yLN * yLN );
+        if ( modLN > DBL_MIN && modPL > DBL_MIN )
+        {
+          yPL /= modPL;
+          yLN /= modLN;
+          // summury direction of neighboring links must be positive
+          bool clockwise = ( yPL + yLN > 0 );
+          elemIt->reverse = ( !clockwise );
+        }
+      }
+  }
+  else {
+
+    int type = -100;
+    vector< pair<int,int> > swapVec;
+    for ( ; elemIt != medi.maillage.end(); elemIt++ ) {
+      if ( elemIt->dimension() == 3 )
+      {
+        // ---------------------------------------------------
+        // Orient volumes according to MED conventions:
+        // normal of a bottom (first) face should be downward
+        // ---------------------------------------------------
+
+        int nbBottomNodes = 0;
+        switch ( elemIt->geometricType ) {
+        case MED_TETRA4:
+        case MED_TETRA10:
+        case MED_PENTA6:
+        case MED_PENTA15:
+          nbBottomNodes = 3; break;
+        case MED_PYRA5:
+        case MED_PYRA13:
+        case MED_HEXA8:
+        case MED_HEXA20:
+          nbBottomNodes = 4; break;
+        default: continue;
+        }
+        // find a normal to the bottom face
+        const _noeud* n[4] = {
+          &elemIt->sommets[0]->second, // 3 bottom nodes
+          &elemIt->sommets[1]->second,
+          &elemIt->sommets[2]->second,
+          &elemIt->sommets[nbBottomNodes]->second };// a top node
+        double vec01 [3] = { // vector n[0]-n[1]
+          n[1]->coord[0] - n[0]->coord[0],
+          n[1]->coord[1] - n[0]->coord[1],
+          n[1]->coord[2] - n[0]->coord[2], };
+        double vec02 [3] = { // vector n[0]-n[2]
+          n[2]->coord[0] - n[0]->coord[0],
+          n[2]->coord[1] - n[0]->coord[1],
+          n[2]->coord[2] - n[0]->coord[2] };
+        double normal [3] = { // vec01 ^ vec02
+          vec01[1] * vec02[2] - vec01[2] * vec02[1],
+          vec01[2] * vec02[0] - vec01[0] * vec02[2],
+          vec01[0] * vec02[1] - vec01[1] * vec02[0] };
+        // check if the 102 angle is convex
+        if ( nbBottomNodes > 3 ) {
+          const _noeud* n3 = &elemIt->sommets[nbBottomNodes-1]->second;// last bottom node
+          double vec03 [3] = { // vector n[0]-n3
+            n3->coord[0] - n[0]->coord[0],
+            n3->coord[1] - n[0]->coord[1],
+            n3->coord[2] - n[0]->coord[2], };
+          if ( fabs( normal[0]+normal[1]+normal[2] ) <= DBL_MIN ) { // vec01 || vec02
+            normal[0] = vec01[1] * vec03[2] - vec01[2] * vec03[1]; // vec01 ^ vec03
+            normal[1] = vec01[2] * vec03[0] - vec01[0] * vec03[2];
+            normal[2] = vec01[0] * vec03[1] - vec01[1] * vec03[0];
+          }
+          else {
+            double vec [3] = { // normal ^ vec01
+              normal[1] * vec01[2] - normal[2] * vec01[1],
+              normal[2] * vec01[0] - normal[0] * vec01[2],
+              normal[0] * vec01[1] - normal[1] * vec01[0] };
+            double dot2 = vec[0]*vec03[0] + vec[1]*vec03[1] + vec[2]*vec03[2]; // vec*vec03
+            if ( dot2 < 0 ) { // concave -> reverse normal
+              normal[0] *= -1;
+              normal[1] *= -1;
+              normal[2] *= -1;
+            }
+          }
+        }
+        // direction from top to bottom
+        vector<double> tbDir(3);
+        tbDir[0] = n[0]->coord[0] - n[3]->coord[0];
+        tbDir[1] = n[0]->coord[1] - n[3]->coord[1];
+        tbDir[2] = n[0]->coord[2] - n[3]->coord[2];
+        // compare 2 directions: normal and top-bottom
+        double dot = normal[0]*tbDir[0] + normal[1]*tbDir[1] + normal[2]*tbDir[2];
+        bool reverse = ( dot < 0. );
+        if ( reverse ) {
+          if ( elemIt->geometricType != type ) {
+            type = elemIt->geometricType;
+            getReverseVector( type, swapVec );
+//             INFOS("vec01: " <<vec01[0] << " " <<vec01[1] << " " << vec01[2]);
+//             INFOS("vec02: " <<vec02[0] << " " <<vec02[1] << " " << vec02[2]);
+//             INFOS("normal: " <<normal[0] << " " <<normal[1] << " " << normal[2]);
+//             INFOS("tb: " << tbDir[0] << " " <<tbDir[1] << " " << tbDir[2]);
+//             INFOS( *elemIt );
+//             for ( vector< _maille::iter >::const_iterator si = elemIt->sommets.begin();
+//                  si != elemIt->sommets.end(); si++ )
+//               INFOS( (*si)->second );
+          }
+          _maille* ma = (_maille*) & (*elemIt);
+          for ( int i = 0; i < swapVec.size(); ++i ) {
+            _maille::iter tmp = ma->sommets[ swapVec[i].first ];
+            ma->sommets[ swapVec[i].first ] = ma->sommets[ swapVec[i].second ];
+            ma->sommets[ swapVec[i].second ] = tmp;
+          }
+        }
+      } // dimension() == 3
+    } // loop on maillage
+    
+    // --------------------------------------
+    // orient equally all connected 3D faces
+    // --------------------------------------
+
+    // fill map of links and their faces
+    set<const _maille*> faces;
+    map<const _maille*, _groupe*> fgm;
+    map<_link, list<const _maille*> > linkFacesMap;
+    map<_link, list<const _maille*> >::iterator lfIt, lfIt2;
+
+    medi.treatGroupes(); // erase groupes that wont be converted
+    for (unsigned int i=0; i!=medi.groupes.size(); ++i)
     {
     {
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << " Error while reading file " << _fileName 
-                   << " The data read are not completed " ) ) ;
+      _groupe& grp = medi.groupes[i];
+      _groupe::mailleIter maIt=grp.mailles.begin();
+      if ( maIt==grp.mailles.end() || (*maIt)->dimension() != 2 )
+        continue;
+      for(; maIt!=grp.mailles.end(); ++maIt) {
+        if ( faces.insert( &(**maIt )).second ) {
+          for ( int j = 0; j < (*maIt)->sommets.size(); ++j )
+            linkFacesMap[ (*maIt)->link( j ) ].push_back( &(**maIt) );
+          fgm.insert( make_pair( &(**maIt), &grp ));
+        }
+      }
     }
     }
-    else
+    // dump linkFacesMap
+//     for ( lfIt = linkFacesMap.begin(); lfIt!=linkFacesMap.end(); lfIt++) {
+//       cout<< "LINK: " << lfIt->first.first << "-" << lfIt->first.second << endl;
+//       list<const _maille*> & fList = lfIt->second;
+//       list<const _maille*>::iterator fIt = fList.begin();
+//       for ( ; fIt != fList.end(); fIt++ )
+//         cout << "\t" << **fIt << fgm[*fIt]->nom << endl;
+//     }
+
+    // Each oriented link must appear in one face only, else a face is reversed.
+
+    queue<const _maille*> faceQueue; // the queue contains well oriented faces
+    // whose neighbors orientation is to be checked
+
+    bool manifold = true;
+    while ( !linkFacesMap.empty() )
     {
     {
-       _ptrMesh->_name = _meshName;
-       _ptrMesh->_spaceDimension = medi.points.begin()->second.coord.size();
-       _ptrMesh->_meshDimension = medi.maillage.rbegin()->dimension();
-       _ptrMesh->_numberOfNodes = medi.points.size();
-       _ptrMesh->_isAGrid = 0;
-       _ptrMesh->_coordinate = medi.getCoordinate();
-
-       //Construction des groupes
-       vector<GROUP *> groupCell, groupFace, groupEdge, groupNode;
-       medi.getGroups(groupCell, groupFace, groupEdge, groupNode, _ptrMesh);
-       _ptrMesh->_groupCell = groupCell;
-       _ptrMesh->_groupFace = groupFace;
-       _ptrMesh->_groupEdge = groupEdge;
-       _ptrMesh->_groupNode = groupNode;
-
-       // appele en dernier car cette fonction detruit le maillage intermediaire!
-       _ptrMesh->_connectivity = medi.getConnectivity(); 
-
-       // calcul de la connectivite d-1 complete, avec renumerotation des groupes
-       //if (_ptrMesh->_spaceDimension==3)
-       //    _ptrMesh->_connectivity->updateGroup(_ptrMesh->_groupFace) ;
-       //else if (_ptrMesh->_spaceDimension==2)
-       //    _ptrMesh->_connectivity->updateGroup(_ptrMesh->_groupEdge) ;
-       
-       // Creation des familles Ã  partir des groupes
-       // NC : Cet appel pourra Ãªtre différé quand la gestion de la cohérence famille/groupes sera assurée
-       _ptrMesh->createFamilies();
-    }
+      if ( faceQueue.empty() ) {
+        ASSERT( !linkFacesMap.begin()->second.empty() );
+        faceQueue.push( linkFacesMap.begin()->second.front() );
+      }
+      while ( !faceQueue.empty() )
+      {
+        const _maille* face = faceQueue.front();
+        faceQueue.pop();
+
+        // loop on links of <face>
+        for ( int i = 0; i < face->sommets.size(); ++i ) {
+          _link link = face->link( i );
+          // find the neighbor faces
+          lfIt = linkFacesMap.find( link );
+          int nbFaceByLink = 0;
+          list< const _maille* > ml;
+          if ( lfIt != linkFacesMap.end() )
+          {
+            list<const _maille*> & fList = lfIt->second;
+            list<const _maille*>::iterator fIt = fList.begin();
+            ASSERT( fIt != fList.end() );
+            for ( ; fIt != fList.end(); fIt++, nbFaceByLink++ ) {
+              ml.push_back( *fIt );
+              if ( *fIt != face ) // wrongly oriented neighbor face
+              {
+                const _maille* badFace = *fIt;
+                // reverse and remove badFace from linkFacesMap
+                for ( int j = 0; j < badFace->sommets.size(); ++j ) {
+                  _link badlink = badFace->link( j );
+                  if ( badlink == link ) continue;
+                  lfIt2 = linkFacesMap.find( badlink );
+                  if ( lfIt2 != linkFacesMap.end() ) {
+                    list<const _maille*> & ff = lfIt2->second;
+                    ff.erase( find( ff.begin(), ff.end(), badFace ));
+                        if ( ff.empty() )
+                          linkFacesMap.erase( lfIt2 );
+                  }
+                }
+                badFace->reverse = true; // reverse
+                //INFOS( "REVERSE " << *badFace );
+                faceQueue.push( badFace );
+              }
+            }
+            linkFacesMap.erase( lfIt );
+          }
+          // add good neighbors to the queue
+          _link revLink( link.second, link.first );
+          lfIt = linkFacesMap.find( revLink );
+          if ( lfIt != linkFacesMap.end() )
+          {
+            list<const _maille*> & fList = lfIt->second;
+            list<const _maille*>::iterator fIt = fList.begin();
+            for ( ; fIt != fList.end(); fIt++, nbFaceByLink++ ) {
+              ml.push_back( *fIt );
+              if ( *fIt != face )
+                faceQueue.push( *fIt );
+            }
+            linkFacesMap.erase( lfIt );
+          }
+          if ( nbFaceByLink > 2 ) {
+            if ( manifold ) {
+              list<const _maille*>::iterator i = ml.begin();
+              INFOS(nbFaceByLink << " faces by 1 link:");
+              for( ; i!= ml.end(); i++ ) {
+                INFOS("in object " << fgm[ *i ]->nom);
+                INFOS( **i );
+              }
+            }
+            manifold = false;
+          }
+        } // loop on links of the being checked face
+      } // loop on the face queue
+    } // while ( !linkFacesMap.empty() )
+
+    if ( !manifold )
+      INFOS(" -> Non manifold mesh, faces orientation may be incorrect");
+
+  } // space dimension == 3
+}
 
 
+//=======================================================================
+//function : fillMesh
+//purpose  : load data from medi to mesh
+//=======================================================================
 
 
+void GIBI_MESH_RDONLY_DRIVER::fillMesh(_intermediateMED* _ptrMedi)
+{
+  const char * LOC = "GIBI_MESH_RDONLY_DRIVER::fillMesh(_intermediateMED* _ptrMedi) : " ;
+  BEGIN_OF(LOC);
 
 
-    END_OF(LOC);
+  _ptrMesh->_name = _meshName;
+
+  if (_ptrMedi)
+  {
+    if (_ptrMedi->maillage.size()==0 ||
+        _ptrMedi->groupes.size()==0 ||
+        _ptrMedi->points.size()==0) {
+      INFOS(" Error while reading file: the data read are not completed " ) ;
+      return;
+    }
+    // fix element orientation
+    orientElements( *_ptrMedi );
+
+    _ptrMesh->_spaceDimension = _ptrMedi->points.begin()->second.coord.size();
+    _ptrMesh->_meshDimension = _ptrMedi->maillage.rbegin()->dimension();
+    _ptrMesh->_numberOfNodes = _ptrMedi->points.size();
+    _ptrMesh->_isAGrid = 0;
+    _ptrMesh->_coordinate = _ptrMedi->getCoordinate();
+
+    //Construction des groupes
+    _ptrMedi->getGroups(_ptrMesh->_groupCell,
+                        _ptrMesh->_groupFace,
+                        _ptrMesh->_groupEdge,
+                        _ptrMesh->_groupNode, _ptrMesh);
+
+    _ptrMesh->_connectivity = _ptrMedi->getConnectivity(); 
+
+    // calcul de la connectivite d-1 complete, avec renumerotation des groupes
+    //if (_ptrMesh->_spaceDimension==3)
+    //    _ptrMesh->_connectivity->updateGroup(_ptrMesh->_groupFace) ;
+    //else if (_ptrMesh->_spaceDimension==2)
+    //    _ptrMesh->_connectivity->updateGroup(_ptrMesh->_groupEdge) ;
+
+    // Creation des familles Ã  partir des groupes
+    // NC : Cet appel pourra Ãªtre différé quand la gestion de la cohérence famille/groupes sera assurée
+    _ptrMesh->createFamilies();
+    // TAKE CARE OF ELEMENTS ORDER IN GROUPS AFTER THEIR SPLITING INTO FAMILIES !!!!
+    // _ptrMesh->createFamilies() breaks the order
+//     _ptrMedi->getFamilies(_ptrMesh->_familyCell,
+//                           _ptrMesh->_familyFace,
+//                           _ptrMesh->_familyEdge,
+//                           _ptrMesh->_familyNode, _ptrMesh);
+
+    // add attributes to families
+    set<string> famNames;
+    for (medEntityMesh entity=MED_CELL; entity<MED_ALL_ENTITIES; ++entity)
+    {
+      int i, nb = _ptrMesh->getNumberOfFamilies(entity);
+      for ( i = 1; i <= nb; ++i ) {
+        FAMILY* f = const_cast<FAMILY*>( _ptrMesh->getFamily( entity, i ));
+        f->setNumberOfAttributes( 1 );
+        int* attIDs = new int[1];
+        attIDs[0] = 1;
+        f->setAttributesIdentifiers( attIDs );
+        int* attVals = new int[1];
+        attVals[0] = 1;
+        f->setAttributesValues( attVals );
+        string* attDescr = new string[1];
+        attDescr[0] = "med_family";
+        f->setAttributesDescriptions( attDescr );
+        // limit a name length
+        if ( f->getName().length() > 31 ) {
+          ostringstream name;
+          name << "FAM" << f->getIdentifier();
+          f->setName( name.str());
+        }
+        // check if family is on the whole mesh entity
+        if (_ptrMesh->getNumberOfElements( entity, MED_ALL_ELEMENTS ) ==
+            f->getNumberOfElements( MED_ALL_ELEMENTS ))
+          f->setAll( true );
+      }
+      // setAll() for groups
+      nb = _ptrMesh->getNumberOfGroups(entity);
+      for ( i = 1; i <= nb; ++i ) {
+        GROUP * g = const_cast<GROUP*>( _ptrMesh->getGroup( entity, i ));
+        if (_ptrMesh->getNumberOfElements( entity, MED_ALL_ELEMENTS ) ==
+            g->getNumberOfElements( MED_ALL_ELEMENTS ))
+          g->setAll( true );
+      }
+    }
+  }
+  END_OF(LOC);
 }
 
 void GIBI_MESH_RDONLY_DRIVER::write( void ) const
 }
 
 void GIBI_MESH_RDONLY_DRIVER::write( void ) const
@@ -423,82 +1368,1076 @@ void GIBI_MESH_RDONLY_DRIVER::write( void ) const
 GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER():GIBI_MESH_DRIVER()
 {
 }
 GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER():GIBI_MESH_DRIVER()
 {
 }
-  
 GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER(const string & fileName,
                                                  MESH * ptrMesh):
   GIBI_MESH_DRIVER(fileName,ptrMesh,MED_WRONLY)
 {
   MESSAGE("GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
 }
 GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER(const string & fileName,
                                                  MESH * ptrMesh):
   GIBI_MESH_DRIVER(fileName,ptrMesh,MED_WRONLY)
 {
   MESSAGE("GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
 }
-
 GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER(const GIBI_MESH_WRONLY_DRIVER & driver): 
   GIBI_MESH_DRIVER(driver)
 {
 }
 GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER(const GIBI_MESH_WRONLY_DRIVER & driver): 
   GIBI_MESH_DRIVER(driver)
 {
 }
-
 GIBI_MESH_WRONLY_DRIVER::~GIBI_MESH_WRONLY_DRIVER()
 {
   //MESSAGE("GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
 }
 GIBI_MESH_WRONLY_DRIVER::~GIBI_MESH_WRONLY_DRIVER()
 {
   //MESSAGE("GIBI_MESH_WRONLY_DRIVER::GIBI_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
 }
-
 GENDRIVER * GIBI_MESH_WRONLY_DRIVER::copy(void) const
 {
   return new GIBI_MESH_WRONLY_DRIVER(*this);
 }
 GENDRIVER * GIBI_MESH_WRONLY_DRIVER::copy(void) const
 {
   return new GIBI_MESH_WRONLY_DRIVER(*this);
 }
-
 void GIBI_MESH_WRONLY_DRIVER::read (void)
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("GIBI_MESH_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
 void GIBI_MESH_WRONLY_DRIVER::read (void)
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("GIBI_MESH_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
+//=======================================================================
+//function : open
+//purpose  : 
+//=======================================================================
+
+void GIBI_MESH_WRONLY_DRIVER::open()
+  //     throw (MEDEXCEPTION)
+{
+  const char * LOC = "GIBI_MESH_DRIVER::open()" ;
+  BEGIN_OF(LOC);
+
+  MED_EN::med_mode_acces aMode = getAccessMode();
+  switch (aMode) {
+  case MED_EN::MED_REMP:       
+  case MED_EN::MED_ECRI: // should never append !!
+    _gibi.open(_fileName.c_str(), ios::out);
+    break;
+  default:
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access ! " << aMode));
+  }
+  if (_gibi &&
+#ifdef WNT
+      _gibi.is_open()
+#else
+      _gibi.rdbuf()->is_open()
+#endif
+      )
+    _status = MED_OPENED;
+  else
+  {
+    _status = MED_CLOSED;
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Could not open file "<<_fileName));
+  }
+  END_OF(LOC);
+}
+
+//=======================================================================
+//function : close
+//purpose  : 
+//=======================================================================
+
+void GIBI_MESH_WRONLY_DRIVER::close()
+  //  throw (MEDEXCEPTION)
+{
+    const char * LOC = "GIBI_MESH_DRIVER::close() " ;
+    BEGIN_OF(LOC);
+    if ( _status == MED_OPENED) 
+    {
+       _gibi.close();
+       _status = MED_CLOSED;
+    }
+    END_OF(LOC);
+}
+
+//=======================================================================
+//function : write
+//purpose  : 
+//=======================================================================
+
 void GIBI_MESH_WRONLY_DRIVER::write(void) const
   throw (MEDEXCEPTION)
 { 
   const char * LOC = "void GIBI_MESH_WRONLY_DRIVER::write(void) const : ";
   BEGIN_OF(LOC);
 
 void GIBI_MESH_WRONLY_DRIVER::write(void) const
   throw (MEDEXCEPTION)
 { 
   const char * LOC = "void GIBI_MESH_WRONLY_DRIVER::write(void) const : ";
   BEGIN_OF(LOC);
 
-  throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<< "Write Driver isn\'t implemented"));
+  // we are going to modify the _gibi field
+  GIBI_MESH_WRONLY_DRIVER * me = const_cast<GIBI_MESH_WRONLY_DRIVER *>(this);
+//  try {
+    me->writeSupportsAndMesh();
+    me->writeLastRecord();
+//   }
+//   catch (MEDEXCEPTION &ex)
+//   {
+//     INFOS( ex.what() );
+//   }
 
   END_OF(LOC);
 
   END_OF(LOC);
-} 
+}
+
+//=======================================================================
+//function : getName
+//purpose  : return cleaned up support name
+//=======================================================================
+
+static string cleanName( const string& theName )
+{
+  string name = theName;
+  if ( !name.empty() ) {
+    // find a name string end
+    int i, len = name.length();
+    for ( i = 0; i < len; ++i ) {
+      if ( name[i] == 0 )
+        break;
+    }
+    // cut off trailing white spaces
+    while ( i > 0 && name[i-1] == ' ' )
+      i--;
+    if ( i != len ) {
+      name = name.substr( 0, i );
+      len = i;
+    }
+  }
+  return name;
+}
+
+//=======================================================================
+//function : addSupport
+//purpose  : 
+//=======================================================================
+
+bool GIBI_MESH_WRONLY_DRIVER::addSupport( const SUPPORT * support )
+{
+  if ( !support )
+    return false;
+  map<const SUPPORT*,supportData>::iterator su = _supports.find( support );
+  if ( su != _supports.end() )
+    return ( su->second.getNumberOfTypes() > 0 );
+
+  if ( support->getMesh() != _ptrMesh )
+    throw MEDEXCEPTION(LOCALIZED(STRING("cant write support of other mesh" )));
+
+  // get sub-supports and define a support type name
+  string supType;
+  list<const SUPPORT*> sList;
+  const GROUP* group = dynamic_cast< const GROUP* >(support);
+  if ( group )
+  {
+    if ( group->getNumberOfTypes() > 0 || group->isOnAllElements() )
+      sList.push_back( group );
+    else {
+      int iFam, nbFam = group->getNumberOfFamilies();
+      for ( iFam = 1; iFam <= nbFam; ++iFam )
+        sList.push_back( group->getFamily( iFam ));
+    }
+    supType = "group";
+  }
+  else
+  {
+    sList.push_back( support );
+    supType = dynamic_cast< const FAMILY* >(support) ? "family" : "support";
+  }
+
+  supportData & data = _supports[ support ];
+  data._cleanName = cleanName( support->getName() );
+
+  // check if it is a writtable support, i.e.
+  // nodal connectivity for a support entity exists
+  medEntityMesh entity = support->getEntity();
+  if ( entity != MED_NODE && !_ptrMesh->existConnectivity( MED_NODAL, entity )) {
+    INFOS("Do not save " << supType << " of entity " << entity
+          << " named <" << data._cleanName << "> nodal connectivity not defined");
+    return false;
+  }
+
+  // fill supportData
+  list<const SUPPORT*>::iterator sIt = sList.begin();
+  for ( ; sIt != sList.end(); sIt++ )
+  {
+    bool onAll = (*sIt)->isOnAllElements();
+    int nbTypes = 0;
+    if ( !onAll )
+      nbTypes = (*sIt)->getNumberOfTypes();
+    else
+      nbTypes = _ptrMesh->getNumberOfTypes( entity );
+    if ( nbTypes == 0 )
+      continue;
+    const medGeometryElement* types = 0;
+    if ( !onAll )
+      types = (*sIt)->getTypes();
+    else if ( entity != MED_NODE )
+      types = _ptrMesh->getTypes( entity );
+    for ( int iType = 0; iType < nbTypes; ++iType )
+    {
+      medGeometryElement geomType = types ? types[ iType ] : MED_ALL_ELEMENTS;
+      const int * ptrElemIDs = 0;
+      int elemID1 = 0, nbElems = 0;
+      if ( onAll ) {
+        nbElems = _ptrMesh->getNumberOfElements( entity, geomType );
+        elemID1 = (entity == MED_NODE) ? 1 : _ptrMesh->getGlobalNumberingIndex (entity)[ iType ];
+      }
+      else {
+        nbElems = (*sIt)->getNumberOfElements( geomType );
+        ptrElemIDs = (*sIt)->getNumber( geomType );
+      }
+      if ( geomType == 0 )
+        geomType = MED_POINT1;
+
+      data.addTypeData( geomType, nbElems, ptrElemIDs, elemID1 );
+    }
+  }
+
+  if ( data.getNumberOfTypes() == 0 ) {
+    INFOS("Do not save " << supType << " of entity " << entity
+          << " named <" << data._cleanName << "> no geometric types");
+    return false;
+  }
+
+  return true;
+}
+
+//=======================================================================
+//function : getSupportIndex
+//purpose  : 
+//=======================================================================
+
+int GIBI_MESH_WRONLY_DRIVER::getSubMeshIdAndSize(const SUPPORT *        support,
+                                                 list<pair<int,int> > & idsAndSizes) const
+{
+  idsAndSizes.clear();
+  map<const SUPPORT*,supportData>::const_iterator su = _supports.find( support );
+  if ( su == _supports.end() )
+    return 0;
+
+  supportData * data = const_cast<supportData *>( & su->second );
+  int id = data->_id;
+  if ( data->getNumberObjects() > data->getNumberOfTypes() )
+    id++;
+  supportData::typeIterator tIt = data->_types.begin();
+  for ( ; tIt != data->_types.end(); ++tIt )
+  {
+    int size = 0;
+    list< typeData >& td = tIt->second;
+    list< typeData >::iterator tdIt = td.begin();
+    for ( ; tdIt != td.end(); ++tdIt )
+      size += tdIt->_nbElems;
+    idsAndSizes.push_back( make_pair( id++, size ));
+  }
+  return idsAndSizes.size();
+}
+
+// ============================================================
+// the class writes endl to the file as soon as <limit> fields
+// have been written after the last endl
+// ============================================================
+
+class TFieldCounter
+{
+  fstream& _file;
+  int _count, _limit;
+ public:
+  TFieldCounter(fstream& f, int limit=0): _file(f), _limit(limit) { init(); }
+  void init(int limit=0) // init, is done by stop() as well
+  { if (limit) _limit = limit; _count = 0; }
+  void operator++(int) // next
+  { if ( ++_count == _limit ) { _file << endl; init(); }}
+  void stop() // init() and write endl if there was no endl after the last written field
+  { if ( _count ) _file << endl; init(); }
+};
+
+//=======================================================================
+//function : writeElements
+//purpose  : ptrElemIDs and elemID1 provide two alternative ways of giving
+//           elements to write.
+//           If elemSet != 0 then an element is
+//           ( addElemInSet ? <written and added to elemSet> : <ignored if id is in elemSet>)
+//=======================================================================
+
+void GIBI_MESH_WRONLY_DRIVER::writeElements (medGeometryElement geomType,
+                                             list< typeData >&  typeDataList,
+                                             const int *        nodalConnect,
+                                             const int *        nodalConnectIndex)
+{
+  // ITYPEL : type de l'鬩ment 1=point, 2=segment ?eux noeuds...
+  // NBSOUS : nombre de sous parties dans cet objet,
+  //          une sous partie par type d'鬩ments le composant.
+  // NBREF : nombre de sous r馩rences. Une r馩rence est par exemple le contour
+  // NBNOEL : nombre de noeuds par é¬©ment
+  // NBEL : nombre d'鬩ments
+
+  int castemType = GIBI_MESH_DRIVER::med2gibiGeom( geomType );
+  char* zeroI8 = "       0"; // FORMAT(I8)
+  int nbElemNodes = geomType % 100;
+        
+  // count total nb of elements
+  int nbElements = 0;
+  list< typeData >::iterator td = typeDataList.begin();
+  for ( ; td != typeDataList.end(); td++ )
+    nbElements += td->_nbElems;
+
+  _gibi << setw(8) << castemType <<  // ITYPE
+    zeroI8 <<                       // NBSOUS
+      zeroI8 <<                     // NBREF
+        setw(8) << nbElemNodes <<   // NBNOEL
+          setw(8) << nbElements <<  // NBEL
+            endl;
+
+  MESSAGE("writeElements(): geomType=" << geomType << " nbElements= " << nbElements)
+
+  // L 'enregistrement donnant le num? de la couleur des é¬©ments.
+  // * 8000 FORMAT(10I8)
+  TFieldCounter fcount( _gibi, 10 );
+  int iElem = 0;
+  for ( ; iElem < nbElements; ++iElem, fcount++ )
+    _gibi << zeroI8;
+  fcount.stop();
+
+  // Tableau des connectivité³® Description du premier é¬©ment puis du deuxiè­¥...
+  // ATTENTION il ne s'agit pas de la num?tation vraie,
+  // il faut la faire passer par le filtre du dernier tableau de la pile num? 32.
+  //int nbSkipped = 0;
+
+  for ( td = typeDataList.begin(); td != typeDataList.end(); td++ )
+  {
+    for ( int i = 0; i < td->_nbElems; i++ )
+    {
+      iElem = td->_ptrElemIDs ? td->_ptrElemIDs[ i ] : td->_elemID1 + i;
+      if ( geomType == MED_POINT1 )
+      {
+        _gibi << setw(8) << iElem;
+        fcount++;
+      }
+      else
+      {
+        int nodeId = nodalConnectIndex[ iElem - 1 ] - 1;
+        for ( int iNode = 0; iNode < nbElemNodes; ++iNode, fcount++ ) {
+          _gibi << setw(8) << nodalConnect[ nodeId++ ];
+        }
+      }
+    }
+  }
+  
+  fcount.stop();
+}
+
+//=======================================================================
+//function : addName
+//purpose  : make name uppercase and shorter than 9, add it to nameNbMap,
+//           raise if not unique
+//=======================================================================
+
+void GIBI_MESH_WRONLY_DRIVER::addName(map<string,int>& nameMap,
+                                      string&          theName,
+                                      int              index,
+                                      string           prefix)
+{
+  string name = cleanName( theName );
+  if ( !name.empty() ) {
+    int len = name.length();
+    if ( len > 8 )
+      throw MEDEXCEPTION(STRING("Can't write too long name: ") << name );
+
+    for ( int i = 0; i < len; ++i )
+      name[i] = toupper( name[i] );
+    if ( ! nameMap.insert( make_pair( name, index )).second )
+      throw MEDEXCEPTION(STRING("Can't write not unique name: ") << name );
+//     bool ok = ( len <= 8 && len > 0 );
+//     if ( ok ) {
+//       for ( int i = 0; i < len; ++i )
+//         name[i] = toupper( name[i] );
+//       ok = nameMap.insert( make_pair( name, index )).second;
+//     }
+//     if ( !ok ) {
+//       char *str=new char[ prefix.size() + 13 ];
+//       int j = 1;
+//       do {
+//         sprintf( str, "%s_%d", prefix.c_str(), nameMap.size()+j );
+//         ok = nameMap.insert( make_pair( str, index )).second;
+//         j++;
+//       } while ( !ok );
+//       INFOS( "Save <" << name << "> as <" << str << ">");
+//       delete [] str;
+//     }
+  }
+}
+
+//=======================================================================
+//function : writeNames
+//purpose  : 
+//=======================================================================
+
+void GIBI_MESH_WRONLY_DRIVER::writeNames( map<string,int>& nameNbMap )
+{
+  // La pile num? 1 est celle des objets de type maillage.
+  // La ligne suivante donne le nom des objets maillages sauvé³®
+  // * 8001       FORMAT(8(1X,A8))
+  if ( !nameNbMap.empty() )
+  {
+    TFieldCounter fcount( _gibi, 8 );
+    _gibi << left;
+    map<string,int>::iterator nameNbIt = nameNbMap.begin();
+    for ( ; nameNbIt != nameNbMap.end(); nameNbIt++, fcount++ ) {
+      _gibi << " " << setw(8) << nameNbIt->first;
+    }
+    fcount.stop();
+    _gibi << right;
+    // La ligne suivante donne les num?s d'ordre, dans la pile,
+    // des objets nomm?cit?pr飩demment.
+    // *  8000 FORMAT(10I8)
+    nameNbIt = nameNbMap.begin();
+    for ( fcount.init(10); nameNbIt != nameNbMap.end(); nameNbIt++, fcount++ )
+      _gibi << setw(8) << nameNbIt->second;
+    fcount.stop();
+  }
+}
+
+//=======================================================================
+//function : writeSupportsAndMesh
+//purpose  : 
+//=======================================================================
+
+void GIBI_MESH_WRONLY_DRIVER::writeSupportsAndMesh()
+{
+  const char * LOC = "void GIBI_MESH_WRONLY_DRIVER::writeSupportsAndMesh() ";
+  BEGIN_OF(LOC);
+
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "file " << _fileName<<  " is not opened." ));
+  if (!_ptrMesh)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "can't write a NULL mesh" ));
+  if (!_ptrMesh->getConnectivityptr())
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "can't write a mesh with NULL connectivity" ));
+
+  // fill _supports with families and groups
+  medEntityMesh entity;
+  for (entity=MED_CELL; entity<MED_ALL_ENTITIES; ++entity)
+  {
+    int i, nb = _ptrMesh->getNumberOfGroups(entity);
+    for ( i = 1; i <= nb; ++i )
+      addSupport( _ptrMesh->getGroup( entity, i ));
+//     nb = _ptrMesh->getNumberOfFamilies(entity);
+//     for ( i = 1; i <= nb; ++i )
+//       addSupport( _ptrMesh->getFamily( entity, i ));
+  }
+
+  // --------------------------------------------------------------------
+  // Count total nb of objects: an object per an element type in support
+  // plus an object per an element type not used in _supports.
+  // Collect object names
+  // --------------------------------------------------------------------
+
+  vector<int> nbSuppElemsByType(MED_HEXA20,0);
+  map<string,int> nameNbMap;
+  map<const SUPPORT*,supportData>::iterator supIt = _supports.begin();
+  int i, nb_objects = 0;
+  for ( ; supIt != _supports.end(); supIt++ )
+  {
+    supportData & data = supIt->second;
+    int nbSupObj = data.getNumberObjects();
+    if ( nbSupObj == 0 )
+      continue;
+    data._id = nb_objects + 1;
+    nb_objects += nbSupObj;
+
+    addName( nameNbMap, data._cleanName, data._id, "C" );
+    MESSAGE( "obj " << data._id << " " << data._cleanName);
+
+    // count elements: take into account supports on all elements and families only
+    const SUPPORT* support = supIt->first;
+    if ( support->isOnAllElements() || dynamic_cast< const FAMILY* >( support ))
+    {
+      supportData::typeIterator tIt = data._types.begin();
+      for ( ; tIt != data._types.end(); ++tIt )
+        if ( support->isOnAllElements() )
+        {
+          nbSuppElemsByType[ tIt->first ] = INT_MAX / 100;
+        }
+        else
+        {
+          list< typeData >& td = tIt->second;
+          list< typeData >::iterator tdIt = td.begin();
+          for ( ; tdIt != td.end(); ++tdIt )
+            nbSuppElemsByType[ tIt->first] += tdIt->_nbElems;
+        }
+    }
+  }
+
+  // count types of mesh elements that are not all in _supports
+  int iType, nbTypes;
+  entity = _ptrMesh->getConnectivityptr()->getEntity();
+  for ( ; entity < MED_NODE; entity++ )
+  {
+    nbTypes = _ptrMesh->getNumberOfTypes( entity );
+    if ( nbTypes == 0 || !_ptrMesh->existConnectivity( MED_NODAL, entity ))
+      continue;
+    const medGeometryElement* types = _ptrMesh->getTypes( entity );
+    for ( iType = 0; iType < nbTypes; ++iType )
+    {
+      int nbElemInSups = nbSuppElemsByType[ types[ iType ]];
+      int nbElemInMesh = _ptrMesh->getNumberOfElements(entity, types[ iType ]);
+      if ( nbElemInSups < nbElemInMesh ) {
+        nb_objects++;
+        nbSuppElemsByType[ types[ iType ]] = -1; // to keep written elements of _supports
+      }
+    }
+  }
+
+  // ------------
+  // Write file 
+  // ------------
+
+  // Premier paquet dont le nombre de lignes ne varie pas.
+  // On y trouve des indications g鮩rales.
+  const int dim = _ptrMesh->getSpaceDimension();
+  _gibi << " ENREGISTREMENT DE TYPE   4" << endl;
+  _gibi << " NIVEAU  15 NIVEAU ERREUR   0 DIMENSION   " << dim <<endl;
+  _gibi << " DENSITE  .00000E+00" << endl;
+  _gibi << " ENREGISTREMENT DE TYPE   7" << endl;
+  _gibi << " NOMBRE INFO CASTEM2000   8" <<endl;
+  _gibi << " IFOUR  -1 NIFOUR   0 IFOMOD  -1 IECHO   1 IIMPI   0 IOSPI   0 ISOTYP   1" << endl;
+  _gibi << " NSDPGE     0" << endl;
+
+  // Deuxiè­¥ paquet qui d馩nit toutes les piles
+  // (une pile par type d'objet et certaines piles en plus).
+  // Un enregistrement de type 2 pr鶩ent de l'飲iture d'une nouvelle pile,
+  // celui de type 5 pr鶩ent de la fin.
+  // * 800   FORMAT (' ENREGISTREMENT DE TYPE', I4)
+  _gibi << " ENREGISTREMENT DE TYPE   2" << endl;
+  // * 801     FORMAT(' PILE NUMERO',I4,'NBRE OBJETS NOMMES',I8,'NBRE OBJETS',I8)
+  _gibi << " PILE NUMERO   1NBRE OBJETS NOMMES" << setw(8) << nameNbMap.size() <<
+    "NBRE OBJETS" << setw(8) << nb_objects <<endl;
+
+  writeNames( nameNbMap );
+
+  // Passage ?a description des objets les uns aprè³ les autres.
+  // Le premier enregistrement de chaque objet est composé ¤e 5 nombres repré³¥ntant :
+  // ITYPEL : type de l'鬩ment 1=point, 2=segment ?eux noeuds...
+  // NBSOUS : nombre de sous parties dans cet objet,
+  //          une sous partie par type d'鬩ments le composant.
+  // NBREF : nombre de sous r馩rences. Une r馩rence est par exemple le contour
+  // NBNOEL : nombre de noeuds par é¬©ment
+  // NBEL : nombre d'鬩ments
+  // Si ITYPEL=0 alors NBSOUS diffé²¥nt de z?. Dans ce cas on lira la liste des positions,
+  // dans la pile des objets, des sous parties le composant.
+  // Si NBSOUS=0, NBNOEL et NBEL sont diffé²¥nts de z?, on trouve, au besoin,
+  // la liste des r馩rences , les num?s des couleurs puis les connectivité³®
+
+  TFieldCounter fcount( _gibi, 10 );
+  char* zeroI8 = "       0"; // FORMAT(I8)
+  for ( supIt = _supports.begin(); supIt != _supports.end(); supIt++ )
+  {
+    supportData & data = supIt->second;
+    int nbSupObj = data.getNumberObjects();
+    if ( nbSupObj == 0 )
+      continue;
+    MESSAGE("support " << data._id << "<" << data._cleanName << ">");
+
+    // write a compound object
+    int nbTypes = data.getNumberOfTypes();
+    if ( nbSupObj > nbTypes )
+    {
+      _gibi << zeroI8 << setw(8) << nbTypes << zeroI8 << zeroI8 << zeroI8 << endl;
+      for ( int i_sub = 1; i_sub <= nbTypes; ++i_sub, fcount++ )
+        _gibi << setw(8) << ( data._id + i_sub );
+      fcount.stop();
+    }
 
 
+    // write components
+    entity = supIt->first->getEntity();
+    const int * nodalConnect = 0, * nodalConnectIndex = 0;
+    if ( entity != MED_NODE ) {
+      nodalConnect = _ptrMesh->getConnectivity (MED_FULL_INTERLACE,
+                                                MED_NODAL,
+                                                entity,
+                                                MED_ALL_ELEMENTS);
+      nodalConnectIndex = _ptrMesh->getConnectivityIndex (MED_NODAL,entity);
+    }
+    supportData::typeIterator tIt = data._types.begin();
+    for ( ; tIt != data._types.end(); ++tIt )
+    {
+      writeElements (tIt->first,
+                     tIt->second,
+                     nodalConnect,
+                     nodalConnectIndex);
+    }
+  }  // loop on _supports
+
+  // Write elements that are not in _supports
+
+  supportData data;
+  entity = _ptrMesh->getConnectivityptr()->getEntity();
+  for ( ; entity < MED_NODE; entity++ )
+  {
+    int nbTypes = _ptrMesh->getNumberOfTypes( entity );
+    if ( nbTypes == 0 || !_ptrMesh->existConnectivity( MED_NODAL, entity ))
+      continue;
+    const medGeometryElement* types = _ptrMesh->getTypes( entity );
+    const int * nbIndex = _ptrMesh->getGlobalNumberingIndex (entity);
+    const int * nodalConnect = 0, * nodalConnectIndex = 0;
+    nodalConnect = _ptrMesh->getConnectivity (MED_FULL_INTERLACE,
+                                              MED_NODAL,
+                                              entity,
+                                              MED_ALL_ELEMENTS);
+    nodalConnectIndex = _ptrMesh->getConnectivityIndex (MED_NODAL,entity);
+
+    for ( int iType = 1; iType <= nbTypes; ++iType )
+    {
+      int nbElements = nbIndex[ iType ] - nbIndex[ iType - 1 ];
+      medGeometryElement geomType = types[ iType - 1 ]; 
+      if ( nbSuppElemsByType[ geomType ] >= nbElements )
+        continue; // all elements are written with _supports
+
+      int elemId1 = nbIndex[ iType - 1 ];
+      data.addTypeData( geomType, nbElements, 0, elemId1 );
+
+      writeElements (geomType,
+                     data._types[ geomType ],
+                     nodalConnect,
+                     nodalConnectIndex);
+    }
+  }
+
+  // D颵t de la pile 32 (celle des points)
+
+  int nbNodes = _ptrMesh->getNumberOfNodes();
+  _gibi << " ENREGISTREMENT DE TYPE   2" << endl;
+  _gibi << " PILE NUMERO  32NBRE OBJETS NOMMES       0" <<
+    "NBRE OBJETS" << setw(8) << nbNodes << endl;
+  // Liste des noms de points
+  // * 8001       FORMAT(8(1X,A8))
+  // No named nodes
+  // suit le nombre de noeuds
+  _gibi << setw(8) << nbNodes << endl;
+  // Le tableau suivant donne le filtre pour avoir le vrai num? des noeuds
+  // appartenant aux é¬©ments d飲its. Par exemple, si un é¬©ment, d飲it
+  // dans la pile 1, fait r馩rence ?n num? de noeud é§¡l ? il faut le
+  // mettre é§¡l ?2
+  // * 8000 FORMAT(10I8)
+  for ( i = 0; i < nbNodes; ++i, fcount++ )
+    _gibi << setw(8) << i + 1;
+  fcount.stop();
+
+  // D颵t de pile 33 (celle des configurations (coordonn?))
+  _gibi << " ENREGISTREMENT DE TYPE   2" << endl;
+  _gibi << " PILE NUMERO  33NBRE OBJETS NOMMES       0NBRE OBJETS       1" << endl;
+  // Suit le nombre de points dont on donne les coordonn?
+  int nbValues = nbNodes * ( dim + 1 );
+  _gibi << setw(8) << nbValues << endl;
+  // Les coordonn? sont donn? par noeuds. D'abord le premier puis le deuxiè­¥...
+  // Pour chaque noeuds, on donne les 2 ou 3 coordonn? plus la densité £ourante
+  // au moment de sa cré¡´ion.
+  // * 8003   FORMAT(1P,3E22.14)
+  _gibi.precision(14);
+  _gibi.setf( ios_base::scientific, ios_base::floatfield );
+  _gibi.setf( ios_base::uppercase );
+  const double * coords = _ptrMesh->getCoordinates(MED_FULL_INTERLACE);
+  int j = 0;
+  for ( fcount.init(3),i = 0; i < nbNodes; ++i, j += dim )
+  {
+    for ( int iCoord = 0; iCoord < dim; ++iCoord, fcount++ )
+      _gibi << setw(22) << coords[ j + iCoord ];
+    _gibi << setw(22) << 0.0; // densite
+    fcount++;
+  }
+  fcount.stop();
 
 
+  END_OF(LOC);
+}
+
+//=======================================================================
+//function : writeLastRecord
+//purpose  : 
+//=======================================================================
+
+void GIBI_MESH_WRONLY_DRIVER::writeLastRecord()
+{
+  _gibi << " ENREGISTREMENT DE TYPE   5" << endl;
+  _gibi << "LABEL AUTOMATIQUE :   1" << endl;
+}
 
 /*--------------------- RDWR PART -------------------------------*/
 
 GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER():GIBI_MESH_DRIVER()
 {
 }
 
 /*--------------------- RDWR PART -------------------------------*/
 
 GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER():GIBI_MESH_DRIVER()
 {
 }
-
 GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(const string & fileName,
 GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(const string & fileName,
-                                          MESH * ptrMesh):
-  GIBI_MESH_DRIVER(fileName,ptrMesh,MED_RDWR)
+                                             MESH * ptrMesh):
+       GIBI_MESH_DRIVER(fileName,ptrMesh,MED_RDWR)
 {
   MESSAGE("GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
 }
 {
   MESSAGE("GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
 }
-
 GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(const GIBI_MESH_RDWR_DRIVER & driver): 
   GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_DRIVER(driver)
 {
 GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(const GIBI_MESH_RDWR_DRIVER & driver): 
   GIBI_MESH_RDONLY_DRIVER::GIBI_MESH_DRIVER(driver)
 {
+  MESSAGE("GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(driver) has been created");
 }
 }
-
 GIBI_MESH_RDWR_DRIVER::~GIBI_MESH_RDWR_DRIVER() {
 GIBI_MESH_RDWR_DRIVER::~GIBI_MESH_RDWR_DRIVER() {
-  //MESSAGE("GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
+  MESSAGE("GIBI_MESH_RDWR_DRIVER::GIBI_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
 } 
 } 
-  
 GENDRIVER * GIBI_MESH_RDWR_DRIVER::copy(void) const
 {
 GENDRIVER * GIBI_MESH_RDWR_DRIVER::copy(void) const
 {
-  return new GIBI_MESH_RDWR_DRIVER(*this);
+  BEGIN_OF( "GIBI_MESH_RDWR_DRIVER::copy()");
+  GENDRIVER * driver = new GIBI_MESH_RDWR_DRIVER(*this);
+  END_OF( "GIBI_MESH_RDWR_DRIVER::copy()");
+  return driver;
 }
 }
-
 void GIBI_MESH_RDWR_DRIVER::write(void) const
   throw (MEDEXCEPTION)
 {
 void GIBI_MESH_RDWR_DRIVER::write(void) const
   throw (MEDEXCEPTION)
 {
-  GIBI_MESH_WRONLY_DRIVER::write();
+  GIBI_MESH_RDWR_DRIVER * me = const_cast<GIBI_MESH_RDWR_DRIVER *>(this);
+  me->GIBI_MESH_WRONLY_DRIVER::open();
+  me->GIBI_MESH_WRONLY_DRIVER::write();
+  me->GIBI_MESH_WRONLY_DRIVER::close();
 }
 void GIBI_MESH_RDWR_DRIVER::read (void)
   throw (MEDEXCEPTION)
 {
 }
 void GIBI_MESH_RDWR_DRIVER::read (void)
   throw (MEDEXCEPTION)
 {
+  BEGIN_OF( "GIBI_MESH_RDWR_DRIVER::read()");
+  GIBI_MESH_RDONLY_DRIVER::open();
   GIBI_MESH_RDONLY_DRIVER::read();
   GIBI_MESH_RDONLY_DRIVER::read();
+  GIBI_MESH_RDONLY_DRIVER::close();
+  END_OF( "GIBI_MESH_RDWR_DRIVER::read()");
+}
+void GIBI_MESH_RDWR_DRIVER::open()
+  // throw (MEDEXCEPTION)
+{
+}
+void GIBI_MESH_RDWR_DRIVER::close()
+  // throw (MEDEXCEPTION)
+{
+}
+
+//============================== ====================================================
+//============================== FIELD Reading Driver ==============================
+//============================== ====================================================
+
+GIBI_MED_RDONLY_DRIVER::GIBI_MED_RDONLY_DRIVER():GIBI_MESH_RDONLY_DRIVER()
+{
+}
+GIBI_MED_RDONLY_DRIVER::GIBI_MED_RDONLY_DRIVER(const string & fileName, MED * ptrMed):
+       GIBI_MESH_RDONLY_DRIVER(fileName,NULL), _med( ptrMed )
+{
+  MESSAGE("GIBI_MED_RDONLY_DRIVER(const string & fileName, MED * ptrMed) has been created");
+  _fileName = fileName;
+  _accessMode = MED_RDONLY;
+}
+GIBI_MED_RDONLY_DRIVER::GIBI_MED_RDONLY_DRIVER(const GIBI_MED_RDONLY_DRIVER & driver) 
+{
+}
+ GIBI_MED_RDONLY_DRIVER::~GIBI_MED_RDONLY_DRIVER() 
+{
+}
+GENDRIVER * GIBI_MED_RDONLY_DRIVER::copy ( void ) const 
+{
+  return new GIBI_MED_RDONLY_DRIVER(*this);
+}
+
+//=======================================================================
+//function : read
+//purpose  : 
+//=======================================================================
+
+void GIBI_MED_RDONLY_DRIVER::read ( void ) throw (MEDEXCEPTION)
+{
+  const char * LOC = "GIBI_MED_RDONLY_DRIVER::read() : " ;
+  BEGIN_OF(LOC);
+
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "file " << _fileName<<" is not opened." ));
+
+  _ptrMesh = new MESH();
+
+  _intermediateMED medi;
+  try {
+    if ( !readFile( &medi, true ) )
+      return;
+
+    // set name of field and its support if it is empty
+    set<string> fnames;
+    list< _fieldBase* >::iterator fIt = medi.fields.begin();
+    for ( ; fIt != medi.fields.end(); fIt++ )
+      fnames.insert( (*fIt)->name );
+    int i = 0;
+    for (fIt = medi.fields.begin(); fIt != medi.fields.end(); fIt++ ) {
+      _fieldBase* f = *fIt;
+      if ( f->name.empty() ) {
+        do {
+          ostringstream name;
+          name << "F_" << ++i;
+          f->name = name.str();
+        } while ( !fnames.insert( f->name ).second );
+      }
+      _groupe& g = medi.groupes[ f->group_id ];
+      if ( g.nom.empty() )
+        g.nom = "GRP_" + f->name;
+    }
+    //MESSAGE(LOC <<  medi );
+    fillMesh( &medi );
+    MESSAGE(LOC << "GIBI_MED_RDONLY_DRIVER::read : RESULTATS STRUCTURE INTERMEDIAIRES : ");
+    MESSAGE(LOC <<  medi );
+
+    list< FIELD_* > fields;
+    medi.getFields( fields );
+    MESSAGE( "nb fields: " << fields.size() );
+
+    if ( _ptrMesh->getName().empty() )
+      _ptrMesh->setName( "MESH" );
+
+    _med->addMesh( _ptrMesh );
+
+    list< FIELD_* >::iterator it = fields.begin();
+    for ( ; it != fields.end(); it++ )
+      _med->addField( *it );
+  }
+  catch (MEDEXCEPTION &ex)
+  {
+    INFOS( ex.what() );
+  }
+
+  END_OF(LOC);
+}
+
+//============================== ====================================================
+//============================== FIELD Writting Driver ==============================
+//============================== ====================================================
+
+GIBI_MED_WRONLY_DRIVER::GIBI_MED_WRONLY_DRIVER():GIBI_MESH_WRONLY_DRIVER()
+{
+}
+GIBI_MED_WRONLY_DRIVER::GIBI_MED_WRONLY_DRIVER(const string & fileName,
+                                                   MED * ptrMed,
+                                                   MESH * ptrMesh)
+     :GIBI_MESH_WRONLY_DRIVER(fileName,ptrMesh), _med( ptrMed )
+{
+  const char * LOC =
+    "GIBI_MED_WRONLY_DRIVER(const string & fileName, MED * ptrMed, MESH * ptrMesh)" ;
+  BEGIN_OF(LOC);
+  
+  _fileName = fileName;
+  _accessMode = MED_WRONLY;
+  _ptrMesh = ptrMesh;
+  if ( !_med || !_ptrMesh )
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << " Bad params " << ptrMed << " " << ptrMesh ));
+}
+GIBI_MED_WRONLY_DRIVER::GIBI_MED_WRONLY_DRIVER(const GIBI_MED_WRONLY_DRIVER & driver)
+{
+}
+GIBI_MED_WRONLY_DRIVER::~GIBI_MED_WRONLY_DRIVER()
+{
+}
+GENDRIVER * GIBI_MED_WRONLY_DRIVER::copy ( void ) const
+{
+  return new GIBI_MED_WRONLY_DRIVER(*this);
+}
+
+//=======================================================================
+//function : writeDataSection
+//purpose  : 
+//=======================================================================
+
+template< class T >
+  static void writeDataSection (fstream& file,
+                                FIELD_*  field,
+                                int      id1,
+                                int      id2)
+{
+  FIELD<T>* f = dynamic_cast<FIELD<T>*>( field );
+  if (!f) return;
+  MEDARRAY<T>* array = f->getvalue();
+  int ld = array->getLeadingValue();
+  //SCRUTE( array->getLengthValue() );
+  for ( int iComp = 0; iComp < ld; ++iComp )
+  {
+    file << setw(8) << 1          // nb scalar values by element
+      << setw(8) << ( id2 - id1 ) // total nb of scalar values
+        << setw(8) << 0
+          << setw(8) << 0 << endl;
+    // * 8003   FORMAT(1P,3E22.14)
+    int id = id1;
+    while ( id < id2 )
+    {
+      for ( int i = 0; id < id2 && i < 3; ++i )
+        file << setw(22) << array->getIJ( id++, iComp + 1);
+      file << endl;
+    }
+  }
+}
+
+//=======================================================================
+//function : getSupports
+//purpose  : 
+//=======================================================================
+
+// int GIBI_MED_WRONLY_DRIVER::getSupports(const FIELD_*         field,
+//                                         list<const SUPPORT*>& supList) const
+// {
+//   int nbSup = 0;
+//   const SUPPORT* sup = field->getSupport();
+//   const GROUP* group = dynamic_cast<const GROUP*>( sup );
+//   if ( group ) {
+//     int nbFam = group->getNumberOfFamilies();
+//     for ( int iFam = 1; iFam <= nbFam; ++iFam ) {
+//       const FAMILY* fam = group->getFamily( iFam );
+//       if ( getSupportIndex( fam ) >= 0 ) {
+//         supList.push_back( fam );
+//         nbSup++;
+//       }
+//     }
+//   }
+//   else {
+//     supList.push_back( sup );
+//     nbSup++;
+//   }
+//   return nbSup;
+// }
+
+//=======================================================================
+//function : write
+//purpose  : 
+//=======================================================================
+
+void GIBI_MED_WRONLY_DRIVER::write( void ) const throw (MEDEXCEPTION)
+{
+  const char * LOC = "void GIBI_MED_WRONLY_DRIVER::write(void) const : ";
+  BEGIN_OF(LOC);
+
+  // we are going to modify the _gibi field
+  GIBI_MED_WRONLY_DRIVER * me = const_cast<GIBI_MED_WRONLY_DRIVER *>(this);
+
+  // get all fields on _ptrMesh and add their support to be written
+  list<FIELD_*> fields;
+  int iField, nbFileds = _med->getNumberOfFields();
+  int nb_obj = 0;
+  list<int> nb_sub_list;
+  map<string,int> nameNbMap;
+
+  list<pair<int,int> >           subIdSizeList; // pair( <submesh id>, <submesh size> );
+  list<pair<int,int> >::iterator idsize;
+
+  string *names=new string[ nbFileds ];
+  _med->getFieldNames( names );
+  for ( iField = 0; iField < nbFileds; ++iField )
+  {
+    int nb_sub = 0;
+    deque<DT_IT_> dtit = _med->getFieldIteration( names[ iField ]);
+    deque<DT_IT_>::iterator fIt = dtit.begin();
+    for ( ; fIt != dtit.end(); fIt++ )
+    {
+      FIELD_ * f = _med->getField( names[ iField ], fIt->dt, fIt->it );
+      if ( !dynamic_cast< FIELD<double >* >( f ))
+      {
+        MESSAGE("GIBI_MED_WRONLY_DRIVER::write( FIELD< int > ) not implemented"); 
+        continue;
+      }
+      const SUPPORT * sup = f->getSupport();
+      if ( me->addSupport( sup ) ) {
+        fields.push_back( f );
+        nb_sub += getSubMeshIdAndSize( sup, subIdSizeList );
+      }
+    }
+    if ( nb_sub ) {
+      addName( nameNbMap, names[ iField ], ++nb_obj, "F" );
+      nb_sub_list.push_back( nb_sub );
+    }
+  }
+
+  // write mesh
+
+  //try {
+    me->writeSupportsAndMesh();
+//   }
+//   catch (MEDEXCEPTION &ex)
+//   {
+//     INFOS( ex.what() );
+//     return;
+//   }
+
+  // write fields
+
+  if ( !fields.empty() ) {
+
+    fstream & gibi = me->_gibi;
+
+    TFieldCounter fcount( gibi, 10 );
+
+    gibi << " ENREGISTREMENT DE TYPE   2" << endl;
+    gibi << " PILE NUMERO  39NBRE OBJETS NOMMES" << setw(8) << nameNbMap.size()
+      << "NBRE OBJETS" << setw(8) << nb_obj << endl;
+
+    me->writeNames( nameNbMap );
+
+    list<FIELD_*>::iterator itF = fields.begin();
+    list<int>::iterator itNbSub = nb_sub_list.begin();
+    int nb_sub = 0, cur_nb_sub = 0;
+    for ( ; itF != fields.end(); itF++ )
+    {
+      if ( cur_nb_sub == nb_sub && itNbSub != nb_sub_list.end() ) {
+        // start the next field writting
+        nb_sub = *(itNbSub++);
+        gibi << setw(8) << nb_sub << "      -1       6      72" << endl;
+        gibi << left;
+        gibi << setw(72) << " Field" << endl;
+        gibi << right;
+        gibi << setw(72) << " " << endl;
+
+        // Sub Components section
+        list<FIELD_*>::iterator itF2 = itF;
+        vector<int> vals( 9, 0 );
+        vals[8] = 2;
+        fcount.init(10);
+        cur_nb_sub = 0;
+        while ( itF2 != fields.end() && cur_nb_sub < nb_sub )
+        {
+          FIELD_* f = *itF2++;
+          vals[2] = f->getNumberOfComponents();
+          getSubMeshIdAndSize( f->getSupport(), subIdSizeList );
+          for ( idsize = subIdSizeList.begin(); idsize != subIdSizeList.end(); idsize++ )
+          {
+            ++cur_nb_sub;
+            vals[0] = -idsize->first; // support id
+            for ( int i = 0; i < vals.size(); ++i, fcount++ )
+              gibi << setw(8) << vals[ i ];
+          }
+        }
+        fcount.stop();
+        cur_nb_sub = 0;
+        // dummy strings
+        int i_sub;
+        for ( fcount.init(4), i_sub = 0; i_sub < nb_sub; ++i_sub, fcount++ )
+          gibi << "                  ";
+        fcount.stop();
+        for ( fcount.init(8), i_sub = 0; i_sub < nb_sub; ++i_sub, fcount++ )
+          gibi << "         ";
+        fcount.stop();
+      }
+
+      FIELD_* f = *itF;
+      int id1 = 1;
+      int iComp, nbComp = f->getNumberOfComponents();
+      // loop on sub-components
+      getSubMeshIdAndSize( f->getSupport(), subIdSizeList );
+      for ( idsize = subIdSizeList.begin(); idsize != subIdSizeList.end(); idsize++ )
+      {
+        cur_nb_sub++;
+        // component addresses
+        for ( fcount.init(10), iComp = 0; iComp < nbComp; ++iComp, fcount++ )
+          gibi << setw(8) << 777; // a good number
+        fcount.stop();
+        // component names
+        gibi << left;
+        for ( fcount.init(8), iComp = 0; iComp < nbComp; ++iComp, fcount++ )
+          gibi << " "  << setw(8) << f->getComponentName( iComp + 1 );
+        fcount.stop();
+        // component types
+        for ( fcount.init(4), iComp = 0; iComp < nbComp; ++iComp, fcount++ )
+          gibi << " "  << setw(17) << "REAL*8";
+        fcount.stop();
+        gibi << right;
+
+        // Data section
+        int id2 = id1 + idsize->second;
+        writeDataSection<double>( gibi, f, id1, id2 );
+        id1 = id2;
+      }
+    } // loop on fields
+  }
+  me->writeLastRecord();
+  delete [] names;
+  END_OF(LOC);
 }
 }
index d3c098f9708602bccef0d1c4ab4feb434f454f73..b015b557e6b3d6bda005a859ce94adfe6f61379d 100644 (file)
@@ -3,7 +3,9 @@
 
 #include <string>
 #include <vector>
 
 #include <string>
 #include <vector>
+#include <map>
 #include <fstream>
 #include <fstream>
+#include <list>
 
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_GenDriver.hxx"
 
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_GenDriver.hxx"
 */
 
 namespace MEDMEM {
 */
 
 namespace MEDMEM {
+class MED;
 class MESH;
 class MESH;
+class FIELD_;
 class FAMILY;
 class GROUP;
 class FAMILY;
 class GROUP;
+class SUPPORT;
 class CONNECTIVITY;
 class CONNECTIVITY;
+class _intermediateMED;
 class GIBI_MESH_DRIVER : public GENDRIVER
 {
 protected:
 class GIBI_MESH_DRIVER : public GENDRIVER
 {
 protected:
@@ -38,8 +44,7 @@ protected:
   // A VOIR FILE DESCRIPTEUR ? MED_FR::med_idt _medIdt;
   string          _meshName;
   /////
   // A VOIR FILE DESCRIPTEUR ? MED_FR::med_idt _medIdt;
   string          _meshName;
   /////
-  ifstream _gibi;
-  
+
   // tableau de correspondance des types géométriques de CASTEM -> MED
   static const size_t nb_geometrie_gibi=47;
   static const MED_EN::medGeometryElement geomGIBItoMED[nb_geometrie_gibi];
   // tableau de correspondance des types géométriques de CASTEM -> MED
   static const size_t nb_geometrie_gibi=47;
   static const MED_EN::medGeometryElement geomGIBItoMED[nb_geometrie_gibi];
@@ -67,9 +72,6 @@ public :
   */
   virtual ~GIBI_MESH_DRIVER() ;
 
   */
   virtual ~GIBI_MESH_DRIVER() ;
 
-  void open() throw (MEDEXCEPTION);
-  void close() throw (MEDEXCEPTION);
-
   virtual void write( void ) const = 0 ;
   virtual void read ( void ) = 0 ;
 
   virtual void write( void ) const = 0 ;
   virtual void read ( void ) = 0 ;
 
@@ -84,7 +86,10 @@ public :
   */
   string getMeshName() const ;
 
   */
   string getMeshName() const ;
 
-private:
+  static MED_EN::medGeometryElement gibi2medGeom( size_t gibiTypeNb );
+  static int med2gibiGeom( MED_EN::medGeometryElement medGeomType );
+
+ private:
   virtual GENDRIVER * copy ( void ) const = 0 ;
 
 };
   virtual GENDRIVER * copy ( void ) const = 0 ;
 
 };
@@ -92,7 +97,6 @@ private:
 
 class GIBI_MESH_RDONLY_DRIVER : public virtual GIBI_MESH_DRIVER
 {
 
 class GIBI_MESH_RDONLY_DRIVER : public virtual GIBI_MESH_DRIVER
 {
 public :
   
   /*!
 public :
   
   /*!
@@ -122,10 +126,54 @@ public :
   */
   void read ( void ) throw (MEDEXCEPTION);
 
   */
   void read ( void ) throw (MEDEXCEPTION);
 
+  void open();
+  void close();
+
+protected:
+
+  bool readFile(_intermediateMED*  medi, bool readFields );
+
+  void fillMesh(_intermediateMED* medi);
+
 private:
  
   GENDRIVER * copy ( void ) const ;
 
 private:
  
   GENDRIVER * copy ( void ) const ;
 
+  // fields and methods for file reading
+
+  bool getLine(char* & line);
+  bool getNextLine (char* & line, bool raiseIfNot = true ) throw (MEDEXCEPTION)
+  {
+    if ( getLine( line )) return true;
+    if ( raiseIfNot ) throw MEDEXCEPTION(LOCALIZED(STRING("Unexpected EOF on ln ")<<_lineNb));
+    return false;
+  }
+  void initNameReading(int nbValues, int width = 8)  // FORMAT(8(1X,A8))
+  { init( nbValues, 72 / ( width + 1 ), width, 1 ); }
+  void initIntReading(int nbValues) //  FORMAT(10I8)
+  { init( nbValues, 10, 8 ); }
+  void initDoubleReading(int nbValues) //  FORMAT(1P,3E22.14)
+  { init( nbValues, 3, 22 ); }
+  void init( int nbToRead, int nbPosInLine, int width, int shift = 0 );
+  bool more() const { return ( _iRead < _nbToRead && _curPos ); }
+  void next();
+  char* str() const { return _curPos; }
+  int index() const { return _iRead; }
+  int getInt() const { return atoi( str() ); }
+  double getDouble() const { return atof( str() ); }
+  string getName() const;
+
+  // line getting
+  int   _File;
+  char* _start;
+  char* _ptr;
+  char* _eptr;
+  int   _lineNb;
+
+  // string reading
+  int _iPos, _nbPosInLine, _width, _shift;
+  int _iRead, _nbToRead;
+  char* _curPos;
 };
 
 /*!
 };
 
 /*!
@@ -167,7 +215,67 @@ public :
   */
   void read ( void ) throw (MEDEXCEPTION);
 
   */
   void read ( void ) throw (MEDEXCEPTION);
 
-private:
+  void open();
+  void close();
+
+ protected:
+
+  fstream _gibi;
+
+  /*!
+    Add a support to write. Return true if a support will be written
+  */
+  bool addSupport( const SUPPORT * support );
+  /*!
+    return submesh id and size for a support. Call it after writeSupportsAndMesh()
+  */
+  int getSubMeshIdAndSize(const SUPPORT *        support,
+                          list<pair<int,int> > & idsAndSizes ) const;
+  /*!
+    Write MESH and _supports.
+  */
+  void writeSupportsAndMesh();
+  /*!
+    Write the record closing file
+  */
+  void writeLastRecord();
+
+  static void addName( map<string,int>& nameMap, string& name, int index, string prefix );
+
+  void writeNames( map<string,int>& nameMap );
+
+ private:
+
+  struct typeData
+  {
+    int         _nbElems;
+    const int * _ptrElemIDs; // elem ids or 
+    int         _elemID1;    // first elem id if isOnAllElements()
+    typeData(): _nbElems(0),  _ptrElemIDs(NULL), _elemID1(0) {}
+    typeData( int nbElems, const int * ptrElemIDs, int elemID1 )
+      : _nbElems(nbElems),  _ptrElemIDs(ptrElemIDs), _elemID1(elemID1) {}
+  };
+  struct supportData
+  {
+    typedef map< MED_EN::medGeometryElement, list< typeData > >::iterator typeIterator;
+    int                                         _id;
+    string                                      _cleanName;
+    map< MED_EN::medGeometryElement, list< typeData > > _types;
+    supportData(): _id(0) {}
+    int getNumberOfTypes() const { return _types.size(); }
+    int getNumberObjects() const
+    { return _types.size() < 2 ? _types.size() : _types.size() + !_cleanName.empty(); }
+    void addTypeData(MED_EN::medGeometryElement type, int nbElems,
+                     const int * ptrElemIDs,  int elemID1 )
+    { _types[type].push_back( typeData( nbElems, ptrElemIDs, elemID1 )); }
+  };
+
+  void writeElements (MED_EN::medGeometryElement geomType,
+                      list< typeData >&  typeDataList,
+                      const int *        nodalConnect,
+                      const int *        nodalConnectIndex);
+
+  map<const SUPPORT*, supportData> _supports;
 
   GENDRIVER * copy ( void ) const ;
 };
 
   GENDRIVER * copy ( void ) const ;
 };
@@ -212,10 +320,137 @@ public :
   */
   void read (void) throw (MEDEXCEPTION);
 
   */
   void read (void) throw (MEDEXCEPTION);
 
-private:
+  void open();
+  void close();
+
+ private:
   GENDRIVER * copy(void) const ;
 
 };
   GENDRIVER * copy(void) const ;
 
 };
+
+class GIBI_MED_RDONLY_DRIVER : public GIBI_MESH_RDONLY_DRIVER {
+
+  MED * _med;
+
+public:
+  
+  /*!
+    Constructor.
+  */
+  GIBI_MED_RDONLY_DRIVER() ;
+  /*!
+    Constructor.
+  */
+  GIBI_MED_RDONLY_DRIVER(const string & fileName, MED * ptrMed) ;
+  /*!
+    Copy constructor.
+  */
+  GIBI_MED_RDONLY_DRIVER(const GIBI_MED_RDONLY_DRIVER & driver) ;
+
+  /*!
+    Destructor.
+  */
+  virtual ~GIBI_MED_RDONLY_DRIVER() ;
+  
+  /*!
+    Read MESH in the specified file.
+  */
+  void read ( void ) throw (MEDEXCEPTION);
+
+private:
+  GENDRIVER * copy ( void ) const ;
+
+};
+
+/*!
+
+  Driver Med for MESH : Write only.
+
+  Implement write method.
+
+*/
+
+class GIBI_MED_WRONLY_DRIVER : public GIBI_MESH_WRONLY_DRIVER {
+
+  MED * _med;
+
+public :
+  
+  /*!
+    Constructor.
+  */
+  GIBI_MED_WRONLY_DRIVER() ;
+  /*!
+    Constructor. To write a mesh and all fields on it
+  */
+  GIBI_MED_WRONLY_DRIVER(const string & fileName, MED * ptrMed, MESH * ptrMesh) ;
+  /*!
+    Copy constructor.
+  */
+  GIBI_MED_WRONLY_DRIVER(const GIBI_MED_WRONLY_DRIVER & driver) ;
+
+  /*!
+    Destructor.
+  */
+  virtual ~GIBI_MED_WRONLY_DRIVER() ;
+
+  /*!
+    Write MESH in the specified file.
+  */
+  void write( void ) const throw (MEDEXCEPTION);
+
+  //int getSupports(const FIELD_* field, list<const SUPPORT*>& supList) const;
+
+private:
+
+  GENDRIVER * copy ( void ) const ;
+};
+
+
+/*!
+
+  Driver GIBI for MESH : Read write.
+  - Use read method from GIBI_MED_RDONLY_DRIVER
+  - Use write method from GIBI_MED_WRONLY_DRIVER
+
+*/
+
+// class GIBI_MED_RDWR_DRIVER : public GIBI_MED_RDONLY_DRIVER, public GIBI_MED_WRONLY_DRIVER {
+
+// public :
+
+//   /*!
+//     Constructor.
+//   */
+//   GIBI_MED_RDWR_DRIVER() ;
+//   /*!
+//     Constructor.
+//   */
+//   GIBI_MED_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) ;
+//   /*!
+//     Copy constructor.
+//   */
+//   GIBI_MED_RDWR_DRIVER(const GIBI_MED_RDWR_DRIVER & driver) ;
+
+//   /*!
+//     Destructor.
+//   */
+//   ~GIBI_MED_RDWR_DRIVER() ;
+
+//   /*!
+//     Write MESH in the specified file.
+//   */
+//   void write(void) const throw (MEDEXCEPTION);
+//   /*!
+//     Read MESH in the specified file.
+//   */
+//   void read (void) throw (MEDEXCEPTION);
+
+// private:
+//   GENDRIVER * copy(void) const ;
+
+// };
 };
 
 
 };
 
 
index 44d503c007e1210821a0f2f7cc2b792eff2cbc2a..2b24bed13dcbf4d2b0995fede7b0f301c66ef9c8 100644 (file)
@@ -203,6 +203,14 @@ const medGeometryElement * GRID::getTypes(medEntityMesh entity) const
     return &_gridGeometry[i];
 }
 
     return &_gridGeometry[i];
 }
 
+MED_EN::medGeometryElement * GRID::getTypesWithPoly(MED_EN::medEntityMesh Entity) const
+{
+  int size=getNumberOfTypesWithPoly(Entity);
+  MED_EN::medGeometryElement *ret=new MED_EN::medGeometryElement[size];
+  memcpy(ret,getTypes(Entity),size*sizeof(MED_EN::medGeometryElement));
+  return ret;
+}
+
 //=======================================================================
 //function : fillMeshAfterRead
 //purpose  : 
 //=======================================================================
 //function : fillMeshAfterRead
 //purpose  : 
index 0fc9a1a4f80703089bbffc2ae7d4b88fcfa34fd3..11e5a4f693b721d94bb0815088af40456e05bd91 100644 (file)
@@ -208,8 +208,12 @@ class GRID: public MESH
 
   inline int getNumberOfTypes(MED_EN::medEntityMesh Entity) const;
 
 
   inline int getNumberOfTypes(MED_EN::medEntityMesh Entity) const;
 
+  inline int getNumberOfTypesWithPoly(MED_EN::medEntityMesh Entity) const;
+
   inline const MED_EN::medGeometryElement * getTypes(MED_EN::medEntityMesh Entity) const;
 
   inline const MED_EN::medGeometryElement * getTypes(MED_EN::medEntityMesh Entity) const;
 
+  MED_EN::medGeometryElement * getTypesWithPoly(MED_EN::medEntityMesh Entity) const;
+
   inline const CELLMODEL * getCellsTypes(MED_EN::medEntityMesh Entity) const;
 
   const int * getGlobalNumberingIndex(MED_EN::medEntityMesh Entity) const;
   inline const CELLMODEL * getCellsTypes(MED_EN::medEntityMesh Entity) const;
 
   const int * getGlobalNumberingIndex(MED_EN::medEntityMesh Entity) const;
@@ -217,12 +221,18 @@ class GRID: public MESH
   inline int getNumberOfElements(MED_EN::medEntityMesh Entity,
                                 MED_EN::medGeometryElement Type) const;
 
   inline int getNumberOfElements(MED_EN::medEntityMesh Entity,
                                 MED_EN::medGeometryElement Type) const;
 
+  inline int getNumberOfElementsWithPoly(MED_EN::medEntityMesh Entity,
+                                        MED_EN::medGeometryElement Type) const;
+
   inline bool existConnectivity(MED_EN::medConnectivity ConnectivityType,
                                MED_EN::medEntityMesh Entity) const;
 
   inline MED_EN::medGeometryElement getElementType(MED_EN::medEntityMesh Entity,
                                           int Number) const;
 
   inline bool existConnectivity(MED_EN::medConnectivity ConnectivityType,
                                MED_EN::medEntityMesh Entity) const;
 
   inline MED_EN::medGeometryElement getElementType(MED_EN::medEntityMesh Entity,
                                           int Number) const;
 
+  inline MED_EN::medGeometryElement getElementTypeWithPoly(MED_EN::medEntityMesh Entity,
+                                                          int Number) const;
+
   inline void calculateConnectivity(MED_EN::medModeSwitch Mode,
                                    MED_EN::medConnectivity ConnectivityType,
                                    MED_EN::medEntityMesh Entity) const ;
   inline void calculateConnectivity(MED_EN::medModeSwitch Mode,
                                    MED_EN::medConnectivity ConnectivityType,
                                    MED_EN::medEntityMesh Entity) const ;
@@ -247,9 +257,12 @@ class GRID: public MESH
 
   inline void setGridType(MED_EN::med_grid_type gridType);
 
 
   inline void setGridType(MED_EN::med_grid_type gridType);
 
-  friend class MED_MESH_RDONLY_DRIVER;
-  friend class MED_MESH_WRONLY_DRIVER;
-
+  friend class IMED_MESH_RDONLY_DRIVER;
+  friend class IMED_MESH_WRONLY_DRIVER;
+  friend class MED_MESH_RDONLY_DRIVER21;
+  friend class MED_MESH_WRONLY_DRIVER21;
+  friend class MED_MESH_RDONLY_DRIVER22;
+  friend class MED_MESH_WRONLY_DRIVER22;
 };
 
 
 };
 
 
@@ -338,6 +351,13 @@ inline int GRID::getNumberOfTypes(MED_EN::medEntityMesh entity) const
     return 1; // a grid has one type
 }
 
     return 1; // a grid has one type
 }
 
+
+inline int GRID::getNumberOfTypesWithPoly(MED_EN::medEntityMesh entity) const
+{
+  MESSAGE("GRID::getNumberOfTypes(medEntityMesh entity) : "<<entity);
+    return 1; // a grid has one type
+}
+
 /*!
   Get the whole list of CELLMODEL used by cells of given type (medEntityMesh).
 
 /*!
   Get the whole list of CELLMODEL used by cells of given type (medEntityMesh).
 
@@ -403,6 +423,11 @@ inline int GRID::getNumberOfElements(MED_EN::medEntityMesh entity, MED_EN::medGe
     return numberOfElements;
 }
 
     return numberOfElements;
 }
 
+int GRID::getNumberOfElementsWithPoly(MED_EN::medEntityMesh entity, MED_EN::medGeometryElement Type) const
+{
+  return getNumberOfElements(entity,Type);
+}
+
 
 /*!
   Return true if the wanted connectivity exist, else return false
 
 /*!
   Return true if the wanted connectivity exist, else return false
@@ -431,6 +456,11 @@ inline MED_EN::medGeometryElement GRID::getElementType(MED_EN::medEntityMesh Ent
   return _connectivity->getElementType(Entity,Number);
 }
 
   return _connectivity->getElementType(Entity,Number);
 }
 
+inline MED_EN::medGeometryElement GRID::getElementTypeWithPoly(MED_EN::medEntityMesh Entity,int Number) const
+{
+  return getElementType(Entity,Number);
+}
+
 /*!
   Calculate the ask connectivity. Return an exception if this could not be
   done. Do nothing if connectivity already exist.
 /*!
   Calculate the ask connectivity. Return an exception if this could not be
   done. Do nothing if connectivity already exist.
index 2041f3cc4bad7456da6c65cb511a838fe0e5794a..c1a3264bf5c79c56d04ecbb769922118774f1ac1 100644 (file)
@@ -15,6 +15,8 @@ using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
+#define MED_NOPDT -1
+
 /*!
   Constructor.
 */
 /*!
   Constructor.
 */
@@ -631,6 +633,32 @@ FIELD_  * MED::getField          ( const string & fieldName, const int dt=MED_NO
   
 };
 
   
 };
 
+/*!
+ Return a reference to the FIELD object named fieldName with 
+ time and iteration nb it.
+*/
+FIELD_  *MED::getField2(const string & fieldName, double time, int it) const throw (MEDEXCEPTION)
+{
+  const char * LOC = "MED::getField2 ( const string &, const int, const int ) const : ";
+  const double eps=1e-9;
+  map<FIELD_NAME_,MAP_DT_IT_>::const_iterator itFields=_fields.find(fieldName);
+  if ( itFields == _fields.end() ) 
+    throw MED_EXCEPTION (LOCALIZED( STRING(LOC) << "There is no known field named |" << fieldName << "|"));
+  MAP_DT_IT_::const_iterator iters=(*itFields).second.begin();
+  bool found=false;
+  FIELD_  *ret;
+  for(;iters!=(*itFields).second.end() && !found;iters++)
+    if(fabs((*iters).second->getTime()-time)<eps)
+      //if(it==(*iters).first.it)
+       {
+         ret=(*iters).second;
+         found=true;
+       }
+  if(!found)
+    throw MED_EXCEPTION(LOCALIZED( STRING(LOC) << "There is no known field existing at specified time and iteration !!! "));
+  return ret;
+  END_OF(LOC);
+}
 
 // fiend ostream & MED::operator<<(ostream &os,const MED & med) const {
 //   return os;
 
 // fiend ostream & MED::operator<<(ostream &os,const MED & med) const {
 //   return os;
index 910f9f0d25a6bbe3042733e2324dd08331a88322..428c01d09ccf0a64dc533d9e86740abd03e77948 100644 (file)
@@ -25,7 +25,7 @@ struct LT_DT_IT_
 {
   bool operator() (const DT_IT_ &p1, const DT_IT_ &p2) const
   {
 {
   bool operator() (const DT_IT_ &p1, const DT_IT_ &p2) const
   {
-    if ( bool test = p1.dt == p2.dt)
+    if ( p1.dt == p2.dt)
       return p1.it < p2.it ;
     else
       return  p1.dt < p2.dt ;
       return p1.it < p2.it ;
     else
       return  p1.dt < p2.dt ;
@@ -49,9 +49,12 @@ typedef map<DT_IT_, FIELD_*, LT_DT_IT_ > MAP_DT_IT_;
 class MED
 {
   // Add your personnal driver line (step 2)
 class MED
 {
   // Add your personnal driver line (step 2)
-  friend class MED_MED_RDONLY_DRIVER;
-  friend class MED_MED_WRONLY_DRIVER;
-  friend class MED_MED_RDWR_DRIVER;
+  friend class MED_MED_RDONLY_DRIVER21;
+  friend class MED_MED_WRONLY_DRIVER21;
+  friend class MED_MED_RDWR_DRIVER21;
+  friend class MED_MED_RDONLY_DRIVER22;
+  friend class MED_MED_WRONLY_DRIVER22;
+  friend class MED_MED_RDWR_DRIVER22;
 
 private:
 
 
 private:
 
@@ -105,6 +108,8 @@ public:
   deque<DT_IT_> getFieldIteration (const string & fieldName) const throw (MEDEXCEPTION) ;
   FIELD_   * getField          ( const string & fieldName,
                                  const int dt,  const int it) const throw (MEDEXCEPTION) ;
   deque<DT_IT_> getFieldIteration (const string & fieldName) const throw (MEDEXCEPTION) ;
   FIELD_   * getField          ( const string & fieldName,
                                  const int dt,  const int it) const throw (MEDEXCEPTION) ;
+  FIELD_   * getField2          ( const string & fieldName,
+                                double time, int it=0) const throw (MEDEXCEPTION) ;
 
   const map<MED_EN::medEntityMesh,SUPPORT *> & getSupports(const string & meshName) const throw (MEDEXCEPTION) ;
 
 
   const map<MED_EN::medEntityMesh,SUPPORT *> & getSupports(const string & meshName) const throw (MEDEXCEPTION) ;
 
index 71d9fd1aa3f3bcc28d0b6a046e0760624237df9a..8d628d28cc28622acdc984541643d69c92f76b7a 100644 (file)
 #include "MEDMEM_Unit.hxx"
 #include "MEDMEM_Array.hxx"
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_Unit.hxx"
 #include "MEDMEM_Array.hxx"
 #include "MEDMEM_Support.hxx"
-//#include "MEDMEM_Field.hxx"
 #include "MEDMEM_Mesh.hxx"
 #include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_Compatibility21_22.hxx"
 
 namespace MEDMEM {
 template <class T> class FIELD;
 
 namespace MEDMEM {
 template <class T> class FIELD;
-
-// A QD LA CLASSE MED_ALL_ELEMENTS_DRIVER.... :) pour mutualiser le open ..... avec led _medIdt...
-
-/*!
-
-  Driver Med for FIELD.
-
-  Generic part : implement open and close methods.
-
-*/
+template <class T> class MED_FIELD_RDWR_DRIVER;
+template <class T> class MED_FIELD_RDONLY_DRIVER;
+template <class T> class MED_FIELD_WRONLY_DRIVER;
 
 template <class T> class MED_FIELD_DRIVER : public GENDRIVER
 {
 protected:
 
 template <class T> class MED_FIELD_DRIVER : public GENDRIVER
 {
 protected:
-  
   FIELD<T> *     _ptrField;
   FIELD<T> *     _ptrField;
-  med_2_1::med_idt        _medIdt;
   string         _fieldName;
   int            _fieldNum;
   string         _fieldName;
   int            _fieldNum;
   void search_field() ;
   
 public :
   void search_field() ;
   
 public :
@@ -50,17 +40,17 @@ public :
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_FIELD_DRIVER():GENDRIVER(),
-                     _ptrField((FIELD<T> *)MED_NULL),_medIdt(MED_INVALID),
-                     _fieldName(""),_fieldNum(MED_INVALID) {}
+  MED_FIELD_DRIVER():_ptrField((FIELD<T> *) NULL),
+                     _fieldName(""),_fieldNum(MED_INVALID)
+  {}
   /*!
     Constructor.
   */
   MED_FIELD_DRIVER(const string & fileName, FIELD<T> * ptrField, 
                   MED_EN::med_mode_acces accessMode)
     : GENDRIVER(fileName,accessMode),
   /*!
     Constructor.
   */
   MED_FIELD_DRIVER(const string & fileName, FIELD<T> * ptrField, 
                   MED_EN::med_mode_acces accessMode)
     : GENDRIVER(fileName,accessMode),
-      _ptrField((FIELD<T> *) ptrField),_medIdt(MED_INVALID), 
-      _fieldName(fileName),_fieldNum(MED_INVALID) 
+      _ptrField((FIELD<T> *) ptrField), 
+      _fieldName(fileName),_fieldNum(MED_INVALID)
   {
   }
 
   {
   }
 
@@ -70,79 +60,38 @@ public :
   MED_FIELD_DRIVER(const MED_FIELD_DRIVER & fieldDriver):
     GENDRIVER(fieldDriver),
     _ptrField(fieldDriver._ptrField),
   MED_FIELD_DRIVER(const MED_FIELD_DRIVER & fieldDriver):
     GENDRIVER(fieldDriver),
     _ptrField(fieldDriver._ptrField),
-    _medIdt(MED_INVALID),
     _fieldName(fieldDriver._fieldName),
     _fieldName(fieldDriver._fieldName),
-    _fieldNum(fieldDriver._fieldNum) 
+    _fieldNum(fieldDriver._fieldNum)
   {
   }
 
   /*!
     Destructor.
   */
   {
   }
 
   /*!
     Destructor.
   */
-  virtual ~MED_FIELD_DRIVER() { 
-  }
-
-  void open() throw (MEDEXCEPTION)
-  {
-    const char * LOC = "MED_FIELD_DRIVER::open() ";
-    BEGIN_OF(LOC);
-
-    // we must set fieldname before open, because we must find field number in file (if it exist !!!)
-    if ( _fileName == "" )
-      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
-                                      << "_fileName is |\"\"|, please set a correct fileName before calling open()"
-                                      )
-                           );
-
-    MESSAGE(LOC<<"_fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
-    _medIdt = med_2_1::MEDouvrir( (const_cast <char *> (_fileName.c_str())),(med_2_1::med_mode_acces) _accessMode);
-    MESSAGE(LOC<<"_medIdt : "<< _medIdt );
-    if (_medIdt > 0) 
-      _status=MED_OPENED;
-    else {
-      _status = MED_INVALID;
-      _medIdt = MED_INVALID;
-      throw MED_EXCEPTION (LOCALIZED( STRING(LOC) 
-                                     << "Can't open |"  << _fileName 
-                                     << "|, _medIdt : " << _medIdt
-                                     )
-                          );
-    }
-
-    END_OF(LOC);
-  }
-  
-  void close() {
-    BEGIN_OF("MED_FIELD_DRIVER::close()");
-    med_2_1::med_int err = 0;
-    if (_status == MED_OPENED) {
-      err=med_2_1::MEDfermer(_medIdt);
-      //H5close(); // If we call H5close() all the files are closed.
-      _status = MED_CLOSED;
-      _medIdt = MED_INVALID;
-      MESSAGE(" MED_FIELD_DRIVER::close() : MEDfermer : _medIdt= " << _medIdt );
-      MESSAGE(" MED_FIELD_DRIVER::close() : MEDfermer : err    = " << err );
-    }
-    END_OF("MED_FIELD_DRIVER::close()");
+  virtual ~MED_FIELD_DRIVER()
+  { 
+    MESSAGE("MED_FIELD_DRIVER::~MED_FIELD_DRIVER() has been destroyed");
   }
 
   }
 
+  virtual void open() throw (MEDEXCEPTION) = 0;
+  virtual void close() =0;
   virtual void write( void ) const = 0 ;
   virtual void read ( void ) = 0 ;
   virtual void write( void ) const = 0 ;
   virtual void read ( void ) = 0 ;
-
   /*!
     Set the name of the FIELD asked in file.
 
     It could be different than the name of the FIELD object.
   */
   /*!
     Set the name of the FIELD asked in file.
 
     It could be different than the name of the FIELD object.
   */
-  void   setFieldName(const string & fieldName) ;
+  virtual void   setFieldName(const string & fieldName) { _fieldName = fieldName; }
   /*!
     Get the name of the FIELD asked in file.
   */
   /*!
     Get the name of the FIELD asked in file.
   */
-  string getFieldName() const ;
-
-private:
+  virtual string getFieldName() const { return _fieldName; } 
+protected:
   virtual GENDRIVER * copy ( void ) const = 0 ;
   virtual GENDRIVER * copy ( void ) const = 0 ;
-
+  friend class MED_FIELD_RDWR_DRIVER<T>;
+  friend class MED_FIELD_RDONLY_DRIVER<T>;
+  friend class MED_FIELD_WRONLY_DRIVER<T>;
 };
 
 /*!
 };
 
 /*!
@@ -153,7 +102,7 @@ private:
 
 */
 
 
 */
 
-template <class T> class MED_FIELD_RDONLY_DRIVER : public virtual MED_FIELD_DRIVER<T>
+template <class T> class IMED_FIELD_RDONLY_DRIVER : public virtual MED_FIELD_DRIVER<T>
 {
  
 public :
 {
  
 public :
@@ -161,27 +110,27 @@ public :
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_FIELD_RDONLY_DRIVER():MED_FIELD_DRIVER<T>() {};
+  IMED_FIELD_RDONLY_DRIVER() {}
   
   /*!
     Constructor.
   */
   
   /*!
     Constructor.
   */
-  MED_FIELD_RDONLY_DRIVER(const string & fileName,  FIELD<T> * ptrField):
+  IMED_FIELD_RDONLY_DRIVER(const string & fileName,  FIELD<T> * ptrField):
     MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDONLY) { 
     MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDONLY) { 
-    BEGIN_OF("MED_FIELD_RDONLY_DRIVER::MED_FIELD_RDONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
-    END_OF("MED_FIELD_RDONLY_DRIVER::MED_FIELD_RDONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
+    BEGIN_OF("IMED_FIELD_RDONLY_DRIVER::IMED_FIELD_RDONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
+    END_OF("IMED_FIELD_RDONLY_DRIVER::IMED_FIELD_RDONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
   }
   
   /*!
     Copy constructor.
   */
   }
   
   /*!
     Copy constructor.
   */
-  MED_FIELD_RDONLY_DRIVER(const MED_FIELD_RDONLY_DRIVER & fieldDriver):
-    MED_FIELD_DRIVER<T>(fieldDriver) {};
+  IMED_FIELD_RDONLY_DRIVER(const IMED_FIELD_RDONLY_DRIVER & fieldDriver):
+    MED_FIELD_DRIVER<T>(fieldDriver) {}
   
   /*!
     Destructor.
   */
   
   /*!
     Destructor.
   */
-  virtual ~MED_FIELD_RDONLY_DRIVER() {};
+  virtual ~IMED_FIELD_RDONLY_DRIVER() {}
 
   // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
 
 
   // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
 
@@ -189,14 +138,8 @@ public :
     Return a MEDEXCEPTION : it is the read-only driver.
   */
   void write( void ) const throw (MEDEXCEPTION) ;
     Return a MEDEXCEPTION : it is the read-only driver.
   */
   void write( void ) const throw (MEDEXCEPTION) ;
-  /*!
-    Read FIELD in the specified file.
-  */
-  void read ( void ) throw (MEDEXCEPTION) ;
-
-private:
-  GENDRIVER * copy( void ) const ;
 
 
+  friend class MED_FIELD_RDONLY_DRIVER<T>;
 };
 
 /*!
 };
 
 /*!
@@ -207,48 +150,41 @@ private:
 
 */
 
 
 */
 
-template <class T> class MED_FIELD_WRONLY_DRIVER : public virtual MED_FIELD_DRIVER<T> {
+template <class T> class IMED_FIELD_WRONLY_DRIVER : public virtual MED_FIELD_DRIVER<T> {
   
 public :
   
   /*!
     Constructor.
   */
   
 public :
   
   /*!
     Constructor.
   */
-  MED_FIELD_WRONLY_DRIVER():MED_FIELD_DRIVER<T>() {}
+  IMED_FIELD_WRONLY_DRIVER() {}
   
   /*!
     Constructor.
   */
   
   /*!
     Constructor.
   */
-  MED_FIELD_WRONLY_DRIVER(const string & fileName, FIELD<T> * ptrField):
+  IMED_FIELD_WRONLY_DRIVER(const string & fileName, FIELD<T> * ptrField):
     MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_WRONLY)
   {
     BEGIN_OF("MED_FIELD_WRONLY_DRIVER::MED_FIELD_WRONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
     END_OF("MED_FIELD_WRONLY_DRIVER::MED_FIELD_WRONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
     MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_WRONLY)
   {
     BEGIN_OF("MED_FIELD_WRONLY_DRIVER::MED_FIELD_WRONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
     END_OF("MED_FIELD_WRONLY_DRIVER::MED_FIELD_WRONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
-  };
+  }
 
   /*!
     Copy constructor.
   */
 
   /*!
     Copy constructor.
   */
-  MED_FIELD_WRONLY_DRIVER(const MED_FIELD_WRONLY_DRIVER & fieldDriver):
-    MED_FIELD_DRIVER<T>(fieldDriver) {};
+  IMED_FIELD_WRONLY_DRIVER(const IMED_FIELD_WRONLY_DRIVER & fieldDriver):
+    MED_FIELD_DRIVER<T>(fieldDriver) {}
   
   /*!
     Destructor.
   */
   
   /*!
     Destructor.
   */
-  virtual ~MED_FIELD_WRONLY_DRIVER() {};
-
-  /*!
-    Write FIELD in the specified file.
-  */
-  void write( void ) const throw (MEDEXCEPTION) ;
+  virtual ~IMED_FIELD_WRONLY_DRIVER() {};
   /*!
     Return a MEDEXCEPTION : it is the write-only driver.
   */
   void read ( void ) throw (MEDEXCEPTION) ;
 
   /*!
     Return a MEDEXCEPTION : it is the write-only driver.
   */
   void read ( void ) throw (MEDEXCEPTION) ;
 
-private:
-  GENDRIVER * copy( void ) const ;
-
+  friend class MED_FIELD_WRONLY_DRIVER<T>;
 };
 
 
 };
 
 
@@ -260,590 +196,193 @@ private:
 
 */
 
 
 */
 
-template <class T> class MED_FIELD_RDWR_DRIVER : public MED_FIELD_RDONLY_DRIVER<T>, public MED_FIELD_WRONLY_DRIVER<T> {
+template <class T> class IMED_FIELD_RDWR_DRIVER : public virtual IMED_FIELD_RDONLY_DRIVER<T>, public virtual IMED_FIELD_WRONLY_DRIVER<T> {
   
 public :
   
   /*!
     Constructor.
   */
   
 public :
   
   /*!
     Constructor.
   */
-  MED_FIELD_RDWR_DRIVER():MED_FIELD_DRIVER<T>() {}
+  IMED_FIELD_RDWR_DRIVER() {}
   
   /*!
     Constructor.
   */
   
   /*!
     Constructor.
   */
-  MED_FIELD_RDWR_DRIVER(const string & fileName, FIELD<T> * ptrField):
-    MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDWR)
+  IMED_FIELD_RDWR_DRIVER(const string & fileName, FIELD<T> * ptrField):
+    IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField),IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDWR)
   {
     BEGIN_OF("MED_FIELD_RDWR_DRIVER::MED_FIELD_RDWR_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
     //_accessMode = MED_RDWR ;
     END_OF("MED_FIELD_RDWR_DRIVER::MED_FIELD_RDWR_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
   {
     BEGIN_OF("MED_FIELD_RDWR_DRIVER::MED_FIELD_RDWR_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
     //_accessMode = MED_RDWR ;
     END_OF("MED_FIELD_RDWR_DRIVER::MED_FIELD_RDWR_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
-  };
+  }
 
   /*!
     Copy constructor.
   */
 
   /*!
     Copy constructor.
   */
-  MED_FIELD_RDWR_DRIVER(const MED_FIELD_RDWR_DRIVER & fieldDriver):
-    MED_FIELD_DRIVER<T>(fieldDriver) {};
+  IMED_FIELD_RDWR_DRIVER(const IMED_FIELD_RDWR_DRIVER & fieldDriver):
+    IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),MED_FIELD_DRIVER<T>(fieldDriver) {}
   
   /*!
     Destructor.
   */
   
   /*!
     Destructor.
   */
-  ~MED_FIELD_RDWR_DRIVER() {};
+  ~IMED_FIELD_RDWR_DRIVER() {}
 
 
-  /*!
-    Write FIELD in the specified file.
-  */
-  void write(void) const throw (MEDEXCEPTION) ;
-  /*!
-    Read FIELD in the specified file.
-  */
-  void read (void) throw (MEDEXCEPTION) ;
+  friend class MED_FIELD_RDWR_DRIVER<T>;
+};
 
 
+}
+
+namespace MEDMEM {
+
+template <class T> class MED_FIELD_RDONLY_DRIVER : public virtual IMED_FIELD_RDONLY_DRIVER<T>
+{
+public :
+  MED_FIELD_RDONLY_DRIVER();
+  MED_FIELD_RDONLY_DRIVER(const string & fileName,  FIELD<T> * ptrField);
+
+  MED_FIELD_RDONLY_DRIVER(const MED_FIELD_RDONLY_DRIVER & fieldDriver):IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver) { _concreteFieldDrv = fieldDriver._concreteFieldDrv->copy(); }
+  virtual ~MED_FIELD_RDONLY_DRIVER() {     if (_concreteFieldDrv) delete _concreteFieldDrv; }
+  virtual void read ( void ) throw (MEDEXCEPTION) { _concreteFieldDrv->read(); }
+  virtual void write( void ) const throw (MEDEXCEPTION) { _concreteFieldDrv->write(); }
+  virtual void open() throw (MEDEXCEPTION) { _concreteFieldDrv->open(); }
+  virtual void close() { _concreteFieldDrv->close(); }
+  virtual void   setFieldName(const string & fieldName) { _concreteFieldDrv->setFieldName(fieldName); }
+  virtual string getFieldName() const { return MED_FIELD_DRIVER<T>::getFieldName(); }
 private:
 private:
-  GENDRIVER * copy( void ) const ;
+  virtual GENDRIVER * copy ( void ) const { return new MED_FIELD_RDONLY_DRIVER<T>(*this); }
+protected:
+  GENDRIVER * _concreteFieldDrv;
+};
 
 
+template <class T> class MED_FIELD_WRONLY_DRIVER : public virtual IMED_FIELD_WRONLY_DRIVER<T> { 
+public :
+  MED_FIELD_WRONLY_DRIVER();
+  MED_FIELD_WRONLY_DRIVER(const string & fileName, FIELD<T> * ptrField);
+
+  MED_FIELD_WRONLY_DRIVER(const MED_FIELD_WRONLY_DRIVER & fieldDriver):IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver) { _concreteFieldDrv = fieldDriver._concreteFieldDrv->copy(); }
+  virtual ~MED_FIELD_WRONLY_DRIVER() {    if (_concreteFieldDrv) delete _concreteFieldDrv;}
+  virtual void read ( void ) throw (MEDEXCEPTION) { _concreteFieldDrv->read(); }
+  virtual void write( void ) const throw (MEDEXCEPTION) { _concreteFieldDrv->write(); }
+  virtual void open() throw (MEDEXCEPTION) { _concreteFieldDrv->open(); }
+  virtual void close() { _concreteFieldDrv->close(); }
+  virtual void   setFieldName(const string & fieldName) { _concreteFieldDrv->setFieldName(fieldName); }
+  virtual string getFieldName() const { return MED_FIELD_DRIVER<T>::getFieldName(); }
+private:
+  virtual GENDRIVER * copy ( void ) const { return new MED_FIELD_WRONLY_DRIVER<T>(*this); }
+protected:
+  GENDRIVER * _concreteFieldDrv;
 };
 
 };
 
+template <class T> class MED_FIELD_RDWR_DRIVER : public virtual IMED_FIELD_RDWR_DRIVER<T> {
+public:
+  MED_FIELD_RDWR_DRIVER();
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDWR_DRIVER(const string & fileName, FIELD<T> * ptrField);
+
+  MED_FIELD_RDWR_DRIVER(const MED_FIELD_RDWR_DRIVER & fieldDriver):
+    IMED_FIELD_RDWR_DRIVER<T>(fieldDriver)
+  { _concreteFieldDrv = fieldDriver._concreteFieldDrv->copy(); }
+  ~MED_FIELD_RDWR_DRIVER() {    if (_concreteFieldDrv) delete _concreteFieldDrv;}
+  virtual void read ( void ) throw (MEDEXCEPTION) { _concreteFieldDrv->read(); }
+  virtual void write( void ) const throw (MEDEXCEPTION) { _concreteFieldDrv->write(); }
+  virtual void open() throw (MEDEXCEPTION) { _concreteFieldDrv->open(); }
+  virtual void close() { _concreteFieldDrv->close(); }
+  virtual void   setFieldName(const string & fieldName) { _concreteFieldDrv->setFieldName(fieldName); }
+  virtual string getFieldName() const { return MED_FIELD_DRIVER<T>::getFieldName(); }
+private:
+  virtual GENDRIVER * copy ( void ) const { return new MED_FIELD_RDWR_DRIVER<T>(*this); }
+protected:
+  GENDRIVER * _concreteFieldDrv;
+};
+}
 
 /*-------------------------*/
 /* template implementation */
 /*-------------------------*/
 /*--------------------- DRIVER PART -------------------------------*/
 
 
 /*-------------------------*/
 /* template implementation */
 /*-------------------------*/
 /*--------------------- DRIVER PART -------------------------------*/
 
-template <class T> void MED_FIELD_DRIVER<T>::setFieldName(const string & fieldName)
-{
-  _fieldName = fieldName; 
-}
+// template <class T> void MED_FIELD_DRIVER<T>::setFieldName(const string & fieldName)
+// {
+//   _fieldName = fieldName; 
+// }
 
 
-template <class T> string  MED_FIELD_DRIVER<T>::getFieldName() const
-{
-  return _fieldName;
-}
-
-//  template <class T> void MED_FIELD_DRIVER<T>::search_field() {
-//    const char * LOC = "template <class T> class MED_FIELD_DRIVER::search_field() :";
-    
-//    // we search the field number !!!!
-//    if (_status==MED_OPENED)
-//      if (_fieldNum==MED_INVALID) {
-//        int err ;
-//        int    numberOfFields              = 0;      //MED_INVALID
-//        //   char   fieldName[MED_TAILLE_NOM+1] = "";
-//        char   fieldName[MED_TAILLE_NOM+1] ;
-//        int    numberOfComponents          = 0;
-//        char * componentName               = (char *) MED_NULL;
-//        char * unitName                    = (char *) MED_NULL;
-//        med_2_1::med_type_champ type ;
-//        numberOfFields = med_2_1::MEDnChamp(_medIdt,0) ;
-//        if ( numberOfFields <= 0 ) 
-//     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
-//        for (int i=1;i<=numberOfFields;i++) {
-         
-//     numberOfComponents = med_2_1::MEDnChamp(_medIdt,i) ;
-//     if ( numberOfComponents <= 0 ) 
-//       throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
-//                                        <<  "Be careful there is no compound for field n°" 
-//                                        << i << "in file |"<<_fileName<<"| !"));
-         
-//     componentName = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;
-//     unitName      = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;   
-         
-//     err = med_2_1::MEDchampInfo(_medIdt, i, fieldName, &type, componentName, 
-//                                unitName, numberOfComponents) ;
-         
-//     delete[] componentName ;
-//     delete[] unitName ;
-//     MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<_fieldName.c_str()<<"#");
-//     if ( !strcmp(fieldName,_fieldName.c_str()) ) {
-//       MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
-//       _fieldNum = i ;
-//       break ;
-//     }
-//        }
-//      }
-//  }
+// template <class T> string  MED_FIELD_DRIVER<T>::getFieldName() const
+// {
+//   return _fieldName;
+// }
   
   
-/*--------------------- RDONLY PART -------------------------------*/
+#include "MEDMEM_DriverFactory.hxx" 
+#include "MEDMEM_MedFieldDriver21.hxx"
+#include "MEDMEM_MedFieldDriver22.hxx"
 
 
-template <class T> GENDRIVER * MED_FIELD_RDONLY_DRIVER<T>::copy(void) const
-{
-  MED_FIELD_RDONLY_DRIVER<T> * myDriver = 
-    new MED_FIELD_RDONLY_DRIVER<T>(*this);
-  return myDriver ;
-}
 
 
-template <class T> void MED_FIELD_RDONLY_DRIVER<T>::read(void)
-  throw (MEDEXCEPTION)
-{
-  const char * LOC = " MED_FIELD_RDONLY_DRIVER::read() " ;
-  BEGIN_OF(LOC);
-
-  if (MED_FIELD_DRIVER<T>::_ptrField->_name=="")
-    MED_FIELD_DRIVER<T>::_ptrField->_name = MED_FIELD_DRIVER<T>::_fieldName ; 
-  else
-    MED_FIELD_DRIVER<T>::_fieldName = MED_FIELD_DRIVER<T>::_ptrField->_name; // bug indetermine ! apres avoir fait readfilestruct, lorsque je recupere le champ, tout est bon sauf le nom du champ dans le driver !!!!!
-
-  MESSAGE("###### "<<LOC<<" fieldNameDRIVER : "<<MED_FIELD_DRIVER<T>::_fieldName<<" fieldName : "<<MED_FIELD_DRIVER<T>::_ptrField->_name);
-
-  string MeshName =  MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getMesh()->getName() ;
-
-  if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
-    {
-
-      //        search_field() ;
-
-      char *  fieldName ;
-      fieldName = new char[MED_TAILLE_NOM+1] ;
-      int err ;
-      int    numberOfComponents          = 0;
-      char * componentName               = (char *) MED_NULL;
-      char * unitName                    = (char *) MED_NULL;
-      med_2_1::med_type_champ type ;
-
-      // we search the field number !!!!
-      if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID) {
-       int    numberOfFields              = 0;      //MED_INVALID
-       numberOfFields = med_2_1::MEDnChamp(MED_FIELD_DRIVER<T>::_medIdt,0) ;
-       if ( numberOfFields <= 0 ) 
-         throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
-       for (int i=1;i<=numberOfFields;i++) {
-           
-         numberOfComponents = med_2_1::MEDnChamp(MED_FIELD_DRIVER<T>::_medIdt,i) ;
-         if ( numberOfComponents <= 0 ) 
-           //                throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
-           //                                                 <<  "Be careful there is no compound for field n°" 
-           //                                                 << i << "in file |"<<_fileName<<"| !"));
-           MESSAGE(LOC<<"Be careful there is no compound for field n°"<<i<<"in file |"<<_fileName<<"| !");
-
-         componentName = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;
-         unitName      = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;   
-           
-         err = med_2_1::MEDchampInfo(MED_FIELD_DRIVER<T>::_medIdt, i, fieldName, &type, componentName, 
-                                    unitName, numberOfComponents) ;
-           
-         MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<MED_FIELD_DRIVER<T>::_fieldName.c_str()<<"#");
-         if ( !strcmp(fieldName,MED_FIELD_DRIVER<T>::_fieldName.c_str()) ) {
-           MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
-           MED_FIELD_DRIVER<T>::_fieldNum = i ;
-           break ;
-         }
-         // not found : release memory and search next field !
-         delete[] componentName ;
-         delete[] unitName ;
-       }
-      }
-      
-      delete[] fieldName ;
-
-      if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID)
-       throw MEDEXCEPTION(LOCALIZED( STRING(LOC) << ": Field "<<MED_FIELD_DRIVER<T>::_fieldName << " not found in file " << MED_FIELD_DRIVER<T>::_fileName ) );
-      MESSAGE ("FieldNum : "<<MED_FIELD_DRIVER<T>::_fieldNum);
-
-      //        int err ;
-      //        int NumberOfComponents = med_2_1::MEDnChamp(MED_FIELD_DRIVER<T>::_medIdt,MED_FIELD_DRIVER<T>::_fieldNum) ;
-      if (numberOfComponents < 1) 
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no component")) ; // use iostring !
-      // test type to check if it is rigth !!!???
-      MED_FIELD_DRIVER<T>::_ptrField->_numberOfComponents = numberOfComponents ;
-      MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = new int[numberOfComponents] ;
-      MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = new string[numberOfComponents] ;
-      MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = new UNIT[numberOfComponents] ;
-      MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = new string[numberOfComponents] ;
-      MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = new string[numberOfComponents] ;
-      for (int i=0; i<numberOfComponents; i++) {
-       MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes[i] = 1 ;
-
-       // PG : what about space !!!
-       MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i] = string(componentName,i*MED_TAILLE_PNOM,MED_TAILLE_PNOM) ;
-       SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i]);
-       MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i] = string(unitName,i*MED_TAILLE_PNOM,MED_TAILLE_PNOM) ;
-       SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i]);
-      }
-      delete[] componentName;
-      delete[] unitName;
-
-      // read values for each geometric type in _support
-      int NumberOfTypes = MED_FIELD_DRIVER<T>::_ptrField->_support->getNumberOfTypes() ;
-      const MED_EN::medGeometryElement *Types = MED_FIELD_DRIVER<T>::_ptrField->_support->getTypes() ;
-      T ** myValues = new T*[NumberOfTypes] ;
-      int * NumberOfValues = new int[NumberOfTypes] ;
-      int TotalNumberOfValues = 0 ;
-      MESSAGE ("NumberOfTypes :"<< NumberOfTypes);
-      _ptrField->_numberOfValues=0 ;
-      for (int i=0; i<NumberOfTypes; i++) {
-       MESSAGE ("Type["<<i+1<<"] :"<< Types[i]);
-       MESSAGE ("Entity :"<<MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity());
-       NumberOfValues[i] = 
-         MEDnVal(MED_FIELD_DRIVER<T>::_medIdt,
-                 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
-                 (med_2_1::med_entite_maillage)MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),
-                 (med_2_1::med_geometrie_element)Types[i],
-                 MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber,
-                 MED_FIELD_DRIVER<T>::_ptrField->_orderNumber) ; // no time step ! prend en compte le nbre de pt de gauss
-       // test if NumberOfValues is the same in _support !!! TODO that !!
-       // we suppose it is
-       // we could allocate array
-       myValues[i] = new T[ NumberOfValues[i]*numberOfComponents ] ;
-       TotalNumberOfValues+=NumberOfValues[i] ;// diviser par le nombre de point de gauss 
-       char * ProfilName = new char[MED_TAILLE_NOM+1];
-       MESSAGE ("NumberOfValues :"<< NumberOfValues[i]);
-       MESSAGE ("NumberOfComponents :"<< numberOfComponents);
-       MESSAGE ("MESH_NAME :"<< MeshName.c_str());
-       MESSAGE ("FIELD_NAME :"<< MED_FIELD_DRIVER<T>::_fieldName.c_str());
-       MESSAGE ("MED_ENTITE :"<< (med_2_1::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity());
-       MESSAGE("MED_GEOM :"<<(med_2_1::med_geometrie_element)Types[i]);
-       MESSAGE("Iteration :"<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
-       MESSAGE("Order :"<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
-        MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOfValues[i]; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
-       med_2_1::med_err ret;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       int lgth2=NumberOfValues[i]*numberOfComponents;
-       if(_ptrField->getValueType()==MED_EN::MED_INT32)
-         {
-           med_2_1::med_int *temp=new med_2_1::med_int[lgth2];
-           ret=med_2_1::MEDchampLire(MED_FIELD_DRIVER<T>::_medIdt,const_cast <char*> (MeshName.c_str()),
-                                 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
-                                 (unsigned char*) temp,
-                                 med_2_1::MED_NO_INTERLACE,
-                                 MED_ALL,
-                                 ProfilName,
-                                 (med_2_1::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),(med_2_1::med_geometrie_element)Types[i],
-                                 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
-                                 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
-                                );
-           for(int i2=0;i2<lgth2;i2++)
-             myValues[i][i2]=(int)(temp[i2]);
-           delete [] temp;
-         }
-       else
-#endif
-       ret=med_2_1::MEDchampLire(MED_FIELD_DRIVER<T>::_medIdt,const_cast <char*> (MeshName.c_str()),
-                                 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
-                                 (unsigned char*) myValues[i],
-                                 med_2_1::MED_NO_INTERLACE,
-                                 MED_ALL,
-                                 ProfilName,
-                                 (med_2_1::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),(med_2_1::med_geometrie_element)Types[i],
-                                 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
-                                 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
-                                ); 
-         if (ret < 0) {
-         // we must do some delete !!!
-         for(int j=0; j<=i;j++)
-           delete[] myValues[j];
-         delete[] myValues;
-         delete[] NumberOfValues ;
-         delete[] ProfilName;
-         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes ;
-         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsNames ;
-         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits ;
-         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions ;
-         delete[] MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits ;
-         MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = NULL ;
-         MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = NULL ;
-         MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = NULL ;
-         MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = NULL ;
-         MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = NULL ;
-         MED_FIELD_DRIVER<T>::_fieldNum = MED_INVALID ; // we have not found right field, so reset the field number 
-         throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": ERROR when read value")) ;
-       }
-
-       delete[] ProfilName ;
-      }
-      // allocate _value
-      // probleme avec les points de gauss : voir lorsqu-il y en a (!= 1)
-      //      MEDARRAY<T> * Values = new MEDARRAY<T>(MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents(),TotalNumberOfValues/MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents(),MED_EN::MED_NO_INTERLACE);
-
-      if (MED_FIELD_DRIVER<T>::_ptrField->_value==NULL)
-       MED_FIELD_DRIVER<T>::_ptrField->_value=new MEDARRAY<T>(numberOfComponents,TotalNumberOfValues,MED_EN::MED_NO_INTERLACE);
-
-      MEDARRAY<T> * Values = MED_FIELD_DRIVER<T>::_ptrField->_value ; // create by constructor ???
-      // check if dimensions are right : inutile : c'est dans le constructeur !!!
-      //if (Values->getLeadingValue() != numberOfComponents)
-      //  throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": leading dimension are false : "<<Values->getLeadingValue()<<" and "<<numberOfComponents) ) ;
-      //if (Values->getLengthValue() != TotalNumberOfValues)
-      //  throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": length dimension are false : "<<Values->getLengthValue()<<" and "<<TotalNumberOfValues) ) ;
-
-      for (int i=0; i<numberOfComponents; i++) {
-       //T * ValuesT = Values->getRow(i+1) ;
-       int Count = 1 ;
-       for (int j=0; j<NumberOfTypes; j++) {
-         T * myValue = myValues[j] ;
-         int NumberOf = NumberOfValues[j] ;
-//       MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOf; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
-         int offset = NumberOf*i ;
-         for (int k=0 ; k<NumberOf; k++) {
-           //ValuesT[Count]=myValue[k+offset] ;
-           Values->setIJ(Count,i+1,myValue[k+offset]);
-           SCRUTE(Count);
-           SCRUTE(Values->getIJ(Count,i+1));
-           Count++;
-         }
-       }
-      }
-      
-      for (int j=0; j<NumberOfTypes; j++)
-       delete[] myValues[j] ;
-      delete[] myValues ;
-      delete[] NumberOfValues ;
-
-      MED_FIELD_DRIVER<T>::_ptrField->_isRead = true ;
-    }
-
-  END_OF(LOC);
-}
+/*--------------------- RDONLY PART -------------------------------*/
+namespace MEDMEM {
 
 
-template <class T> void MED_FIELD_RDONLY_DRIVER<T>::write( void ) const
+template <class T> void IMED_FIELD_RDONLY_DRIVER<T>::write( void ) const
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_FIELD_RDONLY_DRIVER::write : Can't write with a RDONLY driver !");
 }
 
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_FIELD_RDONLY_DRIVER::write : Can't write with a RDONLY driver !");
 }
 
-/*--------------------- WRONLY PART -------------------------------*/
+template <class T>  MED_FIELD_RDONLY_DRIVER<T>::MED_FIELD_RDONLY_DRIVER() {
+    MESSAGE("You are using the default constructor of the Field read only Driver and it is 2.1 one");
+    _concreteFieldDrv=new MED_FIELD_RDONLY_DRIVER21<T>(); 
+}
 
 
-template <class T> GENDRIVER * MED_FIELD_WRONLY_DRIVER<T>::copy(void) const
-{
-  MED_FIELD_WRONLY_DRIVER<T> * myDriver = 
-    new MED_FIELD_WRONLY_DRIVER<T>(*this);
-  return myDriver ;
+template <class T>  MED_FIELD_RDONLY_DRIVER<T>::MED_FIELD_RDONLY_DRIVER(const string & fileName, FIELD<T> * ptrField)
+  {
+    BEGIN_OF("MED_FIELD_RDONLY_DRIVER::MED_FIELD_RDONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
+
+    _concreteFieldDrv = DRIVERFACTORY::buildFieldDriverFromFile(fileName,ptrField,MED_EN::MED_LECT);
+
+    END_OF("MED_FIELD_RDONLY_DRIVER::MED_FIELD_RDONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
 }
 
 }
 
-template <class T> void MED_FIELD_WRONLY_DRIVER<T>::read (void)
+/*--------------------- WRONLY PART -------------------------------*/
+
+template <class T> void IMED_FIELD_WRONLY_DRIVER<T>::read (void)
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_FIELD_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_FIELD_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
-template <class T> void MED_FIELD_WRONLY_DRIVER<T>::write(void) const
-  throw (MEDEXCEPTION)
-{
-  const char * LOC = "MED_FIELD_WRONLY_DRIVER::write(void) const " ;
-  BEGIN_OF(LOC);
-  if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
-    {
-      int err ;
-
-      int component_count=MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents();
-      string   component_name(component_count*MED_TAILLE_PNOM,' ') ;
-      string   component_unit(component_count*MED_TAILLE_PNOM,' ') ;
-
-      const string * listcomponent_name=MED_FIELD_DRIVER<T>::_ptrField->getComponentsNames() ;
-      const string * listcomponent_unit=MED_FIELD_DRIVER<T>::_ptrField->getMEDComponentsUnits() ;
-      int length ;
-      for (int i=0; i < component_count ; i++) {
-       length = min(MED_TAILLE_PNOM,(int)listcomponent_name[i].size());
-       component_name.replace(i*MED_TAILLE_PNOM,length,
-                              listcomponent_name[i],0,length);
-       length = min(MED_TAILLE_PNOM,(int)listcomponent_unit[i].size());
-       component_unit.replace(i*MED_TAILLE_PNOM,length,
-                              listcomponent_unit[i],0,length);
-      }
-
-      MESSAGE("component_name=|"<<component_name<<"|");
-      MESSAGE("component_unit=|"<<component_unit<<"|");
-
-      MED_EN::med_type_champ ValueType=MED_FIELD_DRIVER<T>::_ptrField->getValueType() ;
-      
-      MESSAGE("Template Type =|"<<ValueType<<"|");
-      
-      // le champ existe deja ???
-      char * champName = new char[MED_TAILLE_NOM+1] ;
-      med_2_1::med_type_champ type ;
-      char * compName ;
-      char * compUnit ;
-      bool Find = false ;
-      int n = med_2_1::MEDnChamp(MED_FIELD_DRIVER<T>::_medIdt,0);
-      int nbComp ;
-      for (int i=1; i<=n; i++) {
-       nbComp = med_2_1::MEDnChamp(MED_FIELD_DRIVER<T>::_medIdt,i);
-       compName = new char[MED_TAILLE_PNOM*nbComp+1];
-       compUnit = new char[MED_TAILLE_PNOM*nbComp+1];
-       err = med_2_1::MEDchampInfo(MED_FIELD_DRIVER<T>::_medIdt,i,champName,&type,compName,compUnit,nbComp);
-       if (err == 0)
-         if (strcmp(champName,MED_FIELD_DRIVER<T>::_ptrField->getName().c_str())==0) { // Found !
-           Find = true ;
-           break ;
-         }
-       delete[] compName ;
-       delete[] compUnit ;
-      }
-      delete[] champName ;
-      if (Find) {
-       // the same ?
-       if (nbComp != component_count)
-         throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
-                                        <<": Field exist in file, but number of component are different : "<<nbComp<<" in file and "<<component_count<<" in memory."
-                                        )
-                             );
-       // component name and unit
-       MESSAGE(LOC<<" Component name in file : "<<compName);
-       MESSAGE(LOC<<" Component name in memory : "<<component_name);
-       MESSAGE(LOC<<" Component unit in file : "<<compUnit);
-       MESSAGE(LOC<<" Component unit in memory : "<<component_unit);
-       delete[] compName ;
-       delete[] compUnit ;
-
-      } else {
-        // Verify the field doesn't exist
-
-        string dataGroupName =  "/CHA/";
-        dataGroupName        += MED_FIELD_DRIVER<T>::_ptrField->getName();
-        MESSAGE(LOC << "|" << dataGroupName << "|" );
-        MED_EN::med_idt gid =  H5Gopen(MED_FIELD_DRIVER<T>::_medIdt, dataGroupName.c_str() );
-        
-        if ( gid < 0 ) {
-          // create field :
-          err=med_2_1::MEDchampCr(MED_FIELD_DRIVER<T>::_medIdt, 
-                                 const_cast <char*> ((MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
-                                 (med_2_1::med_type_champ) ValueType,
-                                 const_cast <char*> ( component_name.c_str() ),
-                                 const_cast <char*> ( component_unit.c_str() ),
-                                 component_count);
-          if ( err < 0 )
-            throw MEDEXCEPTION( LOCALIZED (STRING(LOC) 
-                                           << ": Error MEDchampCr : "<<err
-                                           )
-                                );
-        }
-        else H5Gclose(gid);
-      }
-
-      const SUPPORT * mySupport = MED_FIELD_DRIVER<T>::_ptrField->getSupport() ;
-
-      if (! mySupport->isOnAllElements())
-       throw MEDEXCEPTION( LOCALIZED (STRING(LOC) 
-                                      <<": Field must be on all entity"
-                                      )
-                           );
-      
-      MESH * myMesh = mySupport->getMesh() ;
-      string MeshName = myMesh->getName() ;
-      //MED_EN::medModeSwitch Mode = MED_FIELD_DRIVER<T>::_ptrField->_value->getMode() ;
-      // on boucle sur tout les types pour ecrire les tableaux de valeur
-      int NumberOfType = mySupport->getNumberOfTypes() ;
-      int Index = 1 ;
-      const MED_EN::medGeometryElement * Types = mySupport->getTypes() ;
-      const int * NumberOfGaussPoint = mySupport->getNumberOfGaussPoint() ;
-      for (int i=0;i<NumberOfType;i++) {
-       int NumberOfElements = mySupport->getNumberOfElements(Types[i]) ;
-       
-       const T * value = MED_FIELD_DRIVER<T>::_ptrField->getValueI(MED_EN::MED_FULL_INTERLACE,Index) ;
-       
-       MESSAGE("MED_FIELD_DRIVER<T>::_medIdt                         : "<<MED_FIELD_DRIVER<T>::_medIdt);
-       MESSAGE("MeshName.c_str()                : "<<MeshName.c_str());
-       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getName()            : "<<MED_FIELD_DRIVER<T>::_ptrField->getName());
-       MESSAGE("value                           : "<<value);
-       MESSAGE("NumberOfElements                : "<<NumberOfElements);
-       MESSAGE("NumberOfGaussPoint[i]           : "<<NumberOfGaussPoint[i]);
-       MESSAGE("mySupport->getEntity()          : "<<mySupport->getEntity());
-       MESSAGE("Types[i]                        : "<<Types[i]);
-       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber() : "<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
-       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getTime()            : "<<MED_FIELD_DRIVER<T>::_ptrField->getTime());
-       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()     : "<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
-       
-/*     char chanom[MED_TAILLE_NOM+1];
-       char chacomp[MED_TAILLE_NOM+1];
-       char chaunit[MED_TAILLE_NOM+1];
-       med_2_1::med_type_champ chatype;
-       med_int chancomp=1;
-       
-       err=med_2_1::MEDchampInfo(MED_FIELD_DRIVER<T>::_medIdt,1,chanom,&chatype,chacomp,chaunit,chancomp);
-
-       if (err<0) 
-               {
-               cout<<"=======================================================================> gros probleme"<<endl;
-               exit(-1);
-               }
-       cout<<"==================> nom lu            = "<<chanom<<endl;
-       cout<<"==================> type lu           = "<<chatype<<endl;
-       cout<<"==================> nom composante lu = "<<chacomp<<endl;
-       cout<<"==================> nom unit lu       = "<<chaunit<<endl;
-       cout<<"==================> valeur de med_2_1::MED_REEL64 = "<<med_2_1::MED_REEL64<<endl;
-*/     
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       if(_ptrField->getValueType()==MED_EN::MED_INT32)
-         {
-           int lgth2=_ptrField->getNumberOfValues();
-           med_2_1::med_int *temp=new med_2_1::med_int[lgth2];
-           for(int i2=0;i2<lgth2;i2++)
-             temp[i2]=(int)(value[i2]);
-           err=med_2_1::MEDchampEcr(MED_FIELD_DRIVER<T>::_medIdt, 
-                                   const_cast <char*> ( MeshName.c_str()) ,                         //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
-                                   const_cast <char*> ( (MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
-                                   (unsigned char*)temp, 
-                                   med_2_1::MED_FULL_INTERLACE,
-                                   NumberOfElements,
-                                   NumberOfGaussPoint[i],
-                                   MED_ALL,
-                                   MED_NOPFL,
-                                   med_2_1::MED_REMP,  // PROFIL NON GERE, mode de remplacement non géré
-                                   (med_2_1::med_entite_maillage)mySupport->getEntity(),
-                                   (med_2_1::med_geometrie_element)Types[i],
-                                   MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
-                                   "        ",
-                                   MED_FIELD_DRIVER<T>::_ptrField->getTime(),
-                                   MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
-                                   );
-           delete [] temp;
-         }
-       else
-#endif
-       err=med_2_1::MEDchampEcr(MED_FIELD_DRIVER<T>::_medIdt, 
-                               const_cast <char*> ( MeshName.c_str()) ,                         //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
-                               const_cast <char*> ( (MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
-                               (unsigned char*)value, 
-                               med_2_1::MED_FULL_INTERLACE,
-                               NumberOfElements,
-                               NumberOfGaussPoint[i],
-                               MED_ALL,
-                               MED_NOPFL,
-                               med_2_1::MED_REMP,  // PROFIL NON GERE, mode de remplacement non géré
-                               (med_2_1::med_entite_maillage)mySupport->getEntity(),
-                               (med_2_1::med_geometrie_element)Types[i],
-                               MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
-                               "        ",
-                               MED_FIELD_DRIVER<T>::_ptrField->getTime(),
-                               MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
-                               );
-       if (err < MED_VALID )
-         throw MEDEXCEPTION(LOCALIZED( STRING(LOC)
-                                       <<": Error in writing Field "<< MED_FIELD_DRIVER<T>::_ptrField->getName() <<", type "<<Types[i]
-                                       )
-                            );
-
-       Index += NumberOfElements ;
-       
-      }
-    }
-  
-  END_OF(LOC);
+template <class T>  MED_FIELD_WRONLY_DRIVER<T>::MED_FIELD_WRONLY_DRIVER() {
+    MESSAGE("You are using the default constructor of the Field write only Driver and it is 2.1 one");
+
+    _concreteFieldDrv=new MED_FIELD_WRONLY_DRIVER21<T>();
+}
+
+template <class T>  MED_FIELD_WRONLY_DRIVER<T>::MED_FIELD_WRONLY_DRIVER(const string & fileName, FIELD<T> * ptrField)
+  {
+    BEGIN_OF("MED_FIELD_WRONLY_DRIVER::MED_FIELD_WRONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
+
+    _concreteFieldDrv = DRIVERFACTORY::buildFieldDriverFromFile(fileName,ptrField,MED_EN::MED_ECRI);
+
+    END_OF("MED_FIELD_RDONLY_DRIVER::MED_FIELD_RDONLY_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
 }
 
 /*--------------------- RDWR PART -------------------------------*/
 
 }
 
 /*--------------------- RDWR PART -------------------------------*/
 
-template <class T> GENDRIVER * MED_FIELD_RDWR_DRIVER<T>::copy(void) const
-{
-  MED_FIELD_RDWR_DRIVER<T> * myDriver = 
-    new MED_FIELD_RDWR_DRIVER<T>(*this);
-  return myDriver ;
+template <class T>  MED_FIELD_RDWR_DRIVER<T>::MED_FIELD_RDWR_DRIVER() {
+    MESSAGE("You are using the default constructor of the Field read/write Driver and it is 2.1 one");
+
+    _concreteFieldDrv=new MED_FIELD_RDWR_DRIVER21<T>();
 }
 
 }
 
-template <class T> void MED_FIELD_RDWR_DRIVER<T>::write(void) const
-  throw (MEDEXCEPTION)
-{
-  BEGIN_OF("MED_FIELD_RDWR_DRIVER::write(void)");
-  MED_FIELD_WRONLY_DRIVER<T>::write(); 
-  END_OF("MED_FIELD_RDWR_DRIVER::write(void)");
-} 
+template <class T>  MED_FIELD_RDWR_DRIVER<T>::MED_FIELD_RDWR_DRIVER(const string & fileName, FIELD<T> * ptrField)
+  {
+    BEGIN_OF("MED_FIELD_RDWR_DRIVER::MED_FIELD_RDWR_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
 
 
-template <class T> void MED_FIELD_RDWR_DRIVER<T>::read (void)
-  throw (MEDEXCEPTION)
-{
-  BEGIN_OF("MED_FIELD_RDWR_DRIVER::read(void)");
-  MED_FIELD_RDONLY_DRIVER<T>::read();
-  END_OF("MED_FIELD_RDWR_DRIVER::read(void)");
+    _concreteFieldDrv = DRIVERFACTORY::buildFieldDriverFromFile(fileName,ptrField,MED_EN::MED_REMP);
+
+    END_OF("MED_FIELD_RDWR_DRIVER::MED_FIELD_RDWR_DRIVER(const string & fileName, const FIELD<T> * ptrField)");
 }
 }
+
+
 }//End namespace MEDMEM
 /*-----------------------------------------------------------------*/
 
 }//End namespace MEDMEM
 /*-----------------------------------------------------------------*/
 
diff --git a/src/MEDMEM/MEDMEM_MedFieldDriver21.hxx b/src/MEDMEM/MEDMEM_MedFieldDriver21.hxx
new file mode 100644 (file)
index 0000000..b8908b9
--- /dev/null
@@ -0,0 +1,824 @@
+#ifndef MED_FIELD_DRIVER21_HXX
+#define MED_FIELD_DRIVER21_HXX
+
+#include <string>
+
+#include "MEDMEM_define.hxx"
+
+#include "MEDMEM_GenDriver.hxx"
+#include "utilities.h"
+#include "MEDMEM_MedFieldDriver.hxx"
+#include "MEDMEM_STRING.hxx"
+#include "MEDMEM_Exception.hxx"
+#include "MEDMEM_Unit.hxx"
+#include "MEDMEM_Array.hxx"
+#include "MEDMEM_Support.hxx"
+#include "MEDMEM_Mesh.hxx"
+
+namespace MEDMEM {
+template <class T> class FIELD;
+
+// A QD LA CLASSE MED_ALL_ELEMENTS_DRIVER.... :) pour mutualiser le open ..... avec led _medIdt...
+
+/*!
+
+  Driver Med for FIELD.
+
+  Generic part : implement open and close methods.
+
+*/
+
+template <class T> class MED_FIELD_DRIVER21 : public virtual MED_FIELD_DRIVER<T>
+{
+protected:
+  med_2_1::med_idt        _medIdt;
+  void search_field() ;
+public :
+
+  // all MED cell type ?? Classe de Définition ??
+  //   static const medGeometryElement all_cell_type[MED_NBR_GEOMETRIE_MAILLE];
+  
+  //   static const char * const all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE];
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_DRIVER21():MED_FIELD_DRIVER<T>(),_medIdt(MED_INVALID)
+  {}
+  /*!
+    Constructor.
+  */
+  MED_FIELD_DRIVER21(const string & fileName, FIELD<T> * ptrField, 
+                    MED_EN::med_mode_acces accessMode)
+    : MED_FIELD_DRIVER<T>(fileName,ptrField,accessMode),_medIdt(MED_INVALID)
+  {
+  }
+
+  /*!
+    Copy constructor.
+  */
+  MED_FIELD_DRIVER21(const MED_FIELD_DRIVER21 & fieldDriver):
+    MED_FIELD_DRIVER<T>(fieldDriver), _medIdt(fieldDriver._medIdt)
+  {
+  }
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_FIELD_DRIVER21() { 
+  }
+
+  void open() throw (MEDEXCEPTION)
+  {
+    const char * LOC = "MED_FIELD_DRIVER21::open() ";
+    BEGIN_OF(LOC);
+
+    // we must set fieldname before open, because we must find field number in file (if it exist !!!)
+    if ( MED_FIELD_DRIVER<T>::_fileName == "" )
+      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+                                      << "_fileName is |\"\"|, please set a correct fileName before calling open()"
+                                      )
+                           );
+
+    MESSAGE(LOC<<"_fileName.c_str : "<< MED_FIELD_DRIVER<T>::_fileName.c_str()<<",mode : "<< MED_FIELD_DRIVER<T>::_accessMode);
+    _medIdt = med_2_1::MEDouvrir( (const_cast <char *> (MED_FIELD_DRIVER<T>::_fileName.c_str())),(med_2_1::med_mode_acces) MED_FIELD_DRIVER<T>::_accessMode);
+    MESSAGE(LOC<<"_medIdt : "<< _medIdt );
+    if (_medIdt > 0) 
+      MED_FIELD_DRIVER<T>::_status=MED_OPENED;
+    else {
+      MED_FIELD_DRIVER<T>::_status = MED_INVALID;
+      MED_FIELD_DRIVER21<T>::_medIdt = MED_INVALID;
+      throw MED_EXCEPTION (LOCALIZED( STRING(LOC) 
+                                     << "Can't open |"  << MED_FIELD_DRIVER<T>::_fileName 
+                                     << "|, _medIdt : " << MED_FIELD_DRIVER21<T>::_medIdt
+                                     )
+                          );
+    }
+
+    END_OF(LOC);
+  }
+  
+  void close() {
+    BEGIN_OF("MED_FIELD_DRIVER21::close()");
+    med_2_1::med_int err = 0;
+    if (MED_FIELD_DRIVER<T>::_status == MED_OPENED) {
+      err=med_2_1::MEDfermer(MED_FIELD_DRIVER21<T>::_medIdt);
+      //H5close(); // If we call H5close() all the files are closed.
+      MED_FIELD_DRIVER<T>::_status = MED_CLOSED;
+      MED_FIELD_DRIVER21<T>::_medIdt = MED_INVALID;
+      MESSAGE(" MED_FIELD_DRIVER21::close() : MEDfermer : MED_FIELD_DRIVER<T>::_medIdt= " << _medIdt );
+      MESSAGE(" MED_FIELD_DRIVER21::close() : MEDfermer : err    = " << err );
+    }
+    END_OF("MED_FIELD_DRIVER21::close()");
+  }
+
+
+};
+
+/*!
+
+  Driver Med for FIELD : Read only.
+
+  Implement read method.
+
+*/
+
+  template <class T> class MED_FIELD_RDONLY_DRIVER21 : public virtual MED_FIELD_DRIVER21<T>, public virtual IMED_FIELD_RDONLY_DRIVER<T>
+{
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDONLY_DRIVER21():MED_FIELD_DRIVER<T>() {};
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDONLY_DRIVER21(const string & fileName,  FIELD<T> * ptrField):
+    IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField),
+    MED_FIELD_DRIVER21<T>(fileName,ptrField,MED_EN::MED_RDONLY),
+    MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDONLY)
+  { 
+    BEGIN_OF("MED_FIELD_RDONLY_DRIVER21::MED_FIELD_RDONLY_DRIVER21(const string & fileName, const FIELD<T> * ptrField)");
+    END_OF("MED_FIELD_RDONLY_DRIVER21::MED_FIELD_RDONLY_DRIVER21(const string & fileName, const FIELD<T> * ptrField)");
+  }
+  
+  /*!
+    Copy constructor.
+  */
+  MED_FIELD_RDONLY_DRIVER21(const MED_FIELD_RDONLY_DRIVER21 & fieldDriver):
+    IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),
+    MED_FIELD_DRIVER21<T>(fieldDriver),
+    MED_FIELD_DRIVER<T>(fieldDriver)
+  {};
+  
+  /*!
+    Destructor.
+  */
+  virtual ~MED_FIELD_RDONLY_DRIVER21() {};
+
+  // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
+
+  /*!
+    Return a MEDEXCEPTION : it is the read-only driver.
+  */
+  void write( void ) const throw (MEDEXCEPTION) ;
+  /*!
+    Read FIELD in the specified file.
+  */
+  void read ( void ) throw (MEDEXCEPTION) ;
+
+private:
+  GENDRIVER * copy( void ) const ;
+
+};
+
+/*!
+
+  Driver Med for FIELD : Write only.
+
+  Implement write method.
+
+*/
+
+template <class T> class MED_FIELD_WRONLY_DRIVER21 : public virtual MED_FIELD_DRIVER21<T>, public virtual IMED_FIELD_WRONLY_DRIVER<T> {
+  
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_WRONLY_DRIVER21():MED_FIELD_DRIVER<T>() {}
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_WRONLY_DRIVER21(const string & fileName, FIELD<T> * ptrField):
+    IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),
+    MED_FIELD_DRIVER21<T>(fileName,ptrField,MED_EN::MED_WRONLY),
+    MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_WRONLY)
+  {
+    BEGIN_OF("MED_FIELD_WRONLY_DRIVER21::MED_FIELD_WRONLY_DRIVER21(const string & fileName, const FIELD<T> * ptrField)");
+    END_OF("MED_FIELD_WRONLY_DRIVER21::MED_FIELD_WRONLY_DRIVER21(const string & fileName, const FIELD<T> * ptrField)");
+  }
+
+  /*!
+    Copy constructor.
+  */
+  MED_FIELD_WRONLY_DRIVER21(const MED_FIELD_WRONLY_DRIVER21 & fieldDriver):
+    IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),
+    MED_FIELD_DRIVER21<T>(fieldDriver),
+    MED_FIELD_DRIVER<T>(fieldDriver)
+  {}
+  
+  /*!
+    Destructor.
+  */
+  virtual ~MED_FIELD_WRONLY_DRIVER21() {};
+
+  /*!
+    Write FIELD in the specified file.
+  */
+  void write( void ) const throw (MEDEXCEPTION) ;
+  /*!
+    Return a MEDEXCEPTION : it is the write-only driver.
+  */
+  void read ( void ) throw (MEDEXCEPTION) ;
+
+private:
+  GENDRIVER * copy( void ) const ;
+
+};
+
+
+/*!
+
+  Driver Med for FIELD : Read write.
+  - Use read method from MED_FIELD_RDONLY_DRIVER
+  - Use write method from MED_FIELD_WDONLY_DRIVER
+
+*/
+
+template <class T> class MED_FIELD_RDWR_DRIVER21 : public MED_FIELD_RDONLY_DRIVER21<T>, public MED_FIELD_WRONLY_DRIVER21<T>, public IMED_FIELD_RDWR_DRIVER<T> {
+  
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDWR_DRIVER21():MED_FIELD_DRIVER21<T>() {}
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDWR_DRIVER21(const string & fileName, FIELD<T> * ptrField):
+    MED_FIELD_WRONLY_DRIVER21<T>(fileName,ptrField),
+    MED_FIELD_RDONLY_DRIVER21<T>(fileName,ptrField),
+    IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField),
+    IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),
+    MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDWR),
+    IMED_FIELD_RDWR_DRIVER<T>(fileName,ptrField)
+  {
+    BEGIN_OF("MED_FIELD_RDWR_DRIVER21::MED_FIELD_RDWR_DRIVER21(const string & fileName, const FIELD<T> * ptrField)");
+    //_accessMode = MED_RDWR ;
+    END_OF("MED_FIELD_RDWR_DRIVER21::MED_FIELD_RDWR_DRIVER21(const string & fileName, const FIELD<T> * ptrField)");
+  };
+
+  /*!
+    Copy constructor.
+  */
+  MED_FIELD_RDWR_DRIVER21(const MED_FIELD_RDWR_DRIVER21 & fieldDriver):
+    MED_FIELD_WRONLY_DRIVER21<T>(fieldDriver),
+    MED_FIELD_RDONLY_DRIVER21<T>(fieldDriver),
+    IMED_FIELD_RDWR_DRIVER<T>(fieldDriver),
+    IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),
+    IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),
+    MED_FIELD_DRIVER<T>(fieldDriver)
+  {};
+  
+  /*!
+    Destructor.
+  */
+  ~MED_FIELD_RDWR_DRIVER21() {};
+
+  /*!
+    Write FIELD in the specified file.
+  */
+  void write(void) const throw (MEDEXCEPTION) ;
+  /*!
+    Read FIELD in the specified file.
+  */
+  void read (void) throw (MEDEXCEPTION) ;
+
+private:
+  GENDRIVER * copy( void ) const ;
+
+};
+
+/*--------------------- DRIVER PART -------------------------------*/
+
+//  template <class T> void MED_FIELD_DRIVER<T>::search_field() {
+//    const char * LOC = "template <class T> class MED_FIELD_DRIVER::search_field() :";
+    
+//    // we search the field number !!!!
+//    if (_status==MED_OPENED)
+//      if (_fieldNum==MED_INVALID) {
+//        int err ;
+//        int    numberOfFields              = 0;      //MED_INVALID
+//        //   char   fieldName[MED_TAILLE_NOM+1] = "";
+//        char   fieldName[MED_TAILLE_NOM+1] ;
+//        int    numberOfComponents          = 0;
+//        char * componentName               = (char *) MED_NULL;
+//        char * unitName                    = (char *) MED_NULL;
+//        med_2_1::med_type_champ type ;
+//        numberOfFields = med_2_1::MEDnChamp(_medIdt,0) ;
+//        if ( numberOfFields <= 0 ) 
+//     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
+//        for (int i=1;i<=numberOfFields;i++) {
+         
+//     numberOfComponents = med_2_1::MEDnChamp(_medIdt,i) ;
+//     if ( numberOfComponents <= 0 ) 
+//       throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+//                                        <<  "Be careful there is no compound for field n°" 
+//                                        << i << "in file |"<<_fileName<<"| !"));
+         
+//     componentName = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;
+//     unitName      = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;   
+         
+//     err = med_2_1::MEDchampInfo(_medIdt, i, fieldName, &type, componentName, 
+//                                unitName, numberOfComponents) ;
+         
+//     delete[] componentName ;
+//     delete[] unitName ;
+//     MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<_fieldName.c_str()<<"#");
+//     if ( !strcmp(fieldName,_fieldName.c_str()) ) {
+//       MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
+//       _fieldNum = i ;
+//       break ;
+//     }
+//        }
+//      }Srdwr
+//  }
+  
+/*--------------------- RDONLY PART -------------------------------*/
+
+template <class T> GENDRIVER * MED_FIELD_RDONLY_DRIVER21<T>::copy(void) const
+{
+  return new MED_FIELD_RDONLY_DRIVER21<T>(*this);
+}
+
+template <class T> void MED_FIELD_RDONLY_DRIVER21<T>::read(void)
+  throw (MEDEXCEPTION)
+{
+  const char * LOC = " MED_FIELD_RDONLY_DRIVER21::read() " ;
+  BEGIN_OF(LOC);
+
+  if (MED_FIELD_DRIVER<T>::_ptrField->_name=="")
+    MED_FIELD_DRIVER<T>::_ptrField->_name = MED_FIELD_DRIVER<T>::_fieldName ; 
+  else
+    MED_FIELD_DRIVER<T>::_fieldName = MED_FIELD_DRIVER<T>::_ptrField->_name; // bug indetermine ! apres avoir fait readfilestruct, lorsque je recupere le champ, tout est bon sauf le nom du champ dans le driver !!!!!
+
+  MESSAGE("###### "<<LOC<<" fieldNameDRIVER : "<<MED_FIELD_DRIVER<T>::_fieldName<<" fieldName : "<<MED_FIELD_DRIVER<T>::_ptrField->_name);
+
+  string MeshName =  MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getMesh()->getName() ;
+
+  if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
+    {
+
+      //        search_field() ;
+
+      char *  fieldName ;
+      fieldName = new char[MED_TAILLE_NOM+1] ;
+      int err ;
+      int    numberOfComponents          = 0;
+      char * componentName               = (char *) MED_NULL;
+      char * unitName                    = (char *) MED_NULL;
+      med_2_1::med_type_champ type ;
+
+      // we search the field number !!!!
+      if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID) {
+       int    numberOfFields              = 0;      //MED_INVALID
+       numberOfFields = med_2_1::MEDnChamp(MED_FIELD_DRIVER21<T>::_medIdt,0) ;
+       if ( numberOfFields <= 0 ) 
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
+       for (int i=1;i<=numberOfFields;i++) {
+           
+         numberOfComponents = med_2_1::MEDnChamp(MED_FIELD_DRIVER21<T>::_medIdt,i) ;
+         if ( numberOfComponents <= 0 ) 
+           //                throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+           //                                                 <<  "Be careful there is no compound for field n°" 
+           //                                                 << i << "in file |"<<_fileName<<"| !"));
+           MESSAGE(LOC<<"Be careful there is no compound for field n°"<<i<<"in file |"<<MED_FIELD_DRIVER<T>::_fileName<<"| !");
+
+         componentName = new char[numberOfComponents*MED_TAILLE_PNOM21+1] ;
+         unitName      = new char[numberOfComponents*MED_TAILLE_PNOM21+1] ;   
+           
+         err = med_2_1::MEDchampInfo(MED_FIELD_DRIVER21<T>::_medIdt, i, fieldName, &type, componentName, 
+                                    unitName, numberOfComponents) ;
+           
+         MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<MED_FIELD_DRIVER<T>::_fieldName.c_str()<<"#");
+         if ( !strcmp(fieldName,MED_FIELD_DRIVER<T>::_fieldName.c_str()) ) {
+           MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
+           MED_FIELD_DRIVER<T>::_fieldNum = i ;
+           break ;
+         }
+         // not found : release memory and search next field !
+         delete[] componentName ;
+         delete[] unitName ;
+       }
+      }
+      
+      delete[] fieldName ;
+
+      if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID)
+       throw MEDEXCEPTION(LOCALIZED( STRING(LOC) << ": Field "<<MED_FIELD_DRIVER<T>::_fieldName << " not found in file " << MED_FIELD_DRIVER<T>::_fileName ) );
+      MESSAGE ("FieldNum : "<<MED_FIELD_DRIVER<T>::_fieldNum);
+
+      //        int err ;
+      //        int NumberOfComponents = med_2_1::MEDnChamp(MED_FIELD_DRIVER21<T>::_medIdt,MED_FIELD_DRIVER<T>::_fieldNum) ;
+      if (numberOfComponents < 1) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no component")) ; // use iostring !
+      // test type to check if it is rigth !!!???
+      MED_FIELD_DRIVER<T>::_ptrField->_numberOfComponents = numberOfComponents ;
+      MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = new int[numberOfComponents] ;
+      MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = new string[numberOfComponents] ;
+      MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = new UNIT[numberOfComponents] ;
+      MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = new string[numberOfComponents] ;
+      MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = new string[numberOfComponents] ;
+      for (int i=0; i<numberOfComponents; i++) {
+       MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes[i] = 1 ;
+
+       // PG : what about space !!!
+       MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i] = string(componentName,i*MED_TAILLE_PNOM21,MED_TAILLE_PNOM21) ;
+       SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i]);
+       MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i] = string(unitName,i*MED_TAILLE_PNOM21,MED_TAILLE_PNOM21) ;
+       SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i]);
+      }
+      delete[] componentName;
+      delete[] unitName;
+
+      // read values for each geometric type in _support
+      int NumberOfTypes = MED_FIELD_DRIVER<T>::_ptrField->_support->getNumberOfTypes() ;
+      const MED_EN::medGeometryElement *Types = MED_FIELD_DRIVER<T>::_ptrField->_support->getTypes() ;
+      T ** myValues = new T*[NumberOfTypes] ;
+      int * NumberOfValues = new int[NumberOfTypes] ;
+      int TotalNumberOfValues = 0 ;
+      MESSAGE ("NumberOfTypes :"<< NumberOfTypes);
+      MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues=0 ;
+      for (int i=0; i<NumberOfTypes; i++) {
+       MESSAGE ("Type["<<i+1<<"] :"<< Types[i]);
+       MESSAGE ("Entity :"<<MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity());
+       NumberOfValues[i] = 
+         MEDnVal(MED_FIELD_DRIVER21<T>::_medIdt,
+                 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
+                 (med_2_1::med_entite_maillage)MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),
+                 (med_2_1::med_geometrie_element)Types[i],
+                 MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber,
+                 MED_FIELD_DRIVER<T>::_ptrField->_orderNumber) ; // no time step ! prend en compte le nbre de pt de gauss
+       // test if NumberOfValues is the same in _support !!! TODO that !!
+       // we suppose it is
+       // we could allocate array
+       myValues[i] = new T[ NumberOfValues[i]*numberOfComponents ] ;
+       TotalNumberOfValues+=NumberOfValues[i] ;// diviser par le nombre de point de gauss 
+       char * ProfilName = new char[MED_TAILLE_NOM+1];
+       MESSAGE ("NumberOfValues :"<< NumberOfValues[i]);
+       MESSAGE ("NumberOfComponents :"<< numberOfComponents);
+       MESSAGE ("MESH_NAME :"<< MeshName.c_str());
+       MESSAGE ("FIELD_NAME :"<< MED_FIELD_DRIVER<T>::_fieldName.c_str());
+       MESSAGE ("MED_ENTITE :"<< (med_2_1::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity());
+       MESSAGE("MED_GEOM :"<<(med_2_1::med_geometrie_element)Types[i]);
+       MESSAGE("Iteration :"<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
+       MESSAGE("Order :"<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
+        MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOfValues[i]; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
+       med_2_1::med_err ret;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgth2=NumberOfValues[i]*numberOfComponents;
+       if(_ptrField->getValueType()==MED_EN::MED_INT32)
+         {
+           med_2_1::med_int *temp=new med_2_1::med_int[lgth2];
+           ret=med_2_1::MEDchampLire(MED_FIELD_DRIVER21<T>::_medIdt,const_cast <char*> (MeshName.c_str()),
+                                 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
+                                 (unsigned char*) temp,
+                                 med_2_1::MED_NO_INTERLACE,
+                                 MED_ALL,
+                                 ProfilName,
+                                 (med_2_1::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),(med_2_1::med_geometrie_element)Types[i],
+                                 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
+                                 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
+                                );
+           for(int i2=0;i2<lgth2;i2++)
+             myValues[i][i2]=(int)(temp[i2]);
+           delete [] temp;
+         }
+       else
+#endif
+       ret=med_2_1::MEDchampLire(MED_FIELD_DRIVER21<T>::_medIdt,const_cast <char*> (MeshName.c_str()),
+                                 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
+                                 (unsigned char*) myValues[i],
+                                 med_2_1::MED_NO_INTERLACE,
+                                 MED_ALL,
+                                 ProfilName,
+                                 (med_2_1::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),(med_2_1::med_geometrie_element)Types[i],
+                                 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
+                                 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
+                                ); 
+         if (ret < 0) {
+         // we must do some delete !!!
+         for(int j=0; j<=i;j++)
+           delete[] myValues[j];
+         delete[] myValues;
+         delete[] NumberOfValues ;
+         delete[] ProfilName;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes ;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsNames ;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits ;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions ;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits ;
+         MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = NULL ;
+         MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = NULL ;
+         MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = NULL ;
+         MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = NULL ;
+         MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = NULL ;
+         MED_FIELD_DRIVER<T>::_fieldNum = MED_INVALID ; // we have not found right field, so reset the field number 
+         throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": ERROR when read value")) ;
+       }
+
+       delete[] ProfilName ;
+      }
+      // allocate _value
+      // probleme avec les points de gauss : voir lorsqu-il y en a (!= 1)
+      //      MEDARRAY<T> * Values = new MEDARRAY<T>(MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents(),TotalNumberOfValues/MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents(),MED_EN::MED_NO_INTERLACE);
+
+      if (MED_FIELD_DRIVER<T>::_ptrField->_value==NULL)
+       MED_FIELD_DRIVER<T>::_ptrField->_value=new MEDARRAY<T>(numberOfComponents,TotalNumberOfValues,MED_EN::MED_NO_INTERLACE);
+
+      MEDARRAY<T> * Values = MED_FIELD_DRIVER<T>::_ptrField->_value ; // create by constructor ???
+      // check if dimensions are right : inutile : c'est dans le constructeur !!!
+      //if (Values->getLeadingValue() != numberOfComponents)
+      //  throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": leading dimension are false : "<<Values->getLeadingValue()<<" and "<<numberOfComponents) ) ;
+      //if (Values->getLengthValue() != TotalNumberOfValues)
+      //  throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": length dimension are false : "<<Values->getLengthValue()<<" and "<<TotalNumberOfValues) ) ;
+
+      for (int i=0; i<numberOfComponents; i++) {
+       //T * ValuesT = Values->getRow(i+1) ;
+       int Count = 1 ;
+       for (int j=0; j<NumberOfTypes; j++) {
+         T * myValue = myValues[j] ;
+         int NumberOf = NumberOfValues[j] ;
+//       MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOf; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
+         int offset = NumberOf*i ;
+         for (int k=0 ; k<NumberOf; k++) {
+           //ValuesT[Count]=myValue[k+offset] ;
+           Values->setIJ(Count,i+1,myValue[k+offset]);
+           SCRUTE(Count);
+           SCRUTE(Values->getIJ(Count,i+1));
+           Count++;
+         }
+       }
+      }
+      
+      for (int j=0; j<NumberOfTypes; j++)
+       delete[] myValues[j] ;
+      delete[] myValues ;
+      delete[] NumberOfValues ;
+
+      MED_FIELD_DRIVER<T>::_ptrField->_isRead = true ;
+    }
+
+  END_OF(LOC);
+}
+
+template <class T> void MED_FIELD_RDONLY_DRIVER21<T>::write( void ) const
+  throw (MEDEXCEPTION)
+{
+  throw MEDEXCEPTION("MED_FIELD_RDONLY_DRIVER21::write : Can't write with a RDONLY driver !");
+}
+
+/*--------------------- WRONLY PART -------------------------------*/
+
+template <class T> GENDRIVER * MED_FIELD_WRONLY_DRIVER21<T>::copy(void) const
+{
+  return new MED_FIELD_WRONLY_DRIVER21<T>(*this);
+}
+
+template <class T> void MED_FIELD_WRONLY_DRIVER21<T>::read (void)
+  throw (MEDEXCEPTION)
+{
+  throw MEDEXCEPTION("MED_FIELD_WRONLY_DRIVER21::read : Can't read with a WRONLY driver !");
+}
+
+template <class T> void MED_FIELD_WRONLY_DRIVER21<T>::write(void) const
+  throw (MEDEXCEPTION)
+{
+  const char * LOC = "MED_FIELD_WRONLY_DRIVER21::write(void) const " ;
+  BEGIN_OF(LOC);
+  if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
+    {
+      int err ;
+
+      int component_count=MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents();
+      string   component_name(component_count*MED_TAILLE_PNOM21,' ') ;
+      string   component_unit(component_count*MED_TAILLE_PNOM21,' ') ;
+
+      const string * listcomponent_name=MED_FIELD_DRIVER<T>::_ptrField->getComponentsNames() ;
+      const string * listcomponent_unit=MED_FIELD_DRIVER<T>::_ptrField->getMEDComponentsUnits() ;
+      int length ;
+      for (int i=0; i < component_count ; i++) {
+       length = min(MED_TAILLE_PNOM21,(int)listcomponent_name[i].size());
+       component_name.replace(i*MED_TAILLE_PNOM21,length,
+                              listcomponent_name[i],0,length);
+       length = min(MED_TAILLE_PNOM21,(int)listcomponent_unit[i].size());
+       component_unit.replace(i*MED_TAILLE_PNOM21,length,
+                              listcomponent_unit[i],0,length);
+      }
+
+      MESSAGE("component_name=|"<<component_name<<"|");
+      MESSAGE("component_unit=|"<<component_unit<<"|");
+
+      MED_EN::med_type_champ ValueType=MED_FIELD_DRIVER<T>::_ptrField->getValueType() ;
+      
+      MESSAGE("Template Type =|"<<ValueType<<"|");
+      
+      // le champ existe deja ???
+      char * champName = new char[MED_TAILLE_NOM+1] ;
+      med_2_1::med_type_champ type ;
+      char * compName ;
+      char * compUnit ;
+      bool Find = false ;
+      int n = med_2_1::MEDnChamp(MED_FIELD_DRIVER21<T>::_medIdt,0);
+      int nbComp ;
+      for (int i=1; i<=n; i++) {
+       nbComp = med_2_1::MEDnChamp(MED_FIELD_DRIVER21<T>::_medIdt,i);
+       compName = new char[MED_TAILLE_PNOM21*nbComp+1];
+       compUnit = new char[MED_TAILLE_PNOM21*nbComp+1];
+       err = med_2_1::MEDchampInfo(MED_FIELD_DRIVER21<T>::_medIdt,i,champName,&type,compName,compUnit,nbComp);
+       if (err == 0)
+         if (strcmp(champName,MED_FIELD_DRIVER<T>::_ptrField->getName().c_str())==0) { // Found !
+           Find = true ;
+           break ;
+         }
+       delete[] compName ;
+       delete[] compUnit ;
+      }
+      delete[] champName ;
+      if (Find) {
+       // the same ?
+       if (nbComp != component_count)
+         throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
+                                        <<": Field exist in file, but number of component are different : "<<nbComp<<" in file and "<<component_count<<" in memory."
+                                        )
+                             );
+       // component name and unit
+       MESSAGE(LOC<<" Component name in file : "<<compName);
+       MESSAGE(LOC<<" Component name in memory : "<<component_name);
+       MESSAGE(LOC<<" Component unit in file : "<<compUnit);
+       MESSAGE(LOC<<" Component unit in memory : "<<component_unit);
+       delete[] compName ;
+       delete[] compUnit ;
+
+      } else {
+        // Verify the field doesn't exist
+
+        string dataGroupName =  "/CHA/";
+        dataGroupName        += MED_FIELD_DRIVER<T>::_ptrField->getName();
+        MESSAGE(LOC << "|" << dataGroupName << "|" );
+        med_2_1::med_idt gid =  H5Gopen(MED_FIELD_DRIVER21<T>::_medIdt, dataGroupName.c_str() );
+        
+        if ( gid < 0 ) {
+          // create field :
+          err=med_2_1::MEDchampCr(MED_FIELD_DRIVER21<T>::_medIdt, 
+                                 const_cast <char*> ((MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
+                                 (med_2_1::med_type_champ) ValueType,
+                                 const_cast <char*> ( component_name.c_str() ),
+                                 const_cast <char*> ( component_unit.c_str() ),
+                                 component_count);
+          if ( err < 0 )
+            throw MEDEXCEPTION( LOCALIZED (STRING(LOC) 
+                                           << ": Error MEDchampCr : "<<err
+                                           )
+                                );
+        }
+        else H5Gclose(gid);
+      }
+
+      const SUPPORT * mySupport = MED_FIELD_DRIVER<T>::_ptrField->getSupport() ;
+
+      if (! mySupport->isOnAllElements())
+       throw MEDEXCEPTION( LOCALIZED (STRING(LOC) 
+                                      <<": Field must be on all entity"
+                                      )
+                           );
+      
+      MESH * myMesh = mySupport->getMesh() ;
+      string MeshName = myMesh->getName() ;
+      //MED_EN::medModeSwitch Mode = MED_FIELD_DRIVER<T>::_ptrField->_value->getMode() ;
+      // on boucle sur tout les types pour ecrire les tableaux de valeur
+      int NumberOfType = mySupport->getNumberOfTypes() ;
+      int Index = 1 ;
+      const MED_EN::medGeometryElement * Types = mySupport->getTypes() ;
+      const int * NumberOfGaussPoint = mySupport->getNumberOfGaussPoint() ;
+      for (int i=0;i<NumberOfType;i++) {
+       int NumberOfElements = mySupport->getNumberOfElements(Types[i]) ;
+       
+       const T * value = MED_FIELD_DRIVER<T>::_ptrField->getValueI(MED_EN::MED_FULL_INTERLACE,Index) ;
+       
+       MESSAGE("MED_FIELD_DRIVER21<T>::_medIdt                         : "<<MED_FIELD_DRIVER21<T>::_medIdt);
+       MESSAGE("MeshName.c_str()                : "<<MeshName.c_str());
+       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getName()            : "<<MED_FIELD_DRIVER<T>::_ptrField->getName());
+       MESSAGE("value                           : "<<value);
+       MESSAGE("NumberOfElements                : "<<NumberOfElements);
+       MESSAGE("NumberOfGaussPoint[i]           : "<<NumberOfGaussPoint[i]);
+       MESSAGE("mySupport->getEntity()          : "<<mySupport->getEntity());
+       MESSAGE("Types[i]                        : "<<Types[i]);
+       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber() : "<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
+       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getTime()            : "<<MED_FIELD_DRIVER<T>::_ptrField->getTime());
+       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()     : "<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
+       
+/*     char chanom[MED_TAILLE_NOM+1];
+       char chacomp[MED_TAILLE_NOM+1];
+       char chaunit[MED_TAILLE_NOM+1];
+       med_2_1::med_type_champ chatype;
+       med_int chancomp=1;
+       
+       err=med_2_1::MEDchampInfo(MED_FIELD_DRIVER<T>::_medIdt,1,chanom,&chatype,chacomp,chaunit,chancomp);
+
+       if (err<0) 
+               {
+               cout<<"=======================================================================> gros probleme"<<endl;
+               exit(-1);
+               }
+       cout<<"==================> nom lu            = "<<chanom<<endl;
+       cout<<"==================> type lu           = "<<chatype<<endl;
+       cout<<"==================> nom composante lu = "<<chacomp<<endl;
+       cout<<"==================> nom unit lu       = "<<chaunit<<endl;
+       cout<<"==================> valeur de med_2_1::MED_REEL64 = "<<med_2_1::MED_REEL64<<endl;
+*/     
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       if(_ptrField->getValueType()==MED_EN::MED_INT32)
+         {
+           int lgth2=_ptrField->getNumberOfValues();
+           med_2_1::med_int *temp=new med_2_1::med_int[lgth2];
+           for(int i2=0;i2<lgth2;i2++)
+             temp[i2]=(int)(value[i2]);
+           err=med_2_1::MEDchampEcr(MED_FIELD_DRIVER21<T>::_medIdt, 
+                                   const_cast <char*> ( MeshName.c_str()) ,                         //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
+                                   const_cast <char*> ( (MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
+                                   (unsigned char*)temp, 
+                                   med_2_1::MED_FULL_INTERLACE,
+                                   NumberOfElements,
+                                   NumberOfGaussPoint[i],
+                                   MED_ALL,
+                                   MED_NOPFL,
+                                   med_2_1::MED_REMP,  // PROFIL NON GERE, mode de remplacement non géré
+                                   (med_2_1::med_entite_maillage)mySupport->getEntity(),
+                                   (med_2_1::med_geometrie_element)Types[i],
+                                   MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
+                                   "        ",
+                                   MED_FIELD_DRIVER<T>::_ptrField->getTime(),
+                                   MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
+                                   );
+           delete [] temp;
+         }
+       else
+#endif
+       err=med_2_1::MEDchampEcr(MED_FIELD_DRIVER21<T>::_medIdt, 
+                               const_cast <char*> ( MeshName.c_str()) ,                         //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
+                               const_cast <char*> ( (MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
+                               (unsigned char*)value, 
+                               med_2_1::MED_FULL_INTERLACE,
+                               NumberOfElements,
+                               NumberOfGaussPoint[i],
+                               MED_ALL,
+                               MED_NOPFL,
+                               med_2_1::MED_REMP,  // PROFIL NON GERE, mode de remplacement non géré
+                               (med_2_1::med_entite_maillage)mySupport->getEntity(),
+                               (med_2_1::med_geometrie_element)Types[i],
+                               MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
+                               "        ",
+                               MED_FIELD_DRIVER<T>::_ptrField->getTime(),
+                               MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
+                               );
+       if (err < MED_VALID )
+         throw MEDEXCEPTION(LOCALIZED( STRING(LOC)
+                                       <<": Error in writing Field "<< MED_FIELD_DRIVER<T>::_ptrField->getName() <<", type "<<Types[i]
+                                       )
+                            );
+
+       Index += NumberOfElements ;
+       
+      }
+    }
+  
+  END_OF(LOC);
+}
+
+/*--------------------- RDWR PART -------------------------------*/
+
+template <class T> GENDRIVER * MED_FIELD_RDWR_DRIVER21<T>::copy(void) const
+{
+  return new MED_FIELD_RDWR_DRIVER21<T>(*this);
+}
+
+template <class T> void MED_FIELD_RDWR_DRIVER21<T>::write(void) const
+  throw (MEDEXCEPTION)
+{
+  BEGIN_OF("MED_FIELD_RDWR_DRIVER21::write(void)");
+  MED_FIELD_WRONLY_DRIVER21<T>::write(); 
+  END_OF("MED_FIELD_RDWR_DRIVER21::write(void)");
+} 
+
+template <class T> void MED_FIELD_RDWR_DRIVER21<T>::read (void)
+  throw (MEDEXCEPTION)
+{
+  BEGIN_OF("MED_FIELD_RDWR_DRIVER21::read(void)");
+  MED_FIELD_RDONLY_DRIVER21<T>::read();
+  END_OF("MED_FIELD_RDWR_DRIVER21::read(void)");
+}
+}//End namespace MEDMEM
+/*-----------------------------------------------------------------*/
+
+#endif /* MED_FIELD_DRIVER_HXX */
+
diff --git a/src/MEDMEM/MEDMEM_MedFieldDriver22.hxx b/src/MEDMEM/MEDMEM_MedFieldDriver22.hxx
new file mode 100644 (file)
index 0000000..9ff95dc
--- /dev/null
@@ -0,0 +1,818 @@
+#ifndef MED_FIELD_DRIVER22_HXX
+#define MED_FIELD_DRIVER22_HXX
+
+#include <string>
+
+#include "MEDMEM_define.hxx"
+
+#include "MEDMEM_GenDriver.hxx"
+#include "utilities.h"
+#include "MEDMEM_MedFieldDriver.hxx"
+#include "MEDMEM_STRING.hxx"
+#include "MEDMEM_Exception.hxx"
+#include "MEDMEM_Unit.hxx"
+#include "MEDMEM_Array.hxx"
+#include "MEDMEM_Support.hxx"
+#include "MEDMEM_Mesh.hxx"
+
+namespace MEDMEM {
+template <class T> class FIELD;
+
+// A QD LA CLASSE MED_ALL_ELEMENTS_DRIVER.... :) pour mutualiser le open ..... avec led _medIdt...
+
+/*!
+
+  Driver Med for FIELD.
+
+  Generic part : implement open and close methods.
+
+*/
+
+template <class T> class MED_FIELD_DRIVER22 : public virtual MED_FIELD_DRIVER<T>
+{
+protected:
+  
+  med_2_2::med_idt        _medIdt;
+  void search_field() ;
+  
+public :
+
+  // all MED cell type ?? Classe de Définition ??
+  //   static const medGeometryElement all_cell_type[MED_NBR_GEOMETRIE_MAILLE];
+  
+  //   static const char * const all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE];
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_DRIVER22():MED_FIELD_DRIVER<T>(),_medIdt(MED_INVALID)
+  {}
+  /*!
+    Constructor.
+  */
+  MED_FIELD_DRIVER22(const string & fileName, FIELD<T> * ptrField, 
+                    MED_EN::med_mode_acces accessMode)
+    : MED_FIELD_DRIVER<T>(fileName,ptrField,accessMode),_medIdt(MED_INVALID)
+  {
+  }
+
+  /*!
+    Copy constructor.
+  */
+  MED_FIELD_DRIVER22(const MED_FIELD_DRIVER22 & fieldDriver):
+    MED_FIELD_DRIVER<T>(fieldDriver),
+    _medIdt(fieldDriver._medIdt)
+  {
+  }
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_FIELD_DRIVER22() { 
+  }
+
+  void open() throw (MEDEXCEPTION)
+  {
+    const char * LOC = "MED_FIELD_DRIVER22::open() ";
+    BEGIN_OF(LOC);
+
+    // we must set fieldname before open, because we must find field number in file (if it exist !!!)
+    if ( MED_FIELD_DRIVER<T>::_fileName == "" )
+      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+                                      << "_fileName is |\"\"|, please set a correct fileName before calling open()"
+                                      )
+                           );
+
+    MESSAGE(LOC<<"_fileName.c_str : "<< MED_FIELD_DRIVER<T>::_fileName.c_str()<<",mode : "<< MED_FIELD_DRIVER<T>::_accessMode);
+    _medIdt = med_2_2::MEDouvrir( (const_cast <char *> (MED_FIELD_DRIVER<T>::_fileName.c_str())),(med_2_2::med_mode_acces) MED_FIELD_DRIVER<T>::_accessMode);
+    MESSAGE(LOC<<"_medIdt : "<< _medIdt );
+    if (_medIdt > 0) 
+      MED_FIELD_DRIVER<T>::_status=MED_OPENED;
+    else {
+      MED_FIELD_DRIVER<T>::_status = MED_INVALID;
+      _medIdt = MED_INVALID;
+      throw MED_EXCEPTION (LOCALIZED( STRING(LOC) 
+                                     << "Can't open |"  << MED_FIELD_DRIVER<T>::_fileName 
+                                     << "|, _medIdt : " << _medIdt
+                                     )
+                          );
+    }
+
+    END_OF(LOC);
+  }
+  
+  void close() {
+    BEGIN_OF("MED_FIELD_DRIVER22::close()");
+    med_2_2::med_int err = 0;
+    if (MED_FIELD_DRIVER<T>::_status == MED_OPENED) {
+      err=med_2_2::MEDfermer(_medIdt);
+      //H5close(); // If we call H5close() all the files are closed.
+      MED_FIELD_DRIVER<T>::_status = MED_CLOSED;
+      _medIdt = MED_INVALID;
+      MESSAGE(" MED_FIELD_DRIVER22::close() : MEDfermer : _medIdt= " << _medIdt );
+      MESSAGE(" MED_FIELD_DRIVER22::close() : MEDfermer : err    = " << err );
+    }
+    END_OF("MED_FIELD_DRIVER22::close()");
+  }
+
+};
+
+/*!
+
+  Driver Med for FIELD : Read only.
+
+  Implement read method.
+
+*/
+
+  template <class T> class MED_FIELD_RDONLY_DRIVER22 : public virtual MED_FIELD_DRIVER22<T>, public virtual IMED_FIELD_RDONLY_DRIVER<T>
+{
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDONLY_DRIVER22():MED_FIELD_DRIVER<T>() {};
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDONLY_DRIVER22(const string & fileName,  FIELD<T> * ptrField):
+    IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField),
+    MED_FIELD_DRIVER22<T>(fileName,ptrField,MED_EN::MED_RDONLY),
+    MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDONLY)
+  { 
+    BEGIN_OF("MED_FIELD_RDONLY_DRIVER22::MED_FIELD_RDONLY_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
+    END_OF("MED_FIELD_RDONLY_DRIVER22::MED_FIELD_RDONLY_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
+  }
+  
+  /*!
+    Copy constructor.
+  */
+  MED_FIELD_RDONLY_DRIVER22(const MED_FIELD_RDONLY_DRIVER22 & fieldDriver):
+    IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),
+    MED_FIELD_DRIVER22<T>(fieldDriver),
+    MED_FIELD_DRIVER<T>(fieldDriver)
+  {};
+  
+  /*!
+    Destructor.
+  */
+  virtual ~MED_FIELD_RDONLY_DRIVER22() {};
+
+  // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
+
+  /*!
+    Return a MEDEXCEPTION : it is the read-only driver.
+  */
+  void write( void ) const throw (MEDEXCEPTION) ;
+  /*!
+    Read FIELD in the specified file.
+  */
+  void read ( void ) throw (MEDEXCEPTION) ;
+
+private:
+  GENDRIVER * copy( void ) const ;
+
+};
+
+/*!
+
+  Driver Med for FIELD : Write only.
+
+  Implement write method.
+
+*/
+
+template <class T> class MED_FIELD_WRONLY_DRIVER22 : public virtual MED_FIELD_DRIVER22<T>, public virtual IMED_FIELD_WRONLY_DRIVER<T> {
+  
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_WRONLY_DRIVER22():MED_FIELD_DRIVER<T>() {}
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_WRONLY_DRIVER22(const string & fileName, FIELD<T> * ptrField):
+    IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),
+    MED_FIELD_DRIVER22<T>(fileName,ptrField,MED_EN::MED_WRONLY),
+    MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_WRONLY)
+  {
+    BEGIN_OF("MED_FIELD_WRONLY_DRIVER22::MED_FIELD_WRONLY_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
+    END_OF("MED_FIELD_WRONLY_DRIVER22::MED_FIELD_WRONLY_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
+  };
+
+  /*!
+    Copy constructor.
+  */
+  MED_FIELD_WRONLY_DRIVER22(const MED_FIELD_WRONLY_DRIVER22 & fieldDriver):
+    IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),
+    MED_FIELD_DRIVER22<T>(fieldDriver),
+    MED_FIELD_DRIVER<T>(fieldDriver)
+  {};
+  
+  /*!
+    Destructor.
+  */
+  virtual ~MED_FIELD_WRONLY_DRIVER22() {};
+
+  /*!
+    Write FIELD in the specified file.
+  */
+  void write( void ) const throw (MEDEXCEPTION) ;
+  /*!
+    Return a MEDEXCEPTION : it is the write-only driver.
+  */
+  void read ( void ) throw (MEDEXCEPTION) ;
+
+private:
+  GENDRIVER * copy( void ) const ;
+
+};
+
+
+/*!
+
+  Driver Med for FIELD : Read write.
+  - Use read method from MED_FIELD_RDONLY_DRIVER
+  - Use write method from MED_FIELD_WDONLY_DRIVER
+
+*/
+
+template <class T> class MED_FIELD_RDWR_DRIVER22 : public MED_FIELD_RDONLY_DRIVER22<T>, public MED_FIELD_WRONLY_DRIVER22<T>, public IMED_FIELD_RDWR_DRIVER<T> {
+  
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDWR_DRIVER22():MED_FIELD_DRIVER22<T>() {}
+  
+  /*!
+    Constructor.
+  */
+  MED_FIELD_RDWR_DRIVER22(const string & fileName, FIELD<T> * ptrField):
+    MED_FIELD_WRONLY_DRIVER22<T>(fileName,ptrField),
+    MED_FIELD_RDONLY_DRIVER22<T>(fileName,ptrField),
+    IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField),
+    IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),
+    MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDWR),
+    IMED_FIELD_RDWR_DRIVER<T>(fileName,ptrField)
+  {
+    BEGIN_OF("MED_FIELD_RDWR_DRIVER22::MED_FIELD_RDWR_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
+    //_accessMode = MED_RDWR ;
+    END_OF("MED_FIELD_RDWR_DRIVER22::MED_FIELD_RDWR_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
+  };
+
+  /*!
+    Copy constructor.
+  */
+  MED_FIELD_RDWR_DRIVER22(const MED_FIELD_RDWR_DRIVER22 & fieldDriver):
+    MED_FIELD_WRONLY_DRIVER22<T>(fieldDriver),
+    MED_FIELD_RDONLY_DRIVER22<T>(fieldDriver),
+    IMED_FIELD_RDWR_DRIVER<T>(fieldDriver),
+    IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),
+    IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),
+    MED_FIELD_DRIVER<T>(fieldDriver)
+  {};
+  
+  /*!
+    Destructor.
+  */
+  ~MED_FIELD_RDWR_DRIVER22() {};
+
+  /*!
+    Write FIELD in the specified file.
+  */
+  void write(void) const throw (MEDEXCEPTION) ;
+  /*!
+    Read FIELD in the specified file.
+  */
+  void read (void) throw (MEDEXCEPTION) ;
+
+private:
+  GENDRIVER * copy( void ) const ;
+
+};
+
+
+/*-------------------------*/
+/* template implementation */
+/*-------------------------*/
+
+/*--------------------- DRIVER PART -------------------------------*/
+
+//  template <class T> void MED_FIELD_DRIVER<T>::search_field() {
+//    const char * LOC = "template <class T> class MED_FIELD_DRIVER::search_field() :";
+    
+//    // we search the field number !!!!
+//    if (_status==MED_OPENED)
+//      if (_fieldNum==MED_INVALID) {
+//        int err ;
+//        int    numberOfFields              = 0;      //MED_INVALID
+//        //   char   fieldName[MED_TAILLE_NOM+1] = "";
+//        char   fieldName[MED_TAILLE_NOM+1] ;
+//        int    numberOfComponents          = 0;
+//        char * componentName               = (char *) MED_NULL;
+//        char * unitName                    = (char *) MED_NULL;
+//        med_2_2::med_type_champ type ;
+//        numberOfFields = med_2_2::MEDnChamp(_medIdt,0) ;
+//        if ( numberOfFields <= 0 ) 
+//     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
+//        for (int i=1;i<=numberOfFields;i++) {
+         
+//     numberOfComponents = med_2_2::MEDnChamp(_medIdt,i) ;
+//     if ( numberOfComponents <= 0 ) 
+//       throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+//                                        <<  "Be careful there is no compound for field n°" 
+//                                        << i << "in file |"<<_fileName<<"| !"));
+         
+//     componentName = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;
+//     unitName      = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;   
+         
+//     err = med_2_2::MEDchampInfo(_medIdt, i, fieldName, &type, componentName, 
+//                                unitName, numberOfComponents) ;
+         
+//     delete[] componentName ;
+//     delete[] unitName ;
+//     MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<_fieldName.c_str()<<"#");
+//     if ( !strcmp(fieldName,_fieldName.c_str()) ) {
+//       MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
+//       _fieldNum = i ;
+//       break ;
+//     }
+//        }
+//      }
+//  }
+  
+/*--------------------- RDONLY PART -------------------------------*/
+
+template <class T> GENDRIVER * MED_FIELD_RDONLY_DRIVER22<T>::copy(void) const
+{
+  return new MED_FIELD_RDONLY_DRIVER22<T>(*this);
+}
+
+template <class T> void MED_FIELD_RDONLY_DRIVER22<T>::read(void)
+  throw (MEDEXCEPTION)
+{
+  const char * LOC = " MED_FIELD_RDONLY_DRIVER22::read() " ;
+  BEGIN_OF(LOC);
+
+  if (MED_FIELD_DRIVER<T>::_ptrField->_name=="")
+    MED_FIELD_DRIVER<T>::_ptrField->_name = MED_FIELD_DRIVER<T>::_fieldName ; 
+  else
+    MED_FIELD_DRIVER<T>::_fieldName = MED_FIELD_DRIVER<T>::_ptrField->_name; // bug indetermine ! apres avoir fait readfilestruct, lorsque je recupere le champ, tout est bon sauf le nom du champ dans le driver !!!!!
+
+  MESSAGE("###### "<<LOC<<" fieldNameDRIVER : "<<MED_FIELD_DRIVER<T>::_fieldName<<" fieldName : "<<MED_FIELD_DRIVER<T>::_ptrField->_name);
+
+  string MeshName =  MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getMesh()->getName() ;
+
+  if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
+    {
+
+      //        search_field() ;
+
+      char *  fieldName ;
+      fieldName = new char[MED_TAILLE_NOM+1] ;
+      int err ;
+      int    numberOfComponents          = 0;
+      char * componentName               = (char *) MED_NULL;
+      char * unitName                    = (char *) MED_NULL;
+      med_2_2::med_type_champ type ;
+
+      // we search the field number !!!!
+      if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID) {
+       int    numberOfFields              = 0;      //MED_INVALID
+       numberOfFields = med_2_2::MEDnChamp(MED_FIELD_DRIVER22<T>::_medIdt,0) ;
+       if ( numberOfFields <= 0 ) 
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
+       for (int i=1;i<=numberOfFields;i++) {
+           
+         numberOfComponents = med_2_2::MEDnChamp(MED_FIELD_DRIVER22<T>::_medIdt,i) ;
+         if ( numberOfComponents <= 0 ) 
+           //                throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+           //                                                 <<  "Be careful there is no compound for field n°" 
+           //                                                 << i << "in file |"<<_fileName<<"| !"));
+           MESSAGE(LOC<<"Be careful there is no compound for field n°"<<i<<"in file |"<<MED_FIELD_DRIVER<T>::_fileName<<"| !");
+
+         componentName = new char[numberOfComponents*MED_TAILLE_PNOM22+1] ;
+         unitName      = new char[numberOfComponents*MED_TAILLE_PNOM22+1] ;   
+           
+         err = med_2_2::MEDchampInfo(MED_FIELD_DRIVER22<T>::_medIdt, i, fieldName, &type, componentName, 
+                                    unitName, numberOfComponents) ;
+           
+         MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<MED_FIELD_DRIVER<T>::_fieldName.c_str()<<"#");
+         if ( !strcmp(fieldName,MED_FIELD_DRIVER<T>::_fieldName.c_str()) ) {
+           MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
+           MED_FIELD_DRIVER<T>::_fieldNum = i ;
+           break ;
+         }
+         // not found : release memory and search next field !
+         delete[] componentName ;
+         delete[] unitName ;
+       }
+      }
+      
+      delete[] fieldName ;
+
+      if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID)
+       throw MEDEXCEPTION(LOCALIZED( STRING(LOC) << ": Field "<<MED_FIELD_DRIVER<T>::_fieldName << " not found in file " << MED_FIELD_DRIVER<T>::_fileName ) );
+      MESSAGE ("FieldNum : "<<MED_FIELD_DRIVER<T>::_fieldNum);
+
+      //        int err ;
+      //        int NumberOfComponents = med_2_2::MEDnChamp(MED_FIELD_DRIVER<T>::_medIdt,MED_FIELD_DRIVER<T>::_fieldNum) ;
+      if (numberOfComponents < 1) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no component")) ; // use iostring !
+      // test type to check if it is rigth !!!???
+      MED_FIELD_DRIVER<T>::_ptrField->_numberOfComponents = numberOfComponents ;
+      MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = new int[numberOfComponents] ;
+      MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = new string[numberOfComponents] ;
+      MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = new UNIT[numberOfComponents] ;
+      MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = new string[numberOfComponents] ;
+      MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = new string[numberOfComponents] ;
+      for (int i=0; i<numberOfComponents; i++) {
+       MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes[i] = 1 ;
+
+       // PG : what about space !!!
+       MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i] = string(componentName,i*MED_TAILLE_PNOM22,MED_TAILLE_PNOM22) ;
+       SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i]);
+       MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i] = string(unitName,i*MED_TAILLE_PNOM22,MED_TAILLE_PNOM22) ;
+       SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i]);
+      }
+      delete[] componentName;
+      delete[] unitName;
+
+      // read values for each geometric type in _support
+      int NumberOfTypes = MED_FIELD_DRIVER<T>::_ptrField->_support->getNumberOfTypes() ;
+      const MED_EN::medGeometryElement *Types = MED_FIELD_DRIVER<T>::_ptrField->_support->getTypes() ;
+      T ** myValues = new T*[NumberOfTypes] ;
+      int * NumberOfValues = new int[NumberOfTypes] ;
+      int TotalNumberOfValues = 0 ;
+      MESSAGE ("NumberOfTypes :"<< NumberOfTypes);
+      MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues=0 ;
+      for (int i=0; i<NumberOfTypes; i++) {
+       MESSAGE ("Type["<<i+1<<"] :"<< Types[i]);
+       MESSAGE ("Entity :"<<MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity());
+//     NumberOfValues[i] = 
+//       MEDnVal(_medIdt,
+//               const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
+//               (med_2_2::med_entite_maillage)_ptrField->_support->getEntity(),
+//               (med_2_2::med_geometrie_element)Types[i],
+//               _ptrField->_iterationNumber,
+//               _ptrField->_orderNumber) ; // no time step ! prend en compte le nbre de pt de gauss
+       // test if NumberOfValues is the same in _support !!! TODO that !!
+       // we suppose it is
+       // we could allocate array
+       // Be really carefull about the profil; especially the last arg of
+       // MEDnVal
+
+       NumberOfValues[i] =
+         MEDnVal(MED_FIELD_DRIVER22<T>::_medIdt,
+                 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
+                 (med_2_2::med_entite_maillage)MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),
+                 (med_2_2::med_geometrie_element) Types[i],
+                 MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber, MED_FIELD_DRIVER<T>::_ptrField->_orderNumber,
+                 const_cast <char*> (MED_FIELD_DRIVER<T>::_ptrField->_support->getMesh()->getName().c_str()),
+                 med_2_2::MED_COMPACT) ;
+
+       myValues[i] = new T[ NumberOfValues[i]*numberOfComponents ] ;
+       TotalNumberOfValues+=NumberOfValues[i] ;// diviser par le nombre de point de gauss 
+       char * ProfilName = new char[MED_TAILLE_NOM+1];
+       char * LocalGaussName = new char[MED_TAILLE_NOM+1];
+       MESSAGE ("NumberOfValues :"<< NumberOfValues[i]);
+       MESSAGE ("NumberOfComponents :"<< numberOfComponents);
+       MESSAGE ("MESH_NAME :"<< MeshName.c_str());
+       MESSAGE ("FIELD_NAME :"<< MED_FIELD_DRIVER<T>::_fieldName.c_str());
+       MESSAGE ("MED_ENTITE :"<< (med_2_2::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity());
+       MESSAGE("MED_GEOM :"<<(med_2_2::med_geometrie_element)Types[i]);
+       MESSAGE("Iteration :"<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
+       MESSAGE("Order :"<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
+        MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOfValues[i]; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
+
+       err = MEDchampLire(MED_FIELD_DRIVER22<T>::_medIdt,const_cast <char*> (MeshName.c_str()),
+                          const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
+                                 (unsigned char*) myValues[i],
+                          med_2_2::MED_NO_INTERLACE,MED_ALL,
+                          LocalGaussName,ProfilName,
+                          med_2_2::MED_NO_PFLMOD,
+                          (med_2_2::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),(med_2_2::med_geometrie_element)Types[i],
+                          MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
+                          MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
+
+       if ( err < 0) {
+         // we must do some delete !!!
+         for(int j=0; j<=i;j++)
+           delete[] myValues[j];
+         delete[] myValues;
+         delete[] NumberOfValues ;
+         delete[] ProfilName;
+         delete[] LocalGaussName;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes ;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsNames ;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits ;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions ;
+         delete[] MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits ;
+         MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = NULL ;
+         MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = NULL ;
+         MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = NULL ;
+         MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = NULL ;
+         MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = NULL ;
+         MED_FIELD_DRIVER<T>::_fieldNum = MED_INVALID ; // we have not found right field, so reset the field number 
+         throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": ERROR when read value")) ;
+       }
+
+       // At this time ProfilName should be med_2_2::MED_NOPFL and
+       // LocalGaussName should be med_2_2::MED_NOGAUSS
+       delete[] ProfilName ;
+       delete[] LocalGaussName ;
+      }
+      // allocate _value
+      // probleme avec les points de gauss : voir lorsqu-il y en a (!= 1)
+      //      MEDARRAY<T> * Values = new MEDARRAY<T>(MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents(),TotalNumberOfValues/MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents(),MED_EN::MED_NO_INTERLACE);
+
+      if (MED_FIELD_DRIVER<T>::_ptrField->_value==NULL)
+       MED_FIELD_DRIVER<T>::_ptrField->_value=new MEDARRAY<T>(numberOfComponents,TotalNumberOfValues,MED_EN::MED_NO_INTERLACE);
+
+      MEDARRAY<T> * Values = MED_FIELD_DRIVER<T>::_ptrField->_value ; // create by constructor ???
+      // check if dimensions are right : inutile : c'est dans le constructeur !!!
+      //if (Values->getLeadingValue() != numberOfComponents)
+      //  throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": leading dimension are false : "<<Values->getLeadingValue()<<" and "<<numberOfComponents) ) ;
+      //if (Values->getLengthValue() != TotalNumberOfValues)
+      //  throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": length dimension are false : "<<Values->getLengthValue()<<" and "<<TotalNumberOfValues) ) ;
+
+      for (int i=0; i<numberOfComponents; i++) {
+       //T * ValuesT = Values->getRow(i+1) ;
+       int Count = 1 ;
+       for (int j=0; j<NumberOfTypes; j++) {
+         T * myValue = myValues[j] ;
+         int NumberOf = NumberOfValues[j] ;
+//       MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOf; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
+         int offset = NumberOf*i ;
+         for (int k=0 ; k<NumberOf; k++) {
+           //ValuesT[Count]=myValue[k+offset] ;
+           Values->setIJ(Count,i+1,myValue[k+offset]);
+           SCRUTE(Count);
+           SCRUTE(Values->getIJ(Count,i+1));
+           Count++;
+         }
+       }
+      }
+      
+      for (int j=0; j<NumberOfTypes; j++)
+       delete[] myValues[j] ;
+      delete[] myValues ;
+      delete[] NumberOfValues ;
+
+      MED_FIELD_DRIVER<T>::_ptrField->_isRead = true ;
+    }
+
+  END_OF(LOC);
+}
+
+template <class T> void MED_FIELD_RDONLY_DRIVER22<T>::write( void ) const
+  throw (MEDEXCEPTION)
+{
+  throw MEDEXCEPTION("MED_FIELD_RDONLY_DRIVER22::write : Can't write with a RDONLY driver !");
+}
+
+/*--------------------- WRONLY PART -------------------------------*/
+
+template <class T> GENDRIVER * MED_FIELD_WRONLY_DRIVER22<T>::copy(void) const
+{
+  return new MED_FIELD_WRONLY_DRIVER22<T>(*this);
+}
+
+template <class T> void MED_FIELD_WRONLY_DRIVER22<T>::read (void)
+  throw (MEDEXCEPTION)
+{
+  throw MEDEXCEPTION("MED_FIELD_WRONLY_DRIVER22::read : Can't read with a WRONLY driver !");
+}
+
+template <class T> void MED_FIELD_WRONLY_DRIVER22<T>::write(void) const
+  throw (MEDEXCEPTION)
+{
+  const char * LOC = "MED_FIELD_WRONLY_DRIVER22::write(void) const " ;
+  BEGIN_OF(LOC);
+  if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
+    {
+      int err ;
+
+      int component_count=MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents();
+      string   component_name(component_count*MED_TAILLE_PNOM22,' ') ;
+      string   component_unit(component_count*MED_TAILLE_PNOM22,' ') ;
+
+      const string * listcomponent_name=MED_FIELD_DRIVER<T>::_ptrField->getComponentsNames() ;
+      const string * listcomponent_unit=MED_FIELD_DRIVER<T>::_ptrField->getMEDComponentsUnits() ;
+      int length ;
+      for (int i=0; i < component_count ; i++) {
+       length = min(MED_TAILLE_PNOM22,(int)listcomponent_name[i].size());
+       component_name.replace(i*MED_TAILLE_PNOM22,length,
+                              listcomponent_name[i],0,length);
+       length = min(MED_TAILLE_PNOM22,(int)listcomponent_unit[i].size());
+       component_unit.replace(i*MED_TAILLE_PNOM22,length,
+                              listcomponent_unit[i],0,length);
+      }
+
+      MESSAGE("component_name=|"<<component_name<<"|");
+      MESSAGE("component_unit=|"<<component_unit<<"|");
+
+      MED_EN::med_type_champ ValueType=MED_FIELD_DRIVER<T>::_ptrField->getValueType() ;
+      
+      MESSAGE("Template Type =|"<<ValueType<<"|");
+      
+      // le champ existe deja ???
+      char * champName = new char[MED_TAILLE_NOM+1] ;
+      med_2_2::med_type_champ type ;
+      char * compName ;
+      char * compUnit ;
+      bool Find = false ;
+      int n = med_2_2::MEDnChamp(MED_FIELD_DRIVER22<T>::_medIdt,0);
+      int nbComp ;
+      for (int i=1; i<=n; i++) {
+       nbComp = med_2_2::MEDnChamp(MED_FIELD_DRIVER22<T>::_medIdt,i);
+       compName = new char[MED_TAILLE_PNOM22*nbComp+1];
+       compUnit = new char[MED_TAILLE_PNOM22*nbComp+1];
+       err = med_2_2::MEDchampInfo(MED_FIELD_DRIVER22<T>::_medIdt,i,champName,&type,compName,compUnit,nbComp);
+       if (err == 0)
+         if (strcmp(champName,MED_FIELD_DRIVER<T>::_ptrField->getName().c_str())==0) { // Found !
+           Find = true ;
+           break ;
+         }
+       delete[] compName ;
+       delete[] compUnit ;
+      }
+      delete[] champName ;
+      if (Find) {
+       // the same ?
+       if (nbComp != component_count)
+         throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
+                                        <<": Field exist in file, but number of component are different : "<<nbComp<<" in file and "<<component_count<<" in memory."
+                                        )
+                             );
+       // component name and unit
+       MESSAGE(LOC<<" Component name in file : "<<compName);
+       MESSAGE(LOC<<" Component name in memory : "<<component_name);
+       MESSAGE(LOC<<" Component unit in file : "<<compUnit);
+       MESSAGE(LOC<<" Component unit in memory : "<<component_unit);
+       delete[] compName ;
+       delete[] compUnit ;
+
+      } else {
+        // Verify the field doesn't exist
+
+        string dataGroupName =  "/CHA/";
+        dataGroupName        += MED_FIELD_DRIVER<T>::_ptrField->getName();
+        MESSAGE(LOC << "|" << dataGroupName << "|" );
+        med_2_2::med_idt gid =  H5Gopen(MED_FIELD_DRIVER22<T>::_medIdt, dataGroupName.c_str() );
+        
+        if ( gid < 0 ) {
+          // create field :
+          err=med_2_2::MEDchampCr(MED_FIELD_DRIVER22<T>::_medIdt, 
+                                 const_cast <char*> ((MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
+                                 (med_2_2::med_type_champ) ValueType,
+                                 const_cast <char*> ( component_name.c_str() ),
+                                 const_cast <char*> ( component_unit.c_str() ),
+                                 component_count);
+          if ( err < 0 )
+            throw MEDEXCEPTION( LOCALIZED (STRING(LOC) 
+                                           << ": Error MEDchampCr : "<<err
+                                           )
+                                );
+        }
+        else H5Gclose(gid);
+      }
+
+      const SUPPORT * mySupport = MED_FIELD_DRIVER<T>::_ptrField->getSupport() ;
+
+      if (! mySupport->isOnAllElements())
+       throw MEDEXCEPTION( LOCALIZED (STRING(LOC) 
+                                      <<": Field must be on all entity"
+                                      )
+                           );
+      
+      MESH * myMesh = mySupport->getMesh() ;
+      string MeshName = myMesh->getName() ;
+      //MED_EN::medModeSwitch Mode = MED_FIELD_DRIVER<T>::_ptrField->_value->getMode() ;
+      // on boucle sur tout les types pour ecrire les tableaux de valeur
+      int NumberOfType = mySupport->getNumberOfTypes() ;
+      int Index = 1 ;
+      const MED_EN::medGeometryElement * Types = mySupport->getTypes() ;
+      const int * NumberOfGaussPoint = mySupport->getNumberOfGaussPoint() ;
+      for (int i=0;i<NumberOfType;i++) {
+       int NumberOfElements = mySupport->getNumberOfElements(Types[i]) ;
+       
+       const T * value = MED_FIELD_DRIVER<T>::_ptrField->getValueI(MED_EN::MED_FULL_INTERLACE,Index) ;
+       
+       MESSAGE("MED_FIELD_DRIVER<T>22::_medIdt                         : "<<MED_FIELD_DRIVER22<T>::_medIdt);
+       MESSAGE("MeshName.c_str()                : "<<MeshName.c_str());
+       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getName()            : "<<MED_FIELD_DRIVER<T>::_ptrField->getName());
+       MESSAGE("value                           : "<<value);
+       MESSAGE("NumberOfElements                : "<<NumberOfElements);
+       MESSAGE("NumberOfGaussPoint[i]           : "<<NumberOfGaussPoint[i]);
+       MESSAGE("mySupport->getEntity()          : "<<mySupport->getEntity());
+       MESSAGE("Types[i]                        : "<<Types[i]);
+       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber() : "<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
+       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getTime()            : "<<MED_FIELD_DRIVER<T>::_ptrField->getTime());
+       MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()     : "<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
+       
+/*     char chanom[MED_TAILLE_NOM+1];
+       char chacomp[MED_TAILLE_NOM+1];
+       char chaunit[MED_TAILLE_NOM+1];
+       med_2_2::med_type_champ chatype;
+       med_int chancomp=1;
+       
+       err=med_2_2::MEDchampInfo(MED_FIELD_DRIVER<T>::_medIdt,1,chanom,&chatype,chacomp,chaunit,chancomp);
+
+       if (err<0) 
+               {
+               cout<<"=======================================================================> gros probleme"<<endl;
+               exit(-1);
+               }
+       cout<<"==================> nom lu            = "<<chanom<<endl;
+       cout<<"==================> type lu           = "<<chatype<<endl;
+       cout<<"==================> nom composante lu = "<<chacomp<<endl;
+       cout<<"==================> nom unit lu       = "<<chaunit<<endl;
+       cout<<"==================> valeur de med_2_2::MED_REEL64 = "<<med_2_2::MED_REEL64<<endl;
+*/     
+
+//     err=med_2_2::MEDchampEcr(_medIdt, 
+//                             const_cast <char*> ( MeshName.c_str()) ,                         //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
+//                             const_cast <char*> ( (_ptrField->getName()).c_str()),
+//                             (unsigned char*)value, 
+//                             med_2_2::MED_FULL_INTERLACE,
+//                             NumberOfElements,
+//                             NumberOfGaussPoint[i],
+//                             MED_ALL,
+//                             MED_NOPFL,
+//                             med_2_2::MED_REMP,  // PROFIL NON GERE, mode de remplacement non géré
+//                             (med_2_2::med_entite_maillage)mySupport->getEntity(),
+//                             (med_2_2::med_geometrie_element)Types[i],
+//                             _ptrField->getIterationNumber(),
+//                             "        ",
+//                             _ptrField->getTime(),
+//                             _ptrField->getOrderNumber()
+//                             );
+
+       err=med_2_2::MEDchampEcr(MED_FIELD_DRIVER22<T>::_medIdt, 
+                               const_cast <char*> ( MeshName.c_str()) ,                         //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
+                               const_cast <char*> ( (MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
+                               (unsigned char*)value,
+                               med_2_2::MED_FULL_INTERLACE,
+                               NumberOfElements*NumberOfGaussPoint[i],
+                               MED_NOGAUSS, MED_ALL, MED_NOPFL,
+                               med_2_2::MED_NO_PFLMOD, // PROFIL NON GERE, mode de remplacement non géré
+                               (med_2_2::med_entite_maillage)mySupport->getEntity(),
+                               (med_2_2::med_geometrie_element)Types[i],
+                               MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
+                               "        ",
+                               MED_FIELD_DRIVER<T>::_ptrField->getTime(),
+                               MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
+                               );
+
+       if (err < MED_VALID )
+         throw MEDEXCEPTION(LOCALIZED( STRING(LOC)
+                                       <<": Error in writing Field "<< MED_FIELD_DRIVER<T>::_ptrField->getName() <<", type "<<Types[i]
+                                       )
+                            );
+
+       Index += NumberOfElements ;
+       
+      }
+    }
+  
+  END_OF(LOC);
+}
+
+/*--------------------- RDWR PART -------------------------------*/
+
+template <class T> GENDRIVER * MED_FIELD_RDWR_DRIVER22<T>::copy(void) const
+{
+  return new MED_FIELD_RDWR_DRIVER22<T>(*this);
+}
+
+template <class T> void MED_FIELD_RDWR_DRIVER22<T>::write(void) const
+  throw (MEDEXCEPTION)
+{
+  BEGIN_OF("MED_FIELD_RDWR_DRIVER22::write(void)");
+  MED_FIELD_WRONLY_DRIVER22<T>::write(); 
+  END_OF("MED_FIELD_RDWR_DRIVER22::write(void)");
+} 
+
+template <class T> void MED_FIELD_RDWR_DRIVER22<T>::read (void)
+  throw (MEDEXCEPTION)
+{
+  BEGIN_OF("MED_FIELD_RDWR_DRIVER22::read(void)");
+  MED_FIELD_RDONLY_DRIVER22<T>::read();
+  END_OF("MED_FIELD_RDWR_DRIVER22::read(void)");
+}
+
+}
+/*-----------------------------------------------------------------*/
+
+#endif /* MED_FIELD_DRIVER_HXX */
+
index f6491447937044b057ab3ee8e2eac583460fa579..ebf70988644c48657252e63e1e870da6b9217ae3 100644 (file)
@@ -1,28 +1,22 @@
-# include <string>
-
-# include "MEDMEM_MedMedDriver.hxx"
-# include "MEDMEM_MedMeshDriver.hxx"
-# include "MEDMEM_DriversDef.hxx"
-
-# include "MEDMEM_Mesh.hxx"
-# include "MEDMEM_Grid.hxx"
-# include "MEDMEM_Field.hxx"
-// EN ATTENDANT L'utilisation de MedFieldDriver.hxx ds Field.hxx
-# include "MEDMEM_MedFieldDriver.hxx"
-# include "MEDMEM_Med.hxx"
-
-# include "MEDMEM_define.hxx"
+#include "MEDMEM_MedMedDriver.hxx"
+#include "MEDMEM_Compatibility21_22.hxx"
+#include "MEDMEM_MedMedDriver21.hxx"
+#include "MEDMEM_MedMedDriver22.hxx"
+#include "MEDMEM_DriverFactory.hxx" 
+#include "MEDMEM_define.hxx"
 
 using namespace std;
 using namespace MED_EN;
 using namespace MEDMEM;
 
 MED_MED_DRIVER::MED_MED_DRIVER(): GENDRIVER(), 
 
 using namespace std;
 using namespace MED_EN;
 using namespace MEDMEM;
 
 MED_MED_DRIVER::MED_MED_DRIVER(): GENDRIVER(), 
-                                  _ptrMed((MED * const)MED_NULL),_medIdt(MED_INVALID) 
+                                  _ptrMed((MED * const)MED_NULL),
+                                 _concreteMedDrv((GENDRIVER *) MED_NULL)
 {}
 
 MED_MED_DRIVER::MED_MED_DRIVER(const string & fileName,  MED * const ptrMed):
 {}
 
 MED_MED_DRIVER::MED_MED_DRIVER(const string & fileName,  MED * const ptrMed):
-  GENDRIVER(fileName,MED_EN::MED_RDWR), _ptrMed(ptrMed), _medIdt(MED_INVALID)
+  GENDRIVER(fileName,MED_EN::MED_RDWR), _ptrMed(ptrMed),
+  _concreteMedDrv((GENDRIVER *) MED_NULL)
 {
   //_ptrMed->addDriver(*this); // The specific MED driver id is set within the addDriver method.
 }
 {
   //_ptrMed->addDriver(*this); // The specific MED driver id is set within the addDriver method.
 }
@@ -30,7 +24,8 @@ MED_MED_DRIVER::MED_MED_DRIVER(const string & fileName,  MED * const ptrMed):
 MED_MED_DRIVER::MED_MED_DRIVER(const string & fileName,
                               MED * const ptrMed,
                               MED_EN::med_mode_acces accessMode):
 MED_MED_DRIVER::MED_MED_DRIVER(const string & fileName,
                               MED * const ptrMed,
                               MED_EN::med_mode_acces accessMode):
-  GENDRIVER(fileName,accessMode), _ptrMed(ptrMed), _medIdt(MED_INVALID)
+  GENDRIVER(fileName,accessMode), _ptrMed(ptrMed),
+  _concreteMedDrv((GENDRIVER *) MED_NULL)
 {
 }
 //REM :  As t'on besoin du champ _status :  _medIdt <-> _status  ?  Oui
 {
 }
 //REM :  As t'on besoin du champ _status :  _medIdt <-> _status  ?  Oui
@@ -38,568 +33,45 @@ MED_MED_DRIVER::MED_MED_DRIVER(const string & fileName,
 MED_MED_DRIVER::MED_MED_DRIVER(const MED_MED_DRIVER & driver):
   GENDRIVER(driver),
   _ptrMed(driver._ptrMed),
 MED_MED_DRIVER::MED_MED_DRIVER(const MED_MED_DRIVER & driver):
   GENDRIVER(driver),
   _ptrMed(driver._ptrMed),
-  _medIdt(MED_INVALID)
+  _concreteMedDrv(driver._concreteMedDrv->copy())
 {
 }
 
 MED_MED_DRIVER::~MED_MED_DRIVER()
 {
   MESSAGE("MED_MED_DRIVER::~MED_MED_DRIVER() has been destroyed");
 {
 }
 
 MED_MED_DRIVER::~MED_MED_DRIVER()
 {
   MESSAGE("MED_MED_DRIVER::~MED_MED_DRIVER() has been destroyed");
+  if (_concreteMedDrv) delete _concreteMedDrv;
 }
 
 }
 
-//  GENDRIVER * MED_MED_DRIVER::copy(void) const
-//  {
-//    return new MED_MED_DRIVER(*this) ;
-//  }
-void MED_MED_DRIVER::read()
-{
-}
-void MED_MED_DRIVER::readFileStruct()
-{
-}
-void MED_MED_DRIVER::write() const
-{
-}
-GENDRIVER * MED_MED_DRIVER::copy(void) const
-{
-  return new MED_MED_DRIVER(*this) ;
-}
-void MED_MED_DRIVER::writeFrom() const
-{
-}
-
-
-
-void MED_MED_DRIVER::open()
-  throw (MEDEXCEPTION)
-{
-
-  const char * LOC ="MED_MED_DRIVER::open() : ";
-  BEGIN_OF(LOC);
-
-  // REFLECHIR SUR CE TEST PAR RAPPORT A L'OUVERTURE/FERMETURE
-//    if ( _medIdt != MED_INVALID ) 
-//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
-//                                       << "_medIdt is already in use, please close the file |" 
-//                                       << _fileName << "| before calling open()"
-//                                       )
-//                            );   
-  
-//    if ( _status != MED_CLOSED ) 
-//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
-//                                       << "_status is closed, please close the file |"
-//                                       << _fileName << "| before calling open()"
-//                                       )
-//                            );
-  
-  if ( _fileName == "" )
-    throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
-                                     << "_fileName is |\"\"|, please set a correct fileName before calling open()"
-                                     )
-                          );
-  
-  MESSAGE(LOC<<"_fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
-  _medIdt = MEDouvrir( (const_cast <char *> (_fileName.c_str())), (med_2_1::med_mode_acces) _accessMode);
-  MESSAGE(LOC<<" _medIdt = "<<_medIdt);
-  
-  if (_medIdt > 0) 
-    _status=MED_OPENED; 
-  else {
-    _status = MED_CLOSED;
-    _medIdt = MED_INVALID;
-    throw MED_EXCEPTION (LOCALIZED( STRING(LOC) 
-                                    << "Can't open |"  << _fileName 
-                                    << "|, _medIdt : " << _medIdt
-                                    )
-                         );
-  }
-
-  END_OF(LOC);
-}
-
-
-void MED_MED_DRIVER::close()
-{
-  med_2_1::med_int err = 0;
-  const char * LOC = "MED_MED_DRIVER::close() : ";
-  
-  
-//    if ( _status == MED_CLOSED)
-//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << ": the file |" 
-//                                       << _fileName << "| is already closed"
-//                                       )
-//                            );
-   
-//    if ( _medIdt == MED_INVALID ) 
-//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "_medIdt invalid, but the file |" 
-//                                       << _fileName << "| seems to be openned !"
-//                                       )
-//                            );   
-
-  if ( _medIdt != MED_INVALID )
-    err=med_2_1::MEDfermer(_medIdt);
-  
-//    if (err != MED_VALID) 
-//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "the file |" 
-//                                       << _fileName << "| couldn't be closed"
-//                                       )
-//                            );   
-  
-  _status = MED_CLOSED;
-  _medIdt = MED_INVALID;
-    
-  END_OF(LOC);
-}
-
-
 // ------------- Read Only Part --------------
 
 // ------------- Read Only Part --------------
 
-MED_MED_RDONLY_DRIVER::MED_MED_RDONLY_DRIVER():MED_MED_DRIVER()
+IMED_MED_RDONLY_DRIVER::IMED_MED_RDONLY_DRIVER():MED_MED_DRIVER()
 {
 }
 
 {
 }
 
-MED_MED_RDONLY_DRIVER::MED_MED_RDONLY_DRIVER(const string & fileName,  MED * const ptrMed):
+IMED_MED_RDONLY_DRIVER::IMED_MED_RDONLY_DRIVER(const string & fileName,  MED * const ptrMed):
   MED_MED_DRIVER(fileName,ptrMed,MED_EN::MED_RDONLY)
 {
   MESSAGE("MED_MED_RDONLY_DRIVER::MED_MED_RDONLY_DRIVER(const string & fileName,  MED * const ptrMed) Constructeur read only");
 }
 
   MED_MED_DRIVER(fileName,ptrMed,MED_EN::MED_RDONLY)
 {
   MESSAGE("MED_MED_RDONLY_DRIVER::MED_MED_RDONLY_DRIVER(const string & fileName,  MED * const ptrMed) Constructeur read only");
 }
 
-MED_MED_RDONLY_DRIVER::MED_MED_RDONLY_DRIVER(const MED_MED_RDONLY_DRIVER & driver):
+IMED_MED_RDONLY_DRIVER::IMED_MED_RDONLY_DRIVER(const IMED_MED_RDONLY_DRIVER & driver):
   MED_MED_DRIVER(driver)
 {
 }
 
   MED_MED_DRIVER(driver)
 {
 }
 
-MED_MED_RDONLY_DRIVER::~MED_MED_RDONLY_DRIVER()
+IMED_MED_RDONLY_DRIVER::~IMED_MED_RDONLY_DRIVER()
 {
   MESSAGE("MED_MED_RDONLY_DRIVER::~MED_MED_RDONLY_DRIVER() has been destroyed");
 } 
 
 {
   MESSAGE("MED_MED_RDONLY_DRIVER::~MED_MED_RDONLY_DRIVER() has been destroyed");
 } 
 
-GENDRIVER * MED_MED_RDONLY_DRIVER::copy(void) const
-{
-  return new MED_MED_RDONLY_DRIVER(*this) ;
-}
-
-void MED_MED_RDONLY_DRIVER::readFileStruct( void ) 
-  throw (MEDEXCEPTION)
-{
-  const char * LOC = "MED_MED_DRIVER::readFileStruct() : ";
-  int          err,i,j;
-      
-  BEGIN_OF(LOC);
-
-  if ( _medIdt == MED_INVALID ) 
-    throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
-                                     << "_medIdt is invalid, please open the file |" 
-                                     << _fileName << "| before calling readFileStruct()"
-                                     )
-                          );   
-  // Read number of meshes and their associated name
-  {
-    int          numberOfMeshes;
-    char         meshName[MED_TAILLE_NOM+1]="";
-    med_2_1::med_int          meshDim;
-    MESH *       ptrMesh;
-    //    MED_MESH_RDWR_DRIVER * ptrDriver; !! UNUSED VARIABLE !!
-    
-    numberOfMeshes = med_2_1::MEDnMaa(_medIdt) ;
-    if ( numberOfMeshes <= 0 ) 
-      MESSAGE(LOC << "Be careful there is no mesh in file |"<<_fileName<<"| !");
-
-    MESH_ENTITIES::const_iterator currentEntity; 
-    for (i=1;i<=numberOfMeshes;i++) {
-
-      // find out if the mesh is a Grid
-      
-      med_2_1::med_int isAGrid = false;
-      med_2_1::med_grid_type type;
-      
-      err = MEDgridInfo (_medIdt, i, &isAGrid, &type);
-      if (err != MED_VALID) 
-        throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "error in MEDgridInfo()") );
-
-      err = med_2_1::MEDmaaInfo(_medIdt, i ,meshName, &meshDim) ;
-      if (err != MED_VALID) 
-        throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << ": can't get information about the mesh n°"
-                                         << i <<" of the file |" << _fileName << "| !"
-                                         )
-                              );   
-      MESSAGE(LOC<<": Mesh n°"<<i<<" nammed "<<meshName);
-
-      if (isAGrid)
-        ptrMesh = new GRID((MED_EN::med_grid_type) type);
-      else
-       ptrMesh = new MESH();
-
-      //MED_MESH_RDWR_DRIVER * _ptrDriver = new MED_MESH_RDWR_DRIVER(_fileName, ptrMesh);
-      MED_EN::med_mode_acces myMode = getAccessMode();
-      MED_MESH_DRIVER * ptrDriver ;
-      switch (myMode) {
-      case MED_EN::MED_LECT:
-       ptrDriver = new MED_MESH_RDONLY_DRIVER(_fileName, ptrMesh);
-       break ;
-      case MED_EN::MED_REMP:   
-       ptrDriver = new MED_MESH_RDWR_DRIVER(_fileName, ptrMesh);
-       break ;
-      case MED_EN::MED_ECRI: // should never append !!
-       ptrDriver = new MED_MESH_RDONLY_DRIVER(_fileName, ptrMesh);
-       break;
-      default:
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
-      }
-      ptrDriver->setId       ( getId() );
-      ptrDriver->setMeshName ( meshName );
-      ptrMesh->addDriver(*ptrDriver);
-      delete ptrDriver ;
-
-      if (isAGrid)
-       _ptrMed->_meshes[meshName] = (MESH *) ptrMesh;
-      else
-       _ptrMed->_meshes[meshName] = ptrMesh;
-
-      ptrMesh->setName(meshName);
-
-      SCRUTE(ptrMesh);
-
-      MESSAGE(LOC<<"is" << (isAGrid ? "" : " NOT") << " a GRID and its name is "<<ptrMesh->getName());
-
-      // we create all global support (for each entity type :
-      int index = 0;
-      for (currentEntity=meshEntities.begin();currentEntity != meshEntities.end(); currentEntity++) {
-       string supportName="SupportOnAll_" ;
-       supportName+=entNames[(*currentEntity).first] ;
-       //(_ptrMed->_support)[meshName][(MED_EN::medEntityMesh)(*currentEntity).first]=new SUPPORT(ptrMesh,supportName,(MED_EN::medEntityMesh) (*currentEntity).first) ;
-       SUPPORT* mySupport = new SUPPORT() ;
-       mySupport->setName(supportName);
-       mySupport->setMesh(ptrMesh);
-       mySupport->setEntity((MED_EN::medEntityMesh) (*currentEntity).first);
-       mySupport->setAll(true);
-       (_ptrMed->_support)[meshName][(MED_EN::medEntityMesh)(*currentEntity).first] = mySupport ;
-       MESSAGE(LOC<< "The support " << supportName.c_str() << " on entity " << (*currentEntity).first << " is built");
-       index++;
-      }
-      MESSAGE(LOC <<"The mesh " <<ptrMesh->getName() << " has " << index << " support(s)");
-    }
-
-    map<MESH_NAME_, map<MED_EN::medEntityMesh,SUPPORT *> >::const_iterator const_itSupportOnMesh ;
-
-    int index = 0;
-
-    vector<SUPPORT *> vectSupp;
-    for (const_itSupportOnMesh=_ptrMed->_support.begin(); const_itSupportOnMesh != _ptrMed->_support.end();
-        const_itSupportOnMesh++ )
-      {
-       map<MED_EN::medEntityMesh,SUPPORT *>::const_iterator const_itSupport ;
-       for (const_itSupport=(*const_itSupportOnMesh).second.begin();
-            const_itSupport!=(*const_itSupportOnMesh).second.end();const_itSupport++) index++;
-      }
-
-    MESSAGE(LOC << "In this MED object there is(are) " << index << " support(s):");
-
-    vectSupp.resize(index);
-
-    index = 0;
-    for (const_itSupportOnMesh=_ptrMed->_support.begin(); const_itSupportOnMesh != _ptrMed->_support.end();
-        const_itSupportOnMesh++ )
-      {
-       map<MED_EN::medEntityMesh,SUPPORT *>::const_iterator const_itSupport ;
-       for (const_itSupport=(*const_itSupportOnMesh).second.begin();
-            const_itSupport!=(*const_itSupportOnMesh).second.end();const_itSupport++)
-         {
-           vectSupp[index] = (*const_itSupport).second;
-           SCRUTE(vectSupp[index]);
-           MESSAGE(LOC << "Support number " << index << " is "<< *vectSupp[index]);
-           index++;
-         }
-      }
-
-  }
-  
-  
-  // Read number of fields, their associated name and their list of (timeStepNumber,iterationNumber)
-  {
-    int                           numberOfFields              = 0;      //MED_INVALID
-    //    char                          fieldName[MED_TAILLE_NOM+1] = "";
-    char                          fieldName[MED_TAILLE_NOM+1] ;
-    int                           numberOfComponents           = 0;
-    char                          * componentName              = (char *) MED_NULL;
-    char                          * unitName                   =  (char *) MED_NULL;
-    //    char                          meshName[MED_TAILLE_NOM+1]  = "";
-    char                          meshName[MED_TAILLE_NOM+1]  ;
-    med_2_1::med_type_champ        type;
-    MESH                          * ptrMesh                        = (MESH  *) MED_NULL;
-    FIELD_                        * ptrField                       = (FIELD_ *) MED_NULL;
-    //MED_FIELD_RDWR_DRIVER         * ptrDriver                      = (MED_FIELD_RDWR_DRIVER * ) MED_NULL;
-    GENDRIVER                     * ptrDriver                      = (GENDRIVER * ) MED_NULL;
-    SUPPORT                       * ptrSupport                     = (SUPPORT *   ) MED_NULL;
-    MESH_ENTITIES::const_iterator currentEntity; 
-    list<MED_EN::medGeometryElement>::const_iterator currentGeometry;
-    med_2_1::med_int                           NbOfGaussPts                 =  0;
-    int                           numberOfTimeSteps            =  -1;
-    med_2_1::med_int                           timeStepNumber               =  -1;
-    //    char                          timeStepUnit[MED_TAILLE_PNOM]= "";
-    char                          timeStepUnit[MED_TAILLE_PNOM+1] ;
-    double                        timeStep                     = 0.0;
-    med_2_1::med_int                           orderNumber                  =  -1;                           //???init?????
-    map<MESH_NAME_,MESH*>      & _meshes   =  _ptrMed->_meshes; 
-    map<FIELD_NAME_,MAP_DT_IT_> & _fields   =  _ptrMed->_fields; 
-    map<FIELD_ *, MESH_NAME_>  & _meshName =  _ptrMed->_meshName; 
-    map<MESH_NAME_, map<MED_EN::medEntityMesh,SUPPORT *> > & _support = _ptrMed->_support;
-
-    
-    numberOfFields = med_2_1::MEDnChamp(_medIdt,0) ;
-    if ( numberOfFields <= 0 ) 
-      MESSAGE(LOC << "Be careful there is no field in file |"<<_fileName<<"| !");
-  
-    for (i=1;i<=numberOfFields;i++) {
-
-      numberOfComponents = med_2_1::MEDnChamp(_medIdt,i) ;
-      if ( numberOfComponents <= 0 ) 
-        if (err != MED_VALID) 
-          throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) <<  "Be careful there is no compound for field n°" 
-                                           << i << "in file |"<<_fileName<<"| !"));
-      
-      componentName = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;
-      unitName      = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;   
-      
-      err = MEDchampInfo(_medIdt, i, fieldName, &type, componentName, 
-                         unitName, numberOfComponents) ;
-
-      if (err != MED_VALID) 
-        throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
-                                         << ": can't get information about the field n°"
-                                         << i <<" of the file |" << _fileName << "| !")); 
-      
-      MESSAGE(LOC << "Field n°"<<i<<" nammed "<< fieldName 
-              << " ,component(s)  : " << componentName 
-              <<" ,unit(s) : "        << unitName);
-      
-
-      // Loop on all (entity type,geometry type) until you find an existing one then
-      // get the (n°dt,n°it) pairs list for the current (field,entity type,geometry type)
-      // We suppose there is the same list whatever the existing (entity type,geometry type) pair  
-      // support map :
-      for (currentEntity=meshEntities.begin();currentEntity != meshEntities.end(); currentEntity++) { 
-       //         numberOfTimeSteps  MUST be given by MEDchampInfo !!!!!
-       for (currentGeometry  = (*currentEntity).second.begin();currentGeometry != (*currentEntity).second.end(); currentGeometry++) {
-         MESSAGE("Field information with Entity,Geom = "<<(*currentEntity).first<<","<<(*currentGeometry));
-         numberOfTimeSteps = MEDnPasdetemps(_medIdt, fieldName,
-                                            (med_2_1::med_entite_maillage)(*currentEntity).first,
-                                            (med_2_1::med_geometrie_element) (*currentGeometry) );
-         MESSAGE("Field information 2 : NumberOfTimeStep :"<<numberOfTimeSteps);
-         if ( numberOfTimeSteps > MED_VALID ) 
-           break ; // There are value for some med_geometrie_element of this med_entite_maillage.
-       }
-       if (numberOfTimeSteps>0) // we have at least one
-         
-         for (currentGeometry  = (*currentEntity).second.begin();currentGeometry != (*currentEntity).second.end(); currentGeometry++) {            
-           
-           MESSAGE("Field information 3 : Geom : "<<(*currentGeometry));
-           for (j=1;j <= numberOfTimeSteps; j++) {
-             
-             MESSAGE("Field information 4 : time step j = "<<j);
-             err = MEDpasdetempsInfo( _medIdt, fieldName,
-                                      (med_2_1::med_entite_maillage) (*currentEntity).first, 
-                                      (med_2_1::med_geometrie_element) (*currentGeometry),j, 
-                                      meshName, &NbOfGaussPts,
-                                      &timeStepNumber, timeStepUnit, &timeStep,
-                                      &orderNumber);
-             if (err == MED_VALID) { // we have found for (*currentEntity).first and (*currentGeometry)
-               
-               MESSAGE("Field information 5 ;: NumberOfGaussPoint : "<<NbOfGaussPts<<", timeStepNumber : "<<timeStepNumber);
-               // CORRECT a bug in MEDpasdetempsInfo :
-               // we get a value n'importe quoi in NbOfGaussPts !!!!
-               
-               if (NbOfGaussPts>100)
-                 NbOfGaussPts=1 ;
-               if (timeStepNumber<0)
-                 timeStepNumber=-1 ;
-               
-               
-               // ATTENTION TRAITER L'EXCEPTION !!!!!!!!!!!!
-               
-               // Il faudra traiter le cas d'un champ qui utilise +sieurs (entity,geom) voir le travail de patrick
-               // Il faudra traiter le cas des profils...
-               //             ptrField = new FIELD();
-               //             _ptrDriver = new MED_FIELD_RDWR_DRIVER(_fileName, ptrField);
-               //             ptrField->addDriver(_ptrDriver);
-               //             _fields[fieldName]=ptrField;
-               
-               // Verify meshName is already known
-               
-               map<MESH_NAME_,MESH*>::iterator _meshesIt = _meshes.find(meshName);
-               if ( _meshesIt == _meshes.end() ) {
-                 MESSAGE(LOC << "There is no mesh |"
-                         << meshName                            <<"| in the file |"
-                         << _fileName <<"|, but  |" << meshName <<"| is referenced by field |"
-                         << fieldName                           <<"|, entity : |"
-                         << entNames [(*currentEntity).first] <<"|, geometric element of type |" 
-                         << geoNames [(*currentGeometry)]     <<"|" 
-                         ); 
-               }  // POURQUOI SI JE NE MET PAS DE BLOCK J'AI UN PARSE ERROR : PG : c'est la macro MESSAGE qui fait ca !
-               else 
-                 ptrMesh = _meshes[meshName];
-               
-               ptrSupport     =  _support[meshName][(med_2_1::med_entite_maillage) (*currentEntity).first];
-               if (NbOfGaussPts != 1)
-                 throw MEDEXCEPTION(LOCALIZED( STRING(LOC) <<"Number of Gauss Point must be equal to 1 for instance")) ;
-               
-               // init to null to prevent some error if not correctly allocated !
-               ptrField = (FIELD_*)NULL ;
-               ptrDriver = (GENDRIVER*)NULL ;
-
-               switch ( type) {
-               case med_2_1::MED_INT64 :
-                 if ( sizeof(med_2_1::med_int) != 8 )
-                   throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) <<
-                                                    " The Field type of |"
-                                                    << fieldName                         <<"|, entity : |"
-                                                    << entNames [(*currentEntity).first] <<"|, geometric element of type |" 
-                                                    << geoNames [(*currentGeometry) ]    <<
-                                                    "| is  MED_INT64 but size of med_int is not equal to 8 bytes !" 
-                                                    ) 
-                                         );
-                 break;
-               case med_2_1::MED_INT32 : {
-//               throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) <<
-//                                                "NOT IMPLEMENTED : BUG IN STL !")
-//                                     ) ;
-                 // ptrField       =  new FIELD<med_2_1::med_int>   ( ptrSupport,numberOfComponents );   // Les valeurs du champ ne doivent pas Ãªtre lue pour l'instant
-
-                 ptrField       =  new FIELD<int> ( );   // Les valeurs du champ ne doivent pas Ãªtre lue pour l'instant
-                 ((FIELD<int>*) ptrField)->setSupport(ptrSupport);
-                 ((FIELD<int>*) ptrField)->setNumberOfComponents(numberOfComponents);
-                 ((FIELD<int>*) ptrField)->setName(fieldName) ; //provisoire, pour debug
-                 MESSAGE("#### SET NAME in FIELD : "<<fieldName);
-
-                 MED_EN::med_mode_acces myMode = getAccessMode();
-                 switch (myMode) {
-                 case MED_EN::MED_LECT:
-                   ptrDriver = new MED_FIELD_RDONLY_DRIVER<int>(_fileName, (FIELD<int> *)ptrField);
-                   break ;
-                 case MED_EN::MED_REMP:        
-                   ptrDriver = new MED_FIELD_RDWR_DRIVER<int>(_fileName, (FIELD<int> *)ptrField);
-                   break ;
-                 case MED_EN::MED_ECRI: // should never append !!
-                   ptrDriver = new MED_FIELD_RDONLY_DRIVER<int>(_fileName, (FIELD<int> *)ptrField);
-                   break;
-                 default:
-                   throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
-                 }
-                 break;
-               }
-               case med_2_1::MED_REEL64 : {
-                 //              ptrField       =  new FIELD<med_2_1::med_float> ( ptrSupport,numberOfComponents );   // Les valeurs du champ ne doivent pas Ãªtre lue pour l'instant
-                 ptrField       =  new FIELD<med_2_1::med_float> ( );   // Les valeurs du champ ne doivent pas Ãªtre lue pour l'instant
-                 ((FIELD<med_2_1::med_float>*) ptrField)->setSupport(ptrSupport);
-                 ((FIELD<med_2_1::med_float>*) ptrField)->setNumberOfComponents(numberOfComponents);
-                 ((FIELD<med_2_1::med_float>*) ptrField)->setName(fieldName) ; //provisoire, pour debug
-                 MESSAGE("#### SET NAME in FIELD : "<<fieldName);
-
-                 MED_EN::med_mode_acces myMode = getAccessMode();
-                 switch (myMode) {
-                 case MED_EN::MED_LECT:
-                   ptrDriver = new MED_FIELD_RDONLY_DRIVER<med_2_1::med_float>(_fileName, (FIELD<med_2_1::med_float> *)ptrField);
-                   break ;
-                 case MED_EN::MED_REMP:        
-                   ptrDriver = new MED_FIELD_RDWR_DRIVER<med_2_1::med_float>(_fileName, (FIELD<med_2_1::med_float> *)ptrField);
-                   break ;
-                 case MED_EN::MED_ECRI: // should never append !!
-                   ptrDriver = new MED_FIELD_RDONLY_DRIVER<med_2_1::med_float>(_fileName, (FIELD<med_2_1::med_float> *)ptrField);
-                   break;
-                 default:
-                   throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
-                 }
-                 break;
-               }
-               default : {
-                 if ( numberOfTimeSteps > 1) 
-                   throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) <<
-                                                    " The Field type of |"
-                                                    << fieldName                         <<"|, entity : |"
-                                                    << entNames [(*currentEntity).first] 
-                                                    <<"|, geometric element of type |" 
-                                                    << geoNames [(*currentGeometry)]     
-                                                    <<"| is neither MED_INT, MED_INT32, MED_INT64 nor MED_REEL64 !" 
-                                                    ) 
-                                         );
-                 break ;
-               }
-               }
-               ptrField->setValueType((MED_EN::med_type_champ) type) ; // need to write field !
-               
-               MESSAGE("timeStepNumber :"<<timeStepNumber<<",orderNumber :"<<orderNumber);
-               ptrField->setIterationNumber ( timeStepNumber);      // A ajouter dans la classe FIELD
-               ptrField->setOrderNumber     ( orderNumber); 
-               ptrField->setTime            ( timeStep); 
-               
-               // Create a driver for this (field n°dt,n°it)
-                ptrDriver->setId            ( getId() );
-               MESSAGE("###### ptrDriver->setFieldName : #"<<fieldName<<"#");
-               ptrDriver->setFieldName(fieldName);
-               ptrField->addDriver(*ptrDriver);
-               // driver is duplicated : remove it
-               delete ptrDriver;
-
-               DT_IT_ dtIt;
-               dtIt.dt  = timeStepNumber;
-               dtIt.it  = orderNumber;
-               
-               (_fields  [fieldName])[dtIt] = ptrField;
-               _meshName[ptrField ]       = meshName;
-             }
-           }
-         }
-      }
-      delete[] componentName ;
-      delete[] unitName ;
-    }
-  }
-  
-  // read profil count and their names
-  //  int support_count_= 0 ; !! UNUSED VARIABLE !!
-  // il faut lire les champs pour avoir les profils stockes !!!
-  // il faudrait implémenter la lecture des profils dans med !!!
-  
-  END_OF(LOC);
-  
-}
-
-// This method ask the drivers of all MESH/FIELD objects created from this MED driver
-// to read themselves
-void MED_MED_RDONLY_DRIVER::read( void )
-  throw (MEDEXCEPTION) // from objects method read !
-{
-  const char * LOC = "MED_MED_DRIVER::read() : ";
-  BEGIN_OF(LOC);
-
-  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
-  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
-
-  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
-  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
-  
-  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) 
-    (*currentMesh).second->read(*this); 
-  //(*currentMesh).second->read(); // default reader, from readFileStruct
-    
-  // PROVISOIRE
-  _ptrMed->updateSupport() ;
-
-  for ( currentField =_meshName.begin(); currentField != _meshName.end(); currentField++ )
-    (*currentField).first->read(*this);
-  //(*currentField).first->read(); // default reader, from readFileStruct
-
-  END_OF(LOC);
-}
-
-void MED_MED_RDONLY_DRIVER::write(void) const
+void IMED_MED_RDONLY_DRIVER::write(void) const
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_MED_RDONLY_DRIVER::write : Can't write with a RDONLY driver !");
 }
 
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_MED_RDONLY_DRIVER::write : Can't write with a RDONLY driver !");
 }
 
-void MED_MED_RDONLY_DRIVER::writeFrom(void) const
+void IMED_MED_RDONLY_DRIVER::writeFrom(void) const
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_MED_RDONLY_DRIVER::writeFrom : Can't write with a RDONLY driver !");
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_MED_RDONLY_DRIVER::writeFrom : Can't write with a RDONLY driver !");
@@ -607,167 +79,211 @@ void MED_MED_RDONLY_DRIVER::writeFrom(void) const
 
 // ------------- Write Only Part --------------
 
 
 // ------------- Write Only Part --------------
 
-MED_MED_WRONLY_DRIVER::MED_MED_WRONLY_DRIVER():MED_MED_DRIVER()
+IMED_MED_WRONLY_DRIVER::IMED_MED_WRONLY_DRIVER()
 {
 }
 
 {
 }
 
-MED_MED_WRONLY_DRIVER::MED_MED_WRONLY_DRIVER(const string & fileName,  MED * const ptrMed):
-  MED_MED_DRIVER(fileName,ptrMed)
+IMED_MED_WRONLY_DRIVER::IMED_MED_WRONLY_DRIVER(const string & fileName,  MED * const ptrMed):
+  MED_MED_DRIVER(fileName,ptrMed,MED_EN::MED_ECRI)
 {}
 
 {}
 
-MED_MED_WRONLY_DRIVER::MED_MED_WRONLY_DRIVER(const MED_MED_WRONLY_DRIVER & driver):
+IMED_MED_WRONLY_DRIVER::IMED_MED_WRONLY_DRIVER(const IMED_MED_WRONLY_DRIVER & driver):
   MED_MED_DRIVER(driver)
 {}
 
   MED_MED_DRIVER(driver)
 {}
 
-MED_MED_WRONLY_DRIVER::~MED_MED_WRONLY_DRIVER()
+IMED_MED_WRONLY_DRIVER::~IMED_MED_WRONLY_DRIVER()
 {
   MESSAGE("MED_MED_WRONLY_DRIVER::~MED_MED_WRONLY_DRIVER() has been destroyed");
 } 
 
 {
   MESSAGE("MED_MED_WRONLY_DRIVER::~MED_MED_WRONLY_DRIVER() has been destroyed");
 } 
 
-GENDRIVER * MED_MED_WRONLY_DRIVER::copy(void) const
+void IMED_MED_WRONLY_DRIVER::read(void)
+  throw (MEDEXCEPTION)
 {
 {
-  return new MED_MED_WRONLY_DRIVER(*this) ;
+  throw MEDEXCEPTION("MED_MED_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
 }
 
-void MED_MED_WRONLY_DRIVER::read(void)
+void IMED_MED_WRONLY_DRIVER::readFileStruct(void)
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_MED_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
   throw (MEDEXCEPTION)
 {
   throw MEDEXCEPTION("MED_MED_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
-void MED_MED_WRONLY_DRIVER::readFileStruct(void)
-  throw (MEDEXCEPTION)
+// ------------- Read Write Part --------------
+
+IMED_MED_RDWR_DRIVER::IMED_MED_RDWR_DRIVER()
+{}
+
+IMED_MED_RDWR_DRIVER::IMED_MED_RDWR_DRIVER(const string & fileName,  MED * const ptrMed):
+  IMED_MED_RDONLY_DRIVER(fileName,ptrMed),IMED_MED_WRONLY_DRIVER(fileName,ptrMed),MED_MED_DRIVER(fileName,ptrMed,MED_REMP)
+{}
+
+IMED_MED_RDWR_DRIVER::IMED_MED_RDWR_DRIVER(const IMED_MED_RDWR_DRIVER & driver):
+  IMED_MED_RDONLY_DRIVER(driver),IMED_MED_WRONLY_DRIVER(driver),MED_MED_DRIVER(driver)
+{}
+
+IMED_MED_RDWR_DRIVER::~IMED_MED_RDWR_DRIVER() { 
+  MESSAGE("MED_MED_RDWR_DRIVER::~MED_MED_RDWR_DRIVER() has been destroyed");
+}
+
+MED_MED_RDONLY_DRIVER::MED_MED_RDONLY_DRIVER()
 {
 {
-  throw MEDEXCEPTION("MED_MED_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
+  MESSAGE("You are using the default constructor of the Med read only Driver and it is 2.1 one");
+  _concreteMedDrv = new MED_MED_RDONLY_DRIVER21();
 }
 
 }
 
-// This method ask the drivers of all MESH/FIELD objects created from this MED driver
-// to write themselves
-void MED_MED_WRONLY_DRIVER::writeFrom( void) const
-  throw (MEDEXCEPTION) //from object method write !
+MED_MED_RDONLY_DRIVER::MED_MED_RDONLY_DRIVER(const string & fileName,  MED * const ptrMed)
 {
 {
-  const char * LOC = "MED_MED_DRIVER::writeFrom() : ";
+  _concreteMedDrv = DRIVERFACTORY::buildMedDriverFromFile(fileName,ptrMed,MED_LECT);
+}
 
 
-  BEGIN_OF(LOC);
+MED_MED_RDONLY_DRIVER::MED_MED_RDONLY_DRIVER(const MED_MED_RDONLY_DRIVER & driver):MED_MED_DRIVER(driver)
+{
+}
 
 
-  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
-  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
+MED_MED_RDONLY_DRIVER::~MED_MED_RDONLY_DRIVER()
+{
+}
 
 
-  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
-  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
-  
-  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
-    try {
-      (*currentMesh).second->write(*this); 
-      // On utilise pour les objects MESH ET FIELD le write(GENDRIVER *) et le == ds GENDRIVER avec eventuellement 1 id 
-    }
-    catch ( const MED_DRIVER_NOT_FOUND_EXCEPTION & ex ) {
-      continue;
-    }
-  }
+void MED_MED_RDONLY_DRIVER::write          ( void ) const throw (MEDEXCEPTION)
+{
+  _concreteMedDrv->write();
+}
 
 
-  for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
-    try {
-      (*currentField).first->write(*this);
-    }
-    catch ( const MED_DRIVER_NOT_FOUND_EXCEPTION & ex ) {
-      continue;
-    }
-  }
+void MED_MED_RDONLY_DRIVER::writeFrom      ( void ) const throw (MEDEXCEPTION)
+{
+  _concreteMedDrv->writeFrom();
+}
 
 
-  END_OF(LOC);
+void MED_MED_RDONLY_DRIVER::open() throw (MEDEXCEPTION)
+{
+  _concreteMedDrv->open();
+}
 
 
+void MED_MED_RDONLY_DRIVER::close()
+{
+  _concreteMedDrv->close();
+}
+void MED_MED_RDONLY_DRIVER::read           ( void )
+{
+  _concreteMedDrv->read();
 }
 
 }
 
-void MED_MED_WRONLY_DRIVER::write(void ) const
-  throw (MEDEXCEPTION) // from object method write !
+void MED_MED_RDONLY_DRIVER::readFileStruct ( void )
 {
 {
-  const char * LOC = "MED_MED_DRIVER::write() : ";
-  int current;
+  _concreteMedDrv->readFileStruct();
+}
 
 
-  BEGIN_OF(LOC);
+GENDRIVER * MED_MED_RDONLY_DRIVER::copy ( void ) const
+{
+  return new MED_MED_RDONLY_DRIVER(*this);
+}
 
 
-  // BCLE SUR LES OBJETS AVEC AJOUT DE DRIVER ET APPELS write
+MED_MED_WRONLY_DRIVER::MED_MED_WRONLY_DRIVER()
+{
+  MESSAGE("You are using the default constructor of the Med write only Driver and it is 2.1 one");
 
 
-  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
-  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
+  _concreteMedDrv = new MED_MED_WRONLY_DRIVER21();
+}
 
 
-  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
-  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
-  
-  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
-    //current = (*currentMesh).second->addDriver(MED_DRIVER,_fileName);
-    current = (*currentMesh).second->addDriver(MED_DRIVER,_fileName,(*currentMesh).second->getName());
-    // put right _id in Mesh driver (same as this._id)
-    (*currentMesh).second->_drivers[current]->setId( getId() );
-    //(*currentMesh).second->write(current) ;
-  }
+MED_MED_WRONLY_DRIVER::MED_MED_WRONLY_DRIVER(const string & fileName,  MED * const ptrMed)
+{
+  _concreteMedDrv = DRIVERFACTORY::buildMedDriverFromFile(fileName,ptrMed,MED_ECRI);
+}
 
 
-  for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
-    //current = (*currentField).first->addDriver(MED_DRIVER,_fileName);
-    current = (*currentField).first->addDriver(MED_DRIVER,_fileName,(*currentField).first->getName());
-    // put right _id in Field driver (same as this._id)
-    (*currentField).first->_drivers[current]->setId( getId() );
-    //(*currentField).first->write(current) ;
-  }
+MED_MED_WRONLY_DRIVER::MED_MED_WRONLY_DRIVER(const MED_MED_WRONLY_DRIVER & driver):MED_MED_DRIVER(driver)
+{
+}
 
 
-  // that's work, but it is more efficenty to write directly when we had driver, no ?
-  writeFrom();
-  
-  END_OF(LOC);
+MED_MED_WRONLY_DRIVER::~MED_MED_WRONLY_DRIVER()
+{
+}
 
 
+void MED_MED_WRONLY_DRIVER::write          ( void ) const throw (MEDEXCEPTION)
+{
+  _concreteMedDrv->write();
 }
 
 }
 
-// ------------- Read Write Part --------------
+void MED_MED_WRONLY_DRIVER::writeFrom      ( void ) const throw (MEDEXCEPTION)
+{
+  _concreteMedDrv->writeFrom();
+}
+
+void MED_MED_WRONLY_DRIVER::open() throw (MEDEXCEPTION)
+{
+  _concreteMedDrv->open();
+}
+
+void MED_MED_WRONLY_DRIVER::close()
+{
+  _concreteMedDrv->close();
+}
+
+void MED_MED_WRONLY_DRIVER::read           ( void ) throw (MEDEXCEPTION) 
+{
+  _concreteMedDrv->read();
+}
+
+void MED_MED_WRONLY_DRIVER::readFileStruct ( void ) throw (MEDEXCEPTION) 
+{
+  _concreteMedDrv->readFileStruct();
+}
+
+GENDRIVER * MED_MED_WRONLY_DRIVER::copy ( void ) const
+{
+  return _concreteMedDrv->copy();
+}
 
 MED_MED_RDWR_DRIVER::MED_MED_RDWR_DRIVER()
 
 MED_MED_RDWR_DRIVER::MED_MED_RDWR_DRIVER()
-{}
+{
+  MESSAGE("You are using the default constructor of the Med read write Driver and it is 2.1 one");
+  _concreteMedDrv = new MED_MED_RDWR_DRIVER21();
+}
 
 
-MED_MED_RDWR_DRIVER::MED_MED_RDWR_DRIVER(const string & fileName,  MED * const ptrMed):
-  MED_MED_DRIVER(fileName,ptrMed)
-{}
+MED_MED_RDWR_DRIVER::MED_MED_RDWR_DRIVER(const string & fileName,  MED * const ptrMed)
+{
+  _concreteMedDrv = DRIVERFACTORY::buildMedDriverFromFile(fileName,ptrMed,MED_REMP);
+}
 
 MED_MED_RDWR_DRIVER::MED_MED_RDWR_DRIVER(const MED_MED_RDWR_DRIVER & driver):
   MED_MED_DRIVER(driver)
 
 MED_MED_RDWR_DRIVER::MED_MED_RDWR_DRIVER(const MED_MED_RDWR_DRIVER & driver):
   MED_MED_DRIVER(driver)
-{}
+{
+}
 
 
-MED_MED_RDWR_DRIVER::~MED_MED_RDWR_DRIVER() { 
-  MESSAGE("MED_MED_RDWR_DRIVER::~MED_MED_RDWR_DRIVER() has been destroyed");
+MED_MED_RDWR_DRIVER::~MED_MED_RDWR_DRIVER()
+{
+}
+
+void MED_MED_RDWR_DRIVER::write          ( void ) const throw (MEDEXCEPTION)
+{
+  _concreteMedDrv->write();
+}
+
+void MED_MED_RDWR_DRIVER::writeFrom      ( void ) const throw (MEDEXCEPTION)
+{
+  _concreteMedDrv->writeFrom();
 }
 
 }
 
-GENDRIVER * MED_MED_RDWR_DRIVER::copy(void) const
+void MED_MED_RDWR_DRIVER::open() throw (MEDEXCEPTION)
 {
 {
-  return new MED_MED_RDWR_DRIVER(*this) ;
+  _concreteMedDrv->open();
 }
 
 }
 
-void MED_MED_RDWR_DRIVER::read(void)
-  throw (MEDEXCEPTION) // from MED_MED_RDONLY_DRIVER::read()
+void MED_MED_RDWR_DRIVER::close()
 {
 {
-  BEGIN_OF("MED_MED_RDWR_DRIVER::read(void)");
-  MED_MED_RDONLY_DRIVER::read();
-  END_OF("MED_MED_RDWR_DRIVER::read(void)");
+  _concreteMedDrv->close();
 }
 
 }
 
-void MED_MED_RDWR_DRIVER::readFileStruct(void)
-  throw (MEDEXCEPTION) // from MED_MED_RDONLY_DRIVER::readFileStruct()
+void MED_MED_RDWR_DRIVER::read           ( void ) throw (MEDEXCEPTION) 
 {
 {
-  BEGIN_OF("MED_MED_RDWR_DRIVER::readFileStruct(void)");
-  MED_MED_RDONLY_DRIVER::readFileStruct();
-  END_OF("MED_MED_RDWR_DRIVER::readFileStruct(void)");
+  _concreteMedDrv->read();
 }
 
 }
 
-void MED_MED_RDWR_DRIVER::write(void) const
-  throw (MEDEXCEPTION) // from MED_MED_WRONLY_DRIVER::write()
+void MED_MED_RDWR_DRIVER::readFileStruct ( void ) throw (MEDEXCEPTION) 
 {
 {
-  BEGIN_OF("MED_MED_RDWR_DRIVER::write(void) const");
-  MED_MED_WRONLY_DRIVER::write();
-  END_OF("MED_MED_RDWR_DRIVER::write(void) const");
+  _concreteMedDrv->readFileStruct();
 }
 
 }
 
-void MED_MED_RDWR_DRIVER::writeFrom(void) const
-  throw (MEDEXCEPTION) // from MED_MED_WRONLY_DRIVER::writeFrom();
+GENDRIVER * MED_MED_RDWR_DRIVER::copy ( void ) const
 {
 {
-  BEGIN_OF("MED_MED_RDWR_DRIVER::writeFrom(void) const");
-  MED_MED_WRONLY_DRIVER::writeFrom();
-  END_OF("MED_MED_RDWR_DRIVER::writeFrom(void) const");
+  return _concreteMedDrv->copy();
 }
 }
index 7e948b1b420f7180e20ca0c3db84901a20c4b17c..028b696a0ff70931eadd5741ed55572cdd2a1d31 100644 (file)
@@ -27,10 +27,7 @@ class MED_MED_DRIVER : public GENDRIVER
 protected:
   
   MED * const       _ptrMed;         // Store 'MED_DRIVER (0..n)----(1) MED' associations
 protected:
   
   MED * const       _ptrMed;         // Store 'MED_DRIVER (0..n)----(1) MED' associations
-  MED_EN::med_idt           _medIdt;         // The _medIdt used to write/read Meshes to ::_filename
-   
-  //private:
-  //  MED_MED_DRIVER();
+  GENDRIVER * _concreteMedDrv;
 
 public :
   /*!
 
 public :
   /*!
@@ -58,22 +55,19 @@ public :
   */
   virtual ~MED_MED_DRIVER() ;
 
   */
   virtual ~MED_MED_DRIVER() ;
 
-  void open() throw (MEDEXCEPTION) ;
-  void close();
+  virtual void open() throw (MEDEXCEPTION) = 0  ;
+  virtual void close() = 0 ;
+  virtual void write          ( void ) const = 0 ;
+  virtual void writeFrom      ( void ) const = 0 ;
+  virtual void read           ( void ) = 0 ;
+  virtual void readFileStruct ( void ) = 0 ;
 
 
-  //virtual void write          ( void ) const = 0 ;
-  virtual void write          ( void ) const ;
-  //virtual void writeFrom      ( void ) const = 0 ;
-  virtual void writeFrom      ( void ) const  ;
-  //virtual void read           ( void ) = 0 ;
-  virtual void read           ( void )  ;
-  //virtual void readFileStruct ( void ) = 0 ;
-  virtual void readFileStruct ( void ) ;
-
-private:
-  //virtual GENDRIVER * copy ( void ) const = 0 ;
-  virtual GENDRIVER * copy ( void ) const  ;
+protected:
+  virtual GENDRIVER * copy ( void ) const = 0 ;
 
 
+  friend class MED_MED_RDONLY_DRIVER;
+  friend class MED_MED_WRONLY_DRIVER;
+  friend class MED_MED_RDWR_DRIVER;
 };
 
 /*!
 };
 
 /*!
@@ -84,26 +78,26 @@ private:
 
 */
 
 
 */
 
-class MED_MED_RDONLY_DRIVER : public virtual MED_MED_DRIVER
+class IMED_MED_RDONLY_DRIVER : public virtual MED_MED_DRIVER
 {
 public :
   /*!
     Constructor.
   */
 {
 public :
   /*!
     Constructor.
   */
-  MED_MED_RDONLY_DRIVER();
+  IMED_MED_RDONLY_DRIVER();
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_MED_RDONLY_DRIVER(const string & fileName,  MED * const ptrMed);
+  IMED_MED_RDONLY_DRIVER(const string & fileName,  MED * const ptrMed);
   /*!
     Copy constructor.
   */
   /*!
     Copy constructor.
   */
-  MED_MED_RDONLY_DRIVER(const MED_MED_RDONLY_DRIVER & driver);
+  IMED_MED_RDONLY_DRIVER(const IMED_MED_RDONLY_DRIVER & driver);
 
   /*!
     Destructor.
   */
 
   /*!
     Destructor.
   */
-  virtual ~MED_MED_RDONLY_DRIVER();
+  virtual ~IMED_MED_RDONLY_DRIVER();
 
   /*!
     Return a MEDEXCEPTION : it is the read-only driver.
 
   /*!
     Return a MEDEXCEPTION : it is the read-only driver.
@@ -113,20 +107,6 @@ public :
     Return a MEDEXCEPTION : it is the read-only driver.
   */
   void writeFrom      ( void ) const throw (MEDEXCEPTION) ;
     Return a MEDEXCEPTION : it is the read-only driver.
   */
   void writeFrom      ( void ) const throw (MEDEXCEPTION) ;
-  /*!
-    Read all from the file.
-  */
-  void read           ( void ) throw (MEDEXCEPTION);
-  /*!
-    Read only table of contents of the file.
-
-    All objects are created but there values are not read.
-  */
-  void readFileStruct ( void ) throw (MEDEXCEPTION) ;
-
-private:
-  virtual GENDRIVER * copy ( void ) const ;
-
 };
 
 /*!
 };
 
 /*!
@@ -137,36 +117,28 @@ private:
 
 */
 
 
 */
 
-class MED_MED_WRONLY_DRIVER : public virtual MED_MED_DRIVER
+class IMED_MED_WRONLY_DRIVER : public virtual MED_MED_DRIVER
 {
 
 public :
   /*!
     Constructor.
   */
 {
 
 public :
   /*!
     Constructor.
   */
-  MED_MED_WRONLY_DRIVER();
+  IMED_MED_WRONLY_DRIVER();
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_MED_WRONLY_DRIVER(const string & fileName,  MED * const ptrMed);
+  IMED_MED_WRONLY_DRIVER(const string & fileName,  MED * const ptrMed);
   /*!
     Copy constructor.
   */
   /*!
     Copy constructor.
   */
-  MED_MED_WRONLY_DRIVER(const MED_MED_WRONLY_DRIVER & driver);
+  IMED_MED_WRONLY_DRIVER(const IMED_MED_WRONLY_DRIVER & driver);
 
   /*!
     Destructor.
   */
 
   /*!
     Destructor.
   */
-  virtual ~MED_MED_WRONLY_DRIVER();
+  virtual ~IMED_MED_WRONLY_DRIVER();
 
 
-  /*!
-    Write all in file.
-  */
-  void write          ( void ) const throw (MEDEXCEPTION);
-  /*!
-    Write only objects created from this MED driver in file.
-  */
-  void writeFrom      ( void ) const throw (MEDEXCEPTION);
   /*!
     Return a MEDEXCEPTION : it is the write-only driver.
   */
   /*!
     Return a MEDEXCEPTION : it is the write-only driver.
   */
@@ -176,9 +148,6 @@ public :
   */
   void readFileStruct ( void ) throw (MEDEXCEPTION) ;
 
   */
   void readFileStruct ( void ) throw (MEDEXCEPTION) ;
 
-private:
-  virtual GENDRIVER * copy ( void ) const ;
-
 };
 
 /*!
 };
 
 /*!
@@ -189,52 +158,83 @@ private:
 
 */
 
 
 */
 
-class MED_MED_RDWR_DRIVER : public virtual MED_MED_RDONLY_DRIVER,
-                           public virtual MED_MED_WRONLY_DRIVER
+class IMED_MED_RDWR_DRIVER : public virtual IMED_MED_RDONLY_DRIVER,
+                            public virtual IMED_MED_WRONLY_DRIVER
 {
 
 public :
   /*!
     Constructor.
   */
 {
 
 public :
   /*!
     Constructor.
   */
-  MED_MED_RDWR_DRIVER();
+  IMED_MED_RDWR_DRIVER();
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_MED_RDWR_DRIVER(const string & fileName,  MED * const ptrMed);
+  IMED_MED_RDWR_DRIVER(const string & fileName,  MED * const ptrMed);
   /*!
     Copy constructor.
   */
   /*!
     Copy constructor.
   */
-  MED_MED_RDWR_DRIVER(const MED_MED_RDWR_DRIVER & driver);
+  IMED_MED_RDWR_DRIVER(const IMED_MED_RDWR_DRIVER & driver);
 
   /*!
     Destructor.
   */
 
   /*!
     Destructor.
   */
-  ~MED_MED_RDWR_DRIVER();
-
-  /*!
-    Write all in file.
-  */
-  void write          ( void ) const throw (MEDEXCEPTION);
-  /*!
-    Write only objects created from this MED driver in file.
-  */
-  void writeFrom      ( void ) const throw (MEDEXCEPTION);
-  /*!
-    Read all from the file.
-  */
-  void read           ( void ) throw (MEDEXCEPTION);
-  /*!
-    Read only table of contents of the file.
+  ~IMED_MED_RDWR_DRIVER();
 
 
-    All objects are created but there values are not read.
-  */
-  void readFileStruct ( void ) throw (MEDEXCEPTION);
+};
 
 
+class MED_MED_RDONLY_DRIVER : public virtual IMED_MED_RDONLY_DRIVER
+{
+public :
+  MED_MED_RDONLY_DRIVER();
+  MED_MED_RDONLY_DRIVER(const string & fileName,  MED * const ptrMed);
+  MED_MED_RDONLY_DRIVER(const MED_MED_RDONLY_DRIVER & driver);
+  virtual ~MED_MED_RDONLY_DRIVER();
+  void write          ( void ) const throw (MEDEXCEPTION) ;
+  void writeFrom      ( void ) const throw (MEDEXCEPTION) ;
+  virtual void open() throw (MEDEXCEPTION) ;
+  virtual void close() ;
+  virtual void read           ( void ) ;
+  virtual void readFileStruct ( void ) ;
 private:
 private:
-  virtual GENDRIVER * copy ( void ) const ;
+  GENDRIVER * copy ( void ) const;
+};
+
+class MED_MED_WRONLY_DRIVER : public virtual IMED_MED_WRONLY_DRIVER
+{
 
 
+public :
+  MED_MED_WRONLY_DRIVER();
+  MED_MED_WRONLY_DRIVER(const string & fileName,  MED * const ptrMed);
+  MED_MED_WRONLY_DRIVER(const MED_MED_WRONLY_DRIVER & driver);
+  virtual ~MED_MED_WRONLY_DRIVER();
+  void write          ( void ) const throw (MEDEXCEPTION) ;
+  void writeFrom      ( void ) const throw (MEDEXCEPTION) ;
+  virtual void open() throw (MEDEXCEPTION) ;
+  virtual void close() ;
+  virtual void read           ( void ) throw (MEDEXCEPTION) ;
+  virtual void readFileStruct ( void ) throw (MEDEXCEPTION) ;
+private:
+  GENDRIVER * copy ( void ) const;
 };
 };
+
+class MED_MED_RDWR_DRIVER : public IMED_MED_RDWR_DRIVER
+{
+
+public :
+  MED_MED_RDWR_DRIVER();
+  MED_MED_RDWR_DRIVER(const string & fileName,  MED * const ptrMed);
+  MED_MED_RDWR_DRIVER(const MED_MED_RDWR_DRIVER & driver);
+  ~MED_MED_RDWR_DRIVER();
+  void write          ( void ) const throw (MEDEXCEPTION) ;
+  void writeFrom      ( void ) const throw (MEDEXCEPTION) ;
+  virtual void open() throw (MEDEXCEPTION) ;
+  virtual void close() ;
+  virtual void read           ( void ) throw (MEDEXCEPTION) ;
+  virtual void readFileStruct ( void ) throw (MEDEXCEPTION) ;
+private:
+  GENDRIVER * copy ( void ) const;
 };
 };
+}
 
 #endif /* MED_MED_DRIVER_HXX */
 
 #endif /* MED_MED_DRIVER_HXX */
diff --git a/src/MEDMEM/MEDMEM_MedMedDriver21.cxx b/src/MEDMEM/MEDMEM_MedMedDriver21.cxx
new file mode 100644 (file)
index 0000000..b6527a5
--- /dev/null
@@ -0,0 +1,794 @@
+#include "MEDMEM_Compatibility21_22.hxx"
+#include "MEDMEM_MedMedDriver21.hxx"
+#include "MEDMEM_MedMeshDriver.hxx"
+#include "MEDMEM_DriversDef.hxx"
+
+#include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_Grid.hxx"
+#include "MEDMEM_Field.hxx"
+// EN ATTENDANT L'utilisation de MedFieldDriver.hxx ds Field.hxx
+#include "MEDMEM_MedFieldDriver.hxx"
+#include "MEDMEM_Med.hxx"
+#include "MEDMEM_define.hxx"
+
+#include <string>
+
+using namespace std;
+using namespace MED_EN;
+using namespace MEDMEM;
+
+MED_MED_DRIVER21::MED_MED_DRIVER21(): _medIdt(MED_INVALID) 
+{}
+
+MED_MED_DRIVER21::MED_MED_DRIVER21(const string & fileName,  MED * const ptrMed):
+  MED_MED_DRIVER(fileName,ptrMed), _medIdt(MED_INVALID)
+{
+  //_ptrMed->addDriver(*this); // The specific MED driver id is set within the addDriver method.
+}
+
+MED_MED_DRIVER21::MED_MED_DRIVER21(const string & fileName,
+                                  MED * const ptrMed,
+                                  MED_EN::med_mode_acces accessMode):
+  MED_MED_DRIVER(fileName,ptrMed,accessMode), _medIdt(MED_INVALID)
+{
+}
+//REM :  As t'on besoin du champ _status :  _medIdt <-> _status  ?  Oui
+
+MED_MED_DRIVER21::MED_MED_DRIVER21(const MED_MED_DRIVER21 & driver):
+  MED_MED_DRIVER(driver),_medIdt(driver._medIdt)
+{
+}
+
+MED_MED_DRIVER21::~MED_MED_DRIVER21()
+{
+  MESSAGE("MED_MED_DRIVER21::~MED_MED_DRIVER21() has been destroyed");
+}
+
+void MED_MED_DRIVER21::read()
+{
+}
+void MED_MED_DRIVER21::readFileStruct()
+{
+}
+void MED_MED_DRIVER21::write() const
+{
+}
+GENDRIVER * MED_MED_DRIVER21::copy(void) const
+{
+  return new MED_MED_DRIVER21(*this) ;
+}
+void MED_MED_DRIVER21::writeFrom() const
+{
+}
+
+void MED_MED_DRIVER21::open()
+  throw (MEDEXCEPTION)
+{
+
+  const char * LOC ="MED_MED_DRIVER21::open() : ";
+  BEGIN_OF(LOC);
+
+  // REFLECHIR SUR CE TEST PAR RAPPORT A L'OUVERTURE/FERMETURE
+//    if ( _medIdt != MED_INVALID ) 
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+//                                       << "_medIdt is already in use, please close the file |" 
+//                                       << _fileName << "| before calling open()"
+//                                       )
+//                            );   
+  
+//    if ( _status != MED_CLOSED ) 
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+//                                       << "_status is closed, please close the file |"
+//                                       << _fileName << "| before calling open()"
+//                                       )
+//                            );
+  
+  if ( _fileName == "" )
+    throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+                                     << "_fileName is |\"\"|, please set a correct fileName before calling open()"
+                                     )
+                          );
+  
+  MESSAGE(LOC<<"_fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
+  _medIdt = med_2_1::MEDouvrir( (const_cast <char *> (_fileName.c_str())), (med_2_1::med_mode_acces) _accessMode);
+  MESSAGE(LOC<<" _medIdt = "<<_medIdt);
+  
+  if (_medIdt > 0) 
+    _status=MED_OPENED; 
+  else {
+    _status = MED_CLOSED;
+    _medIdt = MED_INVALID;
+    throw MED_EXCEPTION (LOCALIZED( STRING(LOC) 
+                                    << "Can't open |"  << _fileName 
+                                    << "|, _medIdt : " << _medIdt
+                                    )
+                         );
+  }
+
+  END_OF(LOC);
+}
+
+
+void MED_MED_DRIVER21::close()
+{
+  med_2_1::med_int err = 0;
+  const char * LOC = "MED_MED_DRIVER21::close() : ";
+  
+  
+//    if ( _status == MED_CLOSED)
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << ": the file |" 
+//                                       << _fileName << "| is already closed"
+//                                       )
+//                            );
+   
+//    if ( _medIdt == MED_INVALID ) 
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "_medIdt invalid, but the file |" 
+//                                       << _fileName << "| seems to be openned !"
+//                                       )
+//                            );   
+
+  if ( _medIdt != MED_INVALID )
+    err=med_2_1::MEDfermer(_medIdt);
+  
+//    if (err != MED_VALID) 
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "the file |" 
+//                                       << _fileName << "| couldn't be closed"
+//                                       )
+//                            );   
+  
+  _status = MED_CLOSED;
+  _medIdt = MED_INVALID;
+    
+  END_OF(LOC);
+}
+
+
+// ------------- Read Only Part --------------
+
+MED_MED_RDONLY_DRIVER21::MED_MED_RDONLY_DRIVER21()
+{
+}
+
+MED_MED_RDONLY_DRIVER21::MED_MED_RDONLY_DRIVER21(const string & fileName,  MED * const ptrMed):
+  IMED_MED_RDONLY_DRIVER(fileName,ptrMed),MED_MED_DRIVER21(fileName,ptrMed,MED_EN::MED_RDONLY),MED_MED_DRIVER(fileName,ptrMed,MED_EN::MED_RDONLY)
+{
+  MESSAGE("MED_MED_RDONLY_DRIVER21::MED_MED_RDONLY_DRIVER21(const string & fileName,  MED * const ptrMed) Constructeur read only");
+}
+
+MED_MED_RDONLY_DRIVER21::MED_MED_RDONLY_DRIVER21(const MED_MED_RDONLY_DRIVER21 & driver):
+  IMED_MED_RDONLY_DRIVER(driver) ,MED_MED_DRIVER21(driver),MED_MED_DRIVER(driver)
+{
+}
+
+MED_MED_RDONLY_DRIVER21::~MED_MED_RDONLY_DRIVER21()
+{
+  MESSAGE("MED_MED_RDONLY_DRIVER21::~MED_MED_RDONLY_DRIVER21() has been destroyed");
+} 
+
+GENDRIVER * MED_MED_RDONLY_DRIVER21::copy(void) const
+{
+  return new MED_MED_RDONLY_DRIVER21(*this) ;
+}
+
+void MED_MED_RDONLY_DRIVER21::write          ( void ) const throw (MEDEXCEPTION)
+{
+  IMED_MED_RDONLY_DRIVER::write();
+}
+
+void MED_MED_RDONLY_DRIVER21::writeFrom      ( void ) const throw (MEDEXCEPTION)
+{
+  IMED_MED_RDONLY_DRIVER::writeFrom();
+}
+
+void MED_MED_RDONLY_DRIVER21::readFileStruct( void ) 
+  throw (MEDEXCEPTION)
+{
+  const char * LOC = "MED_MED_DRIVER21::readFileStruct() : ";
+  int          err,i,j;
+      
+  BEGIN_OF(LOC);
+
+  if ( _medIdt == MED_INVALID ) 
+    throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+                                     << "_medIdt is invalid, please open the file |" 
+                                     << _fileName << "| before calling readFileStruct()"
+                                     )
+                          );   
+  // Read number of meshes and their associated name
+  {
+    int          numberOfMeshes;
+    char         meshName[MED_TAILLE_NOM+1]="";
+    char         meshDescription[MED_TAILLE_DESC+1]="";
+    med_2_1::med_int          meshDim;
+    MESH *       ptrMesh;
+    //    MED_MESH_RDWR_DRIVER * ptrDriver; !! UNUSED VARIABLE !!
+    
+    numberOfMeshes = med_2_1::MEDnMaa(_medIdt) ;
+    if ( numberOfMeshes <= 0 ) 
+      MESSAGE(LOC << "Be careful there is no mesh in file |"<<_fileName<<"| !");
+
+    MESH_ENTITIES::const_iterator currentEntity; 
+    for (i=1;i<=numberOfMeshes;i++) {
+
+      // find out if the mesh is a Grid
+      
+      med_2_1::med_int isAGrid = false;
+      med_2_1::med_grid_type type;
+      
+      err = MEDgridInfo (_medIdt, i, &isAGrid, &type);
+      if (err != MED_VALID) 
+        throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "error in MEDgridInfo()") );
+
+      err = med_2_1::MEDmaaInfo(_medIdt, i ,meshName, &meshDim) ;
+
+      strcpy(meshDescription,"Mesh from Med 2.2 format");
+
+      if (err != MED_VALID) 
+        throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << ": can't get information about the mesh n°"
+                                         << i <<" of the file |" << _fileName << "| !"
+                                         )
+                              );   
+      MESSAGE(LOC<<": Mesh n°"<<i<<" nammed "<<meshName);
+
+      if (isAGrid)
+        ptrMesh = new GRID((MED_EN::med_grid_type) type);
+      else
+       ptrMesh = new MESH();
+
+      //MED_MESH_RDWR_DRIVER * _ptrDriver = new MED_MESH_RDWR_DRIVER(_fileName, ptrMesh);
+      MED_EN::med_mode_acces myMode = getAccessMode();
+//       MED_MESH_DRIVER * ptrDriver ;
+//       switch (myMode) {
+//       case MED_EN::MED_LECT:
+//     ptrDriver = new MED_MESH_RDONLY_DRIVER(_fileName, ptrMesh);
+//     break ;
+//       case MED_EN::MED_REMP:        
+//     ptrDriver = new MED_MESH_RDWR_DRIVER(_fileName, ptrMesh);
+//     break ;
+//       case MED_EN::MED_ECRI: // should never append !!
+//     ptrDriver = new MED_MESH_RDONLY_DRIVER(_fileName, ptrMesh);
+//     break;
+//       default:
+//     throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
+//       }
+
+      GENDRIVER * ptrDriver =
+       DRIVERFACTORY::buildConcreteMedDriverForMesh(_fileName, ptrMesh,
+                                                    meshName, myMode, V21);
+
+      ptrDriver->setId       ( getId() );
+      ptrDriver->setMeshName ( meshName );
+      ptrMesh->setDescription(meshDescription);
+
+      SCRUTE(ptrDriver);
+
+      ptrMesh->addDriver(*ptrDriver);
+      delete ptrDriver ;
+
+      if (isAGrid)
+       _ptrMed->_meshes[meshName] = (MESH *) ptrMesh;
+      else
+       _ptrMed->_meshes[meshName] = ptrMesh;
+
+      ptrMesh->setName(meshName);
+
+      SCRUTE(ptrMesh);
+
+      MESSAGE(LOC<<"is" << (isAGrid ? "" : " NOT") << " a GRID and its name is "<<ptrMesh->getName());
+
+      // we create all global support (for each entity type :
+      int index = 0;
+      for (currentEntity=meshEntities.begin();currentEntity != meshEntities.end(); currentEntity++) {
+       string supportName="SupportOnAll_" ;
+       supportName+=entNames[(*currentEntity).first] ;
+       //(_ptrMed->_support)[meshName][(MED_EN::medEntityMesh)(*currentEntity).first]=new SUPPORT(ptrMesh,supportName,(MED_EN::medEntityMesh) (*currentEntity).first) ;
+       SUPPORT* mySupport = new SUPPORT() ;
+       mySupport->setName(supportName);
+       mySupport->setMesh(ptrMesh);
+       mySupport->setEntity((MED_EN::medEntityMesh) (*currentEntity).first);
+       mySupport->setAll(true);
+       (_ptrMed->_support)[meshName][(MED_EN::medEntityMesh)(*currentEntity).first] = mySupport ;
+       MESSAGE(LOC<< "The support " << supportName.c_str() << " on entity " << (*currentEntity).first << " is built");
+       index++;
+      }
+      MESSAGE(LOC <<"The mesh " <<ptrMesh->getName() << " has " << index << " support(s)");
+    }
+
+    map<MESH_NAME_, map<MED_EN::medEntityMesh,SUPPORT *> >::const_iterator const_itSupportOnMesh ;
+
+    int index = 0;
+
+    vector<SUPPORT *> vectSupp;
+    for (const_itSupportOnMesh=_ptrMed->_support.begin(); const_itSupportOnMesh != _ptrMed->_support.end();
+        const_itSupportOnMesh++ )
+      {
+       map<MED_EN::medEntityMesh,SUPPORT *>::const_iterator const_itSupport ;
+       for (const_itSupport=(*const_itSupportOnMesh).second.begin();
+            const_itSupport!=(*const_itSupportOnMesh).second.end();const_itSupport++) index++;
+      }
+
+    MESSAGE(LOC << "In this MED object there is(are) " << index << " support(s):");
+
+    vectSupp.resize(index);
+
+    index = 0;
+    for (const_itSupportOnMesh=_ptrMed->_support.begin(); const_itSupportOnMesh != _ptrMed->_support.end();
+        const_itSupportOnMesh++ )
+      {
+       map<MED_EN::medEntityMesh,SUPPORT *>::const_iterator const_itSupport ;
+       for (const_itSupport=(*const_itSupportOnMesh).second.begin();
+            const_itSupport!=(*const_itSupportOnMesh).second.end();const_itSupport++)
+         {
+           vectSupp[index] = (*const_itSupport).second;
+           SCRUTE(vectSupp[index]);
+           MESSAGE(LOC << "Support number " << index << " is "<< *vectSupp[index]);
+           index++;
+         }
+      }
+
+  }
+  
+  
+  // Read number of fields, their associated name and their list of (timeStepNumber,iterationNumber)
+  {
+    int                           numberOfFields              = 0;      //MED_INVALID
+    //    char                          fieldName[MED_TAILLE_NOM+1] = "";
+    char                          fieldName[MED_TAILLE_NOM+1] ;
+    int                           numberOfComponents           = 0;
+    char                          * componentName              = (char *) MED_NULL;
+    char                          * unitName                   =  (char *) MED_NULL;
+    //    char                          meshName[MED_TAILLE_NOM+1]  = "";
+    char                          meshName[MED_TAILLE_NOM+1]  ;
+    med_2_1::med_type_champ        type;
+    MESH                          * ptrMesh                        = (MESH  *) MED_NULL;
+    FIELD_                        * ptrField                       = (FIELD_ *) MED_NULL;
+    //MED_FIELD_RDWR_DRIVER         * ptrDriver                      = (MED_FIELD_RDWR_DRIVER * ) MED_NULL;
+    GENDRIVER                     * ptrDriver                      = (GENDRIVER * ) MED_NULL;
+    SUPPORT                       * ptrSupport                     = (SUPPORT *   ) MED_NULL;
+    MESH_ENTITIES::const_iterator currentEntity; 
+    list<MED_EN::medGeometryElement>::const_iterator currentGeometry;
+    med_2_1::med_int                           NbOfGaussPts                 =  0;
+    int                           numberOfTimeSteps            =  -1;
+    med_2_1::med_int                           timeStepNumber               =  -1;
+    //    char                          timeStepUnit[MED_TAILLE_PNOM]= "";
+    char                          timeStepUnit[MED_TAILLE_PNOM21+1] ;
+    double                        timeStep                     = 0.0;
+    med_2_1::med_int                           orderNumber                  =  -1;                           //???init?????
+    map<MESH_NAME_,MESH*>      & _meshes   =  _ptrMed->_meshes; 
+    map<FIELD_NAME_,MAP_DT_IT_> & _fields   =  _ptrMed->_fields; 
+    map<FIELD_ *, MESH_NAME_>  & _meshName =  _ptrMed->_meshName; 
+    map<MESH_NAME_, map<MED_EN::medEntityMesh,SUPPORT *> > & support = _ptrMed->_support;
+
+    
+    numberOfFields = med_2_1::MEDnChamp(_medIdt,0) ;
+    if ( numberOfFields <= 0 ) 
+      MESSAGE(LOC << "Be careful there is no field in file |"<<_fileName<<"| !");
+  
+    for (i=1;i<=numberOfFields;i++) {
+
+      numberOfComponents = med_2_1::MEDnChamp(_medIdt,i) ;
+      if ( numberOfComponents <= 0 ) 
+        if (err != MED_VALID) 
+          throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) <<  "Be careful there is no compound for field n°" 
+                                           << i << "in file |"<<_fileName<<"| !"));
+      
+      componentName = new char[numberOfComponents*MED_TAILLE_PNOM21+1] ;
+      unitName      = new char[numberOfComponents*MED_TAILLE_PNOM21+1] ;   
+      
+      err = MEDchampInfo(_medIdt, i, fieldName, &type, componentName, 
+                         unitName, numberOfComponents) ;
+
+      if (err != MED_VALID) 
+        throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+                                         << ": can't get information about the field n°"
+                                         << i <<" of the file |" << _fileName << "| !")); 
+      
+      MESSAGE(LOC << "Field n°"<<i<<" nammed "<< fieldName 
+              << " ,component(s)  : " << componentName 
+              <<" ,unit(s) : "        << unitName);
+      
+
+      // Loop on all (entity type,geometry type) until you find an existing one then
+      // get the (n°dt,n°it) pairs list for the current (field,entity type,geometry type)
+      // We suppose there is the same list whatever the existing (entity type,geometry type) pair  
+      // support map :
+      for (currentEntity=meshEntities.begin();currentEntity != meshEntities.end(); currentEntity++) { 
+       //         numberOfTimeSteps  MUST be given by MEDchampInfo !!!!!
+       for (currentGeometry  = (*currentEntity).second.begin();currentGeometry != (*currentEntity).second.end(); currentGeometry++) {
+         MESSAGE("Field information with Entity,Geom = "<<(*currentEntity).first<<","<<(*currentGeometry));
+         numberOfTimeSteps = MEDnPasdetemps(_medIdt, fieldName,
+                                            (med_2_1::med_entite_maillage)(*currentEntity).first,
+                                            (med_2_1::med_geometrie_element) (*currentGeometry) );
+         MESSAGE("Field information 2 : NumberOfTimeStep :"<<numberOfTimeSteps);
+         if ( numberOfTimeSteps > MED_VALID ) 
+           break ; // There are value for some med_geometrie_element of this med_entite_maillage.
+       }
+       if (numberOfTimeSteps>0) // we have at least one
+         
+         for (currentGeometry  = (*currentEntity).second.begin();currentGeometry != (*currentEntity).second.end(); currentGeometry++) {            
+           
+           MESSAGE("Field information 3 : Geom : "<<(*currentGeometry));
+           for (j=1;j <= numberOfTimeSteps; j++) {
+             
+             MESSAGE("Field information 4 : time step j = "<<j);
+             err = MEDpasdetempsInfo( _medIdt, fieldName,
+                                      (med_2_1::med_entite_maillage) (*currentEntity).first, 
+                                      (med_2_1::med_geometrie_element) (*currentGeometry),j, 
+                                      meshName, &NbOfGaussPts,
+                                      &timeStepNumber, timeStepUnit, &timeStep,
+                                      &orderNumber);
+             if (err == MED_VALID) { // we have found for (*currentEntity).first and (*currentGeometry)
+               
+               MESSAGE("Field information 5 ;: NumberOfGaussPoint : "<<NbOfGaussPts<<", timeStepNumber : "<<timeStepNumber);
+               // CORRECT a bug in MEDpasdetempsInfo :
+               // we get a value n'importe quoi in NbOfGaussPts !!!!
+               
+               if (NbOfGaussPts>100)
+                 NbOfGaussPts=1 ;
+               if (timeStepNumber<0)
+                 timeStepNumber=-1 ;
+               
+               
+               // ATTENTION TRAITER L'EXCEPTION !!!!!!!!!!!!
+               
+               // Il faudra traiter le cas d'un champ qui utilise +sieurs (entity,geom) voir le travail de patrick
+               // Il faudra traiter le cas des profils...
+               //             ptrField = new FIELD();
+               //             _ptrDriver = new MED_FIELD_RDWR_DRIVER(_fileName, ptrField);
+               //             ptrField->addDriver(_ptrDriver);
+               //             _fields[fieldName]=ptrField;
+               
+               // Verify meshName is already known
+               
+               map<MESH_NAME_,MESH*>::iterator _meshesIt = _meshes.find(meshName);
+               if ( _meshesIt == _meshes.end() ) {
+                 MESSAGE(LOC << "There is no mesh |"
+                         << meshName                            <<"| in the file |"
+                         << _fileName <<"|, but  |" << meshName <<"| is referenced by field |"
+                         << fieldName                           <<"|, entity : |"
+                         << entNames [(*currentEntity).first] <<"|, geometric element of type |" 
+                         << geoNames [(*currentGeometry)]     <<"|" 
+                         ); 
+               }  // POURQUOI SI JE NE MET PAS DE BLOCK J'AI UN PARSE ERROR : PG : c'est la macro MESSAGE qui fait ca !
+               else 
+                 ptrMesh = _meshes[meshName];
+               
+               ptrSupport     =  support[meshName][(MED_EN::medEntityMesh) (*currentEntity).first];
+               if (NbOfGaussPts != 1)
+                 throw MEDEXCEPTION(LOCALIZED( STRING(LOC) <<"Number of Gauss Point must be equal to 1 for instance")) ;
+               
+               // init to null to prevent some error if not correctly allocated !
+               ptrField = (FIELD_*)NULL ;
+//             ptrDriver = (GENDRIVER*)NULL ;
+
+               switch ( type) {
+               case med_2_1::MED_INT64 :
+                 if ( sizeof(med_2_1::med_int) != 8 )
+                   throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) <<
+                                                    " The Field type of |"
+                                                    << fieldName                         <<"|, entity : |"
+                                                    << entNames [(*currentEntity).first] <<"|, geometric element of type |" 
+                                                    << geoNames [(*currentGeometry) ]    <<
+                                                    "| is  MED_INT64 but size of med_int is not equal to 8 bytes !" 
+                                                    ) 
+                                         );
+                 break;
+               case med_2_1::MED_INT32 : {
+//               throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) <<
+//                                                "NOT IMPLEMENTED : BUG IN STL !")
+//                                     ) ;
+                 // ptrField       =  new FIELD<med_2_1::med_int>   ( ptrSupport,numberOfComponents );   // Les valeurs du champ ne doivent pas Ãªtre lue pour l'instant
+
+                 ptrField       =  new FIELD<int> ( );   // Les valeurs du champ ne doivent pas Ãªtre lue pour l'instant
+                 ((FIELD<int>*) ptrField)->setSupport(ptrSupport);
+                 ((FIELD<int>*) ptrField)->setNumberOfComponents(numberOfComponents);
+                 ((FIELD<int>*) ptrField)->setName(fieldName) ; //provisoire, pour debug
+                 MESSAGE("#### SET NAME in FIELD : "<<fieldName);
+
+                 MED_EN::med_mode_acces myMode = getAccessMode();
+//               switch (myMode) {
+//               case MED_EN::MED_LECT:
+//                 ptrDriver = new MED_FIELD_RDONLY_DRIVER<int>(_fileName, (FIELD<int> *)ptrField);
+//                 break ;
+//               case MED_EN::MED_REMP:        
+//                 ptrDriver = new MED_FIELD_RDWR_DRIVER<int>(_fileName, (FIELD<int> *)ptrField);
+//                 break ;
+//               case MED_EN::MED_ECRI: // should never append !!
+//                 ptrDriver = new MED_FIELD_RDONLY_DRIVER<int>(_fileName, (FIELD<int> *)ptrField);
+//                 break;
+//               default:
+//                 throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
+//               }
+
+                 ptrDriver = DRIVERFACTORY::buildConcreteMedDriverForField<int>(_fileName, (FIELD<int> *)ptrField, myMode, V21);
+
+                 SCRUTE(ptrDriver);
+
+                 break;
+               }
+               case med_2_1::MED_REEL64 : {
+                 //              ptrField       =  new FIELD<med_2_1::med_float> ( ptrSupport,numberOfComponents );   // Les valeurs du champ ne doivent pas Ãªtre lue pour l'instant
+                 ptrField       =  new FIELD<double> ( );   // Les valeurs du champ ne doivent pas Ãªtre lue pour l'instant
+                 ((FIELD<med_2_1::med_float>*) ptrField)->setSupport(ptrSupport);
+                 ((FIELD<med_2_1::med_float>*) ptrField)->setNumberOfComponents(numberOfComponents);
+                 ((FIELD<med_2_1::med_float>*) ptrField)->setName(fieldName) ; //provisoire, pour debug
+                 MESSAGE("#### SET NAME in FIELD : "<<fieldName);
+
+                 MED_EN::med_mode_acces myMode = getAccessMode();
+//               switch (myMode) {
+//               case MED_EN::MED_LECT:
+//                 ptrDriver = new MED_FIELD_RDONLY_DRIVER<med_2_1::med_float>(_fileName, (FIELD<med_2_1::med_float> *)ptrField);
+//                 break ;
+//               case MED_EN::MED_REMP:        
+//                 ptrDriver = new MED_FIELD_RDWR_DRIVER<med_2_1::med_float>(_fileName, (FIELD<med_2_1::med_float> *)ptrField);
+//                 break ;
+//               case MED_EN::MED_ECRI: // should never append !!
+//                 ptrDriver = new MED_FIELD_RDONLY_DRIVER<med_2_1::med_float>(_fileName, (FIELD<med_2_1::med_float> *)ptrField);
+//                 break;
+//               default:
+//                 throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
+//               }
+
+                 ptrDriver = DRIVERFACTORY::buildConcreteMedDriverForField<med_2_1::med_float>(_fileName, (FIELD<med_2_1::med_float> *)ptrField, myMode, V21);
+                 SCRUTE(ptrDriver);
+
+                 break;
+               }
+               default : {
+                 if ( numberOfTimeSteps > 1) 
+                   throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) <<
+                                                    " The Field type of |"
+                                                    << fieldName                         <<"|, entity : |"
+                                                    << entNames [(*currentEntity).first] 
+                                                    <<"|, geometric element of type |" 
+                                                    << geoNames [(*currentGeometry)]     
+                                                    <<"| is neither MED_INT, MED_INT32, MED_INT64 nor MED_REEL64 !" 
+                                                    ) 
+                                         );
+                 break ;
+               }
+               }
+               ptrField->setValueType((MED_EN::med_type_champ) type) ; // need to write field !
+               
+               MESSAGE("timeStepNumber :"<<timeStepNumber<<",orderNumber :"<<orderNumber);
+               ptrField->setIterationNumber ( timeStepNumber);      // A ajouter dans la classe FIELD
+               ptrField->setOrderNumber     ( orderNumber); 
+               ptrField->setTime            ( timeStep); 
+               
+               // Create a driver for this (field n°dt,n°it)
+                ptrDriver->setId            ( getId() );
+               MESSAGE("###### ptrDriver->setFieldName : #"<<fieldName<<"#");
+               ptrDriver->setFieldName(fieldName);
+               ptrField->addDriver(*ptrDriver);
+               // driver is duplicated : remove it
+               delete ptrDriver;
+
+               DT_IT_ dtIt;
+               dtIt.dt  = timeStepNumber;
+               dtIt.it  = orderNumber;
+               
+               (_fields  [fieldName])[dtIt] = ptrField;
+               _meshName[ptrField ]       = meshName;
+             }
+           }
+         }
+      }
+      delete[] componentName ;
+      delete[] unitName ;
+    }
+  }
+  
+  // read profil count and their names
+  //  int support_count_= 0 ; !! UNUSED VARIABLE !!
+  // il faut lire les champs pour avoir les profils stockes !!!
+  // il faudrait implémenter la lecture des profils dans med !!!
+  
+  END_OF(LOC);
+  
+}
+
+// This method ask the drivers of all MESH/FIELD objects created from this MED driver
+// to read themselves
+void MED_MED_RDONLY_DRIVER21::read( void )
+  throw (MEDEXCEPTION) // from objects method read !
+{
+  const char * LOC = "MED_MED_DRIVER21::read() : ";
+  BEGIN_OF(LOC);
+
+  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
+  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
+
+  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
+  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
+  
+  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) 
+    (*currentMesh).second->read(*this); 
+  //(*currentMesh).second->read(); // default reader, from readFileStruct
+    
+  // PROVISOIRE
+  _ptrMed->updateSupport() ;
+
+  for ( currentField =_meshName.begin(); currentField != _meshName.end(); currentField++ )
+    (*currentField).first->read(*this);
+  //(*currentField).first->read(); // default reader, from readFileStruct
+
+  END_OF(LOC);
+}
+
+// ------------- Write Only Part --------------
+
+MED_MED_WRONLY_DRIVER21::MED_MED_WRONLY_DRIVER21()
+{
+}
+
+MED_MED_WRONLY_DRIVER21::MED_MED_WRONLY_DRIVER21(const string & fileName,  MED * const ptrMed):
+  IMED_MED_WRONLY_DRIVER(fileName,ptrMed),MED_MED_DRIVER21(fileName,ptrMed),MED_MED_DRIVER(fileName,ptrMed,MED_EN::MED_WRONLY)
+{}
+
+MED_MED_WRONLY_DRIVER21::MED_MED_WRONLY_DRIVER21(const MED_MED_WRONLY_DRIVER21 & driver):
+  IMED_MED_WRONLY_DRIVER(driver),MED_MED_DRIVER(driver),MED_MED_DRIVER21(driver)
+{}
+
+MED_MED_WRONLY_DRIVER21::~MED_MED_WRONLY_DRIVER21()
+{
+  MESSAGE("MED_MED_WRONLY_DRIVER21::~MED_MED_WRONLY_DRIVER21() has been destroyed");
+} 
+
+GENDRIVER * MED_MED_WRONLY_DRIVER21::copy(void) const
+{
+  return new MED_MED_WRONLY_DRIVER21(*this) ;
+}
+
+void MED_MED_WRONLY_DRIVER21::read           ( void ) throw (MEDEXCEPTION)
+{
+  IMED_MED_WRONLY_DRIVER::read();
+}
+
+void MED_MED_WRONLY_DRIVER21::readFileStruct ( void ) throw (MEDEXCEPTION)
+{
+  IMED_MED_WRONLY_DRIVER::readFileStruct();
+}
+
+// This method ask the drivers of all MESH/FIELD objects created from this MED driver
+// to write themselves
+void MED_MED_WRONLY_DRIVER21::writeFrom( void) const
+  throw (MEDEXCEPTION) //from object method write !
+{
+  const char * LOC = "MED_MED_DRIVER21::writeFrom() : ";
+
+  BEGIN_OF(LOC);
+
+  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
+  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
+
+  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
+  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
+  
+  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
+    try {
+      (*currentMesh).second->write(*this); 
+      // On utilise pour les objects MESH ET FIELD le write(GENDRIVER *) et le == ds GENDRIVER avec eventuellement 1 id 
+    }
+    catch ( const MED_DRIVER_NOT_FOUND_EXCEPTION & ex ) {
+      continue;
+    }
+  }
+
+  for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
+    try {
+      (*currentField).first->write(*this);
+    }
+    catch ( const MED_DRIVER_NOT_FOUND_EXCEPTION & ex ) {
+      continue;
+    }
+  }
+
+  END_OF(LOC);
+
+}
+
+void MED_MED_WRONLY_DRIVER21::write(void ) const
+  throw (MEDEXCEPTION) // from object method write !
+{
+  const char * LOC = "MED_MED_DRIVER21::write() : ";
+  int current;
+
+  BEGIN_OF(LOC);
+
+  // BCLE SUR LES OBJETS AVEC AJOUT DE DRIVER ET APPELS write
+
+  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
+  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
+
+  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
+  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
+  
+  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
+    //current = (*currentMesh).second->addDriver(MED_DRIVER,_fileName);
+    current = (*currentMesh).second->addDriver(MED_DRIVER,_fileName,(*currentMesh).second->getName());
+    // put right _id in Mesh driver (same as this._id)
+    (*currentMesh).second->_drivers[current]->setId( getId() );
+    //(*currentMesh).second->write(current) ;
+  }
+
+  for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
+    //current = (*currentField).first->addDriver(MED_DRIVER,_fileName);
+    current = (*currentField).first->addDriver(MED_DRIVER,_fileName,(*currentField).first->getName());
+    // put right _id in Field driver (same as this._id)
+    (*currentField).first->_drivers[current]->setId( getId() );
+    //(*currentField).first->write(current) ;
+  }
+
+  // that's work, but it is more efficenty to write directly when we had driver, no ?
+  writeFrom();
+  
+  END_OF(LOC);
+
+}
+
+// ------------- Read Write Part --------------
+
+MED_MED_RDWR_DRIVER21::MED_MED_RDWR_DRIVER21()
+{}
+
+MED_MED_RDWR_DRIVER21::MED_MED_RDWR_DRIVER21(const string & fileName,  MED * const ptrMed):
+  MED_MED_RDONLY_DRIVER21(fileName,ptrMed),
+  MED_MED_WRONLY_DRIVER21(fileName,ptrMed),
+  IMED_MED_RDWR_DRIVER(fileName,ptrMed),
+  MED_MED_DRIVER21(fileName,ptrMed,MED_REMP),
+  IMED_MED_WRONLY_DRIVER(fileName,ptrMed),
+  IMED_MED_RDONLY_DRIVER(fileName,ptrMed),
+  MED_MED_DRIVER(fileName,ptrMed,MED_REMP)
+{}
+
+MED_MED_RDWR_DRIVER21::MED_MED_RDWR_DRIVER21(const MED_MED_RDWR_DRIVER21 & driver):
+  MED_MED_RDONLY_DRIVER21(driver),
+  MED_MED_WRONLY_DRIVER21(driver),
+  IMED_MED_RDWR_DRIVER(driver),
+  MED_MED_DRIVER21(driver),
+  IMED_MED_WRONLY_DRIVER(driver),
+  IMED_MED_RDONLY_DRIVER(driver),
+  MED_MED_DRIVER(driver)
+{}
+
+MED_MED_RDWR_DRIVER21::~MED_MED_RDWR_DRIVER21() { 
+  MESSAGE("MED_MED_RDWR_DRIVER21::~MED_MED_RDWR_DRIVER21() has been destroyed");
+}
+
+GENDRIVER * MED_MED_RDWR_DRIVER21::copy(void) const
+{
+  return new MED_MED_RDWR_DRIVER21(*this) ;
+}
+
+void MED_MED_RDWR_DRIVER21::read(void)
+  throw (MEDEXCEPTION) // from MED_MED_RDONLY_DRIVER::read()
+{
+  BEGIN_OF("MED_MED_RDWR_DRIVER21::read(void)");
+  MED_MED_RDONLY_DRIVER21::read();
+  END_OF("MED_MED_RDWR_DRIVER21::read(void)");
+}
+
+void MED_MED_RDWR_DRIVER21::readFileStruct(void)
+  throw (MEDEXCEPTION) // from MED_MED_RDONLY_DRIVER::readFileStruct()
+{
+  BEGIN_OF("MED_MED_RDWR_DRIVER21::readFileStruct(void)");
+  MED_MED_RDONLY_DRIVER21::readFileStruct();
+  END_OF("MED_MED_RDWR_DRIVER21::readFileStruct(void)");
+}
+
+void MED_MED_RDWR_DRIVER21::write(void) const
+  throw (MEDEXCEPTION) // from MED_MED_WRONLY_DRIVER::write()
+{
+  BEGIN_OF("MED_MED_RDWR_DRIVER21::write(void) const");
+  MED_MED_WRONLY_DRIVER21::write();
+  END_OF("MED_MED_RDWR_DRIVER21::write(void) const");
+}
+
+void MED_MED_RDWR_DRIVER21::writeFrom(void) const
+  throw (MEDEXCEPTION) // from MED_MED_WRONLY_DRIVER::writeFrom();
+{
+  BEGIN_OF("MED_MED_RDWR_DRIVER21::writeFrom(void) const");
+  MED_MED_WRONLY_DRIVER21::writeFrom();
+  END_OF("MED_MED_RDWR_DRIVER21::writeFrom(void) const");
+}
diff --git a/src/MEDMEM/MEDMEM_MedMedDriver21.hxx b/src/MEDMEM/MEDMEM_MedMedDriver21.hxx
new file mode 100644 (file)
index 0000000..a95ab0f
--- /dev/null
@@ -0,0 +1,106 @@
+#ifndef MED_MED_DRIVER21_HXX
+#define MED_MED_DRIVER21_HXX
+
+#include "MEDMEM_MedMedDriver.hxx"
+#include <string>
+#include "utilities.h"
+#include "MEDMEM_Exception.hxx"
+#include "MEDMEM_GenDriver.hxx"
+#include "MEDMEM_define.hxx"
+
+/*!
+
+  Driver Med for MED.
+
+  Generic part : implement open and close methods.
+
+*/
+
+// This driver pilots within a MED class read/write accesses of fields/meshes
+namespace MEDMEM {
+class MESH;
+class FIELD_;
+class MED;
+
+class MED_MED_DRIVER21 : public virtual MED_MED_DRIVER
+{
+protected:
+
+  med_2_1::med_idt           _medIdt;         // The _medIdt used to write/read Meshes to ::_filename
+   
+public :
+  MED_MED_DRIVER21();
+  MED_MED_DRIVER21(const string & fileName,  MED * const ptrMed);
+  MED_MED_DRIVER21(const string & fileName,  MED * const ptrMed,
+                  MED_EN::med_mode_acces accessMode);
+  MED_MED_DRIVER21(const MED_MED_DRIVER21 & driver);
+  virtual ~MED_MED_DRIVER21();
+  void open() throw (MEDEXCEPTION) ;
+  void close();
+  virtual void write          ( void ) const ;
+  virtual void writeFrom      ( void ) const  ;
+  virtual void read           ( void )  ;
+  virtual void readFileStruct ( void ) ;
+private:
+  virtual GENDRIVER * copy ( void ) const  ;
+};
+
+/*!
+
+  Driver Med for MED : Read only.
+
+  Implement read method.
+
+*/
+
+  class MED_MED_RDONLY_DRIVER21 : public virtual IMED_MED_RDONLY_DRIVER, public virtual MED_MED_DRIVER21
+{
+public :
+  MED_MED_RDONLY_DRIVER21();
+  MED_MED_RDONLY_DRIVER21(const string & fileName,  MED * const ptrMed);
+  MED_MED_RDONLY_DRIVER21(const MED_MED_RDONLY_DRIVER21 & driver);
+  virtual ~MED_MED_RDONLY_DRIVER21();
+  void write          ( void ) const throw (MEDEXCEPTION) ;
+  void writeFrom      ( void ) const throw (MEDEXCEPTION) ;
+  void read           ( void ) throw (MEDEXCEPTION);
+  void readFileStruct ( void ) throw (MEDEXCEPTION) ;
+private:
+  virtual GENDRIVER * copy ( void ) const ;
+};
+
+class MED_MED_WRONLY_DRIVER21 : public virtual IMED_MED_WRONLY_DRIVER, public virtual MED_MED_DRIVER21
+{
+
+public :
+  MED_MED_WRONLY_DRIVER21();
+  MED_MED_WRONLY_DRIVER21(const string & fileName,  MED * const ptrMed);
+  MED_MED_WRONLY_DRIVER21(const MED_MED_WRONLY_DRIVER21 & driver);
+  virtual ~MED_MED_WRONLY_DRIVER21();
+  void write          ( void ) const throw (MEDEXCEPTION);
+  void writeFrom      ( void ) const throw (MEDEXCEPTION);
+  void read           ( void ) throw (MEDEXCEPTION) ;
+  void readFileStruct ( void ) throw (MEDEXCEPTION) ;
+private:
+  virtual GENDRIVER * copy ( void ) const ;
+};
+
+class MED_MED_RDWR_DRIVER21 : public MED_MED_RDONLY_DRIVER21,
+                             public MED_MED_WRONLY_DRIVER21,
+                             public IMED_MED_RDWR_DRIVER
+{
+public :
+  MED_MED_RDWR_DRIVER21();
+  MED_MED_RDWR_DRIVER21(const string & fileName,  MED * const ptrMed);
+  MED_MED_RDWR_DRIVER21(const MED_MED_RDWR_DRIVER21 & driver);
+  ~MED_MED_RDWR_DRIVER21();
+  void write          ( void ) const throw (MEDEXCEPTION);
+  void writeFrom      ( void ) const throw (MEDEXCEPTION);
+  void read           ( void ) throw (MEDEXCEPTION);
+  void readFileStruct ( void ) throw (MEDEXCEPTION);
+private:
+  virtual GENDRIVER * copy ( void ) const ;
+};
+
+}
+
+#endif /* MED_MED_DRIVER21_HXX */
diff --git a/src/MEDMEM/MEDMEM_MedMedDriver22.cxx b/src/MEDMEM/MEDMEM_MedMedDriver22.cxx
new file mode 100644 (file)
index 0000000..6d389c4
--- /dev/null
@@ -0,0 +1,873 @@
+#include "MEDMEM_Compatibility21_22.hxx"
+# include "MEDMEM_MedMedDriver22.hxx"
+# include "MEDMEM_MedMeshDriver.hxx"
+# include "MEDMEM_DriversDef.hxx"
+
+# include "MEDMEM_Mesh.hxx"
+# include "MEDMEM_Grid.hxx"
+# include "MEDMEM_Field.hxx"
+// EN ATTENDANT L'utilisation de MedFieldDriver.hxx ds Field.hxx
+# include "MEDMEM_MedFieldDriver.hxx"
+# include "MEDMEM_Med.hxx"
+# include "MEDMEM_define.hxx"
+
+using namespace std;
+using namespace MED_EN;
+using namespace MEDMEM;
+
+MED_MED_DRIVER22::MED_MED_DRIVER22(): _medIdt(MED_INVALID) 
+{}
+
+MED_MED_DRIVER22::MED_MED_DRIVER22(const string & fileName,  MED * const ptrMed):
+  MED_MED_DRIVER(fileName,ptrMed), _medIdt(MED_INVALID)
+{
+  //_ptrMed->addDriver(*this); // The specific MED driver id is set within the addDriver method.
+}
+
+MED_MED_DRIVER22::MED_MED_DRIVER22(const string & fileName,
+                                  MED * const ptrMed,
+                                  MED_EN::med_mode_acces accessMode):
+  MED_MED_DRIVER(fileName,ptrMed,accessMode), _medIdt(MED_INVALID)
+{
+}
+//REM :  As t'on besoin du champ _status :  _medIdt <-> _status  ?  Oui
+
+MED_MED_DRIVER22::MED_MED_DRIVER22(const MED_MED_DRIVER22 & driver):
+  MED_MED_DRIVER(driver), _medIdt(MED_INVALID)
+{
+}
+
+MED_MED_DRIVER22::~MED_MED_DRIVER22()
+{
+  MESSAGE("MED_MED_DRIVER22::~MED_MED_DRIVER22() has been destroyed");
+}
+
+//  GENDRIVER * MED_MED_DRIVER::copy(void) const
+//  {
+//    return new MED_MED_DRIVER(*this) ;
+//  }
+void MED_MED_DRIVER22::read()
+{
+}
+void MED_MED_DRIVER22::readFileStruct()
+{
+}
+void MED_MED_DRIVER22::write() const
+{
+}
+GENDRIVER * MED_MED_DRIVER22::copy(void) const
+{
+  return new MED_MED_DRIVER22(*this) ;
+}
+void MED_MED_DRIVER22::writeFrom() const
+{
+}
+
+
+
+void MED_MED_DRIVER22::open()
+  throw (MEDEXCEPTION)
+{
+
+  const char * LOC ="MED_MED_DRIVER22::open() : ";
+  BEGIN_OF(LOC);
+
+  // REFLECHIR SUR CE TEST PAR RAPPORT A L'OUVERTURE/FERMETURE
+//    if ( _medIdt != MED_INVALID ) 
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+//                                       << "_medIdt is already in use, please close the file |" 
+//                                       << _fileName << "| before calling open()"
+//                                       )
+//                            );   
+  
+//    if ( _status != MED_CLOSED ) 
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+//                                       << "_status is closed, please close the file |"
+//                                       << _fileName << "| before calling open()"
+//                                       )
+//                            );
+  
+  if ( _fileName == "" )
+    throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+                                     << "_fileName is |\"\"|, please set a correct fileName before calling open()"
+                                     )
+                          );
+
+  MESSAGE(LOC<<"_fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
+
+  _medIdt = med_2_2::MEDouvrir( (const_cast <char *> (_fileName.c_str())), (med_2_2::med_mode_acces) _accessMode);
+  MESSAGE(LOC<<" _medIdt = "<<_medIdt);
+  
+  if (_medIdt > 0) 
+    _status=MED_OPENED; 
+  else {
+    _status = MED_CLOSED;
+    _medIdt = MED_INVALID;
+    throw MED_EXCEPTION (LOCALIZED( STRING(LOC) 
+                                    << "Can't open |"  << _fileName 
+                                    << "|, _medIdt : " << _medIdt
+                                    )
+                         );
+  }
+
+  END_OF(LOC);
+}
+
+
+void MED_MED_DRIVER22::close()
+{
+  med_2_2::med_int err = 0;
+  const char * LOC = "MED_MED_DRIVER22::close() : ";
+  
+  
+//    if ( _status == MED_CLOSED)
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << ": the file |" 
+//                                       << _fileName << "| is already closed"
+//                                       )
+//                            );
+   
+//    if ( _medIdt == MED_INVALID ) 
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "_medIdt invalid, but the file |" 
+//                                       << _fileName << "| seems to be openned !"
+//                                       )
+//                            );   
+
+  if ( _medIdt != MED_INVALID )
+    err=med_2_2::MEDfermer(_medIdt);
+  
+//    if (err != MED_VALID) 
+//      throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "the file |" 
+//                                       << _fileName << "| couldn't be closed"
+//                                       )
+//                            );   
+  
+  _status = MED_CLOSED;
+  _medIdt = MED_INVALID;
+    
+  END_OF(LOC);
+}
+
+
+// ------------- Read Only Part --------------
+
+MED_MED_RDONLY_DRIVER22::MED_MED_RDONLY_DRIVER22()
+{
+}
+
+MED_MED_RDONLY_DRIVER22::MED_MED_RDONLY_DRIVER22(const string & fileName,  MED * const ptrMed):
+  IMED_MED_RDONLY_DRIVER(fileName,ptrMed),MED_MED_DRIVER22(fileName,ptrMed,MED_EN::MED_RDONLY),MED_MED_DRIVER(fileName,ptrMed,MED_EN::MED_RDONLY)
+{
+  MESSAGE("MED_MED_RDONLY_DRIVER22::MED_MED_RDONLY_DRIVER22(const string & fileName,  MED * const ptrMed) Constructeur read only");
+}
+
+MED_MED_RDONLY_DRIVER22::MED_MED_RDONLY_DRIVER22(const MED_MED_RDONLY_DRIVER22 & driver):
+  IMED_MED_RDONLY_DRIVER(driver) ,MED_MED_DRIVER22(driver),MED_MED_DRIVER(driver)
+{
+}
+
+MED_MED_RDONLY_DRIVER22::~MED_MED_RDONLY_DRIVER22()
+{
+  MESSAGE("MED_MED_RDONLY_DRIVER22::~MED_MED_RDONLY_DRIVER22() has been destroyed");
+} 
+
+GENDRIVER * MED_MED_RDONLY_DRIVER22::copy(void) const
+{
+  return new MED_MED_RDONLY_DRIVER22(*this) ;
+}
+
+void MED_MED_RDONLY_DRIVER22::write          ( void ) const throw (MEDEXCEPTION)
+{
+  IMED_MED_RDONLY_DRIVER::write();
+}
+
+void MED_MED_RDONLY_DRIVER22::writeFrom      ( void ) const throw (MEDEXCEPTION)
+{
+  IMED_MED_RDONLY_DRIVER::writeFrom();
+}
+
+void MED_MED_RDONLY_DRIVER22::readFileStruct( void ) 
+  throw (MEDEXCEPTION)
+{
+  const char * LOC = "MED_MED_DRIVER22::readFileStruct() : ";
+  int          err,i,j;
+      
+  BEGIN_OF(LOC);
+
+  if ( _medIdt == MED_INVALID ) 
+    throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) 
+                                     << "_medIdt is invalid, please open the file |" 
+                                     << _fileName << "| before calling readFileStruct()"
+                                     )
+                          );   
+  // Read number of meshes and their associated name
+  {
+    int          numberOfMeshes;
+    char         meshName[MED_TAILLE_NOM+1]="";
+    char         meshDescription[MED_TAILLE_DESC+1]="";
+    int          meshDim;
+    med_2_2::med_maillage meshType;
+
+    MESH *       ptrMesh;
+    //    MED_MESH_RDWR_DRIVER * ptrDriver; !! UNUSED VARIABLE !!
+    
+    numberOfMeshes = med_2_2::MEDnMaa(_medIdt) ;
+    if ( numberOfMeshes <= 0 ) 
+      MESSAGE(LOC << "Be careful there is no mesh in file |"<<_fileName<<"| !");
+
+    MESH_ENTITIES::const_iterator currentEntity; 
+    for (i=1;i<=numberOfMeshes;i++)
+      {
+       //get infoamation on the i^th mesh
+
+       err = MEDmaaInfo(_medIdt, i ,meshName, &meshDim, &meshType,
+                        meshDescription) ;
+
+       if (err != MED_VALID) 
+         throw MED_EXCEPTION(LOCALIZED(STRING(LOC) << ": can't get information about the mesh n°" << i << " of the file |" << _fileName << "| !"));
+
+       switch (meshType)
+         {
+         case med_2_2::MED_STRUCTURE:
+           MESSAGE(LOC<<": Mesh n°"<< i <<" nammed "<< meshName << " with the description " << meshDescription << " is structured");
+
+           med_2_2::med_type_grille type;
+
+           err = MEDnatureGrilleLire(_medIdt, meshName, &type);
+
+           if (err != MED_VALID)
+             throw MED_EXCEPTION(LOCALIZED(STRING(LOC) << ": can't get the nature of the grid which is the mesh n°" << i << " of the file |" << _fileName << "| !"));
+
+           ptrMesh = new GRID((MED_EN::med_grid_type) type);
+           break;
+         case med_2_2::MED_NON_STRUCTURE:
+           MESSAGE(LOC<<": Mesh n°"<< i <<" nammed "<< meshName << " with the description " << meshDescription << " is not structured");
+
+           ptrMesh = new MESH();
+           break;
+         default:
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mesh type !"));
+         }
+      
+       bool isAGrid = ptrMesh->getIsAGrid();
+      
+
+      MED_EN::med_mode_acces myMode = getAccessMode();
+//       MED_MESH_DRIVER * ptrDriver ;
+//       switch (myMode) {
+//       case MED_EN::MED_LECT: // V2_1->V2_2
+//     ptrDriver = new MED_MESH_RDONLY_DRIVER(_fileName, ptrMesh);
+//     break ;
+//       case MED_EN::MED_REMP:        // V2_1->V2_2
+//     ptrDriver = new MED_MESH_RDWR_DRIVER(_fileName, ptrMesh);
+//     break ;
+//       case MED_EN::MED_ECRI: // should never append !! V2_1->V2_2
+//     ptrDriver = new MED_MESH_WRONLY_DRIVER(_fileName, ptrMesh);
+//     break;
+//       default:
+//     throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
+//       }
+
+      GENDRIVER * ptrDriver =
+       DRIVERFACTORY::buildConcreteMedDriverForMesh(_fileName, ptrMesh,
+                                                    meshName, myMode, V22);
+
+      ptrDriver->setId       ( getId() );
+      ptrDriver->setMeshName ( meshName );
+      ptrMesh->addDriver(*ptrDriver);
+      delete ptrDriver ;
+
+      if (isAGrid)
+       _ptrMed->_meshes[meshName] = (MESH *) ptrMesh;
+      else
+       _ptrMed->_meshes[meshName] = ptrMesh;
+
+      //       _ptrMed->_meshes[meshName] = ptrMesh;
+
+       ptrMesh->setName(meshName);
+
+       ptrMesh->setDescription(meshDescription);
+
+       SCRUTE(ptrMesh);
+
+       MESSAGE(LOC<<"is" << (isAGrid ? "" : " NOT") << " a GRID and its name is "<<ptrMesh->getName());
+
+      // we create all global support (for each entity type :
+      int index = 0;
+       for (currentEntity=meshEntities.begin();currentEntity != meshEntities.end(); currentEntity++) {
+       string supportName="SupportOnAll_" ;
+         supportName+=entNames[(MED_EN::medEntityMesh)(*currentEntity).first] ;
+       SUPPORT* mySupport = new SUPPORT() ;
+       mySupport->setName(supportName);
+       mySupport->setMesh(ptrMesh);
+       mySupport->setEntity((MED_EN::medEntityMesh) (*currentEntity).first);
+       mySupport->setAll(true);
+       (_ptrMed->_support)[meshName][(MED_EN::medEntityMesh)(*currentEntity).first] = mySupport ;
+       MESSAGE(LOC<< "The support " << supportName.c_str() << " on entity " << (*currentEntity).first << " is built");
+       index++;
+      }
+       MESSAGE(LOC <<"The mesh " <<ptrMesh->getName() << " has " << index << " support(s)");
+      }
+
+    map<MESH_NAME_, map<MED_EN::medEntityMesh,SUPPORT *> >::iterator itSupportOnMesh ;
+
+    int index = 0;
+
+    vector<SUPPORT *> vectSupp;
+    for (itSupportOnMesh=_ptrMed->_support.begin();
+        itSupportOnMesh != _ptrMed->_support.end();
+        itSupportOnMesh++ )
+      {
+       map<MED_EN::medEntityMesh,SUPPORT *>::iterator itSupport ;
+       for (itSupport=(*itSupportOnMesh).second.begin();
+            itSupport!=(*itSupportOnMesh).second.end();
+            itSupport++)
+         {
+           index++;
+         }
+      }
+
+    MESSAGE(LOC << "In this MED object there is(are) " << index << " support(s):");
+
+    vectSupp.resize(index);
+
+    map<MESH_NAME_, map<MED_EN::medEntityMesh,SUPPORT *> >::const_iterator const_itSupportOnMesh ;
+
+    index = 0;
+    for (const_itSupportOnMesh=_ptrMed->_support.begin(); const_itSupportOnMesh != _ptrMed->_support.end();
+        const_itSupportOnMesh++ )
+      {
+       map<MED_EN::medEntityMesh,SUPPORT *>::const_iterator const_itSupport ;
+       for (const_itSupport=(*const_itSupportOnMesh).second.begin();
+            const_itSupport!=(*const_itSupportOnMesh).second.end();const_itSupport++)
+         {
+           vectSupp[index] = (*const_itSupport).second;
+           SCRUTE(vectSupp[index]);
+           MESSAGE(LOC << "Support number " << index << " is "<< *vectSupp[index]);
+           index++;
+         }
+      }
+
+  }
+  
+  
+  // Read number of fields, their associated name and their list of (timeStepNumber,iterationNumber)
+  {
+    int                           numberOfFields              = 0;      //MED_INVALID
+    //    char                          fieldName[MED_TAILLE_NOM+1] = "";
+    char                          fieldName[MED_TAILLE_NOM+1] ;
+    int                           numberOfComponents           = 0;
+    char                          * componentName              = (char *) MED_NULL;
+    char                          * unitName                   =  (char *) MED_NULL;
+    //    char                          meshName[MED_TAILLE_NOM+1]  = "";
+    char                          meshName[MED_TAILLE_NOM+1]  ;
+    med_2_2::med_type_champ        type;
+    MESH                          * ptrMesh                        = (MESH  *) MED_NULL;
+    FIELD_                        * ptrField                       = (FIELD_ *) MED_NULL;
+    //MED_FIELD_RDWR_DRIVER         * ptrDriver                      = (MED_FIELD_RDWR_DRIVER * ) MED_NULL;
+    GENDRIVER                     * ptrDriver                      = (GENDRIVER * ) MED_NULL;
+    SUPPORT                       * ptrSupport                     = (SUPPORT *   ) MED_NULL;
+    MESH_ENTITIES::const_iterator currentEntity; 
+    list<MED_EN::medGeometryElement>::const_iterator currentGeometry;
+    med_2_2::med_int                           NbOfGaussPts                 =  0;
+    int                           numberOfTimeSteps            =  -1;
+    med_2_2::med_int                           timeStepNumber               =  -1;
+    //    char                          timeStepUnit[MED_TAILLE_PNOM]= "";
+    char                          timeStepUnit[MED_TAILLE_PNOM22+1] ;
+    double                        timeStep                     = 0.0;
+    int                           orderNumber                  =  -1;                           //???init?????
+    int                           numberOfRefMesh = 0;
+    med_2_2::med_booleen           meshLink;
+    map<MESH_NAME_,MESH*>      & _meshes   =  _ptrMed->_meshes; 
+    map<FIELD_NAME_,MAP_DT_IT_> & _fields   =  _ptrMed->_fields; 
+    map<FIELD_ *, MESH_NAME_>  & _meshName =  _ptrMed->_meshName; 
+    map<MESH_NAME_, map<MED_EN::medEntityMesh,SUPPORT *> > & support = _ptrMed->_support;
+
+    numberOfFields = med_2_2::MEDnChamp(_medIdt,0) ;
+    if ( numberOfFields <= 0 ) 
+      MESSAGE(LOC << "Be careful there is no field in file |"<<
+             _fileName<<"| !");
+
+    for (i=1;i<=numberOfFields;i++)
+      {
+       numberOfComponents = med_2_2::MEDnChamp(_medIdt,i) ;
+
+       if ( numberOfComponents <= 0 ) 
+         if (err != MED_VALID)
+           throw MED_EXCEPTION(LOCALIZED(STRING(LOC) << "Be careful there is no compound for field n°" << i << "in file |"<<_fileName<<"| !"));
+
+       componentName = new char[numberOfComponents*MED_TAILLE_PNOM22+1] ;
+       unitName      = new char[numberOfComponents*MED_TAILLE_PNOM22+1] ;   
+      
+       err = MEDchampInfo(_medIdt, i, fieldName, &type, componentName, 
+                          unitName, numberOfComponents) ;
+
+       if (err != MED_VALID)
+         throw MED_EXCEPTION(LOCALIZED(STRING(LOC) << ": can't get information about the field n°" << i <<" of the file |" << _fileName << "| !")); 
+
+       MESSAGE(LOC << "Field n°"<<i<<" nammed "<< fieldName 
+               << " ,component(s)  : " << componentName 
+               <<" ,unit(s) : "        << unitName);
+
+       // Loop on all (entity type,geometry type) until you find an existing
+       // one then get the (n°dt,n°it) pairs list for the current
+       // (field,entity type,geometry type) We suppose there is the same list
+       // whatever the existing (entity type,geometry type) pair 
+
+       // support map :
+
+       for (currentEntity=meshEntities.begin();currentEntity != meshEntities.end(); currentEntity++)
+         { 
+           //         numberOfTimeSteps  MUST be given by MEDchampInfo !!!!!
+           for (currentGeometry  = (*currentEntity).second.begin();
+                currentGeometry != (*currentEntity).second.end();
+                currentGeometry++)
+             {
+               MESSAGE("Field information with Entity,Geom = "<<
+                       (*currentEntity).first<<","<<(*currentGeometry));
+
+               numberOfTimeSteps =
+                 MEDnPasdetemps(_medIdt, fieldName,
+                                (med_2_2::med_entite_maillage)(*currentEntity).first,
+                                (med_2_2::med_geometrie_element) (*currentGeometry) );
+
+               MESSAGE("Field information 2 : NumberOfTimeStep :"<<
+                       numberOfTimeSteps);
+
+         if ( numberOfTimeSteps > MED_VALID ) 
+                 break ;
+               // There are value for some med_geometrie_element of this
+               // med_entite_maillage.
+       }
+       if (numberOfTimeSteps>0) // we have at least one
+         
+             for (currentGeometry = (*currentEntity).second.begin();
+                  currentGeometry != (*currentEntity).second.end();
+                  currentGeometry++)
+               {
+           MESSAGE("Field information 3 : Geom : "<<(*currentGeometry));
+             
+                 for (j=1;j <= numberOfTimeSteps; j++)
+                   {
+                     MESSAGE("Field information 4 : time step j = "<<j);
+               
+                     // err = MEDpasdetempsInfo( _medIdt, fieldName,
+                     // (med_2_2::med_entite_maillage) (*currentEntity).first, 
+                     // (*currentGeometry),j, meshName,
+                     // &NbOfGaussPts, &timeStepNumber,
+                     // timeStepUnit, &timeStep, &orderNumber);
+
+                     err = MEDpasdetempsInfo(_medIdt, fieldName,
+                                             (med_2_2::med_entite_maillage)
+                                             (*currentEntity).first,
+                                             (med_2_2::med_geometrie_element)
+                                             (*currentGeometry),j,
+                                             &NbOfGaussPts, &timeStepNumber,
+                                             &orderNumber, timeStepUnit,
+                                             &timeStep, meshName, &meshLink,
+                                             &numberOfRefMesh);
+
+                     if (err == MED_VALID)
+                       { // we have found for (*currentEntity).first and
+                         // (*currentGeometry)
+                         MESSAGE("Field information 5 ;: NumberOfGaussPoint : " << NbOfGaussPts << ", timeStepNumber : " << timeStepNumber << ", orderNumber : " << orderNumber);
+                         // CORRECT a bug in MEDpasdetempsInfo :
+                         // we get a value n'importe quoi in NbOfGaussPts !!!!
+               
+                         if (timeStepNumber<0)  timeStepNumber=-1 ;
+                         if ((numberOfRefMesh != 1) ||
+                             (meshLink != med_2_2::MED_VRAI) ||
+                             (NbOfGaussPts != 1))
+                           {
+                             NbOfGaussPts = 1;
+                             numberOfRefMesh=1;
+                             MESSAGE("This field is Med Memory compliant because NumberOfGaussPoint : " << NbOfGaussPts << ", or  numberOfRefMesh : " << numberOfRefMesh << ", or meshLink : " << meshLink);
+                           }
+               
+                         // ATTENTION TRAITER L'EXCEPTION CI DESSUS !!!!!!!!
+               
+                         // Il faudra traiter le cas d'un champ qui utilise
+                         // +sieurs (entity,geom) voir le travail de patrick
+                         // Il faudra traiter le cas des profils...
+                         //             ptrField = new FIELD();
+                         // _ptrDriver = new MED_FIELD_RDWR_DRIVER(_fileName,
+                         //                                        ptrField);
+                         //             ptrField->addDriver(_ptrDriver);
+                         //             _fields[fieldName]=ptrField;
+               
+                         map<MESH_NAME_,MESH*>::iterator _meshesIt =
+                           _meshes.find(meshName);
+
+                         if ( _meshesIt == _meshes.end() ) {
+                           MESSAGE(LOC << "There is no mesh |" << meshName <<
+                                   "| in the file |" << _fileName <<
+                                   "|, but  |" << meshName <<
+                                   "| is referenced by field |" <<
+                                   fieldName <<"|, entity : |" <<
+                                   entNames[ (med_2_2::med_entite_maillage)
+                                              (*currentEntity).first] <<
+                                   "|, geometric element of type |"  <<
+                                   geoNames [(*currentGeometry)]     <<"|"); 
+                         }
+                         // POURQUOI SI JE NE MET PAS DE BLOCK J'AI UN PARSE
+                         // ERROR : PG : c'est la macro MESSAGE qui fait ca !
+                         else 
+                           ptrMesh = _meshes[meshName];
+               
+                         ptrSupport     =  support[meshName][(MED_EN::medEntityMesh) (*currentEntity).first];
+                         if (NbOfGaussPts != 1)
+                           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Number of Gauss Point must be equal to 1 for instance")) ;
+
+                         // init to null to prevent some error if not
+                         // correctly allocated !
+               
+                         ptrField = (FIELD_*)NULL ;
+                         ptrDriver = (GENDRIVER*)NULL ;
+
+                         switch ( type) {
+                         case med_2_2::MED_INT64 :
+                           if ( sizeof(med_2_2::med_int) != 8 )
+                             throw MED_EXCEPTION(LOCALIZED(STRING(LOC) <<" The Field type of |" << fieldName <<"|, entity : |" << entNames[(med_2_2::med_entite_maillage) (*currentEntity).first] <<"|, geometric element of type |" << geoNames [(*currentGeometry)] << "| is  MED_INT64 but size of med_int is not equal to 8 bytes !"));
+                           break;
+                         case med_2_2::MED_INT32 : {
+                           ptrField =  new FIELD<int> ( );
+                           // Les valeurs du champ ne doivent pas Ãªtre lue
+                           // pour l'instant
+                           ((FIELD<int>*)
+                            ptrField)->setSupport(ptrSupport);
+                           ((FIELD<int>*)
+                            ptrField)->setNumberOfComponents(numberOfComponents);
+                           ((FIELD<int>*)
+                            ptrField)->setName(fieldName) ;
+                           //provisoire, pour debug
+                           MESSAGE("#### SET NAME in FIELD : "<<fieldName);
+
+                           MED_EN::med_mode_acces myMode = getAccessMode();
+//                         switch (myMode) {
+//                         case MED_EN::MED_LECT: // V2_1->V2_2
+//                           ptrDriver = new
+//                             MED_FIELD_RDONLY_DRIVER<int>
+//                             (_fileName, (FIELD<int> *)
+//                              ptrField);
+//                           break ;
+//                         case MED_EN::MED_REMP:      // V2_1->V2_2
+//                           ptrDriver = new
+//                             MED_FIELD_RDWR_DRIVER<int>
+//                             (_fileName, (FIELD<int> *)
+//                              ptrField);
+//                           break ;
+//                         case MED_EN::MED_ECRI: // should never append !! V2_1->V2_2
+//                           ptrDriver = new
+//                             MED_FIELD_WRONLY_DRIVER<int>
+//                             (_fileName, (FIELD<int> *)
+//                              ptrField);
+//                           break;
+//                         default:
+//                           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
+//                         }
+
+                           ptrDriver = DRIVERFACTORY::buildConcreteMedDriverForField<int>(_fileName, (FIELD<int> *)ptrField, myMode, V22);
+
+                           SCRUTE(ptrDriver);
+
+
+                           break;
+                         }
+                         case MED_EN::MED_REEL64 : {
+                           ptrField = new FIELD<double> ( );
+                           // Les valeurs du champ ne doivent pas Ãªtre lue
+                           // pour l'instant
+                           ((FIELD<double>*)
+                            ptrField)->setSupport(ptrSupport);
+                           ((FIELD<double>*)
+                            ptrField)->setNumberOfComponents(numberOfComponents);
+                           ((FIELD<double>*)
+                            ptrField)->setName(fieldName) ;
+                           //provisoire, pour debug
+                           MESSAGE("#### SET NAME in FIELD : "<<fieldName);
+
+                           MED_EN::med_mode_acces myMode = getAccessMode();
+//                         switch (myMode) {
+//                         case MED_EN::MED_LECT: // V2_1->V2_2
+//                           ptrDriver = new
+//                             MED_FIELD_RDONLY_DRIVER<double>
+//                             (_fileName, (FIELD<double> *)
+//                              ptrField);
+//                           break ;
+//                         case MED_EN::MED_REMP:      // V2_1->V2_2
+//                           ptrDriver = new
+//                             MED_FIELD_RDWR_DRIVER<double>
+//                             (_fileName, (FIELD<double> *)
+//                              ptrField);
+//                           break ;
+//                         case MED_EN::MED_ECRI: // should never append !! V2_1->V2_2
+//                           ptrDriver = new
+//                             MED_FIELD_WRONLY_DRIVER<double>
+//                             (_fileName, (FIELD<double> *)
+//                              ptrField);
+//                           break;
+//                         default:
+//                           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Bad file mode access !"));
+//                         }
+
+                           ptrDriver = DRIVERFACTORY::buildConcreteMedDriverForField<double>(_fileName, (FIELD<double> *)ptrField, myMode, V22);
+                           SCRUTE(ptrDriver);
+
+                           break;
+                         }
+                         default : {
+                           if ( numberOfTimeSteps > 1) 
+                             throw MED_EXCEPTION(LOCALIZED(STRING(LOC) << " The Field type of |" << fieldName <<"|, entity : |" << entNames[(med_2_2::med_entite_maillage) (*currentEntity).first] <<"|, geometric element of type |" << geoNames [(*currentGeometry)] <<"| is neither MED_INT, MED_INT32, MED_INT64 nor MED_REEL64 !"));
+                           break ;
+                         }
+                         }
+                         ptrField->setValueType((MED_EN::med_type_champ)
+                                                type) ;
+                         // need to write field !
+               
+                         MESSAGE("timeStepNumber :"<<timeStepNumber<<
+                                 ",orderNumber :"<<orderNumber);
+                         ptrField->setIterationNumber ( timeStepNumber);
+                         // A ajouter dans la classe FIELD
+                         ptrField->setOrderNumber     ( orderNumber); 
+                         ptrField->setTime            ( timeStep); 
+               
+                         // Create a driver for this (field n°dt,n°it)
+                         ptrDriver->setId            ( getId() );
+                         MESSAGE("###### ptrDriver->setFieldName : #"<<
+                                 fieldName<<"#");
+                         ptrDriver->setFieldName(fieldName);
+                         ptrField->addDriver(*ptrDriver);
+                         // driver is duplicated : remove it
+                         delete ptrDriver;
+
+                         DT_IT_ dtIt;
+                         dtIt.dt  = timeStepNumber;
+                         dtIt.it  = orderNumber;
+               
+                         (_fields  [fieldName])[dtIt] = ptrField;
+                         _meshName[ptrField ]       = meshName;
+                       }
+                   }
+               }
+         }
+       delete[] componentName ;
+       delete[] unitName ;
+      }
+  }
+  
+  // read profil count and their names
+  //  int support_count_= 0 ; !! UNUSED VARIABLE !!
+  // il faut lire les champs pour avoir les profils stockes !!!
+  // il faudrait implémenter la lecture des profils dans med !!!
+  
+  END_OF(LOC);
+  
+}
+
+// This method ask the drivers of all MESH/FIELD objects created from this MED driver
+// to read themselves
+void MED_MED_RDONLY_DRIVER22::read( void )
+  throw (MEDEXCEPTION) // from objects method read !
+{
+  const char * LOC = "MED_MED_DRIVER22::read() : ";
+  BEGIN_OF(LOC);
+
+  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
+  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
+
+  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
+  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
+  
+  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) 
+    (*currentMesh).second->read(*this); 
+  //(*currentMesh).second->read(); // default reader, from readFileStruct
+    
+  // PROVISOIRE
+  _ptrMed->updateSupport() ;
+
+  for ( currentField =_meshName.begin(); currentField != _meshName.end(); currentField++ )
+    (*currentField).first->read(*this);
+  //(*currentField).first->read(); // default reader, from readFileStruct
+
+  END_OF(LOC);
+}
+
+// ------------- Write Only Part --------------
+
+MED_MED_WRONLY_DRIVER22::MED_MED_WRONLY_DRIVER22()
+{
+}
+
+MED_MED_WRONLY_DRIVER22::MED_MED_WRONLY_DRIVER22(const string & fileName,  MED * const ptrMed):
+  IMED_MED_WRONLY_DRIVER(fileName,ptrMed),MED_MED_DRIVER22(fileName,ptrMed),MED_MED_DRIVER(fileName,ptrMed,MED_EN::MED_WRONLY)
+{}
+
+MED_MED_WRONLY_DRIVER22::MED_MED_WRONLY_DRIVER22(const MED_MED_WRONLY_DRIVER22 & driver):
+  IMED_MED_WRONLY_DRIVER(driver),MED_MED_DRIVER(driver),MED_MED_DRIVER22(driver)
+{}
+
+MED_MED_WRONLY_DRIVER22::~MED_MED_WRONLY_DRIVER22()
+{
+  MESSAGE("MED_MED_WRONLY_DRIVER22::~MED_MED_WRONLY_DRIVER22() has been destroyed");
+} 
+
+GENDRIVER * MED_MED_WRONLY_DRIVER22::copy(void) const
+{
+  return new MED_MED_WRONLY_DRIVER22(*this) ;
+}
+
+void MED_MED_WRONLY_DRIVER22::read(void)
+  throw (MEDEXCEPTION)
+{
+  IMED_MED_WRONLY_DRIVER::read();
+}
+
+void MED_MED_WRONLY_DRIVER22::readFileStruct(void)
+  throw (MEDEXCEPTION)
+{
+  IMED_MED_WRONLY_DRIVER::readFileStruct();
+}
+
+// This method ask the drivers of all MESH/FIELD objects created from this MED driver
+// to write themselves
+void MED_MED_WRONLY_DRIVER22::writeFrom( void) const
+  throw (MEDEXCEPTION) //from object method write !
+{
+  const char * LOC = "MED_MED_DRIVER22::writeFrom() : ";
+
+  BEGIN_OF(LOC);
+
+  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
+  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
+
+  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
+  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
+  
+  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
+    try {
+      (*currentMesh).second->write(*this); 
+      // On utilise pour les objects MESH ET FIELD le write(GENDRIVER *) et le == ds GENDRIVER avec eventuellement 1 id 
+    }
+    catch ( const MED_DRIVER_NOT_FOUND_EXCEPTION & ex ) {
+      continue;
+    }
+  }
+
+  for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
+    try {
+      (*currentField).first->write(*this);
+    }
+    catch ( const MED_DRIVER_NOT_FOUND_EXCEPTION & ex ) {
+      continue;
+    }
+  }
+
+  END_OF(LOC);
+
+}
+
+void MED_MED_WRONLY_DRIVER22::write(void ) const
+  throw (MEDEXCEPTION) // from object method write !
+{
+  const char * LOC = "MED_MED_DRIVER22::write() : ";
+  int current;
+
+  BEGIN_OF(LOC);
+
+  // BCLE SUR LES OBJETS AVEC AJOUT DE DRIVER ET APPELS write
+
+  const map<MESH_NAME_, MESH*> & _meshes = const_cast<const map<MESH_NAME_, MESH*>& > (_ptrMed->_meshes); 
+  map<MESH_NAME_,MESH*>::const_iterator  currentMesh;
+
+  const map<FIELD_ *, MESH_NAME_> & _meshName = const_cast<const map<FIELD_ *, MESH_NAME_>& > (_ptrMed->_meshName);
+  map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
+  
+  for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
+    //current = (*currentMesh).second->addDriver(MED_DRIVER,_fileName);
+    current = (*currentMesh).second->addDriver(MED_DRIVER,_fileName,(*currentMesh).second->getName());
+    // put right _id in Mesh driver (same as this._id)
+    (*currentMesh).second->_drivers[current]->setId( getId() );
+    //(*currentMesh).second->write(current) ;
+  }
+
+  for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
+    //current = (*currentField).first->addDriver(MED_DRIVER,_fileName);
+    current = (*currentField).first->addDriver(MED_DRIVER,_fileName,(*currentField).first->getName());
+    // put right _id in Field driver (same as this._id)
+    (*currentField).first->_drivers[current]->setId( getId() );
+    //(*currentField).first->write(current) ;
+  }
+
+  // that's work, but it is more efficenty to write directly when we had driver, no ?
+  writeFrom();
+  
+  END_OF(LOC);
+
+}
+
+// ------------- Read Write Part --------------
+
+MED_MED_RDWR_DRIVER22::MED_MED_RDWR_DRIVER22()
+{}
+
+MED_MED_RDWR_DRIVER22::MED_MED_RDWR_DRIVER22(const string & fileName,  MED * const ptrMed):
+  MED_MED_RDONLY_DRIVER22(fileName,ptrMed),
+  MED_MED_WRONLY_DRIVER22(fileName,ptrMed),
+  IMED_MED_RDWR_DRIVER(fileName,ptrMed),
+  MED_MED_DRIVER22(fileName,ptrMed,MED_REMP),
+  IMED_MED_WRONLY_DRIVER(fileName,ptrMed),
+  IMED_MED_RDONLY_DRIVER(fileName,ptrMed),
+  MED_MED_DRIVER(fileName,ptrMed,MED_REMP)
+{}
+
+MED_MED_RDWR_DRIVER22::MED_MED_RDWR_DRIVER22(const MED_MED_RDWR_DRIVER22 & driver):
+  MED_MED_RDONLY_DRIVER22(driver),
+  MED_MED_WRONLY_DRIVER22(driver),
+  IMED_MED_RDWR_DRIVER(driver),
+  MED_MED_DRIVER22(driver),
+  IMED_MED_WRONLY_DRIVER(driver),
+  IMED_MED_RDONLY_DRIVER(driver),
+  MED_MED_DRIVER(driver)
+{}
+
+MED_MED_RDWR_DRIVER22::~MED_MED_RDWR_DRIVER22() { 
+  MESSAGE("MED_MED_RDWR_DRIVER22::~MED_MED_RDWR_DRIVER22() has been destroyed");
+}
+
+GENDRIVER * MED_MED_RDWR_DRIVER22::copy(void) const
+{
+  return new MED_MED_RDWR_DRIVER22(*this) ;
+}
+
+void MED_MED_RDWR_DRIVER22::read(void)
+  throw (MEDEXCEPTION) // from MED_MED_RDONLY_DRIVER::read()
+{
+  BEGIN_OF("MED_MED_RDWR_DRIVER22::read(void)");
+  MED_MED_RDONLY_DRIVER22::read();
+  END_OF("MED_MED_RDWR_DRIVER22::read(void)");
+}
+
+void MED_MED_RDWR_DRIVER22::readFileStruct(void)
+  throw (MEDEXCEPTION) // from MED_MED_RDONLY_DRIVER::readFileStruct()
+{
+  BEGIN_OF("MED_MED_RDWR_DRIVER22::readFileStruct(void)");
+  MED_MED_RDONLY_DRIVER22::readFileStruct();
+  END_OF("MED_MED_RDWR_DRIVER22::readFileStruct(void)");
+}
+
+void MED_MED_RDWR_DRIVER22::write(void) const
+  throw (MEDEXCEPTION) // from MED_MED_WRONLY_DRIVER::write()
+{
+  BEGIN_OF("MED_MED_RDWR_DRIVER22::write(void) const");
+  MED_MED_WRONLY_DRIVER22::write();
+  END_OF("MED_MED_RDWR_DRIVER22::write(void) const");
+}
+
+void MED_MED_RDWR_DRIVER22::writeFrom(void) const
+  throw (MEDEXCEPTION) // from MED_MED_WRONLY_DRIVER::writeFrom();
+{
+  BEGIN_OF("MED_MED_RDWR_DRIVER22::writeFrom(void) const");
+  MED_MED_WRONLY_DRIVER22::writeFrom();
+  END_OF("MED_MED_RDWR_DRIVER22::writeFrom(void) const");
+}
diff --git a/src/MEDMEM/MEDMEM_MedMedDriver22.hxx b/src/MEDMEM/MEDMEM_MedMedDriver22.hxx
new file mode 100644 (file)
index 0000000..5c9497d
--- /dev/null
@@ -0,0 +1,240 @@
+#ifndef MED_MED_DRIVER22_HXX
+#define MED_MED_DRIVER22_HXX
+
+#include "MEDMEM_MedMedDriver.hxx"
+#include <string>
+#include "utilities.h"
+#include "MEDMEM_Exception.hxx"
+#include "MEDMEM_GenDriver.hxx"
+#include "MEDMEM_define.hxx"
+
+/*!
+
+  Driver Med for MED.
+
+  Generic part : implement open and close methods.
+
+*/
+
+// This driver pilots within a MED class read/write accesses of fields/meshes
+namespace MEDMEM {
+class MESH;
+class FIELD_;
+class MED;
+
+class MED_MED_DRIVER22 : public virtual MED_MED_DRIVER
+{
+protected:
+  
+  med_2_2::med_idt           _medIdt;         // The _medIdt used to write/read Meshes to ::_filename
+   
+  //private:
+  //  MED_MED_DRIVER();
+
+public :
+  /*!
+    Constructor.
+  */
+  MED_MED_DRIVER22();
+  /*!
+    Constructor.
+  */
+  MED_MED_DRIVER22(const string & fileName,  MED * const ptrMed);
+  /*!
+    Constructor.
+  */
+  MED_MED_DRIVER22(const string & fileName,  MED * const ptrMed,
+                  MED_EN::med_mode_acces accessMode);
+
+  // OPERATEUR DE RECOPIE AVEC _medIdt ??
+  /*!
+    Copy constructor.
+  */
+  MED_MED_DRIVER22(const MED_MED_DRIVER22 & driver);
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MED_DRIVER22() ;
+
+  void open() throw (MEDEXCEPTION) ;
+  void close();
+
+  //virtual void write          ( void ) const = 0 ;
+  virtual void write          ( void ) const ;
+  //virtual void writeFrom      ( void ) const = 0 ;
+  virtual void writeFrom      ( void ) const  ;
+  //virtual void read           ( void ) = 0 ;
+  virtual void read           ( void )  ;
+  //virtual void readFileStruct ( void ) = 0 ;
+  virtual void readFileStruct ( void ) ;
+
+private:
+  //virtual GENDRIVER * copy ( void ) const = 0 ;
+  virtual GENDRIVER * copy ( void ) const  ;
+
+};
+
+/*!
+
+  Driver Med for MED : Read only.
+
+  Implement read method.
+
+*/
+
+  class MED_MED_RDONLY_DRIVER22 : public virtual IMED_MED_RDONLY_DRIVER, public virtual MED_MED_DRIVER22
+{
+public :
+  /*!
+    Constructor.
+  */
+  MED_MED_RDONLY_DRIVER22();
+  /*!
+    Constructor.
+  */
+  MED_MED_RDONLY_DRIVER22(const string & fileName,  MED * const ptrMed);
+  /*!
+    Copy constructor.
+  */
+  MED_MED_RDONLY_DRIVER22(const MED_MED_RDONLY_DRIVER22 & driver);
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MED_RDONLY_DRIVER22();
+
+  /*!
+    Return a MEDEXCEPTION : it is the read-only driver.
+  */
+  void write          ( void ) const throw (MEDEXCEPTION) ;
+  /*!
+    Return a MEDEXCEPTION : it is the read-only driver.
+  */
+  void writeFrom      ( void ) const throw (MEDEXCEPTION) ;
+  /*!
+    Read all from the file.
+  */
+  void read           ( void ) throw (MEDEXCEPTION);
+  /*!
+    Read only table of contents of the file.
+
+    All objects are created but there values are not read.
+  */
+  void readFileStruct ( void ) throw (MEDEXCEPTION) ;
+
+private:
+  virtual GENDRIVER * copy ( void ) const ;
+
+};
+
+/*!
+
+  Driver Med for MED : Write only.
+
+  Implement write method.
+
+*/
+
+class MED_MED_WRONLY_DRIVER22 : public virtual IMED_MED_WRONLY_DRIVER, public virtual MED_MED_DRIVER22
+{
+
+public :
+  /*!
+    Constructor.
+  */
+  MED_MED_WRONLY_DRIVER22();
+  /*!
+    Constructor.
+  */
+  MED_MED_WRONLY_DRIVER22(const string & fileName,  MED * const ptrMed);
+  /*!
+    Copy constructor.
+  */
+  MED_MED_WRONLY_DRIVER22(const MED_MED_WRONLY_DRIVER22 & driver);
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MED_WRONLY_DRIVER22();
+
+  /*!
+    Write all in file.
+  */
+  void write          ( void ) const throw (MEDEXCEPTION);
+  /*!
+    Write only objects created from this MED driver in file.
+  */
+  void writeFrom      ( void ) const throw (MEDEXCEPTION);
+  /*!
+    Return a MEDEXCEPTION : it is the write-only driver.
+  */
+  void read           ( void ) throw (MEDEXCEPTION) ;
+  /*!
+    Return a MEDEXCEPTION : it is the write-only driver.
+  */
+  void readFileStruct ( void ) throw (MEDEXCEPTION) ;
+
+private:
+  virtual GENDRIVER * copy ( void ) const ;
+
+};
+
+/*!
+
+  Driver Med for MED : Read write.
+  - Use read method from MED_MED_RDONLY_DRIVER
+  - Use write method from MED_MED_WDONLY_DRIVER
+
+*/
+
+class MED_MED_RDWR_DRIVER22 : public virtual MED_MED_RDONLY_DRIVER22,
+                             public virtual MED_MED_WRONLY_DRIVER22,
+                             public virtual IMED_MED_RDWR_DRIVER
+{
+
+public :
+  /*!
+    Constructor.
+  */
+  MED_MED_RDWR_DRIVER22();
+  /*!
+    Constructor.
+  */
+  MED_MED_RDWR_DRIVER22(const string & fileName,  MED * const ptrMed);
+  /*!
+    Copy constructor.
+  */
+  MED_MED_RDWR_DRIVER22(const MED_MED_RDWR_DRIVER22 & driver);
+
+  /*!
+    Destructor.
+  */
+  ~MED_MED_RDWR_DRIVER22();
+
+  /*!
+    Write all in file.
+  */
+  void write          ( void ) const throw (MEDEXCEPTION);
+  /*!
+    Write only objects created from this MED driver in file.
+  */
+  void writeFrom      ( void ) const throw (MEDEXCEPTION);
+  /*!
+    Read all from the file.
+  */
+  void read           ( void ) throw (MEDEXCEPTION);
+  /*!
+    Read only table of contents of the file.
+
+    All objects are created but there values are not read.
+  */
+  void readFileStruct ( void ) throw (MEDEXCEPTION);
+
+private:
+  virtual GENDRIVER * copy ( void ) const ;
+
+};
+};
+
+#endif /* MED_MED_DRIVER22_HXX */
index beb5373db119e051fe1751aa0463247f580db22b..ba30a7311c6d9c5726c253f1ee2dd7630426b34e 100644 (file)
@@ -1,5 +1,6 @@
 #include "MEDMEM_MedMeshDriver.hxx"
 #include "MEDMEM_MedMeshDriver.hxx"
-
+#include "MEDMEM_MedMeshDriver21.hxx"
+#include "MEDMEM_DriverFactory.hxx" 
 #include "MEDMEM_DriversDef.hxx"
 
 #include "MEDMEM_Family.hxx"
 #include "MEDMEM_DriversDef.hxx"
 
 #include "MEDMEM_Family.hxx"
@@ -15,17 +16,11 @@ using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
-extern "C" {
-  extern med_idt _MEDdatagroupOuvrir(med_idt pid, char *nom);
-  extern med_err _MEDdatagroupFermer(med_idt id);
-}
-
 // Every memory allocation made in the MedDriver members function are desallocated in the Mesh destructor 
 
 MED_MESH_DRIVER::MED_MESH_DRIVER():
   GENDRIVER(),
   _ptrMesh(( MESH *)MED_NULL),
 // Every memory allocation made in the MedDriver members function are desallocated in the Mesh destructor 
 
 MED_MESH_DRIVER::MED_MESH_DRIVER():
   GENDRIVER(),
   _ptrMesh(( MESH *)MED_NULL),
-  _medIdt(MED_INVALID),
   _meshName(""),
   _meshNum(MED_INVALID)
 {
   _meshName(""),
   _meshNum(MED_INVALID)
 {
@@ -35,1202 +30,56 @@ MED_MESH_DRIVER::MED_MESH_DRIVER(const string & fileName,
                                 MESH * ptrMesh,
                                 MED_EN::med_mode_acces accessMode): 
   GENDRIVER(fileName,accessMode),
                                 MESH * ptrMesh,
                                 MED_EN::med_mode_acces accessMode): 
   GENDRIVER(fileName,accessMode),
-  _ptrMesh(ptrMesh),
-  _medIdt(MED_INVALID), 
+  _ptrMesh(ptrMesh), 
   _meshName(""),
   _meshName(""),
-  _meshNum(MED_INVALID) 
+  _meshNum(MED_INVALID)
 {
 }
   
 MED_MESH_DRIVER::MED_MESH_DRIVER(const MED_MESH_DRIVER & driver): 
   GENDRIVER(driver),
   _ptrMesh(driver._ptrMesh),
 {
 }
   
 MED_MESH_DRIVER::MED_MESH_DRIVER(const MED_MESH_DRIVER & driver): 
   GENDRIVER(driver),
   _ptrMesh(driver._ptrMesh),
-  _medIdt(MED_INVALID), 
   _meshName(driver._meshName),
   _meshName(driver._meshName),
-  _meshNum(driver._meshNum) 
+  _meshNum(driver._meshNum)
 {
 {
+
 }
 
 MED_MESH_DRIVER::~MED_MESH_DRIVER()
 {
 }
 
 MED_MESH_DRIVER::~MED_MESH_DRIVER()
 {
-}
+  MESSAGE("MED_MESH_DRIVER::~MED_MESH_DRIVER()has been destroyed");
 
 
-void MED_MESH_DRIVER::open()
-{
-  const char * LOC = "MED_MESH_DRIVER::open()" ;
-  BEGIN_OF(LOC);
-  MESSAGE(LOC<<" : _fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
-  _medIdt = med_2_1::MEDouvrir( (const_cast <char *> (_fileName.c_str())),(med_2_1::med_mode_acces) _accessMode);
-  MESSAGE(LOC<<" _medIdt : "<< _medIdt );
-  if (_medIdt > 0) 
-    _status = MED_OPENED; 
-  else {
-    _medIdt = MED_INVALID;
-    _status = MED_CLOSED;
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Could not open file "<<_fileName<<" in mode "<<_accessMode));
-  }
-  
-  END_OF(LOC);
 }
 }
-  
-void MED_MESH_DRIVER::close()
-{
-  const char * LOC = "MED_MESH_DRIVER::close() " ;
-  BEGIN_OF(LOC);
-  int err = 0;
-  if ( _status == MED_OPENED) {
-    err=med_2_1::MEDfermer(_medIdt);
-    // san -- MED5873 : Calling H5close() here leads to failure of SALOMEDS::StudyManager_i::_SaveAs()
-    // method during study saving process. MEDfermer() seems sufficient for closing a file.
-    //H5close(); // If we call H5close() all the files are closed.
-    if (err != 0)
-      throw MEDEXCEPTION( LOCALIZED(STRING(LOC)
-                                   <<" Error when closing file !"
-                                   )
-                         );
-    MESSAGE(LOC <<": _medIdt= " << _medIdt );
-    MESSAGE(LOC<<": MEDfermer : err    = " << err );
-    _status = MED_CLOSED;
-    _medIdt = MED_INVALID;
-  }
-  END_OF(LOC);
-}
-
-void    MED_MESH_DRIVER::setMeshName(const string & meshName) { _meshName = meshName; };
-string  MED_MESH_DRIVER::getMeshName() const { return _meshName; };
 
 
-//A FAIRE UTILISER LES MAPS...
-const med_2_1::med_geometrie_element  MED_MESH_DRIVER::all_cell_type[MED_NBR_GEOMETRIE_MAILLE]=
-  { med_2_1::MED_POINT1,med_2_1::MED_SEG2,med_2_1::MED_SEG3,med_2_1::MED_TRIA3,med_2_1::MED_QUAD4,med_2_1::MED_TRIA6,med_2_1::MED_QUAD8,
-    med_2_1::MED_TETRA4,med_2_1::MED_PYRA5,med_2_1::MED_PENTA6,med_2_1::MED_HEXA8,med_2_1::MED_TETRA10,med_2_1::MED_PYRA13,
-    med_2_1::MED_PENTA15, med_2_1::MED_HEXA20};
-
-const char * const MED_MESH_DRIVER::all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE]=
-  { "MED_POINT1","MED_SEG2","MED_SEG3","MED_TRIA3","MED_QUAD4","MED_TRIA6","MED_QUAD8",
-    "MED_TETRA4","MED_PYRA5","MED_PENTA6","MED_HEXA8","MED_TETRA10","MED_PYRA13",
-    "MED_PENTA15","MED_HEXA20"};
+void MED_MESH_DRIVER::setMeshName(const string & meshName) 
+{ 
+  _meshName = meshName; 
+}
 
 
+string  MED_MESH_DRIVER::getMeshName() const 
+{ 
+  return _meshName; 
+}
 
 //---------------------------------- RDONLY PART -------------------------------------------------------------
 
 
 //---------------------------------- RDONLY PART -------------------------------------------------------------
 
-MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(): MED_MESH_DRIVER()
+IMED_MESH_RDONLY_DRIVER::IMED_MESH_RDONLY_DRIVER(): MED_MESH_DRIVER()
 {
 }
   
 {
 }
   
-MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(const string & fileName,
-                                              MESH * ptrMesh):
-  MED_MESH_DRIVER(fileName,ptrMesh,MED_RDONLY)
+IMED_MESH_RDONLY_DRIVER::IMED_MESH_RDONLY_DRIVER(const string & fileName,
+                                                MESH * ptrMesh):
+  MED_MESH_DRIVER(fileName, ptrMesh, MED_EN::MED_RDONLY)
 { 
 { 
-  MESSAGE("MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
+  MESSAGE("IMED_MESH_RDONLY_DRIVER::IMED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
 }
   
 }
   
-MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(const MED_MESH_RDONLY_DRIVER & driver): 
+IMED_MESH_RDONLY_DRIVER::IMED_MESH_RDONLY_DRIVER(const IMED_MESH_RDONLY_DRIVER & driver): 
   MED_MESH_DRIVER(driver)
 {
 }
 
   MED_MESH_DRIVER(driver)
 {
 }
 
-MED_MESH_RDONLY_DRIVER::~MED_MESH_RDONLY_DRIVER()
-{
-  //MESSAGE("MED_MESH_RDONLY_DRIVER::~MED_MESH_RDONLY_DRIVER() has been destroyed");
-}
-  
-GENDRIVER * MED_MESH_RDONLY_DRIVER::copy(void) const
-{
-  return new MED_MESH_RDONLY_DRIVER(*this);
-}
-
-void MED_MESH_RDONLY_DRIVER::read(void)
-{
-  const char * LOC = "MED_MESH_RDONLY_DRIVER::read() : " ;
-  BEGIN_OF(LOC);
-  if (_status!=MED_OPENED)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The _idt of file " << _fileName << " is : " << _medIdt <<  " (the file is not opened)." )) ;
-
-  _ptrMesh->_name =  _meshName;
-
-  SCRUTE(_ptrMesh->getIsAGrid());
-
-  if (_ptrMesh->getIsAGrid())
-    {
-      getGRID( );
-
-      // always call getFAMILY : families are requiered !!!!
-
-//        int nbFam = MEDnFam(_medIdt,
-//                       const_cast <char *> (_meshName.c_str()),
-//                       0,
-//                       med_2_1::MED_FAMILLE);
-//        if (nbFam > 0)
-       {
-//       getFAMILY();
-    
-         if (getFAMILY()!=MED_VALID)
-           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getFAMILY when the mesh is a grid")) ;
-
-         buildAllGroups(_ptrMesh->_groupNode,_ptrMesh->_familyNode) ;
-       }
-
-      END_OF(LOC);
-      return;
-    }
-
-  if (getCOORDINATE()!=MED_VALID)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getCOORDINATE"  )) ;
-  if (getCONNECTIVITY()!=MED_VALID)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getCOONECTIVITY")) ;
-  
-  if (getFAMILY()!=MED_VALID)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getFAMILY"      )) ;
-  
-  updateFamily();
-
-  // we build all groups
-  // on node
-  buildAllGroups(_ptrMesh->_groupNode,_ptrMesh->_familyNode) ;
-  // on cell
-  buildAllGroups(_ptrMesh->_groupCell,_ptrMesh->_familyCell) ;
-  // on face
-  buildAllGroups(_ptrMesh->_groupFace,_ptrMesh->_familyFace) ;
-  // on edge
-  buildAllGroups(_ptrMesh->_groupEdge,_ptrMesh->_familyEdge) ;
-
-//   MESSAGE(LOC<<"Checking of CellModel !!!!!!!");
-
-//   int nbOfTypes =  _ptrMesh->_connectivity->_numberOfTypes;
-//    for(int i=0;i<nbOfTypes;i++)
-//      {
-//        MESSAGE(LOC << _ptrMesh->_connectivity->_type[i]) ;
-//      }
-
-  END_OF(LOC);
-}
-
-//=======================================================================
-//function : getGRID
-//purpose  : 
-//=======================================================================
-
-void MED_MESH_RDONLY_DRIVER::getGRID()
-{
-  const char * LOC = "MED_MESH_RDONLY_DRIVER::getGRID() : " ;
-  BEGIN_OF(LOC);
-  
-  if (_status!=MED_OPENED)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "med file is not opened"));
-  
-  GRID * ptrGrid = (GRID *) _ptrMesh;
-    
-  int err, i;
-
-  // Read the dimension of the space for the mesh <_meshName>
-  int SpaceDimension = med_2_1::MEDdimLire(_medIdt,const_cast <char *> (_meshName.c_str())) ;
-  if ( SpaceDimension  <= MED_VALID ) 
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The space dimension |" << SpaceDimension <<
-                                 "| seems to be incorrect " << "for the mesh : |" <<
-                                 _meshName << "|")) ;
-  _ptrMesh->_spaceDimension = SpaceDimension;
-
-  // Read Array length
-  int * ArrayLen[] = { & ptrGrid->_iArrayLength,
-                       & ptrGrid->_jArrayLength,
-                       & ptrGrid->_kArrayLength  };
-  int idim;
-  for (idim = 0; idim < _ptrMesh->_spaceDimension; ++idim)
-    {
-      int lenght = med_2_1::MEDnGrid(_medIdt,
-                                   const_cast <char *> (_ptrMesh->_name.c_str()),
-                                   (med_2_1::med_grid)
-                                   idim
-                                   );
-      if ( lenght <= MED_VALID )
-       throw MEDEXCEPTION(STRING(LOC) <<"The number of nodes |" << lenght <<
-                          "| seems to be incorrect "
-                          << "for the mesh : |" << _meshName << "|" ) ;
-    
-      ArrayLen [idim][0] = lenght;
-    }
-
-  med_2_1::med_repere rep ;
-  string tmp_nom_coord (MED_TAILLE_PNOM*(_ptrMesh->_spaceDimension)+1,' ');
-  string tmp_unit_coord(MED_TAILLE_PNOM*(_ptrMesh->_spaceDimension)+1,' ');
-  char * tmp_nom = (const_cast <char *> ( tmp_nom_coord.c_str())  ) ;
-  char * tmp_unit= (const_cast <char *> ( tmp_unit_coord.c_str()) ) ;
-  
-  // Read node coordinates for MED_BODY_FITTED grid
-
-  SCRUTE(ptrGrid->getGridType());
-
-  if (ptrGrid->getGridType() == MED_EN::MED_BODY_FITTED)
-    {
-      // Read nb of nodes
-      int NumberOfNodes = med_2_1::MEDnGrid(_medIdt,
-                                          const_cast <char *> (_meshName.c_str()),
-                                          med_2_1::MED_GRID_NOEUD);
-      if ( NumberOfNodes <= MED_VALID )
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The number of nodes |" << NumberOfNodes <<
-                                    "| seems to be incorrect "
-                                    << "for the mesh : |" << _meshName << "|" )) ;
-      _ptrMesh->_numberOfNodes = NumberOfNodes ;
-
-      // this array is useless because families numbers are read in getFAMILY
-      //CCRT  as it is useless replace int by med_int
-      med_2_1::med_int * MEDArrayNodeFamily = new med_2_1::med_int[ NumberOfNodes ];
-      // create coordinates
-      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension,NumberOfNodes,
-                                            MED_EN::MED_FULL_INTERLACE);
-
-      // Read coordinates and families
-//       double * coo = const_cast <double *>
-//     (_ptrMesh->_coordinate->getCoordinates(MED_EN::MED_FULL_INTERLACE));
-    
-//       err = med_2_1::MEDbodyFittedLire (_medIdt,
-//                                    const_cast <char *> (_ptrMesh->_name.c_str()),
-//                                    _ptrMesh->_spaceDimension,
-//                                    coo,
-//                                    med_2_1::MED_FULL_INTERLACE,
-//                                    & rep,
-//                                    tmp_nom,
-//                                    tmp_unit,
-//                                    MEDArrayNodeFamily,
-//                                    NumberOfNodes);
-
-      err = med_2_1::MEDbodyFittedLire (_medIdt,
-                                      const_cast <char *> (_ptrMesh->_name.c_str()),
-                                      _ptrMesh->_spaceDimension,
-                                      const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ),
-                                      med_2_1::MED_FULL_INTERLACE,
-                                      & rep,
-                                      tmp_nom,
-                                      tmp_unit,
-                                      MEDArrayNodeFamily,
-                                      NumberOfNodes);
-
-      MESSAGE(LOC << " NumberOfNodes = " << NumberOfNodes << " SpaceDimension = " << SpaceDimension);
-
-      ptrGrid->_is_coordinates_filled = true;
-
-//       for (int icoor = 0 ; icoor<NumberOfNodes ; icoor++)
-//     for(int jcoor = 0 ; jcoor<SpaceDimension ; jcoor++)
-//       MESSAGE(LOC << " icoor = " << icoor << " jcoor = " << jcoor << " COOR = " << _ptrMesh->getCoordinates(MED_FULL_INTERLACE)[icoor*SpaceDimension+jcoor]);
-
-      delete[] MEDArrayNodeFamily;
-      if (err != MED_VALID)
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"error in MEDbodyFittedLire()"));
-
-      //      _ptrMesh->_MEDArrayNodeFamily = fam ;
-
-    }
-  else
-    {
-      // Read Arrays and Node families in Cartesian or Polar Grid
-
-      int nbNodes = 1;
-      double * Array[] = { (double*) 0, (double*) 0, (double*) 0 };
-      for (idim = 0; idim < _ptrMesh->_spaceDimension; ++idim)
-       {
-         int nbNodesDim = * ArrayLen [idim];
-         nbNodes *= nbNodesDim;
-         Array [idim] = new double [ nbNodesDim ];
-         err = med_2_1::MEDgridLire (_medIdt,
-                                    const_cast <char *> (_ptrMesh->_name.c_str()),
-                                    _ptrMesh->_spaceDimension,
-                                    Array [idim],
-                                    idim,
-                                    med_2_1::MED_FULL_INTERLACE,
-                                    & rep,
-                                    tmp_nom,
-                                    tmp_unit);
-         if (err != MED_VALID)
-           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Error in MEDgridLire for dimention" << idim ));
-
-       }
-      ptrGrid->_iArray = Array[0];
-      ptrGrid->_jArray = Array[1];
-      ptrGrid->_kArray = Array[2];
-    
-      _ptrMesh->_numberOfNodes = nbNodes ;
-    
-      // create coordinates
-      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension,nbNodes,
-                                            MED_EN::MED_FULL_INTERLACE);
-      // Read node families
-//        int nbFamNodes = med_2_1::MEDnGrid(_medIdt,
-//                                     const_cast <char *> (_ptrMesh->_name.c_str()),
-//                                     med_2_1::MED_FAM_NOEUD);
-//        if (nbFamNodes > 0)
-//     {
-//       //      int * fam = new int[ nbFamNodes ];
-
-//       //_ptrMesh->_MEDArrayNodeFamily = new int[ nbFamNodes ];
-//       // this array is useless because families numbers are read in getFAMILY
-//       int * MEDArrayNodeFamily = new int[ nbFamNodes ];
-
-//       err = med_2_1::MEDfamGridLire (_medIdt,
-//                                     const_cast <char *> (_ptrMesh->_name.c_str()),
-//                                     MEDArrayNodeFamily,
-//                                     nbFamNodes,
-//                                     med_2_1::MED_NOEUD);
-
-//       if (err != MED_VALID)
-//         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't read grid nodes families for "
-//                                      << idim << "-th dimention"));
-//       else
-//         _ptrMesh->_MEDArrayNodeFamily = fam;
-//     }
-
-    } // end read  Cartesian or Polar Grid
-
-  // set coordinate names
-
-  for (i=0; i<_ptrMesh->_spaceDimension; ++i ) {
-    string myStringName(tmp_nom_coord,i*MED_TAILLE_PNOM,MED_TAILLE_PNOM) ;
-    string myStringUnit(tmp_unit_coord,i*MED_TAILLE_PNOM,MED_TAILLE_PNOM) ;
-    // suppress space at the end
-    int j ;
-    for(j=MED_TAILLE_PNOM-1;j>=0;j--)
-      if (myStringName[j] != ' ') break ;
-    _ptrMesh->_coordinate->_coordinateName[i]=string(myStringName,0,j+1);
-    for(j=MED_TAILLE_PNOM-1;j>=0;j--)
-      if (myStringUnit[j] != ' ') break ;
-    _ptrMesh->_coordinate->_coordinateUnit[i]=string(myStringUnit,0,j+1);
-  }
-
-  string coordinateSystem = "UNDEFINED";
-
-  if( rep == med_2_1::MED_CART) coordinateSystem = "CARTESIAN";
-  else if ( rep == med_2_1::MED_CYL) coordinateSystem = "CYLINDRICAL";
-  else if ( rep == med_2_1::MED_SPHER) coordinateSystem = "SPHERICAL";
-
-  _ptrMesh->_coordinate->setCoordinatesSystem(coordinateSystem);
-
-
-  END_OF(LOC);
-}
-
-//=======================================================================
-//function : getCOORDINATE
-// A FAIRE : RENVOYER DU VOID
-//=======================================================================
-int  MED_MESH_RDONLY_DRIVER::getCOORDINATE()
-{
-  const char * LOC = "MED_MESH_RDONLY_DRIVER::getCOORDINATE() : " ;
-  BEGIN_OF(LOC);
-
-  if (_status==MED_OPENED)
-    {
-      int err ;
-      
-      // Read the dimension of the space for the mesh <_meshName>
-      // to be able to create a COORDINATE object
-      int SpaceDimension = med_2_1::MEDdimLire(_medIdt,const_cast <char *> (_meshName.c_str())) ;
-      if ( SpaceDimension  <= MED_VALID ) 
-        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The space dimension |" << SpaceDimension << "| seems to be incorrect "
-                                     << "for the mesh : |" << _meshName << "|")) ;
-      _ptrMesh->_spaceDimension = SpaceDimension ;
-
-      
-
-      // Read the number of nodes used in the mesh <_meshName>
-      // to be able to create a COORDINATE object
-      int NumberOfNodes=MEDnEntMaa(_medIdt,
-                                   const_cast <char *> (_meshName.c_str()),
-                                   med_2_1::MED_COOR,
-                                   med_2_1::MED_NOEUD,
-                                   (med_2_1::med_geometrie_element) MED_NONE,
-                                   (med_2_1::med_connectivite)      MED_NONE);
-      if ( NumberOfNodes <= MED_VALID )
-        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The number of nodes |" << NumberOfNodes << "| seems to be incorrect "
-                                     << "for the mesh : |" << _meshName << "|" )) ;
-      _ptrMesh->_numberOfNodes = NumberOfNodes ;
-
-
-
-      // create a COORDINATE object
-      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension, NumberOfNodes, MED_EN::MED_FULL_INTERLACE);
-      
-      med_2_1::med_repere rep ; // ATTENTION ---> DOIT ETRE INTEGRE DS MESH EF: FAIT NON?
-      string tmp_nom_coord (MED_TAILLE_PNOM*(_ptrMesh->_spaceDimension)+1,'\0');
-      string tmp_unit_coord(MED_TAILLE_PNOM*(_ptrMesh->_spaceDimension)+1,'\0');
-      char * tmp_nom = (const_cast <char *> ( tmp_nom_coord.c_str())  ) ;
-      char * tmp_unit= (const_cast <char *> ( tmp_unit_coord.c_str()) ) ;
-
-      err=MEDcoordLire(_medIdt,
-                       const_cast <char *> (_ptrMesh->_name.c_str()),
-                      _ptrMesh->_spaceDimension,
-                      //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ),
-                      const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ),
-                       med_2_1::MED_FULL_INTERLACE,
-                       MED_ALL,                      // we read all the coordinates
-                       NULL,                         // we don't use a profile
-                       0,                            // so the profile's size is 0
-                       &rep,tmp_nom,tmp_unit);
-      if (err != MED_VALID)
-        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't read coordinates of the |" << NumberOfNodes << "| nodes "
-                                     << "for the mesh : |" << _meshName 
-                                     << "| of space dimension |" << SpaceDimension 
-                                     << "| with units names |"   << tmp_nom
-                                     << "| and units |"          << tmp_unit
-                                     << " |")) ;
-      
-
-      for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
-       string myStringName(tmp_nom_coord,i*MED_TAILLE_PNOM,MED_TAILLE_PNOM) ;
-       string myStringUnit(tmp_unit_coord,i*MED_TAILLE_PNOM,MED_TAILLE_PNOM) ;
-       // suppress space at the end
-       int j ;
-       for(j=MED_TAILLE_PNOM-1;j>=0;j--)
-         if (myStringName[j] != ' ') break ;
-       _ptrMesh->_coordinate->_coordinateName[i]=string(myStringName,0,j+1);
-       for(j=MED_TAILLE_PNOM-1;j>=0;j--)
-         if (myStringUnit[j] != ' ') break ;
-       _ptrMesh->_coordinate->_coordinateUnit[i]=string(myStringUnit,0,j+1);
-      }
-
-      // Pourquoi le stocker sous forme de chaîne ?
-      switch (rep)
-       {
-       case med_2_1::MED_CART : 
-         {
-           _ptrMesh->_coordinate->_coordinateSystem = "CARTESIAN";
-           break ;
-         }
-       case med_2_1::MED_CYL :
-         {
-           _ptrMesh->_coordinate->_coordinateSystem = "CYLINDRICAL";
-           break ;
-         }
-       case med_2_1::MED_SPHER :
-         {
-           _ptrMesh->_coordinate->_coordinateSystem = "SPHERICAL";
-           break ;
-         }
-       default :
-         {
-           _ptrMesh->_coordinate->_coordinateSystem = "UNDEFINED"; // ?Erreur ?
-           break ;
-         }
-       }
-
-      // Read the unused optional node Names
-      char * tmp_node_name = new char[NumberOfNodes*MED_TAILLE_PNOM+1];
-      tmp_node_name[NumberOfNodes]='\0' ;
-      err=MEDnomLire(_medIdt,const_cast <char*> (_ptrMesh->_name.c_str()),
-                    tmp_node_name,NumberOfNodes*MED_TAILLE_PNOM,med_2_1::MED_NOEUD,
-                    (med_2_1::med_geometrie_element) MED_NONE);
-      if (err == MED_VALID) 
-        MESSAGE(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : WARNING : Nodes have names but we do not read them !");
-      delete[] tmp_node_name ;
-
-
-      // ??? Read the unused optional node Numbers ???
-      med_2_1::med_int * tmp_node_number = new med_2_1::med_int[NumberOfNodes] ;
-      err=MEDnumLire(_medIdt,const_cast <char*> (_ptrMesh->_name.c_str()),
-                    tmp_node_number,NumberOfNodes,med_2_1::MED_NOEUD,(med_2_1::med_geometrie_element)0);
-      if (err == MED_VALID) {
-        // INFOS(LOC<<"WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING");
-        // INFOS(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : WARNING : Nodes have numbers but we do not take care of them !");
-        // INFOS(LOC<<"WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING");
-       MESSAGE(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : Nodes have numbers, we DO TAKE care of them !");
-       _ptrMesh->_coordinate->_nodeNumber.set(NumberOfNodes) ; 
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       for(med_2_1::med_int i2=0;i2<NumberOfNodes;i2++)
-         _ptrMesh->_coordinate->_nodeNumber[i2]=(int)(tmp_node_number[i2]);
-#else
-       memcpy((int*)_ptrMesh->_coordinate->_nodeNumber,tmp_node_number,sizeof(int)*NumberOfNodes) ;
-#endif
-       
-       //////////////////////////////////////////////////////////////////////////////////////
-       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
-       //////////////////////////////////////////////////////////////////////////////////////
-       ///
-       /// Calcule _optionnalToCanonicNodesNumbers de telle sorte que _optionnalToCanonicNodesNumbers[OptionnalNumber]==CanonicNumber
-       
-//     _ptrMesh->_arePresentOptionnalNodesNumbers=1;
-//     for (int canonicNumber=1;canonicNumber<=NumberOfNodes;canonicNumber++) _ptrMesh->_optionnalToCanonicNodesNumbers[tmp_node_number[canonicNumber-1]]=canonicNumber;
-// ICI RETOUR A LA NORMALE::: AUCUNE PRISE EN COMPTE D'UN NUMEROTATION OPTIONNEL
-       _ptrMesh->_arePresentOptionnalNodesNumbers=0;
-      } 
-      else _ptrMesh->_arePresentOptionnalNodesNumbers=0;
-
-       //////////////////////////////////////////////////////////////////////////////////////
-
-      delete[] tmp_node_number ;
-      
-      END_OF(LOC);
-      return MED_VALID;
-    }
-  return MED_ERROR;
-}
-
-
-int MED_MESH_RDONLY_DRIVER::getCONNECTIVITY() 
-{
-  const char * LOC = "MED_MESH_RDONLY_DRIVER::getCONNECTIVITY : " ;
-  BEGIN_OF(LOC);
-
-  if (_status==MED_OPENED)
-    {
-
-      int err = 0 ;
-      // read MED_CELL connectivity
-      CONNECTIVITY * Connectivity     = new CONNECTIVITY(MED_CELL) ;
-      Connectivity->_numberOfNodes    = _ptrMesh->_numberOfNodes ;   // EF : Pourquoi cet attribut est-il dans MESH et non dans COORDINATE ?
-
-      // Try to read nodal connectivity of the cells <Connectivity->_nodal>
-      // then try to read descending connectivity    <Connectivity->_descending>
-      // if neither nodal nor descending connectivity exists
-      // throw an exception.
-      err = getNodalConnectivity(Connectivity) ;
-      if (err!=MED_VALID)
-       {
-         Connectivity->_typeConnectivity = MED_DESCENDING ;
-         err = getDescendingConnectivity(Connectivity) ;
-       }
-      else 
-       getDescendingConnectivity(Connectivity) ; // we read it if there is one
-      
-      if (err!=MED_VALID)
-       {
-         delete Connectivity ;
-         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "We could not read " <<
-                                      "any Connectivity")) ;
-       }
-
-      _ptrMesh->_meshDimension = Connectivity->_entityDimension ; 
-
-      // At this point Connectivity->_typeConnectivity is either NODAL or DESCENDING
-      // If both connectivities are found Connectivity->_typeConnectivity is NODAL
-      // If space dimension is 3 
-      // try to read the nodal connectivity of the faces <ConnectivityFace->_nodal> then
-      // try to read the descending connectivity <ConnectivityFace->_descending>
-      // if there is no descending connectivity and the CELLS are
-      // defined in descending mode then throw an exception
-
-      // PROVISOIRE : if we have some face or edge in MED_MAILLE, we don't read more. There could not be have face or edge !!!!
-
-      if(Connectivity->_constituent==NULL)
-       {
-         SCRUTE(_ptrMesh->_meshDimension);
-         if (_ptrMesh->_meshDimension == 3)
-           {
-             MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DES FACES..." );
-             CONNECTIVITY * ConnectivityFace = new CONNECTIVITY(MED_EN::MED_FACE) ;
-             ConnectivityFace->_typeConnectivity = Connectivity->_typeConnectivity ;
-             // NODAL or DESCENDING
-             SCRUTE(ConnectivityFace->_typeConnectivity);
-             if (Connectivity->_typeConnectivity == MED_DESCENDING)
-               {
-                 MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DESCENDANTE DES FACES" );
-                 err = getDescendingConnectivity(ConnectivityFace) ;
-                 if (err!=MED_VALID)
-                   throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<
-                                                "No FACE in descending connectivity")) ;
-                 getNodalConnectivity(ConnectivityFace) ; // if any !
-               }
-             else
-               {
-                 MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE NODALE DES FACES" );
-                 err = getNodalConnectivity(ConnectivityFace) ;
-                 if (err!=MED_VALID)
-                   { // or error ????? we are in NODAL mode.
-                     err = getDescendingConnectivity(ConnectivityFace) ;
-                   }
-                 else
-                   getDescendingConnectivity(ConnectivityFace); // if any !
-               }
-
-             if (err!=MED_VALID)
-               {
-                 delete ConnectivityFace ;
-                 MESSAGE(LOC<<"No FACE defined.") ;
-               }
-             else
-               {
-                 MESSAGE(LOC<<" SAUVEGARDE DE LA CONNECTIVITE DES " <<
-                         "FACES DANS L'OBJET CONNECTIVITY" );
-                 Connectivity->_constituent=ConnectivityFace ; 
-               }
-           }
-      
-         // read MED_EDGE connectivity
-         if (_ptrMesh->_meshDimension > 1)
-           { // we are in 3 or 2D 
-             MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DES ARRETES...." );
-             CONNECTIVITY * ConnectivityEdge = new CONNECTIVITY(MED_EDGE) ;
-             ConnectivityEdge->_typeConnectivity = Connectivity->_typeConnectivity ;
-             if (Connectivity->_typeConnectivity == MED_DESCENDING)
-               {
-                 MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DESCENDANTE " <<
-                         "DES ARRETES" );
-                 err = getDescendingConnectivity(ConnectivityEdge) ;
-                 if (err!=MED_VALID)
-                   throw MEDEXCEPTION ( LOCALIZED(STRING(LOC) <<
-                                                  "No EDGE in descending connectivity")) ;
-                 getNodalConnectivity(ConnectivityEdge) ; // if any !
-               }
-             else
-               {
-                 MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE NODALE DES ARRETES" );
-                 err = getNodalConnectivity(ConnectivityEdge) ;
-                 if (err!=MED_VALID)
-                   { // or error ????? we are in NODAL mode.
-                     err = getDescendingConnectivity(ConnectivityEdge) ;
-                   }
-                 else
-                   getDescendingConnectivity(ConnectivityEdge) ; // if any !
-               }
-
-             if (err!=MED_VALID)
-               {
-                 delete ConnectivityEdge ;
-                 MESSAGE(LOC<<"No EDGE defined.") ;
-               }
-             else
-               {
-                 if (_ptrMesh->_meshDimension == 3)
-                   if (Connectivity->_constituent != NULL)
-                     Connectivity->_constituent->_constituent=ConnectivityEdge ;
-                   else
-                     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<< "EDGE defined but there are no FACE !")) ;
-                 else
-                   { // IN 2D
-                     MESSAGE(LOC<<" SAUVEGARDE DE LA CONNECTIVITE DES " <<
-                             "ARETES DANS L'OBJET CONNECTIVITY" );
-                     Connectivity->_constituent=ConnectivityEdge ;
-                   }
-               }
-           }
-       }
-      _ptrMesh->_connectivity  = Connectivity ;                                      
-
-      // all right !
-
-      // we have read all connectivity in file, now we must build descending connectivity if necessary !
-
-      // If connectivity descending is defined, we have nothing to do, all constituent are defined !
-      // If connectivity is only nodal, we must rebuild descending if we have some contituent !
-
-      //A FAIRE !!!!
-//        if (Connectivity->_descending == NULL)
-//     if (Connectivity->_constituent != NULL){
-//       // update Connectivity->_constituent
-//       CONNECTIVITY * myConstituentOld = Connectivity->_constituent ;
-//       Connectivity->_constituent = (CONNECTIVITY *)NULL ;
-//       Connectivity->calculateDescendingConnectivity() ;
-         
-//     }
-      
-      END_OF(LOC);
-      return MED_VALID;
-    }
-  return MED_ERROR;
-}
-
-int MED_MESH_RDONLY_DRIVER::getNodalConnectivity(CONNECTIVITY * Connectivity) 
-{
-  const char * LOC = "MED_MESH_RDONLY_DRIVER::getNodalConnectivity : " ;
-  BEGIN_OF(LOC);
-
-  int spaceDimension = _ptrMesh->_spaceDimension;
-
-  if (_status==MED_OPENED)
-    {
-      // Get the type of entity to work on (previously set in the Connectivity Object)
-      med_2_1::med_entite_maillage Entity = (med_2_1::med_entite_maillage) Connectivity->getEntity();
-
-      // Get the number of cells of each type & store it in <tmp_cells_count>.
-      int * tmp_cells_count = new int[MED_NBR_GEOMETRIE_MAILLE] ;
-      int i;
-      for (i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
-       { // EF :ON SCANNE DES GEOMETRIES INUTILES, UTILISER LES MAPS
-
-         tmp_cells_count[i]=MEDnEntMaa(_medIdt,(const_cast <char *> (_ptrMesh->_name.c_str())),
-                                       med_2_1::MED_CONN,(med_2_1::med_entite_maillage) Entity,
-                                       all_cell_type[i],med_2_1::MED_NOD); 
-
-         // Get the greatest dimension of the cells : Connectivity->_entityDimension
-         // We suppose there is no cells used as faces in MED 2.2.x , this is forbidden !!!
-         // In version prior to 2.2.x, it is possible
-         if (tmp_cells_count[i]>0)
-           { 
-             Connectivity->_entityDimension=all_cell_type[i]/100;  
-             Connectivity->_numberOfTypes++;
-           }
-       }
-      
-
-      // If there is no nodal connectivity, we quit !
-      if ( Connectivity->_numberOfTypes == 0 )
-       {
-         delete[] tmp_cells_count ;
-         return MED_ERROR ;
-       }
-
-      // if MED version < 2.2.x, we read only entity with dimention = Connectivity->_entityDimension. Lesser dimension are face or edge !
-
-      char version_med[10] ;
-      if ( MEDfichEntete(_medIdt,med_2_1::MED_VERSION,version_med) != 0 )
-       {
-         // error : we suppose we have not a good med file !
-         delete[] tmp_cells_count ;
-         return MED_ERROR ;
-       }
-
-      // we get MED version number
-      // If MED version is < 2.2 then the cells which dimension
-      // is lesser than the main dimension ( Connectivity->_entityDimension )
-      // are either faces or edges
-
-      //        string medVersion(version_med);
-      //        int firstNumber = 
-      int * tmpEdgeCount = new int[MED_NBR_GEOMETRIE_MAILLE] ;
-      tmpEdgeCount[0]     = 0 ;
-      int numberOfEdgesTypes = 0;
-      int * tmpFaceCount = new int[MED_NBR_GEOMETRIE_MAILLE] ;
-      tmpFaceCount[0]     = 0 ;
-      int numberOfFacesTypes = 0;
-  
-//       if ((version_med != "2.2")&(Entity==med_2_1::MED_MAILLE))
-//     {
-//       Connectivity->_numberOfTypes=0;
-       
-//       for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
-//         {
-//           tmpFaceCount[i]=0;
-//           tmpEdgeCount[i]=0;
-//           if (tmp_cells_count[i]!=0)
-//             {
-//               int dimension = all_cell_type[i]/100 ;
-//               if (Connectivity->_entityDimension==dimension) 
-//                 Connectivity->_numberOfTypes++ ;
-           
-//               if (dimension == 2)
-//                 if (Connectivity->_entityDimension==3)
-//                   {
-//                     tmpFaceCount[i]=tmp_cells_count[i] ;
-//                     tmp_cells_count[i]=0 ;
-//                     numberOfFacesTypes++;
-//                   }
-//               if (dimension == 1)
-//                 if (Connectivity->_entityDimension>dimension)
-//                   {
-//                     tmpEdgeCount[i]=tmp_cells_count[i] ;
-//                     tmp_cells_count[i]=0;
-//                     numberOfEdgesTypes++ ;
-//                   }
-//             }
-//         }
-//     }
-
-      if (Entity==med_2_1::MED_MAILLE)
-       {
-         Connectivity->_numberOfTypes=0;
-       
-         for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
-           {
-             tmpFaceCount[i]=0;
-             tmpEdgeCount[i]=0;
-             if (tmp_cells_count[i]!=0)
-               {
-                 int dimension = all_cell_type[i]/100 ;
-                 if (Connectivity->_entityDimension==dimension) 
-                   Connectivity->_numberOfTypes++ ;
-           
-                 if (dimension == 2)
-                   if (Connectivity->_entityDimension==3)
-                     {
-                       tmpFaceCount[i]=tmp_cells_count[i] ;
-                       //tmp_cells_count[i]=0 ;
-                       //Connectivity->_numberOfTypes++ ;
-                       numberOfFacesTypes++;
-                     }
-                 if (dimension == 1)
-                   if (Connectivity->_entityDimension>dimension)
-                     {
-                       tmpEdgeCount[i]=tmp_cells_count[i] ;
-                       //tmp_cells_count[i]=0;
-                       //Connectivity->_numberOfTypes++ ;
-                       numberOfEdgesTypes++ ;
-                     }
-               }
-           }
-       }
-
-      // bloc to read CELL :
-      {
-       // Prepare an array of indexes on the different cell types to create a MEDSKYLINEARRAY
-       // We use <tmp_cells_count> to calculate <Connectivity->_count> then we release it
-       Connectivity->_geometricTypes = new MED_EN::medGeometryElement [Connectivity->_numberOfTypes]   ;  // Double emploi pour des raisons pratiques 
-       Connectivity->_type           = new CELLMODEL                  [Connectivity->_numberOfTypes]   ;  //
-       Connectivity->_count          = new int                        [Connectivity->_numberOfTypes+1] ;
-       Connectivity->_count[0]       = 1;
-       
-       int size = 0 ; 
-       int typeNumber=1 ;
-        int i;
-       for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
-         { // no point1 cell type (?)
-           int dimension = all_cell_type[i]/100 ;
-           if ((tmp_cells_count[i]>0) && (Connectivity->_entityDimension == dimension))
-             {
-               Connectivity->_count[typeNumber]=Connectivity->_count[typeNumber-1]+tmp_cells_count[i];
-
-               CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER::all_cell_type[i]) ;
-
-               Connectivity->_type[typeNumber-1] = t ;
-           
-               Connectivity->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER::all_cell_type[i] ;
-           
-               // probleme avec les mailles de dimension < a dimension du maillage :
-               // Il faut oter le zero a la lecture est le remettre a l'ecriture : ce n'est pas fait !!!!! On interdit ce cas pour l'instant !!!
-
-             
-               size+=tmp_cells_count[i]*((MED_MESH_DRIVER::all_cell_type[i])%100) ;
-           
-               MESSAGE(LOC
-                       << Connectivity->_count[typeNumber]-1 << " cells of type " 
-                       << all_cell_type_tab[i] ); 
-
-               typeNumber++;
-             }
-         }
-       
-       // Creation of the MEDSKYLINEARRAY
-       //Connectivity->_nodal = new MEDSKYLINEARRAY(Connectivity->_count[Connectivity->_numberOfTypes]-1,size) ; 
-       //int * NodalIndex = Connectivity->_nodal->getIndex() ;
-       int * NodalValue = new int[size] ;
-       int * NodalIndex = new int[Connectivity->_count[Connectivity->_numberOfTypes]] ;
-       NodalIndex[0]=1 ;
-       
-       // Fill the MEDSKYLINEARRAY by reading the MED file.
-        int j=0;
-       for ( i=0;i<Connectivity->_numberOfTypes;i++)
-         {
-           int multi = 0 ;
-           med_2_1::med_geometrie_element med_type = (med_2_1::med_geometrie_element) Connectivity->_type[i].getType() ;
-           //if ( Connectivity->_type[i].getDimension() < Connectivity->_entityDimension) 
-           if (Connectivity->_entity == MED_CELL)
-             if ( Connectivity->_type[i].getDimension() < _ptrMesh->_spaceDimension) 
-               multi=1;
-         
-           //    int NumberOfCell = Connectivity->_count[i+1]-Connectivity->_count[i] ;
-           int NumberOfNodeByCell = Connectivity->_type[i].getNumberOfNodes() ;
-         
-           // initialise index
-           for ( j=Connectivity->_count[i]; j<Connectivity->_count[i+1];j++)
-             NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByCell ; 
-
-           int tmp_numberOfCells = Connectivity->_count[i+1]-Connectivity->_count[i] ;
-           med_2_1::med_int * tmp_ConnectivityArray = new med_2_1::med_int[(NumberOfNodeByCell+multi)*tmp_numberOfCells];
-         
-           //int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
-           //                    Connectivity->_entityDimension,tmp_ConnectivityArray,
-           //med_2_1::MED_FULL_INTERLACE,NULL,0,Entity,med_type,med_2_1::MED_NOD);
-
-           int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
-                               _ptrMesh->_spaceDimension,tmp_ConnectivityArray,
-                               med_2_1::MED_FULL_INTERLACE,NULL,0,Entity,med_type,
-                               med_2_1::MED_NOD);
-
-           if ( err != MED_VALID)
-             {
-               delete[] tmp_ConnectivityArray;
-               delete[] tmp_cells_count;
-               delete[] tmpFaceCount;
-               delete[] tmpEdgeCount;
-               MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
-               return MED_ERROR ;
-             }
-
-           int * ConnectivityArray = NodalValue + NodalIndex[Connectivity->_count[i]-1]-1 ;
-
-           // version originale sans prise en compte des numéros optionnels
-           //
-           for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
-             ConnectivityArray[j*NumberOfNodeByCell+k]=(int)(tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k]) ;
-
-           //////////////////////////////////////////////////////////////////////////////
-           // Modification pour prise en compte de la numérotation optionnelle des noeuds ///
-           //////////////////////////////////////////////////////////////////////////////
-           //
-           // Rénumérote le tableau temporaire tmp_ConnectivityArray en utilisant _optionnalToCanonicNodesNumbers
-           // Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
-           
-           //  if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) 
-           //          {
-           //          for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
-           //                  ConnectivityArray[j*NumberOfNodeByCell+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k]] ;
-           //          }
-           //  else
-           //          {
-           //          for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
-           //                  ConnectivityArray[j*NumberOfNodeByCell+k]=tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k] ;
-           //          }
-           ////////////////////////////////////////////////////////////////////////////
-       
-           delete[] tmp_ConnectivityArray;  
-         }
-
-       Connectivity->_nodal = new MEDSKYLINEARRAY(Connectivity->_count[Connectivity->_numberOfTypes]-1,
-                                                  size,
-                                                  NodalIndex,
-                                                  NodalValue) ; 
-
-       delete[] NodalIndex;
-       delete[] NodalValue;
-      } // end of bloc to read CELL
-
-      delete[] tmp_cells_count; 
-
-
-
-      // Get Face if any
-      // ===============
-     
-      if (numberOfFacesTypes!=0) {
-
-        // Create a CONNECTIVITY constituent to put in the top level CONNECTIVITY recursive class
-       CONNECTIVITY * constituent = new CONNECTIVITY(numberOfFacesTypes,MED_EN::MED_FACE) ;
-       constituent->_entityDimension = 2 ;
-       constituent->_count[0]=1 ;
-
-        // In order to create the MEDSKYLINEARRAY of the constituent object we need :
-        // 1:
-        // To initialize the _count array of the constituent object (containning cumulated face count by geometric type)
-        // _count[0]=1 and _count[_numberOfTypes] give the size of NodalIndex
-        // 2:
-        // To calculate the total number of face nodes whatever the geometric type is.
-        // The result is the size of the array containning all the nodes : NodalValue
-        // 3 :
-        // To calculate the starting indexes of the different face types in NodalValue, 
-        // this is the NodalIndex array.
-        
-       int size       = 0 ; 
-       int typeNumber = 1 ;
-        int i;
-       for ( i=1; i < MED_NBR_GEOMETRIE_MAILLE; i++)  { // no point1 cell type (?)
-         if (tmpFaceCount[i]>0) {
-           
-           constituent->_count[typeNumber] = constituent->_count[typeNumber-1] + tmpFaceCount[i];
-           CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER::all_cell_type[i]) ;
-           constituent->_type[typeNumber-1]=t ;
-           
-           constituent->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER::all_cell_type[i] ;
-           
-           size+=tmpFaceCount[i]*((MED_MESH_DRIVER::all_cell_type[i])%100) ;
-           typeNumber++;
-         }
-       }
-       
-       // Creation of the MEDSKYLINEARRAY
-       //constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,size) ; 
-       //int * NodalIndex = constituent->_nodal->getIndex() ;
-       int * NodalValue = new int[size] ;
-       int * NodalIndex = new int[constituent->_count[constituent->_numberOfTypes]] ;
-       NodalIndex[0]=1 ;
-       
-       // Fill the MEDSKYLINEARRAY by reading the MED file.
-       for ( i=0; i<constituent->_numberOfTypes; i++) {
-         med_2_1::med_geometrie_element med_type = (med_2_1::med_geometrie_element) constituent->_type[i].getType() ;
-
-         int NumberOfNodeByFace = constituent->_type[i].getNumberOfNodes() ;
-         
-         // initialise NodalIndex
-         for (int j=constituent->_count[i]; j<constituent->_count[i+1];j++)
-           NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByFace ; 
-         
-         int tmp_numberOfFaces = constituent->_count[i+1]-constituent->_count[i] ;
-         // Il faut ajouter 1 pour le zero a la lecture !!!
-          // ATTENTION UNIQUEMENT POUR MED < 2.2.x
-          med_2_1::med_int * tmp_constituentArray = NULL;
-          if (version_med != "2.2") 
-            tmp_constituentArray = new med_2_1::med_int[(NumberOfNodeByFace+1)*tmp_numberOfFaces] ;
-          else {
-            tmp_constituentArray = new med_2_1::med_int[NumberOfNodeByFace*tmp_numberOfFaces] ;
-            MESSAGE(LOC<<": WE ARE USING MED2.2 so there is no +1 for calculating the size of  tmp_constituentArray !") ;
-         }
-
-         int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
-                             Connectivity->_entityDimension,tmp_constituentArray,
-                             med_2_1::MED_FULL_INTERLACE,NULL,0,med_2_1::MED_MAILLE,med_type,med_2_1::MED_NOD);
-
-         if ( err != MED_VALID) {
-           MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
-           delete constituent ;
-           delete[] tmp_constituentArray;
-           delete[] tmpFaceCount;
-           delete[] tmpEdgeCount;
-           return MED_ERROR ;
-         }
-
-         int * constituentArray = NodalValue + NodalIndex[constituent->_count[i]-1]-1 ;
-         
-         // version originale sans prise en compte des numéros optionnels
-         //    
-         for (int j=0; j<tmp_numberOfFaces; j++)
-           for (int k=0; k<NumberOfNodeByFace; k++)
-             constituentArray[j*NumberOfNodeByFace+k]=(int)(tmp_constituentArray[j*(NumberOfNodeByFace+1)+k]) ;
-
-       //////////////////////////////////////////////////////////////////////////////////////
-       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
-       //////////////////////////////////////////////////////////////////////////////////////
-       ///
-       /// Rénumérote le tableau temporaire tmp_constituentArray en utilisant _optionnalToCanonicNodesNumbers
-       /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
-       
-//     if (_ptrMesh->_arePresentOptionnalNodesNumbers) 
-//             {
-//             for (int j=0; j<tmp_numberOfFaces; j++) for (int k=0; k<NumberOfNodeByFace; k++)
-//                     constituentArray[j*NumberOfNodeByFace+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_constituentArray[j*(NumberOfNodeByFace+1)+k]] ;
-//             }
-//     else
-//             {
-//             for (int j=0; j<tmp_numberOfFaces; j++) for (int k=0; k<NumberOfNodeByFace; k++)
-//                     constituentArray[j*NumberOfNodeByFace+k]=tmp_constituentArray[j*(NumberOfNodeByFace+1)+k] ;
-//             }
-       
-       //////////////////////////////////////////////////////////////////////////////////////
-         
-         delete[] tmp_constituentArray;
-       }
-       
-       constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,
-                                                 size,
-                                                 NodalIndex,
-                                                 NodalValue) ;
-       delete[] NodalIndex ;
-       delete[] NodalValue ;
-
-       Connectivity->_constituent = constituent ;
-      }
-
-      delete[] tmpFaceCount;
-
-      // get Edge if any
-      // ===============
-      if (numberOfEdgesTypes!=0) {
-       CONNECTIVITY * constituent = new CONNECTIVITY(numberOfEdgesTypes,MED_EDGE) ;
-       constituent->_entityDimension = 1 ;
-       constituent->_count[0]=1 ;
-
-       int size = 0 ; 
-       int typeNumber=1 ;
-        // if you declare a variable <i> in two <for> initialization statement, 
-        // compiler gcc2.95.3 says nothing but there are two <i> variables in the same block 
-        //and the value you get in the common block seems to be the value of the first variable !
-        int i; 
-
-       for ( i=1; i<MED_NBR_GEOMETRIE_MAILLE; i++)  { // no point1 cell type (?)
-         if (tmpEdgeCount[i]>0) {
-           
-           constituent->_count[typeNumber]=constituent->_count[typeNumber-1]+tmpEdgeCount[i];
-           CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER::all_cell_type[i]) ;
-           constituent->_type[typeNumber-1]=t ;
-           
-           constituent->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER::all_cell_type[i] ;
-           
-           size+=tmpEdgeCount[i]*((MED_MESH_DRIVER::all_cell_type[i])%100) ;
-           typeNumber++;
-         }
-       }
-       
-       // Creation of the MEDSKYLINEARRAY
-       //constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,size) ; 
-       //int * NodalIndex = constituent->_nodal->getIndex() ;
-       int * NodalValue = new int[size] ;
-       int * NodalIndex = new int[constituent->_count[constituent->_numberOfTypes]] ;
-       NodalIndex[0]=1 ;
-       
-       // Fill the MEDSKYLINEARRAY by reading the MED file.
-       for ( i=0; i<constituent->_numberOfTypes; i++) {
-         med_2_1::med_geometrie_element med_type = (med_2_1::med_geometrie_element) constituent->_type[i].getType() ;
-
-         int NumberOfNodeByEdge = constituent->_type[i].getNumberOfNodes() ;
-         
-         // initialise index
-         for (int j=constituent->_count[i]; j<constituent->_count[i+1];j++)
-           NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByEdge ; 
-         
-         int tmp_numberOfEdges = constituent->_count[i+1]-constituent->_count[i] ;
-         // Il faut ajouter 1 pour le zero a la lecture !!!
-
-          // ATTENTION UNIQUEMENT POUR MED < 2.2.x
-          med_2_1::med_int * tmp_constituentArray = NULL;
-          if (version_med != "2.2") 
-           tmp_constituentArray = new med_2_1::med_int[(NumberOfNodeByEdge+1)*tmp_numberOfEdges] ;
-          else {
-           tmp_constituentArray = new med_2_1::med_int[NumberOfNodeByEdge*tmp_numberOfEdges] ;
-            MESSAGE(LOC<<": WE ARE USING MED2.2 so there is no +1 for calculating the size of  tmp_constituentArray !") ;
-          }
-         
-         int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
-                             _ptrMesh->_spaceDimension,tmp_constituentArray,
-                             med_2_1::MED_FULL_INTERLACE,NULL,0,med_2_1::MED_MAILLE,med_type,med_2_1::MED_NOD);
-         if ( err != MED_VALID) {
-           MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
-           delete constituent ;
-           delete[] tmp_constituentArray;
-           delete[] tmpEdgeCount;
-           return MED_ERROR ;
-         }
-
-         int * constituentArray = NodalValue + NodalIndex[constituent->_count[i]-1]-1 ;
-         
-         // version originale sans prise en compte des numéros optionnels      
-         //
-         for (int j=0; j<tmp_numberOfEdges; j++)
-           for (int k=0; k<NumberOfNodeByEdge; k++)
-             constituentArray[j*NumberOfNodeByEdge+k]=(int)(tmp_constituentArray[j*(NumberOfNodeByEdge+1)+k]) ;
-
-       //////////////////////////////////////////////////////////////////////////////////////
-       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
-       //////////////////////////////////////////////////////////////////////////////////////
-       ///
-       /// Rénumérote le tableau temporaire tmp_constituentArray en utilisant _optionnalToCanonicNodesNumbers
-       /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
-       
-//     if (_ptrMesh->_arePresentOptionnalNodesNumbers) 
-//             {
-//             for (int j=0; j<tmp_numberOfEdges; j++) for (int k=0; k<NumberOfNodeByEdge; k++)
-//                     constituentArray[j*NumberOfNodeByEdge+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_constituentArray[j*(NumberOfNodeByEdge+1)+k]] ;
-//             }
-//     else
-//             {
-//             for (int j=0; j<tmp_numberOfEdges; j++) for (int k=0; k<NumberOfNodeByEdge; k++)
-//                     constituentArray[j*NumberOfNodeByEdge+k]=tmp_constituentArray[j*(NumberOfNodeByEdge+1)+k] ;
-//             }
-       
-       //////////////////////////////////////////////////////////////////////////////////////
-
-         delete[] tmp_constituentArray;
-       }
-
-       constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,
-                                                 size,
-                                                 NodalIndex,
-                                                 NodalValue) ;
-
-       delete[] NodalIndex ;
-       delete[] NodalValue ;
-
-       if (Connectivity->_entityDimension == 3) {
-         if (Connectivity->_constituent==NULL)
-           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Edges are defined but there are no Faces !"));
-         Connectivity->_constituent->_constituent = constituent ;
-       } else 
-         Connectivity->_constituent = constituent ;
-      }
-
-      delete[] tmpEdgeCount; 
-      
-      return MED_VALID;
-    }
-
-  return MED_ERROR;
-}
-
-int MED_MESH_RDONLY_DRIVER::getDescendingConnectivity(CONNECTIVITY * Connectivity) 
+int IMED_MESH_RDONLY_DRIVER::getDescendingConnectivity(CONNECTIVITY * Connectivity) 
 {
   const char * LOC = "MED_MESH_RDONLY_DRIVER::getDescendingConnectivity : " ;
   if (_status==MED_OPENED)
 {
   const char * LOC = "MED_MESH_RDONLY_DRIVER::getDescendingConnectivity : " ;
   if (_status==MED_OPENED)
@@ -1241,369 +90,7 @@ int MED_MESH_RDONLY_DRIVER::getDescendingConnectivity(CONNECTIVITY * Connectivit
   return MED_ERROR;
 }
 
   return MED_ERROR;
 }
 
-//  int  MED_MESH_RDONLY_DRIVER::getElementFamilies(CONNECTIVITY * Connectivity)
-//  {
-//    int err = 0 ;
-//    int NumberOfTypes = Connectivity->_numberOfTypes ;
-//    int * Count = Connectivity->_count ;
-//    medGeometryElement * GeometricTypes= Connectivity->_geometricTypes ;
-//    int ** tmp_array = new int*[NumberOfTypes] ;
-//    for (int i=0; i<NumberOfTypes; i++) 
-//      tmp_array[i]=NULL ;
-//    for (int i=0; i<NumberOfTypes; i++) {
-//      int NumberOfElements = Count[i+1]-Count[i] ;
-//      int * tmp_families_number = new int[NumberOfElements] ;
-//      err = MEDfamLire(_medIdt,const_cast <char*> (_ptrMesh->_name.c_str()),
-//                  tmp_families_number,NumberOfElements,
-//                  Connectivity->_entity,GeometricTypes[i]);
-//      tmp_array[i]=tmp_families_number ;
-//      if (err != MED_VALID) {
-//        for (int j=0; j<NumberOfTypes; j++)
-//     if (tmp_array[j] != NULL)
-//       delete[] tmp_array[j] ;
-//        delete[] tmp_array ;
-//        throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER::getElementFamilies : No Family in element GeometricTypes[i]");
-//      }
-//    }
-  
-//    if (Connectivity->_entity == MED_CELL)
-//      _ptrMesh->_MEDArrayCellFamily = tmp_array ;
-//    else if (Connectivity->_entity == MED_FACE)
-//      _ptrMesh->_MEDArrayFaceFamily = tmp_array ;
-//    else if (Connectivity->_entity == MED_EDGE)
-//      _ptrMesh->_MEDArrayEdgeFamily = tmp_array ;
-  
-//    return MED_VALID ;
-//  }
-
-int  MED_MESH_RDONLY_DRIVER::getFAMILY() 
-{
-  const char * LOC = "MED_MESH_RDONLY_DRIVER::getFAMILY() : " ;
-  BEGIN_OF(LOC);
-
-  if (_status==MED_OPENED) {
-    int err = 0 ;
-
-    int * MEDArrayNodeFamily = NULL ;
-    int ** MEDArrayCellFamily = NULL ;
-    int ** MEDArrayFaceFamily = NULL ;
-    int ** MEDArrayEdgeFamily = NULL ;
-
-    if ( !_ptrMesh->getIsAGrid() )
-      {
-       // read number :
-       // NODE :
-       MEDArrayNodeFamily = new int[_ptrMesh->getNumberOfNodes()] ;
-       err = getNodesFamiliesNumber(MEDArrayNodeFamily) ; // error only if (_status!=MED_OPENED), other case exeception !
-       // CELL
-
-       MESSAGE(LOC << "error returned from getNodesFamiliesNumber " << err);
-
-       MEDArrayCellFamily = new int*[_ptrMesh->getNumberOfTypes(MED_CELL)] ; // ET SI IL N'Y A PAS DE CELLS ?
-       const medGeometryElement * myTypes = _ptrMesh->getTypes(MED_CELL);
-       for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_CELL);i++)
-         MEDArrayCellFamily[i] = new int[_ptrMesh->getNumberOfElements(MED_CELL,myTypes[i])] ;
-
-       err = getCellsFamiliesNumber(MEDArrayCellFamily,_ptrMesh->_connectivity,MED_CELL) ;
-
-       MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Cells " << err);
-
-       if (_ptrMesh->_connectivity->_constituent != NULL) {
-         if (_ptrMesh->_connectivity->_constituent->_entity == MED_EN::MED_FACE) {
-           // FACE
-           MEDArrayFaceFamily = new int*[_ptrMesh->getNumberOfTypes(MED_FACE)] ;
-           myTypes = _ptrMesh->getTypes(MED_FACE);
-           for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_FACE);i++)
-             MEDArrayFaceFamily[i] = new int[_ptrMesh->getNumberOfElements(MED_FACE,myTypes[i])] ;
-
-           err = getCellsFamiliesNumber(MEDArrayFaceFamily,_ptrMesh->_connectivity->_constituent,MED_FACE) ;
-
-           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Faces " << err);
-
-         } else {
-           // EDGE in 2D
-           MEDArrayEdgeFamily = new int*[_ptrMesh->getNumberOfTypes(MED_EDGE)] ;
-           myTypes = _ptrMesh->getTypes(MED_EDGE);
-           for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
-             MEDArrayEdgeFamily[i] = new int[_ptrMesh->getNumberOfElements(MED_EDGE,myTypes[i])] ;
-           err = getCellsFamiliesNumber(MEDArrayEdgeFamily,_ptrMesh->_connectivity->_constituent,MED_EDGE) ;
-
-           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Edges in 2D " << err);
-
-         }
-         // EDGE in 3D
-         if (_ptrMesh->_connectivity->_constituent->_constituent != NULL) {
-           MEDArrayEdgeFamily = new int*[_ptrMesh->getNumberOfTypes(MED_EDGE)] ;
-           myTypes = _ptrMesh->getTypes(MED_EDGE);
-           for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
-             MEDArrayEdgeFamily[i] = new int[_ptrMesh->getNumberOfElements(MED_EDGE,myTypes[i])] ;
-           err = getCellsFamiliesNumber(MEDArrayEdgeFamily,_ptrMesh->_connectivity->_constituent->_constituent,MED_EDGE) ; // we are in 3D !
-
-           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Edges in 3D " << err);
-
-         }
-       }
-      }
-    else
-      {
-       // node 
-       int NumberOfNodes =  _ptrMesh->getNumberOfNodes() ;
-       MEDArrayNodeFamily = new int[ NumberOfNodes ];
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       med_2_1::med_int* MEDArrayNodeFamily2 = new med_2_1::med_int[ NumberOfNodes ];
-       err = med_2_1::MEDfamGridLire (_medIdt,
-                                     const_cast <char *> (_ptrMesh->_name.c_str()),
-                                     MEDArrayNodeFamily2,
-                                     NumberOfNodes,
-                                     med_2_1::MED_NOEUD);
-       for(int i=0;i<NumberOfNodes;i++)
-         MEDArrayNodeFamily[i]=(int) MEDArrayNodeFamily2[i];
-       delete [] MEDArrayNodeFamily2;
-#else
-       err = med_2_1::MEDfamGridLire (_medIdt,
-                                     const_cast <char *> (_ptrMesh->_name.c_str()),
-                                     MEDArrayNodeFamily,
-                                     NumberOfNodes,
-                                     med_2_1::MED_NOEUD);
-#endif
-       // what about cell face and edge ?
-      }
-
-    // Creation of the families
-    int NumberOfFamilies = MEDnFam(_medIdt,const_cast <char *> (_meshName.c_str()),0,med_2_1::MED_FAMILLE) ;
-    if ( NumberOfFamilies < 1 ) // at least family 0 must exist 
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"There is no FAMILY, FAMILY 0 must exists" ));
-
-    SCRUTE(NumberOfFamilies);
-
-    vector<FAMILY*> &NodeFamilyVector = _ptrMesh->_familyNode ;
-    vector<FAMILY*> &CellFamilyVector = _ptrMesh->_familyCell ;
-    vector<FAMILY*> &FaceFamilyVector = _ptrMesh->_familyFace ;
-    vector<FAMILY*> &EdgeFamilyVector = _ptrMesh->_familyEdge ;
-
-    int numberOfNodesFamilies = 0 ;
-    int numberOfCellsFamilies = 0 ;
-    int numberOfFacesFamilies = 0 ;
-    int numberOfEdgesFamilies = 0 ;
-
-    for (int i=0;i<NumberOfFamilies;i++) {
-      
-      med_2_1::med_int NumberOfAttributes = MEDnFam(_medIdt,const_cast <char *> (_meshName.c_str()),i+1,med_2_1::MED_ATTR) ;
-      if (NumberOfAttributes < 0) 
-       throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER::getFAMILY() : NumberOfAttributes" );
-    
-      med_2_1::med_int NumberOfGroups = MEDnFam(_medIdt,const_cast <char *> (_meshName.c_str()),i+1,med_2_1::MED_GROUPE) ;
-      if (NumberOfGroups < 0)
-       throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER::getFAMILY() : NumberOfGroups" );
-      
-      med_2_1::med_int FamilyIdentifier ;
-      string FamilyName(MED_TAILLE_NOM,'\0');
-      int *  AttributesIdentifier = new int[NumberOfAttributes] ;
-      int *  AttributesValues     = new int[NumberOfAttributes] ;
-      string AttributesDescription(MED_TAILLE_DESC*NumberOfAttributes,' ') ;
-      string GroupsNames(MED_TAILLE_LNOM*NumberOfGroups+1,'\0') ;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      med_2_1::med_int tmp_NumberOfAttributes=NumberOfAttributes;
-      med_2_1::med_int *  AttributesIdentifier2 = new med_2_1::med_int[NumberOfAttributes] ;
-      med_2_1::med_int *  AttributesValues2     = new med_2_1::med_int[NumberOfAttributes] ;
-      err = med_2_1::MEDfamInfo(_medIdt,const_cast <char *> (_meshName.c_str()),
-                              i+1,const_cast <char *> (FamilyName.c_str()),
-                              &FamilyIdentifier,AttributesIdentifier2,AttributesValues2,
-                              const_cast <char *> (AttributesDescription.c_str()),
-                              &NumberOfAttributes,
-                              const_cast <char *> (GroupsNames.c_str()),&NumberOfGroups
-                      );
-      for(med_2_1::med_int i2=0;i2<tmp_NumberOfAttributes;i2++)
-       {
-         AttributesIdentifier[i2]=(int)(AttributesIdentifier2[i2]);
-         AttributesValues[i2]=(int)(AttributesValues2[i2]);
-       }
-      delete [] AttributesIdentifier2;
-      delete [] AttributesValues2;
-#else
-      err = med_2_1::MEDfamInfo(_medIdt,const_cast <char *> (_meshName.c_str()),
-                              i+1,const_cast <char *> (FamilyName.c_str()),
-                              &FamilyIdentifier,AttributesIdentifier,AttributesValues,
-                              const_cast <char *> (AttributesDescription.c_str()),
-                              &NumberOfAttributes,
-                              const_cast <char *> (GroupsNames.c_str()),&NumberOfGroups
-                      );
-#endif
-
-      SCRUTE(GroupsNames);
-      SCRUTE(FamilyName);
-      SCRUTE(err);
-      SCRUTE(i);
-
-      if (err != MED_VALID)
-       throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER::getFAMILY() : ERROR when get FAMILY informations" );
-      if (FamilyIdentifier != 0 ) {
-       FAMILY * Family = new FAMILY(_ptrMesh,(int)FamilyIdentifier,FamilyName,
-                                     (int)NumberOfAttributes,AttributesIdentifier,
-                                    AttributesValues,AttributesDescription,
-                                     (int)NumberOfGroups,GroupsNames,
-                                    MEDArrayNodeFamily,
-                                    MEDArrayCellFamily,
-                                    MEDArrayFaceFamily,
-                                    MEDArrayEdgeFamily
-                                    ) ;
-       // All good ?
-       // if nothing found, delete Family
-
-
-       //MESSAGE(LOC << " Well is that OK now ?? " << (*Family));
-
-
-
-       if (Family->getNumberOfTypes() == 0) {
-         MESSAGE(LOC<<"Nothing found for family "<<FamilyName<< " : skip");
-         delete Family;
-       } else
-         switch (Family->getEntity()) {
-         case MED_EN::MED_NODE :
-           NodeFamilyVector.push_back(Family) ;
-           numberOfNodesFamilies++ ;
-           break ;
-         case MED_EN::MED_CELL :
-           CellFamilyVector.push_back(Family) ;
-           numberOfCellsFamilies++ ;
-           break ;
-         case MED_EN::MED_FACE :
-           FaceFamilyVector.push_back(Family) ;
-           numberOfFacesFamilies++ ;
-           break ;
-         case MED_EN::MED_EDGE :
-           EdgeFamilyVector.push_back(Family) ;
-           numberOfEdgesFamilies++ ;
-           break ;
-         }
-
-       //      MESSAGE(LOC << (*Family));
-
-
-
-
-      }
-
-      delete [] AttributesIdentifier ;
-      delete [] AttributesValues ;
-    }
-
-    if (MEDArrayNodeFamily != NULL)
-      delete[] MEDArrayNodeFamily ;
-    if (MEDArrayCellFamily != NULL) {
-      for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_CELL);i++)
-       delete[] MEDArrayCellFamily[i] ;
-      delete[] MEDArrayCellFamily ;
-    }
-    if (MEDArrayFaceFamily != NULL) {
-      for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_FACE);i++)
-       delete[] MEDArrayFaceFamily[i] ;
-      delete[] MEDArrayFaceFamily ;
-    }
-    if (MEDArrayEdgeFamily != NULL) {
-      for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
-       delete[] MEDArrayEdgeFamily[i] ;
-      delete[] MEDArrayEdgeFamily ;
-    }
-
-    END_OF(LOC);
-    return MED_VALID ;
-  }
-  return MED_ERROR;
-}
-
-int  MED_MESH_RDONLY_DRIVER::getNodesFamiliesNumber(int * MEDArrayNodeFamily) 
-{
-  const char * LOC = "MED_MESH_RDONLY_DRIVER::getNodesFamiliesNumber() : " ;
-  BEGIN_OF(LOC);
-  if (_status==MED_OPENED) {
-    int err = 0 ;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-    int lgth=_ptrMesh->getNumberOfNodes();
-    med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-    err = MEDfamLire(_medIdt,(const_cast <char *> (_ptrMesh->_name.c_str())), 
-                    temp,
-                    _ptrMesh->getNumberOfNodes(),
-                    med_2_1::MED_NOEUD,(med_2_1::med_geometrie_element) MED_NONE);
-      for(int i2=0;i2<lgth;i2++)
-       MEDArrayNodeFamily[i2]=(int)(temp[i2]);
-      delete [] temp;
-#else
-    err = MEDfamLire(_medIdt,(const_cast <char *> (_ptrMesh->_name.c_str())), 
-                    MEDArrayNodeFamily,
-                    _ptrMesh->getNumberOfNodes(),
-                    med_2_1::MED_NOEUD,(med_2_1::med_geometrie_element) MED_NONE);
-#endif
-    if ( err != MED_VALID) {
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "There is no family for the |"<< _ptrMesh->getNumberOfNodes() 
-                                   << "| nodes in mesh |" 
-                                   << _ptrMesh->_name.c_str() << "|" ));
-    }
-    END_OF(LOC);
-    return MED_VALID;
-  }
-  return MED_ERROR;
-}
-
-int  MED_MESH_RDONLY_DRIVER::getCellsFamiliesNumber(int **MEDArrayFamily,CONNECTIVITY *Connectivity, MED_EN::medEntityMesh entity) 
-{
-  const char * LOC = "MED_MESH_RDONLY_DRIVER::getCellsFamiliesNumber " ;
-  BEGIN_OF(LOC);
-
-  if (_status==MED_OPENED) {
-    int i, err = 0 ;
-    for (i=0;i<Connectivity->_numberOfTypes;i++)       {
-      int NumberOfCell = Connectivity->_count[i+1]-Connectivity->_count[i] ;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      const medGeometryElement * myTypes = _ptrMesh->getTypes(entity);
-      int lgthI=_ptrMesh->getNumberOfElements(entity,myTypes[i]);
-      med_2_1::med_int *temp=new med_2_1::med_int[lgthI];
-      err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
-                     temp,NumberOfCell,
-                     (med_2_1::med_entite_maillage) Connectivity->_entity,
-                     (med_2_1::med_geometrie_element) Connectivity->_geometricTypes[i]);
-      for(int i2=0;i2<lgthI;i2++)
-       MEDArrayFamily[i][i2]=(int)(temp[i2]);
-      delete [] temp;
-#else
-      err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
-                     MEDArrayFamily[i],NumberOfCell,
-                     (med_2_1::med_entite_maillage) Connectivity->_entity,
-                     (med_2_1::med_geometrie_element) Connectivity->_geometricTypes[i]);
-#endif
-
-      // provisoire : si les faces ou les aretes sont des mailles !!!
-      if (err != MED_VALID) {
-       MESSAGE(LOC<<"search face/edge family on cell !!!");
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       int lgthI=_ptrMesh->getNumberOfElements(entity,myTypes[i]);
-       med_2_1::med_int *temp=new med_2_1::med_int[lgthI];
-       err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
-                      temp,NumberOfCell,
-                      med_2_1::MED_MAILLE,
-                      (med_2_1::med_geometrie_element) Connectivity->_geometricTypes[i]);
-       for(int i2=0;i2<lgthI;i2++)
-         MEDArrayFamily[i][i2]=(int)(temp[i2]);
-       delete [] temp;
-#else
-       err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
-                      MEDArrayFamily[i],NumberOfCell,
-                      med_2_1::MED_MAILLE,
-                      (med_2_1::med_geometrie_element) Connectivity->_geometricTypes[i]);
-#endif
-      }
-
-      if (err != MED_VALID) 
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Family not found for entity "<<Connectivity->_entity<<" and geometric type "<<Connectivity->_geometricTypes[i]));
-      
-    }
-    return MED_VALID;
-  }
-  return MED_ERROR;  
-}
-
-void MED_MESH_RDONLY_DRIVER::buildAllGroups(vector<GROUP*> & Groups, vector<FAMILY*> & Families) 
+void IMED_MESH_RDONLY_DRIVER::buildAllGroups(vector<GROUP*> & Groups, vector<FAMILY*> & Families) 
 {
   const char * LOC = "MED_MESH_RDONLY_DRIVER::buildAllGroups " ;
   BEGIN_OF(LOC);
 {
   const char * LOC = "MED_MESH_RDONLY_DRIVER::buildAllGroups " ;
   BEGIN_OF(LOC);
@@ -1642,7 +129,7 @@ void MED_MESH_RDONLY_DRIVER::buildAllGroups(vector<GROUP*> & Groups, vector<FAMI
   END_OF(LOC);
 }
 
   END_OF(LOC);
 }
 
-void MED_MESH_RDONLY_DRIVER::updateFamily()
+void IMED_MESH_RDONLY_DRIVER::updateFamily()
 {
   const char * LOC = "MED_MESH_RDONLY_DRIVER::updateFamily() " ;
   BEGIN_OF(LOC);
 {
   const char * LOC = "MED_MESH_RDONLY_DRIVER::updateFamily() " ;
   BEGIN_OF(LOC);
@@ -1657,1042 +144,356 @@ void MED_MESH_RDONLY_DRIVER::updateFamily()
 }
 
 
 }
 
 
-void MED_MESH_RDONLY_DRIVER::write( void ) const
+void IMED_MESH_RDONLY_DRIVER::write( void ) const
 {
   throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER::write : Can't write with a RDONLY driver !");
 }
 
 /*--------------------- WRONLY PART -------------------------------*/
 
 {
   throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER::write : Can't write with a RDONLY driver !");
 }
 
 /*--------------------- WRONLY PART -------------------------------*/
 
-MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER():MED_MESH_DRIVER()
+IMED_MESH_WRONLY_DRIVER::IMED_MESH_WRONLY_DRIVER():MED_MESH_DRIVER()
 {
 }
   
 {
 }
   
-MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName,
+IMED_MESH_WRONLY_DRIVER::IMED_MESH_WRONLY_DRIVER(const string & fileName,
                                               MESH * ptrMesh):
   MED_MESH_DRIVER(fileName,ptrMesh,MED_WRONLY)
 {
   MESSAGE("MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
 }
 
                                               MESH * ptrMesh):
   MED_MESH_DRIVER(fileName,ptrMesh,MED_WRONLY)
 {
   MESSAGE("MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
 }
 
-MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const MED_MESH_WRONLY_DRIVER & driver): 
+IMED_MESH_WRONLY_DRIVER::IMED_MESH_WRONLY_DRIVER(const IMED_MESH_WRONLY_DRIVER & driver): 
   MED_MESH_DRIVER(driver)
 {
 }
 
   MED_MESH_DRIVER(driver)
 {
 }
 
-MED_MESH_WRONLY_DRIVER::~MED_MESH_WRONLY_DRIVER()
+IMED_MESH_WRONLY_DRIVER::~IMED_MESH_WRONLY_DRIVER()
 {
   //MESSAGE("MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
 }
 
 {
   //MESSAGE("MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
 }
 
-GENDRIVER * MED_MESH_WRONLY_DRIVER::copy(void) const
+void IMED_MESH_WRONLY_DRIVER::read (void)
 {
 {
-  return new MED_MESH_WRONLY_DRIVER(*this);
+  throw MEDEXCEPTION("MED_MESH_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
 }
 
-void MED_MESH_WRONLY_DRIVER::read (void)
+/*--------------------- RDWR PART -------------------------------*/
+
+IMED_MESH_RDWR_DRIVER::IMED_MESH_RDWR_DRIVER()
 {
 {
-  throw MEDEXCEPTION("MED_MESH_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
 }
 
 }
 
-void MED_MESH_WRONLY_DRIVER::write(void) const
-{ 
-  const char * LOC = "void MED_MESH_WRONLY_DRIVER::write(void) const : ";
-  BEGIN_OF(LOC);
+IMED_MESH_RDWR_DRIVER::IMED_MESH_RDWR_DRIVER(const string & fileName,
+                                          MESH * ptrMesh):
+   IMED_MESH_RDONLY_DRIVER(fileName,ptrMesh),IMED_MESH_WRONLY_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER(fileName,ptrMesh,MED_RDWR)
+{
+  MESSAGE("MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
+}
 
 
-  // we must first create mesh !!
-  MESSAGE(LOC << "MeshName : |" << _meshName << "| FileName : |"<<_fileName<<"| MedIdt : | "<< _medIdt << "|");
+IMED_MESH_RDWR_DRIVER::IMED_MESH_RDWR_DRIVER(const IMED_MESH_RDWR_DRIVER & driver): 
+  IMED_MESH_RDONLY_DRIVER(driver),IMED_MESH_WRONLY_DRIVER(driver),MED_MESH_DRIVER(driver)
+{
+}
 
 
-  if (_status!=MED_OPENED)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "File "<<_fileName<<" is not open. Open it before write !"));
+IMED_MESH_RDWR_DRIVER::~IMED_MESH_RDWR_DRIVER() {
+  //MESSAGE("MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
+}
 
 
-  if (_ptrMesh->getIsAGrid())
-  {
-    if ( writeGRID() != MED_VALID )
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeGRID()"  )) ;
-  }
-  else
-  {
-    if (writeCoordinates()!=MED_VALID)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeCoordinates()"  )) ;
-
-    if (writeConnectivities(MED_EN::MED_CELL)!=MED_VALID)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_CELL)"  )) ;
-    if (writeConnectivities(MED_EN::MED_FACE)!=MED_VALID)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_FACE)"  )) ;
-    if (writeConnectivities(MED_EN::MED_EDGE)!=MED_VALID)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_EDGE)"  )) ;
-  }
+/////////// Concrete MED_MESH_DRIVERS implementations
 
 
-  if (writeFamilyNumbers() !=MED_VALID)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilyNumbers()"  )) ;
-  
+MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER()
+{
+  MESSAGE("You are using the default constructor of the Mesh read only Driver and it is 2.1 one");
+  _concreteMeshDrv = new MED_MESH_RDONLY_DRIVER21();
+}
 
 
-  // well we must first write zero family :
-  if (_status==MED_OPENED) {
-    int err ;
-    // test if the family already exists (HDF trick waiting a MED evolution to be replaced)
-    string dataGroupFam = "/ENS_MAA/"+_meshName+"/FAS/FAMILLE_0/";  
-    MESSAGE("|"<<dataGroupFam<<"|");
-    err =_MEDdatagroupOuvrir(_medIdt,const_cast <char *> (dataGroupFam.c_str()) );
-    if ( err < MED_VALID ) {
-      SCRUTE(err);
-      
-      err = med_2_1::MEDfamCr( _medIdt,
-                             const_cast <char *> ( _meshName.c_str() ),
-                             "FAMILLE_0", 0,
-                             (med_2_1::med_int*)NULL, (med_2_1::med_int*)NULL, (char*)NULL, 0,
-                             (char*)NULL, 0);
-      
-      if ( err != MED_VALID) 
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't create family |FAMILLE_0| with identifier |0| groups names || and  attributes descriptions ||")) ;
-    }
-    else
-      _MEDdatagroupFermer(_medIdt);
-     
-  }
+MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh)
+{
+  _concreteMeshDrv = DRIVERFACTORY::buildMeshDriverFromFile(fileName,ptrMesh,MED_LECT);
+}
 
 
-  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyNode)");
-  if (writeFamilies(_ptrMesh->_familyNode) !=MED_VALID)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyNode)"  )) ;
+MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(const MED_MESH_RDONLY_DRIVER & driver):MED_MESH_DRIVER(driver)
+{
+  _concreteMeshDrv = driver._concreteMeshDrv->copy();
+}
 
 
-  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyCell)");
-  if (writeFamilies(_ptrMesh->_familyCell) !=MED_VALID)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyCell)"  )) ;
+MED_MESH_RDONLY_DRIVER::~MED_MESH_RDONLY_DRIVER()
+{
+  if (_concreteMeshDrv) delete _concreteMeshDrv;
+}
 
 
-  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyFace)");
-  if (writeFamilies(_ptrMesh->_familyFace) !=MED_VALID)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyFace)"  )) ;
+void MED_MESH_RDONLY_DRIVER::write( void ) const
+{
+  _concreteMeshDrv->write();
+}
 
 
-  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyEdge)");
-  if (writeFamilies(_ptrMesh->_familyEdge) !=MED_VALID)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyEdge)"  )) ;
+void MED_MESH_RDONLY_DRIVER::read ( void )
+{
+  _concreteMeshDrv->read();
+}
 
 
-  END_OF(LOC);
-} 
+void MED_MESH_RDONLY_DRIVER::open()
+{
+  _concreteMeshDrv->open();
+}
 
 
-//=======================================================================
-//function : writeGRID
-//purpose  : 
-//=======================================================================
+void MED_MESH_RDONLY_DRIVER::close()
+{
+  _concreteMeshDrv->close();
+}
 
 
-int MED_MESH_WRONLY_DRIVER::writeGRID() const
+void MED_MESH_RDONLY_DRIVER::setMeshName(const string & meshName)
 {
 {
-  const char * LOC = "MED_MESH_WRONLY_DRIVER::writeGRID() : " ;
-  BEGIN_OF(LOC);
-  
-  if (_status!=MED_OPENED)
-  {
-    MESSAGE (LOC<<" Not open !!!");
-    return MED_ERROR;
-  }
-  GRID * ptrGrid = (GRID*) _ptrMesh;
-  
-  med_2_1::med_err err = MED_ERROR;
-  med_2_1::med_repere rep;
-  string tmp_name(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM,' ');
-  string tmp_unit(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM,' ');
-
-  // Test if the mesh <_meshName> already exists
-  // If it doesn't exists create it
-  // If it already exists verify if its dimension is the same as <_ptrMesh->_spaceDimension>
-  // rem : <_meshName> is the driver meshName not <ptrMesh->_meshName>
-  int dim = med_2_1::MEDdimLire(_medIdt, const_cast <char *> (_meshName.c_str()) );
-  if (dim < MED_VALID)
-  {
-    err = med_2_1::MEDgridCr(_medIdt,
-                    const_cast <char *> (_meshName.c_str()),
-                    _ptrMesh->_spaceDimension,
-                    (med_2_1::med_grid_type) ptrGrid->getGridType());
-    if (err != MED_VALID)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Unable to create Grid"));
-    else 
-      MESSAGE(LOC<<"Grid "<<_meshName<<" created in file "<<_fileName<<" !");
-  }
-  else if (dim != _ptrMesh->_spaceDimension) 
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Grid |" << _meshName.c_str() <<
-                                 "| already exists in file |" << _fileName <<
-                                 "| with dimension |" << dim <<
-                                 "| but the dimension of the mesh we want to write is |"
-                                 << _ptrMesh->_spaceDimension <<"|" )) ;
-
-  // Recompose the <_spaceDimension> strings in 1 string 
-  int lengthString ;
-  string valueString ;
-  for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
-    SCRUTE(i);
-    valueString = _ptrMesh->_coordinate->_coordinateName[i] ;
-    lengthString = (MED_TAILLE_PNOM<valueString.size())?MED_TAILLE_PNOM:valueString.size() ;
-    tmp_name.replace(i*MED_TAILLE_PNOM,i*MED_TAILLE_PNOM+lengthString,valueString,0,lengthString);
-    valueString = _ptrMesh->_coordinate->_coordinateUnit[i];
-    lengthString = (MED_TAILLE_PNOM<valueString.size())?MED_TAILLE_PNOM:valueString.size() ;
-    tmp_unit.replace(i*MED_TAILLE_PNOM,i*MED_TAILLE_PNOM+lengthString,valueString,0,lengthString);
-  }
+  _concreteMeshDrv->setMeshName(meshName);
+}
 
 
-  // Pourquoi le stocker sous forme de chaîne ?
-  const string & coordinateSystem = _ptrMesh->_coordinate->_coordinateSystem;
-  if      (coordinateSystem  == "CARTESIAN") 
-    rep = med_2_1::MED_CART;
-  else if ( coordinateSystem == "CYLINDRICAL")
-    rep = med_2_1::MED_CYL;
-  else if ( coordinateSystem == "SPHERICAL" )
-    rep = med_2_1::MED_SPHER;
-  else
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Grid |" << _meshName.c_str() <<
-                                 "| doesn't have a valid coordinate system : |" 
-                                 << _ptrMesh->_coordinate->_coordinateSystem
-                                 << "|" )) ;  
-
-  med_2_1::med_int ArrayLen[] = { (med_2_1::med_int) ptrGrid->_iArrayLength,
-                     (med_2_1::med_int) ptrGrid->_jArrayLength,
-                     (med_2_1::med_int) ptrGrid->_kArrayLength  };
-  
-  // Write node coordinates for MED_BODY_FITTED grid
-  if (ptrGrid->getGridType() == MED_EN::MED_BODY_FITTED)
-  {
-
-    // Write Coordinates and families
-    double * coo = const_cast <double *>
-      (_ptrMesh->_coordinate->getCoordinates(MED_EN::MED_FULL_INTERLACE));
-    
-    // Write unused families
-    //CCRT unused => med_2_1::med_int
-    med_2_1::med_int * MEDArrayNodeFamily = new med_2_1::med_int[_ptrMesh->_numberOfNodes] ;
-
-    err = MEDbodyFittedEcr (_medIdt,
-                            const_cast <char *> (_ptrMesh->_name.c_str()),
-                            _ptrMesh->_spaceDimension,
-                            coo,
-                            ArrayLen,
-                            med_2_1::MED_FULL_INTERLACE,
-                            rep,
-                            const_cast <char *> (tmp_name.c_str()),
-                            const_cast <char *> (tmp_unit.c_str()),
-                            MEDArrayNodeFamily,
-                            _ptrMesh->_numberOfNodes,
-                            med_2_1::MED_REMP);
-    delete[] MEDArrayNodeFamily;
-
-    if (err != MED_VALID)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"error in MEDbodyFittedEcr()"));
+string MED_MESH_RDONLY_DRIVER::getMeshName() const
+{
+  return MED_MESH_DRIVER::getMeshName();
+}
 
 
-  }
-  else
-  {
-    // Write Arrays of Cartesian or Polar Grid
-
-    double * Array[] = { ptrGrid->_iArray,
-                         ptrGrid->_jArray,
-                         ptrGrid->_kArray };
-    int idim;
-    for (idim = 0; idim < _ptrMesh->_spaceDimension; ++idim)
-    {
-      err = med_2_1::MEDgridEcr (_medIdt,
-                        const_cast <char *> (_ptrMesh->_name.c_str()),
-                        _ptrMesh->_spaceDimension,
-                        Array [idim],
-                        ArrayLen [idim],
-                        idim,
-                        med_2_1::MED_FULL_INTERLACE,
-                        rep,
-                        const_cast <char *> (tmp_name.c_str()),
-                        const_cast <char *> (tmp_unit.c_str()),
-                        med_2_1::MED_REMP);
-      if (err != MED_VALID)
-        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't read grid coordinates for "
-                                     << idim << "-th dimention"));
-    }
+GENDRIVER * MED_MESH_RDONLY_DRIVER::copy ( void ) const
+{
+  return new MED_MESH_RDONLY_DRIVER(*this);
+}
 
 
-//      err = MEDfamGridEcr(_medIdt,
-//                          const_cast <char *> (_ptrMesh->_name.c_str()),
-//                          _ptrMesh->_MEDArrayNodeFamily,
-//                          _ptrMesh->_numberOfNodes,
-//                          med_2_1::MED_REMP,
-//                          med_2_1::MED_NOEUD);
-    if (err != MED_VALID)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"error in MEDfamGridEcr()"));
+// int MED_MESH_RDONLY_DRIVER::getCOORDINATE()
+// {
+//   return _concreteMeshDrv->getCOORDINATE();
+// }
 
 
-  } // end Write  Cartesian or Polar Grid
+// int MED_MESH_RDONLY_DRIVER::getCONNECTIVITY()
+// {
+//   return _concreteMeshDrv->getCONNECTIVITY();
+// }
 
 
-  END_OF(LOC);
-  return MED_VALID;
-}
+// int MED_MESH_RDONLY_DRIVER::getFAMILY()
+// {
+//   return _concreteMeshDrv->getFAMILY();
+// }
 
 
-//=======================================================================
-//function : writeCoordinates
-//purpose  : 
-//=======================================================================
+// int MED_MESH_RDONLY_DRIVER::getNodalConnectivity(CONNECTIVITY * Connectivity)
+// {
+//   return _concreteMeshDrv->getNodalConnectivity(Connectivity);
+// }
 
 
-int MED_MESH_WRONLY_DRIVER::writeCoordinates() const {
-  const char * LOC = "int MED_MESH_WRONLY_DRIVER::writeCoordinates() const : ";
-  BEGIN_OF(LOC);
+// int MED_MESH_RDONLY_DRIVER::getDescendingConnectivity(CONNECTIVITY * Connectivity)
+// {
+//   return _concreteMeshDrv->getDescendingConnectivity(Connectivity);
+// }
 
 
-  med_2_1::med_err err = MED_ERROR;
-  med_2_1::med_repere rep;
-  string tmp_name(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM,' ');
-  string tmp_unit(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM,' ');
-    
-  // Recompose the <_spaceDimension> strings in 1 string 
-  int lengthString ;
-  string valueString ;
-  for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
-    valueString = _ptrMesh->_coordinate->_coordinateName[i] ;
-    lengthString = (MED_TAILLE_PNOM<valueString.size())?MED_TAILLE_PNOM:valueString.size() ;
-    tmp_name.replace(i*MED_TAILLE_PNOM,i*MED_TAILLE_PNOM+lengthString,valueString,0,lengthString);
-    valueString = _ptrMesh->_coordinate->_coordinateUnit[i];
-    lengthString = (MED_TAILLE_PNOM<valueString.size())?MED_TAILLE_PNOM:valueString.size() ;
-    tmp_unit.replace(i*MED_TAILLE_PNOM,i*MED_TAILLE_PNOM+lengthString,valueString,0,lengthString);
-  }
+// int MED_MESH_RDONLY_DRIVER::getNodesFamiliesNumber(int * MEDArrayNodeFamily)
+// {
+//   return _concreteMeshDrv->getNodesFamiliesNumber(MEDArrayNodeFamily);
+// }
 
 
-  // Test if the mesh <_meshName> already exists
-  // If it doesn't exists create it
-  // If it already exists verify if its dimension is the same as <_ptrMesh->_spaceDimension>
-  // rem : <_meshName> is the driver meshName not <ptrMesh->_meshName>
-  int dim = med_2_1::MEDdimLire(_medIdt, const_cast <char *> (_meshName.c_str()) );
-  if (dim < MED_VALID)
-    if (med_2_1::MEDmaaCr(_medIdt,const_cast <char *> (_meshName.c_str()),_ptrMesh->_spaceDimension) != 0 )
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Unable to create Mesh : |" << _meshName << "|"));
-    else 
-      {
-       MESSAGE(LOC<<"Mesh "<<_meshName<<" created in file "<<_fileName<<" !");
-      }
-  else if (dim != _ptrMesh->_spaceDimension) 
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Mesh |" << _meshName.c_str() << "| already exists in file |" << _fileName
-                                << "| with dimension |" << dim << "| but the dimension of the mesh we want to write is |"
-                                << _ptrMesh->_spaceDimension <<"|" )) ;
-    
-  // Pourquoi le stocker sous forme de chaîne ?
-  const string & coordinateSystem = _ptrMesh->_coordinate->_coordinateSystem;
-  if      (coordinateSystem  == "CARTESIAN") 
-    rep = med_2_1::MED_CART;
-  else if ( coordinateSystem == "CYLINDRICAL")
-    rep = med_2_1::MED_CYL;
-  else if ( coordinateSystem == "SPHERICAL" )
-    rep = med_2_1::MED_SPHER;
-  else
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Mesh |" << _meshName.c_str() << "| doesn't have a valid coordinate system : |" 
-                                << _ptrMesh->_coordinate->_coordinateSystem
-                                << "|" )) ;  
-      
-  err = MEDcoordEcr(_medIdt, const_cast <char *> (_meshName.c_str()),
-                   _ptrMesh->_spaceDimension, 
-                   //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ), 
-                   const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ), 
-                   med_2_1::MED_FULL_INTERLACE, 
-                   _ptrMesh->_numberOfNodes,                 //  _ptrMesh->_coordinate->_numberOfNodes
-                   med_2_1::MED_REMP,    
-                   rep,
-                   const_cast <char *> (tmp_name.c_str()), 
-                   const_cast <char *> (tmp_unit.c_str()) 
-                   );  
-
-  if (err<0) 
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write coordinates of mesh |" << _meshName.c_str() << "| in file |" << _fileName
-                                << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
-                                << " with units names |"  << tmp_name
-                                << "| and units |"       << tmp_unit
-                                << " |")) ;    
-    
-
-       //////////////////////////////////////////////////////////////////////////////////////
-       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
-       //////////////////////////////////////////////////////////////////////////////////////
-       ///
-       /// Ecrit les numéros optionnels des noeuds
-       /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
-
-
-      if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) {
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       int lgth=_ptrMesh->_coordinate->getNumberOfNodes();
-       med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-       for(int i2=0;i2<lgth;i2++)
-         temp[i2]=(med_2_1::med_int)(_ptrMesh->_coordinate->getNodesNumbers()[i2]);
-       err =  MEDnumEcr(_medIdt,const_cast <char *> (_meshName.c_str()),
-                         temp, 
-                         _ptrMesh->_numberOfNodes, med_2_1::MED_REMP,
-                         med_2_1::MED_NOEUD, med_2_1::med_geometrie_element(0) );
-       delete [] temp;
-#else        
-        err =  MEDnumEcr(_medIdt,const_cast <char *> (_meshName.c_str()),
-                         const_cast <int *> (_ptrMesh->_coordinate->getNodesNumbers() ), 
-                         _ptrMesh->_numberOfNodes, med_2_1::MED_REMP,
-                         med_2_1::MED_NOEUD, med_2_1::med_geometrie_element(0) );
-#endif
-
-        if (err<0) 
-          throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write optionnal numbers of mesh |" << _meshName.c_str() 
-                                       << "| in file |" << _fileName  << " |")) ;    
-      }
-      //////////////////////////////////////////////////////////////////////////////////////
+// int MED_MESH_RDONLY_DRIVER::getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity)
+// {
+//   return _concreteMeshDrv->getCellsFamiliesNumber(Arrays,Connectivity,entity);
+// }
 
 
-  END_OF(LOC);
-    
-  return MED_VALID;
+// void MED_MESH_RDONLY_DRIVER::getGRID()
+// {
+//   _concreteMeshDrv->getGRID();
+// }
+
+MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER()
+{
+  MESSAGE("You are using the default constructor of the Mesh write only Driver and it is 2.1 one");
+  _concreteMeshDrv = new MED_MESH_WRONLY_DRIVER21();
 }
 
 }
 
+MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh)
+{
+  _concreteMeshDrv = DRIVERFACTORY::buildMeshDriverFromFile(fileName,ptrMesh,MED_ECRI);
+}
 
 
+MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const MED_MESH_WRONLY_DRIVER & driver):MED_MESH_DRIVER(driver)
+{
+  _concreteMeshDrv = driver._concreteMeshDrv->copy();
+}
 
 
+MED_MESH_WRONLY_DRIVER::~MED_MESH_WRONLY_DRIVER()
+{
+  if (_concreteMeshDrv) delete _concreteMeshDrv;
+}
 
 
-int MED_MESH_WRONLY_DRIVER::writeConnectivities(medEntityMesh entity) const {
-  
-  const char * LOC="int MED_MESH_WRONLY_DRIVER::writeConnectivities() const : ";
-  BEGIN_OF(LOC);
+void MED_MESH_WRONLY_DRIVER::open()
+{
+  _concreteMeshDrv->open();
+}
 
 
-  med_2_1::med_err err;
-  
-  // REM SI LA METHODE EST APPELEE DIRECTEMENT ET QUE LE MAILLAGE N'EST PAS CREE IL Y A PB !
-  // PG : IMPOSSIBLE : LA METHODE EST PRIVEE !
-    
-    // A FAIRE : A tester surtout dans les methodes de MESH.
-    //    if ( _ptrMesh->_connectivity == (CONNECTIVITY *) MED_INVALID )
-  if ( _ptrMesh->_connectivity == (CONNECTIVITY *) NULL )
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The connectivity is not defined in the MESH object ")) ;
-    
-  if   ( _ptrMesh->existConnectivity(MED_NODAL,entity) ) { 
-
-    int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
-    const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
-    
-    for (int i=0; i<numberOfTypes; i++) {
-      
-      int    numberOfElements = _ptrMesh->getNumberOfElements (entity,types[i]);
-      const int * connectivity      = _ptrMesh->getConnectivity     (MED_EN::MED_FULL_INTERLACE, 
-                                                                    MED_NODAL, entity, types[i]); // ?? et SI MED_NODAL n'existe pas, recalcul auto ??
-      
-      // Pour l'instant la class utilise le multi.....
-      int multi = 0 ;
-      if (entity==MED_EN::MED_CELL)
-       if ( (types[i]/ 100) < _ptrMesh->_spaceDimension) 
-         multi=1 ;
-      int numberOfNodes = types[i]%100 ;
-      int * connectivityArray = new int[numberOfElements*(numberOfNodes+multi)];
-      
-      // version originale sans prise en compte des numéros optionnels 
-      //     
-      for (int j=0 ; j<numberOfElements; j++) 
-               {
-         for (int k=0; k<numberOfNodes; k++)
-           connectivityArray[j*(numberOfNodes+multi)+k]=connectivity[j*numberOfNodes+k] ;
-
-         if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
-       }
-      
-      //////////////////////////////////////////////////////////////////////////////////////
-      ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
-      //////////////////////////////////////////////////////////////////////////////////////
-      ///
-      /// Dénumérote les sommets des mailles pour leur rendre leurs numéros optionnels
-      /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
-
-//     if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) 
-//             {
-//             const int * nodesNumbers = _ptrMesh->_coordinate->getNodesNumbers();
-//                     for (int j=0 ; j<numberOfElements; j++) 
-//                     {
-//                     for (int k=0; k<numberOfNodes; k++) connectivityArray[j*(numberOfNodes+multi)+k]=nodesNumbers[connectivity[j*numberOfNodes+k]-1] ;
-//                     if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
-//                     }
-//             }
-//     else
-//             {
-//                     for (int j=0 ; j<numberOfElements; j++) 
-//                     {
-//                     for (int k=0; k<numberOfNodes; k++) connectivityArray[j*(numberOfNodes+multi)+k]=connectivity[j*numberOfNodes+k] ;
-//                     if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
-//                     }
-//             }
-
-      //////////////////////////////////////////////////////////////////////////////////////
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      int lgth=numberOfElements*(numberOfNodes+multi);
-      med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-      for(int i2=0;i2<lgth;i2++)
-       temp[i2]=(med_2_1::med_int)(connectivityArray[i2]);
-      err = MEDconnEcr( _medIdt, const_cast <char *> ( _meshName.c_str()), _ptrMesh->_spaceDimension,
-                       temp, med_2_1::MED_FULL_INTERLACE , numberOfElements,
-                       med_2_1::MED_REMP,
-                       (med_2_1::med_entite_maillage  ) entity, 
-                       (med_2_1::med_geometrie_element) types[i], med_2_1::MED_NOD );
-      delete [] temp;
-#else
-      err = MEDconnEcr( _medIdt, const_cast <char *> ( _meshName.c_str()), _ptrMesh->_spaceDimension,
-                       connectivityArray, med_2_1::MED_FULL_INTERLACE , numberOfElements,
-                       med_2_1::MED_REMP,
-                       (med_2_1::med_entite_maillage  ) entity, 
-                       (med_2_1::med_geometrie_element) types[i], med_2_1::MED_NOD );
-#endif
-      delete[] connectivityArray ;
-      if (err<0) // ETENDRE LES EXPLICATIONS
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write connectivities of mesh |" << _meshName.c_str() << "| in file |" << _fileName
-                                    << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
-                                    )) ;
-    }
-  }
-  // Connctivity descending :
-  if   ( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) { 
-      
-    int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
-    const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
-      
-    for (int i=0; i<numberOfTypes; i++) {
-       
-      int    numberOfElements = _ptrMesh->getNumberOfElements (entity,types[i]);
-      const int * connectivity = _ptrMesh->getConnectivity(MED_EN::MED_FULL_INTERLACE, MED_DESCENDING, entity, types[i]); 
-      
-      // Pour l'instant la class utilise le multi.....
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      int lgth=_ptrMesh->getConnectivityLength(MED_EN::MED_FULL_INTERLACE, MED_DESCENDING, entity, types[i]);
-      med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-      for(int i2=0;i2<lgth;i2++)
-       temp[i2]=(med_2_1::med_int)(connectivity[i2]);
-      err = med_2_1::MEDconnEcr( _medIdt,
-                               const_cast <char *> ( _meshName.c_str()),
-                               _ptrMesh->_spaceDimension,
-                               temp,
-                               med_2_1::MED_FULL_INTERLACE,
-                               numberOfElements,
-                               med_2_1::MED_REMP,
-                               (med_2_1::med_entite_maillage  ) entity, 
-                               (med_2_1::med_geometrie_element) types[i],
-                               med_2_1::MED_DESC );
-      delete [] temp;
-#else
-      err = med_2_1::MEDconnEcr( _medIdt,
-                               const_cast <char *> ( _meshName.c_str()),
-                               _ptrMesh->_spaceDimension,
-                               const_cast <int *> (connectivity),
-                               med_2_1::MED_FULL_INTERLACE,
-                               numberOfElements,
-                               med_2_1::MED_REMP,
-                               (med_2_1::med_entite_maillage  ) entity, 
-                               (med_2_1::med_geometrie_element) types[i],
-                               med_2_1::MED_DESC );
-#endif
-       
-      if (err<0) // ETENDRE LES EXPLICATIONS
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write connectivities of mesh |" << _meshName.c_str() << "| in file |" << _fileName
-                                    << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
-                                    )) ;
-            
-    }
-  }
-  END_OF(LOC);
-  return MED_VALID;
+void MED_MESH_WRONLY_DRIVER::close()
+{
+  _concreteMeshDrv->close();
 }
 
 }
 
-int MED_MESH_WRONLY_DRIVER::writeFamilyNumbers() const {
-  
-  const char * LOC="int MED_MESH_WRONLY_DRIVER::writeFamilyNumbers() const : ";
-  BEGIN_OF(LOC);
+void MED_MESH_WRONLY_DRIVER::setMeshName(const string & meshName)
+{
+  _concreteMeshDrv->setMeshName(meshName);
+}
 
 
-  med_2_1::med_err err;
-  
-  // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArrayNodeFamily DOIT ETRE ENLEVER DE LA CLASSE MESH
-
-  { // Node related block
-    
-    // We build the array from the families list objects :
-    int NumberOfNodes = _ptrMesh->getNumberOfNodes() ;
-    int * MEDArrayNodeFamily = new int[NumberOfNodes] ;
-    // family 0 by default
-    for (int i=0; i<NumberOfNodes; i++)
-      MEDArrayNodeFamily[i]=0;
-    //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(MED_NODE);
-    vector<FAMILY*> * myFamilies = &_ptrMesh->_familyNode;
-    int NumberOfNodesFamilies = myFamilies->size() ;
-    //bool ToDestroy = false;
-    if (0 == NumberOfNodesFamilies) {
-      //ToDestroy = true ;
-      vector<GROUP*> myGroups = _ptrMesh->getGroups(MED_NODE);
-      int NumberOfGroups = myGroups.size() ;
-      // build families from groups
-      for (int i=0; i<NumberOfGroups; i++) {
-       SUPPORT * mySupport = myGroups[i] ;
-       FAMILY* myFamily = new FAMILY(*mySupport);
-       myFamily->setIdentifier(i+1);
-       myFamilies->push_back(myFamily);
-      }
-      NumberOfNodesFamilies=myFamilies->size() ;
-    }
-    for (int i=0 ; i<NumberOfNodesFamilies; i++) {
-      //SCRUTE(i);
-      //SCRUTE(myFamilies[i]->getName());
-      int FamilyIdentifier = (*myFamilies)[i]->getIdentifier() ;
-      int TotalNumber = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
-      if ((*myFamilies)[i]->isOnAllElements())
-       for (int j=0; j<TotalNumber; j++)
-         MEDArrayNodeFamily[j]=FamilyIdentifier;
-      else {
-       const int * Number = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
-       for (int j=0; j<TotalNumber; j++)
-         MEDArrayNodeFamily[Number[j]-1]=FamilyIdentifier ;
-      }
-    }
-    for(int j=0; j<NumberOfNodes; j++) {
-      SCRUTE(MEDArrayNodeFamily[j]);
-    }
-    if ( !_ptrMesh->getIsAGrid() ){
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      int lgth=NumberOfNodes;
-      med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-      for(int i2=0;i2<lgth;i2++)
-       temp[i2]=(med_2_1::med_int)(MEDArrayNodeFamily[i2]);
-      err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                     temp, NumberOfNodes,med_2_1::MED_REMP ,
-                     med_2_1::MED_NOEUD,
-                     (med_2_1::med_geometrie_element) MED_NONE);
-      delete [] temp;
-#else
-      err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                     MEDArrayNodeFamily, NumberOfNodes,med_2_1::MED_REMP ,
-                     med_2_1::MED_NOEUD,
-                     (med_2_1::med_geometrie_element) MED_NONE); 
-#endif
-    }
-    else{
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      int lgth=NumberOfNodes;
-      med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-      for(int i2=0;i2<lgth;i2++)
-       temp[i2]=(med_2_1::med_int)(MEDArrayNodeFamily[i2]);
-      err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                     temp, NumberOfNodes,med_2_1::MED_REMP ,
-                     med_2_1::MED_NOEUD,
-                     (med_2_1::med_geometrie_element) MED_NONE);
-      delete [] temp;
-#else
-      err = MEDfamGridEcr(_medIdt,
-                         const_cast <char *> (_ptrMesh->_name.c_str()),
-                         MEDArrayNodeFamily,
-                         NumberOfNodes,
-                         med_2_1::MED_REMP,
-                         med_2_1::MED_NOEUD);
-#endif
-    }
+string MED_MESH_WRONLY_DRIVER::getMeshName() const
+{
+  return MED_MESH_DRIVER::getMeshName();
+}
 
 
-    if ( err != MED_VALID) 
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write node family for the |"<< NumberOfNodes
-                                  << "| nodes in mesh |" 
-                                  << _ptrMesh->_name.c_str() << "|" ));
-    delete[] MEDArrayNodeFamily;
-    //if (true == ToDestroy)
-    //  for (int i=0; i<NumberOfNodesFamilies; i++)
-    //   delete myFamilies[i];
-  }
-    
-  { // CELLS RELATED BLOCK
-    medEntityMesh entity=MED_EN::MED_CELL;
-    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
-    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
-
-      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
-      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
-
-      // We build the array from the families list objects :
-      int NumberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS);
-      int * MEDArrayFamily = new int[NumberOfElements] ;
-      // family 0 by default
-      for (int i=0; i<NumberOfElements; i++)
-       MEDArrayFamily[i]=0;
-      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity);
-      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyCell ;
-      int NumberOfFamilies = myFamilies->size() ;
-      //bool ToDestroy = false;
-      if (0 == NumberOfFamilies) {
-       //ToDestroy = true ;
-       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
-       int NumberOfGroups = myGroups.size() ;
-       // build families from groups
-       for (int i=0; i<NumberOfGroups; i++) {
-         SCRUTE( myGroups[i]->getName() );
-         SUPPORT * mySupport = myGroups[i] ;
-         FAMILY* myFamily = new FAMILY(*mySupport);
-         myFamily->setIdentifier(-i-1);
-         myFamilies->push_back(myFamily);
-       }
-       NumberOfFamilies=myFamilies->size() ;
-      }
-      for (int i=0 ; i<NumberOfFamilies; i++) {
-       int FamilyIdentifier = (*myFamilies)[i]->getIdentifier() ;
-       int TotalNumber = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
-       if ((*myFamilies)[i]->isOnAllElements())
-         for (int ii=0; ii<TotalNumber; ii++)
-           MEDArrayFamily[ii]=FamilyIdentifier;
-       else {
-         const int * Number = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
-         for (int ii=0; ii<TotalNumber; ii++)
-           MEDArrayFamily[Number[ii]-1]=FamilyIdentifier ;
-       }
-      }
-
-      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       int lgth=NumberOfElements;
-       med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-       for(int i2=0;i2<lgth;i2++)
-         temp[i2]=(med_2_1::med_int) (MEDArrayFamily[i2]);
-#endif
-      for (int i=0; i<numberOfTypes; i++) {
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                       temp+typeCount[i]-1,typeCount[i+1]-typeCount[i],
-                       med_2_1::MED_REMP ,
-                       (med_2_1::med_entite_maillage) entity,
-                       (med_2_1::med_geometrie_element) types[i]
-);
-#else
-       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                       MEDArrayFamily+typeCount[i]-1,typeCount[i+1]-typeCount[i],
-                       med_2_1::MED_REMP ,
-                       (med_2_1::med_entite_maillage) entity,
-                       (med_2_1::med_geometrie_element) types[i]
-); 
-#endif
-       MESSAGE("OK "<<i);
-       if ( err != MED_VALID) 
-         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
-                                      << "| cells of geometric type |" << geoNames[ types[i]] <<"|in mesh |"      
-                                      << _ptrMesh->_name.c_str() << "|" ));   
-      }
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      delete [] temp;
-#endif
-      delete[] MEDArrayFamily ;
-      //if (true == ToDestroy) {
-      //  int NumberOfFamilies = myFamilies->size();
-      //  for (int i=0; i<NumberOfFamilies; i++)
-      //    delete myFamilies[i];
-      //}
-    }
-  }
+GENDRIVER * MED_MESH_WRONLY_DRIVER::copy ( void ) const
+{
+  return new MED_MESH_WRONLY_DRIVER(*this);
+}
 
 
-  { // FACE RELATED BLOCK
-    medEntityMesh entity=MED_EN::MED_FACE;
-    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
-    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
-
-      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
-      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
-      SCRUTE(numberOfTypes);
-      
-      int numberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS) ;
-      int * familyArray = new int[numberOfElements] ;
-      for (int i=0;i<numberOfElements;i++)
-       familyArray[i]=0;
-
-      int numberOfFamilies = _ptrMesh->getNumberOfFamilies(entity) ;
-      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity) ;
-      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyFace ;
-      //bool ToDestroy = false;
-      if (0 == numberOfFamilies) {
-       //ToDestroy = true ;
-       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
-       int NumberOfGroups = myGroups.size() ;
-       // build families from groups
-       for (int i=0; i<NumberOfGroups; i++) {
-         SCRUTE( myGroups[i]->getName() );
-         SUPPORT * mySupport = myGroups[i] ;
-         FAMILY* myFamily = new FAMILY(*mySupport);
-         myFamily->setIdentifier(-i-1000);
-         myFamilies->push_back(myFamily);
-       }
-       numberOfFamilies=myFamilies->size() ;
-      }
-      for (int i=0;i<numberOfFamilies;i++) {
-       int familyNumber = (*myFamilies)[i]->getIdentifier() ;
-       int numberOfFamilyElements = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
-       if ((*myFamilies)[i]->isOnAllElements())
-         for (int ii=0; ii<numberOfFamilyElements; ii++)
-           familyArray[ii]=familyNumber;
-       else {
-         const int * myFamilyElements = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
-         for (int ii=0;ii<numberOfFamilyElements;ii++)
-           familyArray[myFamilyElements[ii]-1]=familyNumber;
-       }
-      }
-
-      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       int lgth=numberOfElements;
-       med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-       for(int i2=0;i2<lgth;i2++)
-         temp[i2]=(med_2_1::med_int) (familyArray[i2]);
-#endif
-      for (int i=0; i<numberOfTypes; i++) {
-
-       int typeNumberOfElements = typeCount[i+1] - typeCount[i] ;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                       temp+typeCount[i]-1, typeNumberOfElements,
-                       med_2_1::MED_REMP ,
-                       (med_2_1::med_entite_maillage) entity,
-                       (med_2_1::med_geometrie_element) types[i]);
-#else
-       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                       familyArray+typeCount[i]-1, typeNumberOfElements,
-                       med_2_1::MED_REMP ,
-                       (med_2_1::med_entite_maillage) entity,
-                       (med_2_1::med_geometrie_element) types[i]); 
-#endif
-       if ( err != MED_VALID) 
-         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
-                                      << "| faces of geometric type |" << geoNames[types[i]] <<"|in mesh |"      
-                                      << _ptrMesh->_name.c_str() << "|" ));   
-      }
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      delete [] temp;
-#endif
-      delete[] familyArray ;
-      //if (true == ToDestroy) {
-      //  int NumberOfFamilies = myFamilies->size();
-      //    for (int i=0; i<NumberOfFamilies; i++)
-      //      delete myFamilies[i];
-      //}
-    }
-  }
+void MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::read ( void )
+{
+  _concreteMeshDrv->read();
+}
 
 
-  { // EDGE RELATED BLOCK
-    //medEntityMesh entity=MED_EN::MED_FACE;
-    medEntityMesh entity=MED_EN::MED_EDGE;
-    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
-    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
-
-      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
-      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
-      
-      int numberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS) ;
-      int * familyArray = new int[numberOfElements] ;
-      for (int i=0;i<numberOfElements;i++)
-       familyArray[i]=0;
-
-      int numberOfFamilies = _ptrMesh->getNumberOfFamilies(entity) ;
-      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity) ;
-      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyEdge ;
-      //bool ToDestroy = false;
-      if (0 == numberOfFamilies) {
-       //ToDestroy = true ;
-       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
-       int NumberOfGroups = myGroups.size() ;
-       // build families from groups
-       for (int i=0; i<NumberOfGroups; i++) {
-         SCRUTE( myGroups[i]->getName() );
-         SUPPORT * mySupport = myGroups[i] ;
-         FAMILY* myFamily = new FAMILY(*mySupport);
-         myFamily->setIdentifier(-i-2000);
-         myFamilies->push_back(myFamily);
-       }
-       numberOfFamilies=myFamilies->size() ;
-      }
-      for (int i=0;i<numberOfFamilies;i++) {
-       int familyNumber = (*myFamilies)[i]->getIdentifier() ;
-       int numberOfFamilyElements = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
-       if ((*myFamilies)[i]->isOnAllElements())
-         for (int ii=0; ii<numberOfFamilyElements; ii++)
-           familyArray[ii]=familyNumber;
-       else {
-         const int * myFamilyElements = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
-         for (int ii=0;ii<numberOfFamilyElements;ii++)
-           familyArray[myFamilyElements[ii]-1]=familyNumber;
-       }
-      }
-
-      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       int lgth=numberOfElements;
-       med_2_1::med_int *temp=new med_2_1::med_int[lgth];
-       for(int i2=0;i2<lgth;i2++)
-         temp[i2]=(med_2_1::med_int) (familyArray[i2]);
-#endif
-      for (int i=0; i<numberOfTypes; i++) {
-
-       int typeNumberOfElements = typeCount[i+1] - typeCount[i] ;
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                       temp+typeCount[i]-1, typeNumberOfElements,
-                       med_2_1::MED_REMP ,
-                       (med_2_1::med_entite_maillage) entity,
-                       (med_2_1::med_geometrie_element) types[i]);
-#else
-       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
-                       familyArray+typeCount[i]-1, typeNumberOfElements,
-                       med_2_1::MED_REMP ,
-                       (med_2_1::med_entite_maillage) entity,
-                       (med_2_1::med_geometrie_element) types[i]); 
-#endif
-       if ( err != MED_VALID) 
-         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
-                                      << "| edges of geometric type |" << geoNames[types[i]] <<"|in mesh |"      
-                                      << _ptrMesh->_name.c_str() << "|" ));   
-      }
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      delete [] temp;
-#endif
-      delete[] familyArray ;
-      //if (true == ToDestroy) {
-      //  int NumberOfFamilies = myFamilies->size();
-      //  for (int i=0; i<NumberOfFamilies; i++)
-      //    delete myFamilies[i];
-      //}
-    }
-  }
-    
-  END_OF(LOC);
-  return MED_VALID;
+void MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::write( void ) const
+{
+  _concreteMeshDrv->write();
 }
 
 }
 
-int MED_MESH_WRONLY_DRIVER::writeFamilies(vector<FAMILY*> & families ) const {
-  
-  const char * LOC="int MED_MESH_WRONLY_DRIVER::writeFamilies(vector<FAMILY*> families) const : ";
-  BEGIN_OF(LOC);
+// int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeCoordinates    ()                           const
+// {
+//   return _concreteMeshDrv->writeCoordinates();
+// }
 
 
-  med_2_1::med_err err;
-  
-  MESSAGE(LOC<<" families.size() :"<<families.size());
-
-  for (unsigned int i=0; i< families.size(); i++) {
-
-    int      numberOfAttributes         = families[i]->getNumberOfAttributes ();
-    string   attributesDescriptions     = "";
-
-    // Recompose the attributes descriptions arg for MED
-    for (int j=0; j < numberOfAttributes; j++) {
-        
-      string attributeDescription = families[i]->getAttributeDescription(j+1);
-        
-      if ( attributeDescription.size() > MED_TAILLE_DESC )
-       throw MEDEXCEPTION( LOCALIZED(STRING(LOC) << "The size of the attribute description n° |" << j+1 << "| of the family |" << families[i]->getName()
-                                     << "| with identifier |" << families[i]->getIdentifier()  << "| is |" 
-                                     <<  attributeDescription.size()  <<"| and is more than |" <<  MED_TAILLE_DESC << "|")) ;
-        
-      attributesDescriptions += attributeDescription;
-    }
-      
-
-    int      numberOfGroups  = families[i]->getNumberOfGroups();
-    string   groupsNames(numberOfGroups*MED_TAILLE_LNOM,'\0') ;
-    // Recompose the groups names arg for MED
-    for (int j=0; j < numberOfGroups; j++) {
-
-      string groupName = families[i]->getGroupName(j+1);
-       
-      if ( groupName.size() > MED_TAILLE_LNOM )
-       throw MEDEXCEPTION( LOCALIZED(STRING(LOC) << "The size of the group name  n° |" << j+1 << "| of the family |" << families[i]->getName()
-                                     << "| with identifier |" << families[i]->getIdentifier()  << "| is |" 
-                                     <<  groupName.size()  <<"| and is more than |" << MED_TAILLE_LNOM << "|")) ;
-        
-
-      int length = min(MED_TAILLE_LNOM,(int)groupName.size());
-      groupsNames.replace(j*MED_TAILLE_LNOM,length, groupName,0,length);
-      
-    }
+// int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeConnectivities (MED_EN::medEntityMesh entity)       const
+// {
+//   return _concreteMeshDrv->writeConnectivities(entity);
+// }
 
 
-    // test if the family already exists (HDF trick waiting a MED evolution to be replaced)
-    string dataGroupFam = "/ENS_MAA/"+_meshName+"/FAS/"+families[i]->getName()+"/";  
-    SCRUTE("|"<<dataGroupFam<<"|");
-    err =_MEDdatagroupOuvrir(_medIdt,const_cast <char *> (dataGroupFam.c_str()) ) ;
-    if ( err < MED_VALID ) {
-      SCRUTE(err);
-
-      MESSAGE(LOC<<"families[i]->getName().c_str() : "<<families[i]->getName().c_str());
-      MESSAGE(LOC<<"_meshName.c_str() : "<<_meshName.c_str());
-      MESSAGE(LOC<<"families[i]->getIdentifier() : "<<families[i]->getIdentifier());
-      MESSAGE(LOC<<"numberOfAttributes : "<<numberOfAttributes);
-       
-      //MESSAGE(LOC<<"families[i]->getAttributesIdentifiers() : "<<families[i]->getAttributesIdentifiers()[0]);
-      //MESSAGE(LOC<<"families[i]->getAttributesValues() : "<<families[i]->getAttributesValues()[0]);
-      MESSAGE(LOC<<"attributesDescriptions.c_str() : "<<attributesDescriptions.c_str());
-      MESSAGE(LOC<<"numberOfGroups : "<<numberOfGroups);
-      MESSAGE(LOC<<"groupsNames.c_str() : "<<groupsNames.c_str());
-#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-      int lgth=families[i]->getNumberOfAttributes();
-      med_2_1::med_int *  AttributesIdentifier2 = new med_2_1::med_int[lgth] ;
-      med_2_1::med_int *  AttributesValues2     = new med_2_1::med_int[lgth] ;
-      for(med_2_1::med_int i2=0;i2<lgth;i2++)
-       {
-         AttributesIdentifier2[i2]=(med_2_1::med_int)(families[i]->getAttributesIdentifiers()[i2]);
-         AttributesValues2[i2]=(med_2_1::med_int)(families[i]->getAttributesValues()[i2]);
-       }
-      err = med_2_1::MEDfamCr( _medIdt, 
-                             const_cast <char *> ( _meshName.c_str() ),
-                             const_cast <char *> ( families[i]->getName().c_str() ),
-                             families[i]->getIdentifier(), 
-                             AttributesIdentifier2,
-                             AttributesValues2,
-                             const_cast <char *> (attributesDescriptions.c_str()), 
-                             numberOfAttributes,  
-                             const_cast <char *> (groupsNames.c_str()), 
-                             numberOfGroups);
-      delete [] AttributesIdentifier2;
-      delete [] AttributesValues2;
-#else
-      err = med_2_1::MEDfamCr( _medIdt, 
-                             const_cast <char *> ( _meshName.c_str() ),
-                             const_cast <char *> ( families[i]->getName().c_str() ),
-                             families[i]->getIdentifier(), 
-                             families[i]->getAttributesIdentifiers(),
-                             families[i]->getAttributesValues(),
-                             const_cast <char *> (attributesDescriptions.c_str()), 
-                             numberOfAttributes,  
-                             const_cast <char *> (groupsNames.c_str()), 
-                             numberOfGroups);
-#endif
-      SCRUTE(err);
-      if ( err != MED_VALID) 
-       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't create family |" << families[i]->getName()
-                                    << "| with identifier |" << families[i]->getIdentifier()  << "| groups names |" 
-                                    << groupsNames  <<"| and  attributes descriptions |" << attributesDescriptions << "|")) ;
-    }
-    else
-      _MEDdatagroupFermer(_medIdt);
+// int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeFamilyNumbers  ()                           const
+// {
+//   return _concreteMeshDrv->writeFamilyNumbers();
+// }
 
 
+// int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeFamilies       (vector<FAMILY*> & families) const
+// {
+//   return _concreteMeshDrv->writeFamilies(families);
+// }
 
 
-  }
+// int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeGRID() const
+// {
+//   return _concreteMeshDrv->writeGRID();
+// }
 
 
-  END_OF(LOC);
-    
-  return MED_VALID;
+MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER()
+{
+  _concreteMeshDrv=new MED_MESH_RDWR_DRIVER21();
 }
 
 }
 
+MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh)
+{
+  _concreteMeshDrv = DRIVERFACTORY::buildMeshDriverFromFile(fileName,ptrMesh,MED_REMP);
+}
 
 
-// A FAIRE POUR LES NOEUDS ET LES ELEMENTS ret = MEDfamEcr(
-
-
-
-/*--------------------- RDWR PART -------------------------------*/
+MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const MED_MESH_RDWR_DRIVER & driver): MED_MESH_DRIVER(driver)
+{
+  _concreteMeshDrv = driver._concreteMeshDrv->copy();
+}
 
 
-MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER():MED_MESH_DRIVER()
+MED_MESH_RDWR_DRIVER::~MED_MESH_RDWR_DRIVER()
 {
 {
+  if (_concreteMeshDrv) delete _concreteMeshDrv;
 }
 
 }
 
-MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName,
-                                          MESH * ptrMesh):
-  MED_MESH_DRIVER(fileName,ptrMesh,MED_RDWR)
+void MED_MESH_RDWR_DRIVER::read ( void )
 {
 {
-  MESSAGE("MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
+  _concreteMeshDrv->read();
 }
 
 }
 
-MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const MED_MESH_RDWR_DRIVER & driver): 
-  MED_MESH_RDONLY_DRIVER::MED_MESH_DRIVER(driver)
+void MED_MESH_RDWR_DRIVER::write( void ) const
 {
 {
+  _concreteMeshDrv->write();
+}
+void MED_MESH_RDWR_DRIVER::open()
+{
+  _concreteMeshDrv->open();
 }
 
 }
 
-MED_MESH_RDWR_DRIVER::~MED_MESH_RDWR_DRIVER() {
-  //MESSAGE("MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
-} 
-  
-GENDRIVER * MED_MESH_RDWR_DRIVER::copy(void) const
+void MED_MESH_RDWR_DRIVER::close()
 {
 {
-  return new MED_MESH_RDWR_DRIVER(*this);
+  _concreteMeshDrv->close();
 }
 
 }
 
-void MED_MESH_RDWR_DRIVER::write(void) const
+// int MED_MESH_RDWR_DRIVER::getCOORDINATE()
+// {
+//   return _concreteMeshDrv->getCOORDINATE();
+// }
+
+// int MED_MESH_RDWR_DRIVER::getCONNECTIVITY()
+// {
+//   return _concreteMeshDrv->getCONNECTIVITY();
+// }
+
+// int MED_MESH_RDWR_DRIVER::getFAMILY()
+// {
+//   return _concreteMeshDrv->getFAMILY();
+// }
+
+// int MED_MESH_RDWR_DRIVER::getNodalConnectivity(CONNECTIVITY * Connectivity)
+// {
+//   return _concreteMeshDrv->getNodalConnectivity(Connectivity);
+// }
+
+// int MED_MESH_RDWR_DRIVER::getDescendingConnectivity(CONNECTIVITY * Connectivity)
+// {
+//   return _concreteMeshDrv->getDescendingConnectivity(Connectivity);
+// }
+// int MED_MESH_RDWR_DRIVER::getNodesFamiliesNumber(int * MEDArrayNodeFamily)
+// {
+//   return _concreteMeshDrv->getNodesFamiliesNumber(MEDArrayNodeFamily);
+// }
+
+// int MED_MESH_RDWR_DRIVER::getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity)
+// {
+//   return _concreteMeshDrv->getCellsFamiliesNumber(Arrays,Connectivity,entity);
+// }
+
+// void MED_MESH_RDWR_DRIVER::getGRID ()
+// {
+//   _concreteMeshDrv->getGRID();
+// }
+
+// int MED_MESH_RDWR_DRIVER::writeCoordinates    ()                           const
+// {
+//   _concreteMeshDrv->writeCoordinates();
+// }
+
+// int MED_MESH_RDWR_DRIVER::writeConnectivities (MED_EN::medEntityMesh entity)       const
+// {
+//   return _concreteMeshDrv->writeConnectivities (entity);
+// }
+
+// int MED_MESH_RDWR_DRIVER::writeFamilyNumbers  ()                           const
+// {
+//   return _concreteMeshDrv->writeFamilyNumbers();
+// }
+
+// int MED_MESH_RDWR_DRIVER::writeFamilies       (vector<FAMILY*> & families) const
+// {
+//   return _concreteMeshDrv->writeFamilies(families);
+// }
+
+// int MED_MESH_RDWR_DRIVER::writeGRID() const
+// {
+//   return _concreteMeshDrv->writeGRID();
+// }
+
+void MED_MESH_RDWR_DRIVER::setMeshName(const string & meshName)
 {
 {
-  MED_MESH_WRONLY_DRIVER::write();
+  _concreteMeshDrv->setMeshName(meshName);
 }
 }
-void MED_MESH_RDWR_DRIVER::read (void)
+
+string MED_MESH_RDWR_DRIVER::getMeshName() const
 {
 {
-  MED_MESH_RDONLY_DRIVER::read();
+  return MED_MESH_DRIVER::getMeshName();
 }
 
 }
 
+GENDRIVER * MED_MESH_RDWR_DRIVER::copy ( void ) const
+{
+  return new MED_MESH_RDWR_DRIVER(*this);
+}
index b00313db79d47183fdf369bb97ff4a319935c084..a197fe7c036cfa1c26b56b270217ee3abcd8aa30 100644 (file)
@@ -28,16 +28,11 @@ class MED_MESH_DRIVER : public GENDRIVER
 protected:
   
   MESH *   _ptrMesh;
 protected:
   
   MESH *   _ptrMesh;
-  med_2_1::med_idt        _medIdt;
   string         _meshName;    // const ?
   int            _meshNum;     // INUTILE ?
   string         _meshName;    // const ?
   int            _meshNum;     // INUTILE ?
-  
-public :
 
 
-  // all MED cell type
-  static const med_2_1::med_geometrie_element all_cell_type[MED_NBR_GEOMETRIE_MAILLE];
-  
-  static const char * const all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE];
+
+public :
 
   /*!
     Constructor.
 
   /*!
     Constructor.
@@ -59,8 +54,8 @@ public :
   */
   virtual ~MED_MESH_DRIVER() ;
 
   */
   virtual ~MED_MESH_DRIVER() ;
 
-  void open();
-  void close();
+  virtual void open() = 0;
+  virtual void close() = 0;
 
   virtual void write( void ) const = 0 ;
   virtual void read ( void ) = 0 ;
 
   virtual void write( void ) const = 0 ;
   virtual void read ( void ) = 0 ;
@@ -70,13 +65,13 @@ public :
 
     It could be different than the name of the MESH object.
   */
 
     It could be different than the name of the MESH object.
   */
-  void   setMeshName(const string & meshName) ;
+  virtual void   setMeshName(const string & meshName) ;
   /*!
     Get the name of the MESH asked in file.
   */
   /*!
     Get the name of the MESH asked in file.
   */
-  string getMeshName() const ;
+  virtual string getMeshName() const ;
 
 
-private:
+public:
   virtual GENDRIVER * copy ( void ) const = 0 ;
 
 };
   virtual GENDRIVER * copy ( void ) const = 0 ;
 
 };
@@ -89,7 +84,7 @@ private:
 
 */
 
 
 */
 
-class MED_MESH_RDONLY_DRIVER : public virtual MED_MESH_DRIVER
+  class IMED_MESH_RDONLY_DRIVER : public virtual MED_MESH_DRIVER
 {
  
 public :
 {
  
 public :
@@ -97,45 +92,35 @@ public :
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_MESH_RDONLY_DRIVER() ;
+  IMED_MESH_RDONLY_DRIVER() ;
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh) ;
+  IMED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh) ;
   /*!
     Copy constructor.
   */
   /*!
     Copy constructor.
   */
-  MED_MESH_RDONLY_DRIVER(const MED_MESH_RDONLY_DRIVER & driver) ;
-
-  /*!
-    Destructor.
-  */
-  virtual ~MED_MESH_RDONLY_DRIVER() ;
+  IMED_MESH_RDONLY_DRIVER(const IMED_MESH_RDONLY_DRIVER & driver) ;
   
   // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
   
   // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
-
   /*!
     Return a MEDEXCEPTION : it is the read-only driver.
   */
   void write( void ) const;
   /*!
     Return a MEDEXCEPTION : it is the read-only driver.
   */
   void write( void ) const;
-  /*!
-    Read MESH in the specified file.
-  */
-  void read ( void );
 
 
-private:
-  int getCOORDINATE();
-  int getCONNECTIVITY();
-  int getFAMILY();
-  int getNodalConnectivity(CONNECTIVITY * Connectivity) ;
-  int getDescendingConnectivity(CONNECTIVITY * Connectivity) ;
-  int getNodesFamiliesNumber(int * MEDArrayNodeFamily) ;
-  int getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity) ;
+protected:
+//   virtual int getCOORDINATE() = 0 ;
+//   virtual int getCONNECTIVITY() = 0 ;
+//   virtual int getFAMILY() = 0 ;
+//   virtual int getNodalConnectivity(CONNECTIVITY * Connectivity) = 0 ;
+  int getDescendingConnectivity(CONNECTIVITY * Connectivity);
+//   virtual int getNodesFamiliesNumber(int * MEDArrayNodeFamily) = 0 ;
+//   virtual int getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity) = 0 ;
   void updateFamily() ;
   void buildAllGroups(vector<GROUP*> & Groups, vector<FAMILY*> & Families) ;
   void updateFamily() ;
   void buildAllGroups(vector<GROUP*> & Groups, vector<FAMILY*> & Families) ;
-  void getGRID ();
+//   virtual void getGRID () = 0 ;
 
 
-  GENDRIVER * copy ( void ) const ;
+  friend class MED_MESH_RDONLY_DRIVER;
 
 };
 
 
 };
 
@@ -147,45 +132,41 @@ private:
 
 */
 
 
 */
 
-class MED_MESH_WRONLY_DRIVER : public virtual MED_MESH_DRIVER {
+class IMED_MESH_WRONLY_DRIVER : public virtual MED_MESH_DRIVER {
   
 public :
   
   /*!
     Constructor.
   */
   
 public :
   
   /*!
     Constructor.
   */
-  MED_MESH_WRONLY_DRIVER() ;
+  IMED_MESH_WRONLY_DRIVER() ;
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) ;
+  IMED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) ;
   /*!
     Copy constructor.
   */
   /*!
     Copy constructor.
   */
-  MED_MESH_WRONLY_DRIVER(const MED_MESH_WRONLY_DRIVER & driver) ;
+  IMED_MESH_WRONLY_DRIVER(const IMED_MESH_WRONLY_DRIVER & driver) ;
 
   /*!
     Destructor.
   */
 
   /*!
     Destructor.
   */
-  virtual ~MED_MESH_WRONLY_DRIVER() ;
+  virtual ~IMED_MESH_WRONLY_DRIVER() ;
 
 
-  /*!
-    Write MESH in the specified file.
-  */
-  void write( void ) const;
   /*!
     Return a MEDEXCEPTION : it is the write-only driver.
   */
   void read ( void );
 
   /*!
     Return a MEDEXCEPTION : it is the write-only driver.
   */
   void read ( void );
 
-private:
-  int writeCoordinates    ()                           const;
-  int writeConnectivities (MED_EN::medEntityMesh entity)       const;
-  int writeFamilyNumbers  ()                           const;
-  int writeFamilies       (vector<FAMILY*> & families) const;
-  int writeGRID() const;
+// protected:
+//   virtual int writeCoordinates    ()                           const = 0 ;
+//   virtual int writeConnectivities (MED_EN::medEntityMesh entity)       const = 0 ;
+//   virtual int writeFamilyNumbers  ()                           const = 0 ;
+//   virtual int writeFamilies       (vector<FAMILY*> & families) const = 0 ;
+//   virtual int writeGRID() const = 0 ;
 
 
-  GENDRIVER * copy ( void ) const ;
+  friend class MED_MESH_WRONLY_DRIVER;
 };
 
 
 };
 
 
@@ -197,41 +178,110 @@ private:
 
 */
 
 
 */
 
-class MED_MESH_RDWR_DRIVER : public MED_MESH_RDONLY_DRIVER, public MED_MESH_WRONLY_DRIVER {
+class IMED_MESH_RDWR_DRIVER : public virtual IMED_MESH_RDONLY_DRIVER, public virtual IMED_MESH_WRONLY_DRIVER {
 
 public :
 
   /*!
     Constructor.
   */
 
 public :
 
   /*!
     Constructor.
   */
-  MED_MESH_RDWR_DRIVER() ;
+  IMED_MESH_RDWR_DRIVER() ;
   /*!
     Constructor.
   */
   /*!
     Constructor.
   */
-  MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) ;
+  IMED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) ;
   /*!
     Copy constructor.
   */
   /*!
     Copy constructor.
   */
-  MED_MESH_RDWR_DRIVER(const MED_MESH_RDWR_DRIVER & driver) ;
+  IMED_MESH_RDWR_DRIVER(const IMED_MESH_RDWR_DRIVER & driver) ;
 
   /*!
     Destructor.
   */
 
   /*!
     Destructor.
   */
-  ~MED_MESH_RDWR_DRIVER() ;
+  ~IMED_MESH_RDWR_DRIVER() ;
 
 
-  /*!
-    Write MESH in the specified file.
-  */
-  void write(void) const;
-  /*!
-    Read MESH in the specified file.
-  */
-  void read (void);
+  friend class MED_MESH_RDWR_DRIVER;
 
 
-private:
-  GENDRIVER * copy(void) const ;
+};
 
 
+class MED_MESH_RDONLY_DRIVER : public virtual IMED_MESH_RDONLY_DRIVER
+{
+public:
+  MED_MESH_RDONLY_DRIVER();
+  MED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh);
+  MED_MESH_RDONLY_DRIVER(const MED_MESH_RDONLY_DRIVER & driver);
+  ~MED_MESH_RDONLY_DRIVER();
+  void   setMeshName(const string & meshName);
+  string getMeshName() const;
+  void write( void ) const;
+  void read ( void );
+  void open();
+  void close();
+protected:
+  GENDRIVER * _concreteMeshDrv;
+//   int getCOORDINATE();
+//   int getCONNECTIVITY();
+//   int getFAMILY();
+//   int getNodalConnectivity(CONNECTIVITY * Connectivity);
+//   int getDescendingConnectivity(CONNECTIVITY * Connectivity);
+//   int getNodesFamiliesNumber(int * MEDArrayNodeFamily);
+//   int getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity);
+//   void getGRID ();
+  GENDRIVER * copy ( void ) const;
 };
 };
+
+class MED_MESH_WRONLY_DRIVER : public virtual IMED_MESH_WRONLY_DRIVER {
+public :
+  MED_MESH_WRONLY_DRIVER();
+  MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh);
+  MED_MESH_WRONLY_DRIVER(const MED_MESH_WRONLY_DRIVER & driver);
+  ~MED_MESH_WRONLY_DRIVER();
+  void   setMeshName(const string & meshName);
+  string getMeshName() const;
+  void read ( void );
+  void write( void ) const;
+  void open();
+  void close();
+protected:
+  GENDRIVER * _concreteMeshDrv;
+//   int writeCoordinates    ()                           const;
+//   int writeConnectivities (MED_EN::medEntityMesh entity)       const;
+//   int writeFamilyNumbers  ()                           const;
+//   int writeFamilies       (vector<FAMILY*> & families) const;
+//   int writeGRID() const;
+  GENDRIVER * copy ( void ) const;
+};
+
+class MED_MESH_RDWR_DRIVER : public IMED_MESH_RDWR_DRIVER {
+public :
+  MED_MESH_RDWR_DRIVER();
+  MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh);
+  MED_MESH_RDWR_DRIVER(const MED_MESH_RDWR_DRIVER & driver);
+  ~MED_MESH_RDWR_DRIVER();
+  void   setMeshName(const string & meshName);
+  string getMeshName() const;
+  void read ( void );
+  void write( void ) const;
+  void open();
+  void close();
+protected:
+  GENDRIVER * _concreteMeshDrv;
+//   int getCOORDINATE();
+//   int getCONNECTIVITY();
+//   int getFAMILY();
+//   int getNodalConnectivity(CONNECTIVITY * Connectivity);
+//   int getDescendingConnectivity(CONNECTIVITY * Connectivity);
+//   int getNodesFamiliesNumber(int * MEDArrayNodeFamily);
+//   int getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity);
+//   void getGRID ();
+//   int writeCoordinates    ()                           const;
+//   int writeConnectivities (MED_EN::medEntityMesh entity)       const;
+//   int writeFamilyNumbers  ()                           const;
+//   int writeFamilies       (vector<FAMILY*> & families) const;
+//   int writeGRID() const;
+  GENDRIVER * copy ( void ) const;
+};
+
 };
 
 #endif /* MED_MESH_DRIVER_HXX */
 };
 
 #endif /* MED_MESH_DRIVER_HXX */
diff --git a/src/MEDMEM/MEDMEM_MedMeshDriver21.cxx b/src/MEDMEM/MEDMEM_MedMeshDriver21.cxx
new file mode 100644 (file)
index 0000000..4c19248
--- /dev/null
@@ -0,0 +1,2565 @@
+#include "MEDMEM_MedMeshDriver21.hxx"
+
+#include "MEDMEM_DriversDef.hxx"
+
+#include "MEDMEM_Family.hxx"
+#include "MEDMEM_Group.hxx"
+#include "MEDMEM_Coordinate.hxx"
+#include "MEDMEM_Connectivity.hxx"
+#include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_CellModel.hxx"
+#include "MEDMEM_Grid.hxx"
+
+
+using namespace std;
+using namespace MEDMEM;
+using namespace MED_EN;
+
+namespace med_2_1 {
+  extern "C" {
+    extern med_idt _MEDdatagroupOuvrir(med_idt pid, char *nom);
+    extern med_err _MEDdatagroupFermer(med_idt id);
+  }
+}
+
+// Every memory allocation made in the MedDriver members function are desallocated in the Mesh destructor 
+
+MED_MESH_DRIVER21::MED_MESH_DRIVER21():_medIdt(MED_INVALID)
+{
+}
+
+MED_MESH_DRIVER21::MED_MESH_DRIVER21(const string & fileName,  
+                                    MESH * ptrMesh, 
+                                    MED_EN::med_mode_acces accessMode):
+  _medIdt(MED_INVALID),MED_MESH_DRIVER(fileName,ptrMesh,accessMode)
+{
+}
+
+MED_MESH_DRIVER21::MED_MESH_DRIVER21(const MED_MESH_DRIVER21 & driver):
+  MED_MESH_DRIVER(driver),_medIdt(driver._medIdt)
+{
+}
+
+MED_MESH_DRIVER21::~MED_MESH_DRIVER21()
+{
+}
+
+void MED_MESH_DRIVER21::open()
+{
+  const char * LOC = "MED_MESH_DRIVER21::open()" ;
+  BEGIN_OF(LOC);
+  MESSAGE(LOC<<" : _fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
+  _medIdt = med_2_1::MEDouvrir( (const_cast <char *> (_fileName.c_str())),(med_2_1::med_mode_acces) _accessMode);
+  MESSAGE(LOC<<" _medIdt : "<< _medIdt );
+  if (_medIdt > 0) 
+    _status = MED_OPENED; 
+  else {
+    _medIdt = MED_INVALID;
+    _status = MED_CLOSED;
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Could not open file "<<_fileName<<" in mode "<<_accessMode));
+  }
+  
+  END_OF(LOC);
+}
+  
+void MED_MESH_DRIVER21::close()
+{
+  const char * LOC = "MED_MESH_DRIVER21::close() " ;
+  BEGIN_OF(LOC);
+  int err = 0;
+  if ( _status == MED_OPENED) {
+    err=med_2_1::MEDfermer(_medIdt);
+    // san -- MED5873 : Calling H5close() here leads to failure of SALOMEDS::StudyManager_i::_SaveAs()
+    // method during study saving process. MEDfermer() seems sufficient for closing a file.
+    //H5close(); // If we call H5close() all the files are closed.
+    if (err != 0)
+      throw MEDEXCEPTION( LOCALIZED(STRING(LOC)
+                                   <<" Error when closing file !"
+                                   )
+                         );
+    MESSAGE(LOC <<": _medIdt= " << _medIdt );
+    MESSAGE(LOC<<": MEDfermer : err    = " << err );
+    _status = MED_CLOSED;
+    _medIdt = MED_INVALID;
+  }
+  END_OF(LOC);
+}
+
+//A FAIRE UTILISER LES MAPS...
+const med_2_1::med_geometrie_element  MED_MESH_DRIVER21::all_cell_type[MED_NBR_GEOMETRIE_MAILLE]=
+  { med_2_1::MED_POINT1,med_2_1::MED_SEG2,med_2_1::MED_SEG3,med_2_1::MED_TRIA3,med_2_1::MED_QUAD4,med_2_1::MED_TRIA6,med_2_1::MED_QUAD8,
+    med_2_1::MED_TETRA4,med_2_1::MED_PYRA5,med_2_1::MED_PENTA6,med_2_1::MED_HEXA8,med_2_1::MED_TETRA10,med_2_1::MED_PYRA13,
+    med_2_1::MED_PENTA15, med_2_1::MED_HEXA20};
+
+const char * const MED_MESH_DRIVER21::all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE]=
+  { "MED_POINT1","MED_SEG2","MED_SEG3","MED_TRIA3","MED_QUAD4","MED_TRIA6","MED_QUAD8",
+    "MED_TETRA4","MED_PYRA5","MED_PENTA6","MED_HEXA8","MED_TETRA10","MED_PYRA13",
+    "MED_PENTA15","MED_HEXA20"};
+
+//---------------------------------- RDONLY PART -------------------------------------------------------------
+
+MED_MESH_RDONLY_DRIVER21::MED_MESH_RDONLY_DRIVER21()
+{
+}
+  
+MED_MESH_RDONLY_DRIVER21::MED_MESH_RDONLY_DRIVER21(const string & fileName,
+                                                  MESH * ptrMesh):
+  IMED_MESH_RDONLY_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER21(fileName,ptrMesh,MED_RDONLY),MED_MESH_DRIVER(fileName,ptrMesh,MED_RDONLY)
+{ 
+  MESSAGE("MED_MESH_RDONLY_DRIVER21::MED_MESH_RDONLY_DRIVER21(const string & fileName, MESH * ptrMesh) has been created");
+}
+  
+MED_MESH_RDONLY_DRIVER21::MED_MESH_RDONLY_DRIVER21(const MED_MESH_RDONLY_DRIVER21 & driver): 
+  IMED_MESH_RDONLY_DRIVER(driver),MED_MESH_DRIVER21(driver),MED_MESH_DRIVER(driver)
+{
+}
+
+MED_MESH_RDONLY_DRIVER21::~MED_MESH_RDONLY_DRIVER21()
+{
+  //MESSAGE("MED_MESH_RDONLY_DRIVER21::~MED_MESH_RDONLY_DRIVER21() has been destroyed");
+}
+  
+GENDRIVER * MED_MESH_RDONLY_DRIVER21::copy(void) const
+{
+  return new MED_MESH_RDONLY_DRIVER21(*this);
+}
+
+void MED_MESH_RDONLY_DRIVER21::read(void)
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER21::read() : " ;
+  BEGIN_OF(LOC);
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The _idt of file " << _fileName << " is : " << _medIdt <<  " (the file is not opened)." )) ;
+
+  _ptrMesh->_name =  _meshName;
+
+  SCRUTE(_ptrMesh->getIsAGrid());
+
+  if (_ptrMesh->getIsAGrid())
+    {
+      getGRID( );
+
+      // always call getFAMILY : families are requiered !!!!
+
+//        int nbFam = MEDnFam(_medIdt,
+//                       const_cast <char *> (_meshName.c_str()),
+//                       0,
+//                       med_2_1::MED_FAMILLE);
+//        if (nbFam > 0)
+       {
+//       getFAMILY();
+    
+         if (getFAMILY()!=MED_VALID)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getFAMILY when the mesh is a grid")) ;
+
+         buildAllGroups(_ptrMesh->_groupNode,_ptrMesh->_familyNode) ;
+       }
+
+      END_OF(LOC);
+      return;
+    }
+
+  if (getCOORDINATE()!=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getCOORDINATE"  )) ;
+  if (getCONNECTIVITY()!=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getCOONECTIVITY")) ;
+  
+  if (getFAMILY()!=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getFAMILY"      )) ;
+  
+  updateFamily();
+
+  // we build all groups
+  // on node
+  buildAllGroups(_ptrMesh->_groupNode,_ptrMesh->_familyNode) ;
+  // on cell
+  buildAllGroups(_ptrMesh->_groupCell,_ptrMesh->_familyCell) ;
+  // on face
+  buildAllGroups(_ptrMesh->_groupFace,_ptrMesh->_familyFace) ;
+  // on edge
+  buildAllGroups(_ptrMesh->_groupEdge,_ptrMesh->_familyEdge) ;
+
+//   MESSAGE(LOC<<"Checking of CellModel !!!!!!!");
+
+//   int nbOfTypes =  _ptrMesh->_connectivity->_numberOfTypes;
+//    for(int i=0;i<nbOfTypes;i++)
+//      {
+//        MESSAGE(LOC << _ptrMesh->_connectivity->_type[i]) ;
+//      }
+
+  END_OF(LOC);
+}
+
+//=======================================================================
+//function : getGRID
+//purpose  : 
+//=======================================================================
+
+void MED_MESH_RDONLY_DRIVER21::getGRID()
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER21::getGRID() : " ;
+  BEGIN_OF(LOC);
+  
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "med file is not opened"));
+  
+  GRID * ptrGrid = (GRID *) _ptrMesh;
+    
+  int err, i;
+
+  // Read the dimension of the space for the mesh <_meshName>
+  int SpaceDimension = med_2_1::MEDdimLire(_medIdt,const_cast <char *> (_meshName.c_str())) ;
+  if ( SpaceDimension  <= MED_VALID ) 
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The space dimension |" << SpaceDimension <<
+                                 "| seems to be incorrect " << "for the mesh : |" <<
+                                 _meshName << "|")) ;
+  _ptrMesh->_spaceDimension = SpaceDimension;
+
+  _ptrMesh->_meshDimension = SpaceDimension;
+
+  // Read Array length
+  int * ArrayLen[] = { & ptrGrid->_iArrayLength,
+                       & ptrGrid->_jArrayLength,
+                       & ptrGrid->_kArrayLength  };
+  int idim;
+  for (idim = 0; idim < _ptrMesh->_spaceDimension; ++idim)
+    {
+      int lenght = med_2_1::MEDnGrid(_medIdt,
+                                   const_cast <char *> (_ptrMesh->_name.c_str()),
+                                   (med_2_1::med_grid)
+                                   idim
+                                   );
+      if ( lenght <= MED_VALID )
+       throw MEDEXCEPTION(STRING(LOC) <<"The number of nodes |" << lenght <<
+                          "| seems to be incorrect "
+                          << "for the mesh : |" << _meshName << "|" ) ;
+    
+      ArrayLen [idim][0] = lenght;
+    }
+
+  med_2_1::med_repere rep ;
+  string tmp_nom_coord (MED_TAILLE_PNOM21*(_ptrMesh->_spaceDimension)+1,' ');
+  string tmp_unit_coord(MED_TAILLE_PNOM21*(_ptrMesh->_spaceDimension)+1,' ');
+  char * tmp_nom = (const_cast <char *> ( tmp_nom_coord.c_str())  ) ;
+  char * tmp_unit= (const_cast <char *> ( tmp_unit_coord.c_str()) ) ;
+  
+  // Read node coordinates for MED_BODY_FITTED grid
+
+  SCRUTE(ptrGrid->getGridType());
+
+  if (ptrGrid->getGridType() == MED_EN::MED_BODY_FITTED)
+    {
+      // Read nb of nodes
+      int NumberOfNodes = med_2_1::MEDnGrid(_medIdt,
+                                          const_cast <char *> (_meshName.c_str()),
+                                          med_2_1::MED_GRID_NOEUD);
+      if ( NumberOfNodes <= MED_VALID )
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The number of nodes |" << NumberOfNodes <<
+                                    "| seems to be incorrect "
+                                    << "for the mesh : |" << _meshName << "|" )) ;
+      _ptrMesh->_numberOfNodes = NumberOfNodes ;
+
+      // this array is useless because families numbers are read in getFAMILY
+      //CCRT  as it is useless replace int by med_int
+      med_2_1::med_int * MEDArrayNodeFamily = new med_2_1::med_int[ NumberOfNodes ];
+      // create coordinates
+      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension,NumberOfNodes,
+                                            MED_EN::MED_FULL_INTERLACE);
+
+      // Read coordinates and families
+//       double * coo = const_cast <double *>
+//     (_ptrMesh->_coordinate->getCoordinates(MED_EN::MED_FULL_INTERLACE));
+    
+//       err = med_2_1::MEDbodyFittedLire (_medIdt,
+//                                    const_cast <char *> (_ptrMesh->_name.c_str()),
+//                                    _ptrMesh->_spaceDimension,
+//                                    coo,
+//                                    med_2_1::MED_FULL_INTERLACE,
+//                                    & rep,
+//                                    tmp_nom,
+//                                    tmp_unit,
+//                                    MEDArrayNodeFamily,
+//                                    NumberOfNodes);
+
+      err = med_2_1::MEDbodyFittedLire (_medIdt,
+                                      const_cast <char *> (_ptrMesh->_name.c_str()),
+                                      _ptrMesh->_spaceDimension,
+                                      const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ),
+                                      med_2_1::MED_FULL_INTERLACE,
+                                      & rep,
+                                      tmp_nom,
+                                      tmp_unit,
+                                      MEDArrayNodeFamily,
+                                      NumberOfNodes);
+
+      MESSAGE(LOC << " NumberOfNodes = " << NumberOfNodes << " SpaceDimension = " << SpaceDimension);
+
+      ptrGrid->_is_coordinates_filled = true;
+
+//       for (int icoor = 0 ; icoor<NumberOfNodes ; icoor++)
+//     for(int jcoor = 0 ; jcoor<SpaceDimension ; jcoor++)
+//       MESSAGE(LOC << " icoor = " << icoor << " jcoor = " << jcoor << " COOR = " << _ptrMesh->getCoordinates(MED_FULL_INTERLACE)[icoor*SpaceDimension+jcoor]);
+
+      delete[] MEDArrayNodeFamily;
+      if (err != MED_VALID)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"error in MEDbodyFittedLire()"));
+
+      //      _ptrMesh->_MEDArrayNodeFamily = fam ;
+
+    }
+  else
+    {
+      // Read Arrays and Node families in Cartesian or Polar Grid
+
+      int nbNodes = 1;
+      double * Array[] = { (double*) 0, (double*) 0, (double*) 0 };
+      for (idim = 0; idim < _ptrMesh->_spaceDimension; ++idim)
+       {
+         int nbNodesDim = * ArrayLen [idim];
+         nbNodes *= nbNodesDim;
+         Array [idim] = new double [ nbNodesDim ];
+         err = med_2_1::MEDgridLire (_medIdt,
+                                    const_cast <char *> (_ptrMesh->_name.c_str()),
+                                    _ptrMesh->_spaceDimension,
+                                    Array [idim],
+                                    idim,
+                                    med_2_1::MED_FULL_INTERLACE,
+                                    & rep,
+                                    tmp_nom,
+                                    tmp_unit);
+         if (err != MED_VALID)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Error in MEDgridLire for dimention" << idim ));
+
+       }
+      ptrGrid->_iArray = Array[0];
+      ptrGrid->_jArray = Array[1];
+      ptrGrid->_kArray = Array[2];
+    
+      _ptrMesh->_numberOfNodes = nbNodes ;
+    
+      // create coordinates
+      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension,nbNodes,
+                                            MED_EN::MED_FULL_INTERLACE);
+    } // end read  Cartesian or Polar Grid
+
+  // set coordinate names
+
+  for (i=0; i<_ptrMesh->_spaceDimension; ++i ) {
+    string myStringName(tmp_nom_coord,i*MED_TAILLE_PNOM21,MED_TAILLE_PNOM21) ;
+    string myStringUnit(tmp_unit_coord,i*MED_TAILLE_PNOM21,MED_TAILLE_PNOM21) ;
+    // suppress space at the end
+    int j ;
+    for(j=MED_TAILLE_PNOM21-1;j>=0;j--)
+      if (myStringName[j] != ' ') break ;
+    _ptrMesh->_coordinate->_coordinateName[i]=string(myStringName,0,j+1);
+    for(j=MED_TAILLE_PNOM21-1;j>=0;j--)
+      if (myStringUnit[j] != ' ') break ;
+    _ptrMesh->_coordinate->_coordinateUnit[i]=string(myStringUnit,0,j+1);
+  }
+
+  string coordinateSystem = "UNDEFINED";
+
+  if( rep == med_2_1::MED_CART) coordinateSystem = "CARTESIAN";
+  else if ( rep == med_2_1::MED_CYL) coordinateSystem = "CYLINDRICAL";
+  else if ( rep == med_2_1::MED_SPHER) coordinateSystem = "SPHERICAL";
+
+  _ptrMesh->_coordinate->setCoordinatesSystem(coordinateSystem);
+
+
+  END_OF(LOC);
+}
+
+//=======================================================================
+//function : getCOORDINATE
+// A FAIRE : RENVOYER DU VOID
+//=======================================================================
+int  MED_MESH_RDONLY_DRIVER21::getCOORDINATE()
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER21::getCOORDINATE() : " ;
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED)
+    {
+      int err ;
+      
+      // Read the dimension of the space for the mesh <_meshName>
+      // to be able to create a COORDINATE object
+      int SpaceDimension = med_2_1::MEDdimLire(_medIdt,const_cast <char *> (_meshName.c_str())) ;
+      if ( SpaceDimension  <= MED_VALID ) 
+        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The space dimension |" << SpaceDimension << "| seems to be incorrect "
+                                     << "for the mesh : |" << _meshName << "|")) ;
+      _ptrMesh->_spaceDimension = SpaceDimension ;
+
+      
+
+      // Read the number of nodes used in the mesh <_meshName>
+      // to be able to create a COORDINATE object
+      int NumberOfNodes=MEDnEntMaa(_medIdt,
+                                   const_cast <char *> (_meshName.c_str()),
+                                   med_2_1::MED_COOR,
+                                   med_2_1::MED_NOEUD,
+                                   (med_2_1::med_geometrie_element) MED_NONE,
+                                   (med_2_1::med_connectivite)      MED_NONE);
+      if ( NumberOfNodes <= MED_VALID )
+        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The number of nodes |" << NumberOfNodes << "| seems to be incorrect "
+                                     << "for the mesh : |" << _meshName << "|" )) ;
+      _ptrMesh->_numberOfNodes = NumberOfNodes ;
+
+
+
+      // create a COORDINATE object
+      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension, NumberOfNodes, MED_EN::MED_FULL_INTERLACE);
+      
+      med_2_1::med_repere rep ; // ATTENTION ---> DOIT ETRE INTEGRE DS MESH EF: FAIT NON?
+      string tmp_nom_coord (MED_TAILLE_PNOM21*(_ptrMesh->_spaceDimension)+1,'\0');
+      string tmp_unit_coord(MED_TAILLE_PNOM21*(_ptrMesh->_spaceDimension)+1,'\0');
+      char * tmp_nom = (const_cast <char *> ( tmp_nom_coord.c_str())  ) ;
+      char * tmp_unit= (const_cast <char *> ( tmp_unit_coord.c_str()) ) ;
+
+      err=MEDcoordLire(_medIdt,
+                       const_cast <char *> (_ptrMesh->_name.c_str()),
+                      _ptrMesh->_spaceDimension,
+                      //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ),
+                      const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ),
+                       med_2_1::MED_FULL_INTERLACE,
+                       MED_ALL,                      // we read all the coordinates
+                       NULL,                         // we don't use a profile
+                       0,                            // so the profile's size is 0
+                       &rep,tmp_nom,tmp_unit);
+      if (err != MED_VALID)
+        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't read coordinates of the |" << NumberOfNodes << "| nodes "
+                                     << "for the mesh : |" << _meshName 
+                                     << "| of space dimension |" << SpaceDimension 
+                                     << "| with units names |"   << tmp_nom
+                                     << "| and units |"          << tmp_unit
+                                     << " |")) ;
+      
+
+      for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
+       string myStringName(tmp_nom_coord,i*MED_TAILLE_PNOM21,MED_TAILLE_PNOM21) ;
+       string myStringUnit(tmp_unit_coord,i*MED_TAILLE_PNOM21,MED_TAILLE_PNOM21) ;
+       // suppress space at the end
+       int j ;
+       for(j=MED_TAILLE_PNOM21-1;j>=0;j--)
+         if (myStringName[j] != ' ') break ;
+       _ptrMesh->_coordinate->_coordinateName[i]=string(myStringName,0,j+1);
+       for(j=MED_TAILLE_PNOM21-1;j>=0;j--)
+         if (myStringUnit[j] != ' ') break ;
+       _ptrMesh->_coordinate->_coordinateUnit[i]=string(myStringUnit,0,j+1);
+      }
+
+      // Pourquoi le stocker sous forme de chaîne ?
+      switch (rep)
+       {
+       case med_2_1::MED_CART : 
+         {
+           _ptrMesh->_coordinate->_coordinateSystem = "CARTESIAN";
+           break ;
+         }
+       case med_2_1::MED_CYL :
+         {
+           _ptrMesh->_coordinate->_coordinateSystem = "CYLINDRICAL";
+           break ;
+         }
+       case med_2_1::MED_SPHER :
+         {
+           _ptrMesh->_coordinate->_coordinateSystem = "SPHERICAL";
+           break ;
+         }
+       default :
+         {
+           _ptrMesh->_coordinate->_coordinateSystem = "UNDEFINED"; // ?Erreur ?
+           break ;
+         }
+       }
+
+      // Read the unused optional node Names
+      char * tmp_node_name = new char[NumberOfNodes*MED_TAILLE_PNOM21+1];
+      tmp_node_name[NumberOfNodes]='\0' ;
+      err=MEDnomLire(_medIdt,const_cast <char*> (_ptrMesh->_name.c_str()),
+                    tmp_node_name,NumberOfNodes*MED_TAILLE_PNOM21,med_2_1::MED_NOEUD,
+                    (med_2_1::med_geometrie_element) MED_NONE);
+      if (err == MED_VALID) 
+        MESSAGE(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : WARNING : Nodes have names but we do not read them !");
+      delete[] tmp_node_name ;
+
+
+      // ??? Read the unused optional node Numbers ???
+      med_2_1::med_int * tmp_node_number = new med_2_1::med_int[NumberOfNodes] ;
+      err=MEDnumLire(_medIdt,const_cast <char*> (_ptrMesh->_name.c_str()),
+                    tmp_node_number,NumberOfNodes,med_2_1::MED_NOEUD,(med_2_1::med_geometrie_element)0);
+      if (err == MED_VALID) {
+        // INFOS(LOC<<"WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING");
+        // INFOS(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : WARNING : Nodes have numbers but we do not take care of them !");
+        // INFOS(LOC<<"WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING");
+       MESSAGE(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : Nodes have numbers, we DO TAKE care of them !");
+       _ptrMesh->_coordinate->_nodeNumber.set(NumberOfNodes) ; 
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       for(med_2_1::med_int i2=0;i2<NumberOfNodes;i2++)
+         _ptrMesh->_coordinate->_nodeNumber[i2]=(int)(tmp_node_number[i2]);
+#else
+       memcpy((int*)_ptrMesh->_coordinate->_nodeNumber,tmp_node_number,sizeof(int)*NumberOfNodes) ;
+#endif
+       
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///
+       /// Calcule _optionnalToCanonicNodesNumbers de telle sorte que _optionnalToCanonicNodesNumbers[OptionnalNumber]==CanonicNumber
+       
+//     _ptrMesh->_arePresentOptionnalNodesNumbers=1;
+//     for (int canonicNumber=1;canonicNumber<=NumberOfNodes;canonicNumber++) _ptrMesh->_optionnalToCanonicNodesNumbers[tmp_node_number[canonicNumber-1]]=canonicNumber;
+// ICI RETOUR A LA NORMALE::: AUCUNE PRISE EN COMPTE D'UN NUMEROTATION OPTIONNEL
+       _ptrMesh->_arePresentOptionnalNodesNumbers=0;
+      } 
+      else _ptrMesh->_arePresentOptionnalNodesNumbers=0;
+
+       //////////////////////////////////////////////////////////////////////////////////////
+
+      delete[] tmp_node_number ;
+      
+      END_OF(LOC);
+      return MED_VALID;
+    }
+  return MED_ERROR;
+}
+
+
+int MED_MESH_RDONLY_DRIVER21::getCONNECTIVITY() 
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER21::getCONNECTIVITY : " ;
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED)
+    {
+
+      int err = 0 ;
+      // read MED_CELL connectivity
+      CONNECTIVITY * Connectivity     = new CONNECTIVITY(MED_CELL) ;
+      Connectivity->_numberOfNodes    = _ptrMesh->_numberOfNodes ;   // EF : Pourquoi cet attribut est-il dans MESH et non dans COORDINATE ?
+
+      // Try to read nodal connectivity of the cells <Connectivity->_nodal>
+      // then try to read descending connectivity    <Connectivity->_descending>
+      // if neither nodal nor descending connectivity exists
+      // throw an exception.
+      err = getNodalConnectivity(Connectivity) ;
+      if (err!=MED_VALID)
+       {
+         Connectivity->_typeConnectivity = MED_DESCENDING ;
+         err = getDescendingConnectivity(Connectivity) ;
+       }
+      else 
+       getDescendingConnectivity(Connectivity) ; // we read it if there is one
+      
+      if (err!=MED_VALID)
+       {
+         delete Connectivity ;
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "We could not read " <<
+                                      "any Connectivity")) ;
+       }
+
+      _ptrMesh->_meshDimension = Connectivity->_entityDimension ; 
+
+      // At this point Connectivity->_typeConnectivity is either NODAL or DESCENDING
+      // If both connectivities are found Connectivity->_typeConnectivity is NODAL
+      // If space dimension is 3 
+      // try to read the nodal connectivity of the faces <ConnectivityFace->_nodal> then
+      // try to read the descending connectivity <ConnectivityFace->_descending>
+      // if there is no descending connectivity and the CELLS are
+      // defined in descending mode then throw an exception
+
+      // PROVISOIRE : if we have some face or edge in MED_MAILLE, we don't read more. There could not be have face or edge !!!!
+
+      if(Connectivity->_constituent==NULL)
+       {
+         SCRUTE(_ptrMesh->_meshDimension);
+         if (_ptrMesh->_meshDimension == 3)
+           {
+             MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DES FACES..." );
+             CONNECTIVITY * ConnectivityFace = new CONNECTIVITY(MED_EN::MED_FACE) ;
+             ConnectivityFace->_typeConnectivity = Connectivity->_typeConnectivity ;
+             // NODAL or DESCENDING
+             SCRUTE(ConnectivityFace->_typeConnectivity);
+             if (Connectivity->_typeConnectivity == MED_DESCENDING)
+               {
+                 MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DESCENDANTE DES FACES" );
+                 err = getDescendingConnectivity(ConnectivityFace) ;
+                 if (err!=MED_VALID)
+                   throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<
+                                                "No FACE in descending connectivity")) ;
+                 getNodalConnectivity(ConnectivityFace) ; // if any !
+               }
+             else
+               {
+                 MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE NODALE DES FACES" );
+                 err = getNodalConnectivity(ConnectivityFace) ;
+                 if (err!=MED_VALID)
+                   { // or error ????? we are in NODAL mode.
+                     err = getDescendingConnectivity(ConnectivityFace) ;
+                   }
+                 else
+                   getDescendingConnectivity(ConnectivityFace); // if any !
+               }
+
+             if (err!=MED_VALID)
+               {
+                 delete ConnectivityFace ;
+                 MESSAGE(LOC<<"No FACE defined.") ;
+               }
+             else
+               {
+                 MESSAGE(LOC<<" SAUVEGARDE DE LA CONNECTIVITE DES " <<
+                         "FACES DANS L'OBJET CONNECTIVITY" );
+                 Connectivity->_constituent=ConnectivityFace ; 
+               }
+           }
+      
+         // read MED_EDGE connectivity
+         if (_ptrMesh->_meshDimension > 1)
+           { // we are in 3 or 2D 
+             MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DES ARRETES...." );
+             CONNECTIVITY * ConnectivityEdge = new CONNECTIVITY(MED_EDGE) ;
+             ConnectivityEdge->_typeConnectivity = Connectivity->_typeConnectivity ;
+             if (Connectivity->_typeConnectivity == MED_DESCENDING)
+               {
+                 MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DESCENDANTE " <<
+                         "DES ARRETES" );
+                 err = getDescendingConnectivity(ConnectivityEdge) ;
+                 if (err!=MED_VALID)
+                   throw MEDEXCEPTION ( LOCALIZED(STRING(LOC) <<
+                                                  "No EDGE in descending connectivity")) ;
+                 getNodalConnectivity(ConnectivityEdge) ; // if any !
+               }
+             else
+               {
+                 MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE NODALE DES ARRETES" );
+                 err = getNodalConnectivity(ConnectivityEdge) ;
+                 if (err!=MED_VALID)
+                   { // or error ????? we are in NODAL mode.
+                     err = getDescendingConnectivity(ConnectivityEdge) ;
+                   }
+                 else
+                   getDescendingConnectivity(ConnectivityEdge) ; // if any !
+               }
+
+             if (err!=MED_VALID)
+               {
+                 delete ConnectivityEdge ;
+                 MESSAGE(LOC<<"No EDGE defined.") ;
+               }
+             else
+               {
+                 if (_ptrMesh->_meshDimension == 3)
+                   if (Connectivity->_constituent != NULL)
+                     Connectivity->_constituent->_constituent=ConnectivityEdge ;
+                   else
+                     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<< "EDGE defined but there are no FACE !")) ;
+                 else
+                   { // IN 2D
+                     MESSAGE(LOC<<" SAUVEGARDE DE LA CONNECTIVITE DES " <<
+                             "ARETES DANS L'OBJET CONNECTIVITY" );
+                     Connectivity->_constituent=ConnectivityEdge ;
+                   }
+               }
+           }
+       }
+      _ptrMesh->_connectivity  = Connectivity ;                                      
+
+      // all right !
+
+      // we have read all connectivity in file, now we must build descending connectivity if necessary !
+
+      // If connectivity descending is defined, we have nothing to do, all constituent are defined !
+      // If connectivity is only nodal, we must rebuild descending if we have some contituent !
+
+      //A FAIRE !!!!
+//        if (Connectivity->_descending == NULL)
+//     if (Connectivity->_constituent != NULL){
+//       // update Connectivity->_constituent
+//       CONNECTIVITY * myConstituentOld = Connectivity->_constituent ;
+//       Connectivity->_constituent = (CONNECTIVITY *)NULL ;
+//       Connectivity->calculateDescendingConnectivity() ;
+         
+//     }
+      
+      END_OF(LOC);
+      return MED_VALID;
+    }
+  return MED_ERROR;
+}
+
+int MED_MESH_RDONLY_DRIVER21::getNodalConnectivity(CONNECTIVITY * Connectivity) 
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER21::getNodalConnectivity : " ;
+  BEGIN_OF(LOC);
+
+  int spaceDimension = _ptrMesh->_spaceDimension;
+
+  if (_status==MED_OPENED)
+    {
+      // Get the type of entity to work on (previously set in the Connectivity Object)
+      med_2_1::med_entite_maillage Entity = (med_2_1::med_entite_maillage) Connectivity->getEntity();
+
+      // Get the number of cells of each type & store it in <tmp_cells_count>.
+      int * tmp_cells_count = new int[MED_NBR_GEOMETRIE_MAILLE] ;
+      int i;
+      for (i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
+       { // EF :ON SCANNE DES GEOMETRIES INUTILES, UTILISER LES MAPS
+
+         tmp_cells_count[i]=MEDnEntMaa(_medIdt,(const_cast <char *> (_ptrMesh->_name.c_str())),
+                                       med_2_1::MED_CONN,(med_2_1::med_entite_maillage) Entity,
+                                       all_cell_type[i],med_2_1::MED_NOD); 
+
+         // Get the greatest dimension of the cells : Connectivity->_entityDimension
+         // We suppose there is no cells used as faces in MED 2.2.x , this is forbidden !!!
+         // In version prior to 2.2.x, it is possible
+         if (tmp_cells_count[i]>0)
+           { 
+             Connectivity->_entityDimension=all_cell_type[i]/100;  
+             Connectivity->_numberOfTypes++;
+           }
+       }
+      
+
+      // If there is no nodal connectivity, we quit !
+      if ( Connectivity->_numberOfTypes == 0 )
+       {
+         delete[] tmp_cells_count ;
+         return MED_ERROR ;
+       }
+
+      // if MED version < 2.2.x, we read only entity with dimention = Connectivity->_entityDimension. Lesser dimension are face or edge !
+
+      char version_med[10] ;
+      if ( MEDfichEntete(_medIdt,med_2_1::MED_VERSION,version_med) != 0 )
+       {
+         // error : we suppose we have not a good med file !
+         delete[] tmp_cells_count ;
+         return MED_ERROR ;
+       }
+
+      // we get MED version number
+      // If MED version is < 2.2 then the cells which dimension
+      // is lesser than the main dimension ( Connectivity->_entityDimension )
+      // are either faces or edges
+
+      //        string medVersion(version_med);
+      //        int firstNumber = 
+      int * tmpEdgeCount = new int[MED_NBR_GEOMETRIE_MAILLE] ;
+      tmpEdgeCount[0]     = 0 ;
+      int numberOfEdgesTypes = 0;
+      int * tmpFaceCount = new int[MED_NBR_GEOMETRIE_MAILLE] ;
+      tmpFaceCount[0]     = 0 ;
+      int numberOfFacesTypes = 0;
+  
+//       if ((version_med != "2.2")&(Entity==med_2_1::MED_MAILLE))
+//     {
+//       Connectivity->_numberOfTypes=0;
+       
+//       for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
+//         {
+//           tmpFaceCount[i]=0;
+//           tmpEdgeCount[i]=0;
+//           if (tmp_cells_count[i]!=0)
+//             {
+//               int dimension = all_cell_type[i]/100 ;
+//               if (Connectivity->_entityDimension==dimension) 
+//                 Connectivity->_numberOfTypes++ ;
+           
+//               if (dimension == 2)
+//                 if (Connectivity->_entityDimension==3)
+//                   {
+//                     tmpFaceCount[i]=tmp_cells_count[i] ;
+//                     tmp_cells_count[i]=0 ;
+//                     numberOfFacesTypes++;
+//                   }
+//               if (dimension == 1)
+//                 if (Connectivity->_entityDimension>dimension)
+//                   {
+//                     tmpEdgeCount[i]=tmp_cells_count[i] ;
+//                     tmp_cells_count[i]=0;
+//                     numberOfEdgesTypes++ ;
+//                   }
+//             }
+//         }
+//     }
+
+      if (Entity==med_2_1::MED_MAILLE)
+       {
+         Connectivity->_numberOfTypes=0;
+       
+         for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
+           {
+             tmpFaceCount[i]=0;
+             tmpEdgeCount[i]=0;
+             if (tmp_cells_count[i]!=0)
+               {
+                 int dimension = all_cell_type[i]/100 ;
+                 if (Connectivity->_entityDimension==dimension) 
+                   Connectivity->_numberOfTypes++ ;
+           
+                 if (dimension == 2)
+                   if (Connectivity->_entityDimension==3)
+                     {
+                       tmpFaceCount[i]=tmp_cells_count[i] ;
+                       //tmp_cells_count[i]=0 ;
+                       //Connectivity->_numberOfTypes++ ;
+                       numberOfFacesTypes++;
+                     }
+                 if (dimension == 1)
+                   if (Connectivity->_entityDimension>dimension)
+                     {
+                       tmpEdgeCount[i]=tmp_cells_count[i] ;
+                       //tmp_cells_count[i]=0;
+                       //Connectivity->_numberOfTypes++ ;
+                       numberOfEdgesTypes++ ;
+                     }
+               }
+           }
+       }
+
+      // bloc to read CELL :
+      {
+       // Prepare an array of indexes on the different cell types to create a MEDSKYLINEARRAY
+       // We use <tmp_cells_count> to calculate <Connectivity->_count> then we release it
+       Connectivity->_geometricTypes = new MED_EN::medGeometryElement [Connectivity->_numberOfTypes]   ;  // Double emploi pour des raisons pratiques 
+       Connectivity->_type           = new CELLMODEL                  [Connectivity->_numberOfTypes]   ;  //
+       Connectivity->_count          = new int                        [Connectivity->_numberOfTypes+1] ;
+       Connectivity->_count[0]       = 1;
+       
+       int size = 0 ; 
+       int typeNumber=1 ;
+        int i;
+       for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
+         { // no point1 cell type (?)
+           int dimension = all_cell_type[i]/100 ;
+           if ((tmp_cells_count[i]>0) && (Connectivity->_entityDimension == dimension))
+             {
+               Connectivity->_count[typeNumber]=Connectivity->_count[typeNumber-1]+tmp_cells_count[i];
+
+               CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER21::all_cell_type[i]) ;
+
+               Connectivity->_type[typeNumber-1] = t ;
+           
+               Connectivity->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER21::all_cell_type[i] ;
+           
+               // probleme avec les mailles de dimension < a dimension du maillage :
+               // Il faut oter le zero a la lecture est le remettre a l'ecriture : ce n'est pas fait !!!!! On interdit ce cas pour l'instant !!!
+
+             
+               size+=tmp_cells_count[i]*((MED_MESH_DRIVER21::all_cell_type[i])%100) ;
+           
+               MESSAGE(LOC
+                       << Connectivity->_count[typeNumber]-1 << " cells of type " 
+                       << all_cell_type_tab[i] ); 
+
+               typeNumber++;
+             }
+         }
+       
+       // Creation of the MEDSKYLINEARRAY
+       //Connectivity->_nodal = new MEDSKYLINEARRAY(Connectivity->_count[Connectivity->_numberOfTypes]-1,size) ; 
+       //int * NodalIndex = Connectivity->_nodal->getIndex() ;
+       int * NodalValue = new int[size] ;
+       int * NodalIndex = new int[Connectivity->_count[Connectivity->_numberOfTypes]] ;
+       NodalIndex[0]=1 ;
+       
+       // Fill the MEDSKYLINEARRAY by reading the MED file.
+        int j=0;
+       for ( i=0;i<Connectivity->_numberOfTypes;i++)
+         {
+           int multi = 0 ;
+           med_2_1::med_geometrie_element med_type = (med_2_1::med_geometrie_element) Connectivity->_type[i].getType() ;
+           //if ( Connectivity->_type[i].getDimension() < Connectivity->_entityDimension) 
+           if (Connectivity->_entity == MED_CELL)
+             if ( Connectivity->_type[i].getDimension() < spaceDimension) 
+               multi=1;
+         
+           //    int NumberOfCell = Connectivity->_count[i+1]-Connectivity->_count[i] ;
+           int NumberOfNodeByCell = Connectivity->_type[i].getNumberOfNodes() ;
+         
+           // initialise index
+           for ( j=Connectivity->_count[i]; j<Connectivity->_count[i+1];j++)
+             NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByCell ; 
+
+           int tmp_numberOfCells = Connectivity->_count[i+1]-Connectivity->_count[i] ;
+           med_2_1::med_int * tmp_ConnectivityArray = new med_2_1::med_int[(NumberOfNodeByCell+multi)*tmp_numberOfCells];
+         
+           //int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+           //                    Connectivity->_entityDimension,tmp_ConnectivityArray,
+           //med_2_1::MED_FULL_INTERLACE,NULL,0,Entity,med_type,med_2_1::MED_NOD);
+
+           int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                               spaceDimension,tmp_ConnectivityArray,
+                               med_2_1::MED_FULL_INTERLACE,NULL,0,Entity,med_type,
+                               med_2_1::MED_NOD);
+
+           if ( err != MED_VALID)
+             {
+               delete[] tmp_ConnectivityArray;
+               delete[] tmp_cells_count;
+               delete[] tmpFaceCount;
+               delete[] tmpEdgeCount;
+               MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
+               return MED_ERROR ;
+             }
+
+           int * ConnectivityArray = NodalValue + NodalIndex[Connectivity->_count[i]-1]-1 ;
+
+           // version originale sans prise en compte des numéros optionnels
+           //
+           for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
+             ConnectivityArray[j*NumberOfNodeByCell+k]=(int)(tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k]) ;
+
+           //////////////////////////////////////////////////////////////////////////////
+           // Modification pour prise en compte de la numérotation optionnelle des noeuds ///
+           //////////////////////////////////////////////////////////////////////////////
+           //
+           // Rénumérote le tableau temporaire tmp_ConnectivityArray en utilisant _optionnalToCanonicNodesNumbers
+           // Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+           
+           //  if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) 
+           //          {
+           //          for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
+           //                  ConnectivityArray[j*NumberOfNodeByCell+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k]] ;
+           //          }
+           //  else
+           //          {
+           //          for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
+           //                  ConnectivityArray[j*NumberOfNodeByCell+k]=tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k] ;
+           //          }
+           ////////////////////////////////////////////////////////////////////////////
+       
+           delete[] tmp_ConnectivityArray;  
+         }
+
+       Connectivity->_nodal = new MEDSKYLINEARRAY(Connectivity->_count[Connectivity->_numberOfTypes]-1,
+                                                  size,
+                                                  NodalIndex,
+                                                  NodalValue) ; 
+
+       delete[] NodalIndex;
+       delete[] NodalValue;
+      } // end of bloc to read CELL
+
+      delete[] tmp_cells_count; 
+
+
+
+      // Get Face if any
+      // ===============
+     
+      if (numberOfFacesTypes!=0) {
+
+        // Create a CONNECTIVITY constituent to put in the top level CONNECTIVITY recursive class
+       CONNECTIVITY * constituent = new CONNECTIVITY(numberOfFacesTypes,MED_EN::MED_FACE) ;
+       constituent->_entityDimension = 2 ;
+       constituent->_count[0]=1 ;
+
+        // In order to create the MEDSKYLINEARRAY of the constituent object we need :
+        // 1:
+        // To initialize the _count array of the constituent object (containning cumulated face count by geometric type)
+        // _count[0]=1 and _count[_numberOfTypes] give the size of NodalIndex
+        // 2:
+        // To calculate the total number of face nodes whatever the geometric type is.
+        // The result is the size of the array containning all the nodes : NodalValue
+        // 3 :
+        // To calculate the starting indexes of the different face types in NodalValue, 
+        // this is the NodalIndex array.
+        
+       int size       = 0 ; 
+       int typeNumber = 1 ;
+        int i;
+       for ( i=1; i < MED_NBR_GEOMETRIE_MAILLE; i++)  { // no point1 cell type (?)
+         if (tmpFaceCount[i]>0) {
+           
+           constituent->_count[typeNumber] = constituent->_count[typeNumber-1] + tmpFaceCount[i];
+           CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER21::all_cell_type[i]) ;
+           constituent->_type[typeNumber-1]=t ;
+           
+           constituent->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER21::all_cell_type[i] ;
+           
+           size+=tmpFaceCount[i]*((MED_MESH_DRIVER21::all_cell_type[i])%100) ;
+           typeNumber++;
+         }
+       }
+       
+       // Creation of the MEDSKYLINEARRAY
+       //constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,size) ; 
+       //int * NodalIndex = constituent->_nodal->getIndex() ;
+       int * NodalValue = new int[size] ;
+       int * NodalIndex = new int[constituent->_count[constituent->_numberOfTypes]] ;
+       NodalIndex[0]=1 ;
+       
+       // Fill the MEDSKYLINEARRAY by reading the MED file.
+       for ( i=0; i<constituent->_numberOfTypes; i++) {
+         med_2_1::med_geometrie_element med_type = (med_2_1::med_geometrie_element) constituent->_type[i].getType() ;
+
+         int NumberOfNodeByFace = constituent->_type[i].getNumberOfNodes() ;
+         
+         // initialise NodalIndex
+         for (int j=constituent->_count[i]; j<constituent->_count[i+1];j++)
+           NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByFace ; 
+         
+         int tmp_numberOfFaces = constituent->_count[i+1]-constituent->_count[i] ;
+         // Il faut ajouter 1 pour le zero a la lecture !!!
+          // ATTENTION UNIQUEMENT POUR MED < 2.2.x
+          med_2_1::med_int * tmp_constituentArray = NULL;
+          if (version_med != "2.2") 
+            tmp_constituentArray = new med_2_1::med_int[(NumberOfNodeByFace+1)*tmp_numberOfFaces] ;
+          else {
+            tmp_constituentArray = new med_2_1::med_int[NumberOfNodeByFace*tmp_numberOfFaces] ;
+            MESSAGE(LOC<<": WE ARE USING MED2.2 so there is no +1 for calculating the size of  tmp_constituentArray !") ;
+         }
+
+         int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                             Connectivity->_entityDimension,tmp_constituentArray,
+                             med_2_1::MED_FULL_INTERLACE,NULL,0,med_2_1::MED_MAILLE,med_type,med_2_1::MED_NOD);
+
+         if ( err != MED_VALID) {
+           MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
+           delete constituent ;
+           delete[] tmp_constituentArray;
+           delete[] tmpFaceCount;
+           delete[] tmpEdgeCount;
+           return MED_ERROR ;
+         }
+
+         int * constituentArray = NodalValue + NodalIndex[constituent->_count[i]-1]-1 ;
+         
+         // version originale sans prise en compte des numéros optionnels
+         //    
+         for (int j=0; j<tmp_numberOfFaces; j++)
+           for (int k=0; k<NumberOfNodeByFace; k++)
+             constituentArray[j*NumberOfNodeByFace+k]=(int)(tmp_constituentArray[j*(NumberOfNodeByFace+1)+k]) ;
+
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///
+       /// Rénumérote le tableau temporaire tmp_constituentArray en utilisant _optionnalToCanonicNodesNumbers
+       /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+       
+//     if (_ptrMesh->_arePresentOptionnalNodesNumbers) 
+//             {
+//             for (int j=0; j<tmp_numberOfFaces; j++) for (int k=0; k<NumberOfNodeByFace; k++)
+//                     constituentArray[j*NumberOfNodeByFace+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_constituentArray[j*(NumberOfNodeByFace+1)+k]] ;
+//             }
+//     else
+//             {
+//             for (int j=0; j<tmp_numberOfFaces; j++) for (int k=0; k<NumberOfNodeByFace; k++)
+//                     constituentArray[j*NumberOfNodeByFace+k]=tmp_constituentArray[j*(NumberOfNodeByFace+1)+k] ;
+//             }
+       
+       //////////////////////////////////////////////////////////////////////////////////////
+         
+         delete[] tmp_constituentArray;
+       }
+       
+       constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,
+                                                 size,
+                                                 NodalIndex,
+                                                 NodalValue) ;
+       delete[] NodalIndex ;
+       delete[] NodalValue ;
+
+       Connectivity->_constituent = constituent ;
+      }
+
+      delete[] tmpFaceCount;
+
+      // get Edge if any
+      // ===============
+      if (numberOfEdgesTypes!=0) {
+       CONNECTIVITY * constituent = new CONNECTIVITY(numberOfEdgesTypes,MED_EDGE) ;
+       constituent->_entityDimension = 1 ;
+       constituent->_count[0]=1 ;
+
+       int size = 0 ; 
+       int typeNumber=1 ;
+        // if you declare a variable <i> in two <for> initialization statement, 
+        // compiler gcc2.95.3 says nothing but there are two <i> variables in the same block 
+        //and the value you get in the common block seems to be the value of the first variable !
+        int i; 
+
+       for ( i=1; i<MED_NBR_GEOMETRIE_MAILLE; i++)  { // no point1 cell type (?)
+         if (tmpEdgeCount[i]>0) {
+           
+           constituent->_count[typeNumber]=constituent->_count[typeNumber-1]+tmpEdgeCount[i];
+           CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER21::all_cell_type[i]) ;
+           constituent->_type[typeNumber-1]=t ;
+           
+           constituent->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER21::all_cell_type[i] ;
+           
+           size+=tmpEdgeCount[i]*((MED_MESH_DRIVER21::all_cell_type[i])%100) ;
+           typeNumber++;
+         }
+       }
+       
+       // Creation of the MEDSKYLINEARRAY
+       //constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,size) ; 
+       //int * NodalIndex = constituent->_nodal->getIndex() ;
+       int * NodalValue = new int[size] ;
+       int * NodalIndex = new int[constituent->_count[constituent->_numberOfTypes]] ;
+       NodalIndex[0]=1 ;
+       
+       // Fill the MEDSKYLINEARRAY by reading the MED file.
+       for ( i=0; i<constituent->_numberOfTypes; i++) {
+         med_2_1::med_geometrie_element med_type = (med_2_1::med_geometrie_element) constituent->_type[i].getType() ;
+
+         int NumberOfNodeByEdge = constituent->_type[i].getNumberOfNodes() ;
+         
+         // initialise index
+         for (int j=constituent->_count[i]; j<constituent->_count[i+1];j++)
+           NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByEdge ; 
+         
+         int tmp_numberOfEdges = constituent->_count[i+1]-constituent->_count[i] ;
+         // Il faut ajouter 1 pour le zero a la lecture !!!
+
+          // ATTENTION UNIQUEMENT POUR MED < 2.2.x
+          med_2_1::med_int * tmp_constituentArray = NULL;
+          if (version_med != "2.2") 
+           tmp_constituentArray = new med_2_1::med_int[(NumberOfNodeByEdge+1)*tmp_numberOfEdges] ;
+          else {
+           tmp_constituentArray = new med_2_1::med_int[NumberOfNodeByEdge*tmp_numberOfEdges] ;
+            MESSAGE(LOC<<": WE ARE USING MED2.2 so there is no +1 for calculating the size of  tmp_constituentArray !") ;
+          }
+         
+         int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                             spaceDimension,tmp_constituentArray,
+                             med_2_1::MED_FULL_INTERLACE,NULL,0,med_2_1::MED_MAILLE,
+                             med_type,med_2_1::MED_NOD);
+         if ( err != MED_VALID) {
+           MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
+           delete constituent ;
+           delete[] tmp_constituentArray;
+           delete[] tmpEdgeCount;
+           return MED_ERROR ;
+         }
+
+         int * constituentArray = NodalValue + NodalIndex[constituent->_count[i]-1]-1 ;
+         
+         // version originale sans prise en compte des numéros optionnels      
+         //
+         for (int j=0; j<tmp_numberOfEdges; j++)
+           for (int k=0; k<NumberOfNodeByEdge; k++)
+             constituentArray[j*NumberOfNodeByEdge+k]=(int)(tmp_constituentArray[j*(NumberOfNodeByEdge+1)+k]) ;
+
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///
+       /// Rénumérote le tableau temporaire tmp_constituentArray en utilisant _optionnalToCanonicNodesNumbers
+       /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+       
+//     if (_ptrMesh->_arePresentOptionnalNodesNumbers) 
+//             {
+//             for (int j=0; j<tmp_numberOfEdges; j++) for (int k=0; k<NumberOfNodeByEdge; k++)
+//                     constituentArray[j*NumberOfNodeByEdge+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_constituentArray[j*(NumberOfNodeByEdge+1)+k]] ;
+//             }
+//     else
+//             {
+//             for (int j=0; j<tmp_numberOfEdges; j++) for (int k=0; k<NumberOfNodeByEdge; k++)
+//                     constituentArray[j*NumberOfNodeByEdge+k]=tmp_constituentArray[j*(NumberOfNodeByEdge+1)+k] ;
+//             }
+       
+       //////////////////////////////////////////////////////////////////////////////////////
+
+         delete[] tmp_constituentArray;
+       }
+
+       constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,
+                                                 size,
+                                                 NodalIndex,
+                                                 NodalValue) ;
+
+       delete[] NodalIndex ;
+       delete[] NodalValue ;
+
+       if (Connectivity->_entityDimension == 3) {
+         if (Connectivity->_constituent==NULL)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Edges are defined but there are no Faces !"));
+         Connectivity->_constituent->_constituent = constituent ;
+       } else 
+         Connectivity->_constituent = constituent ;
+      }
+
+      delete[] tmpEdgeCount; 
+      
+      return MED_VALID;
+    }
+
+  return MED_ERROR;
+}
+
+int  MED_MESH_RDONLY_DRIVER21::getFAMILY() 
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER21::getFAMILY() : " ;
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED) {
+    int err = 0 ;
+
+    int * MEDArrayNodeFamily = NULL ;
+    int ** MEDArrayCellFamily = NULL ;
+    int ** MEDArrayFaceFamily = NULL ;
+    int ** MEDArrayEdgeFamily = NULL ;
+
+    if ( !_ptrMesh->getIsAGrid() )
+      {
+       // read number :
+       // NODE :
+       MEDArrayNodeFamily = new int[_ptrMesh->getNumberOfNodes()] ;
+       err = getNodesFamiliesNumber(MEDArrayNodeFamily) ; // error only if (_status!=MED_OPENED), other case exeception !
+       // CELL
+
+       MESSAGE(LOC << "error returned from getNodesFamiliesNumber " << err);
+
+       MEDArrayCellFamily = new int*[_ptrMesh->getNumberOfTypes(MED_CELL)] ; // ET SI IL N'Y A PAS DE CELLS ?
+       const medGeometryElement * myTypes = _ptrMesh->getTypes(MED_CELL);
+       for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_CELL);i++)
+         MEDArrayCellFamily[i] = new int[_ptrMesh->getNumberOfElements(MED_CELL,myTypes[i])] ;
+
+       err = getCellsFamiliesNumber(MEDArrayCellFamily,_ptrMesh->_connectivity,MED_CELL) ;
+
+       MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Cells " << err);
+
+       if (_ptrMesh->_connectivity->_constituent != NULL) {
+         if (_ptrMesh->_connectivity->_constituent->_entity == MED_EN::MED_FACE) {
+           // FACE
+           MEDArrayFaceFamily = new int*[_ptrMesh->getNumberOfTypes(MED_FACE)] ;
+           myTypes = _ptrMesh->getTypes(MED_FACE);
+           for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_FACE);i++)
+             MEDArrayFaceFamily[i] = new int[_ptrMesh->getNumberOfElements(MED_FACE,myTypes[i])] ;
+
+           err = getCellsFamiliesNumber(MEDArrayFaceFamily,_ptrMesh->_connectivity->_constituent,MED_FACE) ;
+
+           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Faces " << err);
+
+         } else {
+           // EDGE in 2D
+           MEDArrayEdgeFamily = new int*[_ptrMesh->getNumberOfTypes(MED_EDGE)] ;
+           myTypes = _ptrMesh->getTypes(MED_EDGE);
+           for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
+             MEDArrayEdgeFamily[i] = new int[_ptrMesh->getNumberOfElements(MED_EDGE,myTypes[i])] ;
+           err = getCellsFamiliesNumber(MEDArrayEdgeFamily,_ptrMesh->_connectivity->_constituent,MED_EDGE) ;
+
+           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Edges in 2D " << err);
+
+         }
+         // EDGE in 3D
+         if (_ptrMesh->_connectivity->_constituent->_constituent != NULL) {
+           MEDArrayEdgeFamily = new int*[_ptrMesh->getNumberOfTypes(MED_EDGE)] ;
+           myTypes = _ptrMesh->getTypes(MED_EDGE);
+           for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
+             MEDArrayEdgeFamily[i] = new int[_ptrMesh->getNumberOfElements(MED_EDGE,myTypes[i])] ;
+           err = getCellsFamiliesNumber(MEDArrayEdgeFamily,_ptrMesh->_connectivity->_constituent->_constituent,MED_EDGE) ; // we are in 3D !
+
+           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Edges in 3D " << err);
+
+         }
+       }
+      }
+    else
+      {
+       // node 
+       int NumberOfNodes =  _ptrMesh->getNumberOfNodes() ;
+       MEDArrayNodeFamily = new int[ NumberOfNodes ];
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       med_2_1::med_int* MEDArrayNodeFamily2 = new med_2_1::med_int[ NumberOfNodes ];
+       err = med_2_1::MEDfamGridLire (_medIdt,
+                                     const_cast <char *> (_ptrMesh->_name.c_str()),
+                                     MEDArrayNodeFamily2,
+                                     NumberOfNodes,
+                                     med_2_1::MED_NOEUD);
+       for(int i=0;i<NumberOfNodes;i++)
+         MEDArrayNodeFamily[i]=(int) MEDArrayNodeFamily2[i];
+       delete [] MEDArrayNodeFamily2;
+#else
+       err = med_2_1::MEDfamGridLire (_medIdt,
+                                     const_cast <char *> (_ptrMesh->_name.c_str()),
+                                     MEDArrayNodeFamily,
+                                     NumberOfNodes,
+                                     med_2_1::MED_NOEUD);
+#endif
+       // what about cell face and edge ?
+      }
+
+    // Creation of the families
+    int NumberOfFamilies = MEDnFam(_medIdt,const_cast <char *> (_meshName.c_str()),0,med_2_1::MED_FAMILLE) ;
+    if ( NumberOfFamilies < 1 ) // at least family 0 must exist 
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"There is no FAMILY, FAMILY 0 must exists" ));
+
+    SCRUTE(NumberOfFamilies);
+
+    vector<FAMILY*> &NodeFamilyVector = _ptrMesh->_familyNode ;
+    vector<FAMILY*> &CellFamilyVector = _ptrMesh->_familyCell ;
+    vector<FAMILY*> &FaceFamilyVector = _ptrMesh->_familyFace ;
+    vector<FAMILY*> &EdgeFamilyVector = _ptrMesh->_familyEdge ;
+
+    int numberOfNodesFamilies = 0 ;
+    int numberOfCellsFamilies = 0 ;
+    int numberOfFacesFamilies = 0 ;
+    int numberOfEdgesFamilies = 0 ;
+
+    for (int i=0;i<NumberOfFamilies;i++) {
+      
+      med_2_1::med_int NumberOfAttributes = MEDnFam(_medIdt,const_cast <char *> (_meshName.c_str()),i+1,med_2_1::MED_ATTR) ;
+      if (NumberOfAttributes < 0) 
+       throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER21::getFAMILY() : NumberOfAttributes" );
+    
+      med_2_1::med_int NumberOfGroups = MEDnFam(_medIdt,const_cast <char *> (_meshName.c_str()),i+1,med_2_1::MED_GROUPE) ;
+      if (NumberOfGroups < 0)
+       throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER21::getFAMILY() : NumberOfGroups" );
+      
+      med_2_1::med_int FamilyIdentifier ;
+      string FamilyName(MED_TAILLE_NOM,'\0');
+      int *  AttributesIdentifier = new int[NumberOfAttributes] ;
+      int *  AttributesValues     = new int[NumberOfAttributes] ;
+      string AttributesDescription(MED_TAILLE_DESC*NumberOfAttributes,' ') ;
+      string GroupsNames(MED_TAILLE_LNOM*NumberOfGroups+1,'\0') ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      med_2_1::med_int tmp_NumberOfAttributes=NumberOfAttributes;
+      med_2_1::med_int *  AttributesIdentifier2 = new med_2_1::med_int[NumberOfAttributes] ;
+      med_2_1::med_int *  AttributesValues2     = new med_2_1::med_int[NumberOfAttributes] ;
+      err = med_2_1::MEDfamInfo(_medIdt,const_cast <char *> (_meshName.c_str()),
+                              i+1,const_cast <char *> (FamilyName.c_str()),
+                              &FamilyIdentifier,AttributesIdentifier2,AttributesValues2,
+                              const_cast <char *> (AttributesDescription.c_str()),
+                              &NumberOfAttributes,
+                              const_cast <char *> (GroupsNames.c_str()),&NumberOfGroups
+                      );
+      for(med_2_1::med_int i2=0;i2<tmp_NumberOfAttributes;i2++)
+       {
+         AttributesIdentifier[i2]=(int)(AttributesIdentifier2[i2]);
+         AttributesValues[i2]=(int)(AttributesValues2[i2]);
+       }
+      delete [] AttributesIdentifier2;
+      delete [] AttributesValues2;
+#else
+      err = med_2_1::MEDfamInfo(_medIdt,const_cast <char *> (_meshName.c_str()),
+                              i+1,const_cast <char *> (FamilyName.c_str()),
+                              &FamilyIdentifier,AttributesIdentifier,AttributesValues,
+                              const_cast <char *> (AttributesDescription.c_str()),
+                              &NumberOfAttributes,
+                              const_cast <char *> (GroupsNames.c_str()),&NumberOfGroups
+                      );
+#endif
+
+      SCRUTE(GroupsNames);
+      SCRUTE(FamilyName);
+      SCRUTE(err);
+      SCRUTE(i);
+
+      if (err != MED_VALID)
+       throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER21::getFAMILY() : ERROR when get FAMILY informations" );
+      if (FamilyIdentifier != 0 ) {
+       FAMILY * Family = new FAMILY(_ptrMesh,(int)FamilyIdentifier,FamilyName,
+                                     (int)NumberOfAttributes,AttributesIdentifier,
+                                    AttributesValues,AttributesDescription,
+                                     (int)NumberOfGroups,GroupsNames,
+                                    MEDArrayNodeFamily,
+                                    MEDArrayCellFamily,
+                                    MEDArrayFaceFamily,
+                                    MEDArrayEdgeFamily
+                                    ) ;
+       // All good ?
+       // if nothing found, delete Family
+
+
+       //MESSAGE(LOC << " Well is that OK now ?? " << (*Family));
+
+
+
+       if (Family->getNumberOfTypes() == 0) {
+         MESSAGE(LOC<<"Nothing found for family "<<FamilyName<< " : skip");
+         delete Family;
+       } else
+         switch (Family->getEntity()) {
+         case MED_EN::MED_NODE :
+           NodeFamilyVector.push_back(Family) ;
+           numberOfNodesFamilies++ ;
+           break ;
+         case MED_EN::MED_CELL :
+           CellFamilyVector.push_back(Family) ;
+           numberOfCellsFamilies++ ;
+           break ;
+         case MED_EN::MED_FACE :
+           FaceFamilyVector.push_back(Family) ;
+           numberOfFacesFamilies++ ;
+           break ;
+         case MED_EN::MED_EDGE :
+           EdgeFamilyVector.push_back(Family) ;
+           numberOfEdgesFamilies++ ;
+           break ;
+         }
+
+       //      MESSAGE(LOC << (*Family));
+
+
+
+
+      }
+
+      delete [] AttributesIdentifier ;
+      delete [] AttributesValues ;
+    }
+
+    if (MEDArrayNodeFamily != NULL)
+      delete[] MEDArrayNodeFamily ;
+    if (MEDArrayCellFamily != NULL) {
+      for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_CELL);i++)
+       delete[] MEDArrayCellFamily[i] ;
+      delete[] MEDArrayCellFamily ;
+    }
+    if (MEDArrayFaceFamily != NULL) {
+      for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_FACE);i++)
+       delete[] MEDArrayFaceFamily[i] ;
+      delete[] MEDArrayFaceFamily ;
+    }
+    if (MEDArrayEdgeFamily != NULL) {
+      for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
+       delete[] MEDArrayEdgeFamily[i] ;
+      delete[] MEDArrayEdgeFamily ;
+    }
+
+    END_OF(LOC);
+    return MED_VALID ;
+  }
+  return MED_ERROR;
+}
+
+int  MED_MESH_RDONLY_DRIVER21::getNodesFamiliesNumber(int * MEDArrayNodeFamily) 
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER21::getNodesFamiliesNumber() : " ;
+  BEGIN_OF(LOC);
+  if (_status==MED_OPENED) {
+    int err = 0 ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+    int lgth=_ptrMesh->getNumberOfNodes();
+    med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+    err = MEDfamLire(_medIdt,(const_cast <char *> (_ptrMesh->_name.c_str())), 
+                    temp,
+                    _ptrMesh->getNumberOfNodes(),
+                    med_2_1::MED_NOEUD,(med_2_1::med_geometrie_element) MED_NONE);
+      for(int i2=0;i2<lgth;i2++)
+       MEDArrayNodeFamily[i2]=(int)(temp[i2]);
+      delete [] temp;
+#else
+    err = MEDfamLire(_medIdt,(const_cast <char *> (_ptrMesh->_name.c_str())), 
+                    MEDArrayNodeFamily,
+                    _ptrMesh->getNumberOfNodes(),
+                    med_2_1::MED_NOEUD,(med_2_1::med_geometrie_element) MED_NONE);
+#endif
+    if ( err != MED_VALID) {
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "There is no family for the |"<< _ptrMesh->getNumberOfNodes() 
+                                   << "| nodes in mesh |" 
+                                   << _ptrMesh->_name.c_str() << "|" ));
+    }
+    END_OF(LOC);
+    return MED_VALID;
+  }
+  return MED_ERROR;
+}
+
+int  MED_MESH_RDONLY_DRIVER21::getCellsFamiliesNumber(int **MEDArrayFamily,
+                                                     CONNECTIVITY *Connectivity,
+                                                     MED_EN::medEntityMesh entity)
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER21::getCellsFamiliesNumber " ;
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED) {
+    int i, err = 0 ;
+    for (i=0;i<Connectivity->_numberOfTypes;i++)       {
+      int NumberOfCell = Connectivity->_count[i+1]-Connectivity->_count[i] ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      const medGeometryElement * myTypes = _ptrMesh->getTypes(entity);
+      int lgthI=_ptrMesh->getNumberOfElements(entity,myTypes[i]);
+      med_2_1::med_int *temp=new med_2_1::med_int[lgthI];
+      err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                     temp,NumberOfCell,
+                     (med_2_1::med_entite_maillage) Connectivity->_entity,
+                     (med_2_1::med_geometrie_element) Connectivity->_geometricTypes[i]);
+      for(int i2=0;i2<lgthI;i2++)
+       MEDArrayFamily[i][i2]=(int)(temp[i2]);
+      delete [] temp;
+#else
+      err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                     MEDArrayFamily[i],NumberOfCell,
+                     (med_2_1::med_entite_maillage) Connectivity->_entity,
+                     (med_2_1::med_geometrie_element) Connectivity->_geometricTypes[i]);
+#endif
+
+      // provisoire : si les faces ou les aretes sont des mailles !!!
+      if (err != MED_VALID) {
+       MESSAGE(LOC<<"search face/edge family on cell !!!");
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgthI=_ptrMesh->getNumberOfElements(entity,myTypes[i]);
+       med_2_1::med_int *temp=new med_2_1::med_int[lgthI];
+       err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                      temp,NumberOfCell,
+                      med_2_1::MED_MAILLE,
+                      (med_2_1::med_geometrie_element) Connectivity->_geometricTypes[i]);
+       for(int i2=0;i2<lgthI;i2++)
+         MEDArrayFamily[i][i2]=(int)(temp[i2]);
+       delete [] temp;
+#else
+       err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                      MEDArrayFamily[i],NumberOfCell,
+                      med_2_1::MED_MAILLE,
+                      (med_2_1::med_geometrie_element) Connectivity->_geometricTypes[i]);
+#endif
+      }
+
+      if (err != MED_VALID) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Family not found for entity "<<Connectivity->_entity<<" and geometric type "<<Connectivity->_geometricTypes[i]));
+      
+    }
+    return MED_VALID;
+  }
+  return MED_ERROR;  
+}
+
+/*--------------------- WRONLY PART -------------------------------*/
+
+MED_MESH_WRONLY_DRIVER21::MED_MESH_WRONLY_DRIVER21()
+{
+}
+  
+MED_MESH_WRONLY_DRIVER21::MED_MESH_WRONLY_DRIVER21(const string & fileName,
+                                                  MESH * ptrMesh):
+  MED_MESH_DRIVER21(fileName,ptrMesh,MED_WRONLY),IMED_MESH_WRONLY_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER(fileName,ptrMesh,MED_WRONLY)
+{
+  MESSAGE("MED_MESH_WRONLY_DRIVER21::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
+}
+
+MED_MESH_WRONLY_DRIVER21::MED_MESH_WRONLY_DRIVER21(const MED_MESH_WRONLY_DRIVER21 & driver): 
+  IMED_MESH_WRONLY_DRIVER(driver),MED_MESH_DRIVER21(driver),MED_MESH_DRIVER(driver)
+{
+}
+
+MED_MESH_WRONLY_DRIVER21::~MED_MESH_WRONLY_DRIVER21()
+{
+  //MESSAGE("MED_MESH_WRONLY_DRIVER21::MED_MESH_WRONLY_DRIVER21(const string & fileName, MESH * ptrMesh) has been destroyed");
+}
+
+GENDRIVER * MED_MESH_WRONLY_DRIVER21::copy(void) const
+{
+  return new MED_MESH_WRONLY_DRIVER21(*this);
+}
+
+void MED_MESH_WRONLY_DRIVER21::write(void) const
+{ 
+  const char * LOC = "void MED_MESH_WRONLY_DRIVER21::write(void) const : ";
+  BEGIN_OF(LOC);
+
+  // we must first create mesh !!
+  MESSAGE(LOC << "MeshName : |" << _meshName << "| FileName : |"<<_fileName<<"| MedIdt : | "<< _medIdt << "|");
+
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "File "<<_fileName<<" is not open. Open it before write !"));
+
+  if (_ptrMesh->getIsAGrid())
+  {
+    if ( writeGRID() != MED_VALID )
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeGRID()"  )) ;
+  }
+  else
+  {
+    if (writeCoordinates()!=MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeCoordinates()"  )) ;
+
+    if (writeConnectivities(MED_EN::MED_CELL)!=MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_CELL)"  )) ;
+    if (writeConnectivities(MED_EN::MED_FACE)!=MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_FACE)"  )) ;
+    if (writeConnectivities(MED_EN::MED_EDGE)!=MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_EDGE)"  )) ;
+  }
+
+  if (writeFamilyNumbers() !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilyNumbers()"  )) ;
+  
+
+  // well we must first write zero family :
+  if (_status==MED_OPENED) {
+    int err ;
+    // test if the family already exists (HDF trick waiting a MED evolution to be replaced)
+    string dataGroupFam = "/ENS_MAA/"+_meshName+"/FAS/FAMILLE_0/";  
+    MESSAGE("|"<<dataGroupFam<<"|");
+    err = med_2_1::_MEDdatagroupOuvrir(_medIdt,const_cast <char *> (dataGroupFam.c_str()) );
+    if ( err < MED_VALID ) {
+      SCRUTE(err);
+      
+      err = med_2_1::MEDfamCr( _medIdt,
+                             const_cast <char *> ( _meshName.c_str() ),
+                             "FAMILLE_0", 0,
+                             (med_2_1::med_int*)NULL, (med_2_1::med_int*)NULL, (char*)NULL, 0,
+                             (char*)NULL, 0);
+      
+      if ( err != MED_VALID) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't create family |FAMILLE_0| with identifier |0| groups names || and  attributes descriptions ||")) ;
+    }
+    else
+      med_2_1::_MEDdatagroupFermer(_medIdt);
+     
+  }
+
+  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyNode)");
+  if (writeFamilies(_ptrMesh->_familyNode) !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyNode)"  )) ;
+
+  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyCell)");
+  if (writeFamilies(_ptrMesh->_familyCell) !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyCell)"  )) ;
+
+  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyFace)");
+  if (writeFamilies(_ptrMesh->_familyFace) !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyFace)"  )) ;
+
+  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyEdge)");
+  if (writeFamilies(_ptrMesh->_familyEdge) !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyEdge)"  )) ;
+
+  END_OF(LOC);
+} 
+
+//=======================================================================
+//function : writeGRID
+//purpose  : 
+//=======================================================================
+
+int MED_MESH_WRONLY_DRIVER21::writeGRID() const
+{
+  const char * LOC = "MED_MESH_WRONLY_DRIVER21::writeGRID() : " ;
+  BEGIN_OF(LOC);
+  
+  if (_status!=MED_OPENED)
+  {
+    MESSAGE (LOC<<" Not open !!!");
+    return MED_ERROR;
+  }
+  GRID * ptrGrid = (GRID*) _ptrMesh;
+  
+  med_2_1::med_err err = MED_ERROR;
+  med_2_1::med_repere rep;
+  string tmp_name(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM21,' ');
+  string tmp_unit(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM21,' ');
+
+  // Test if the mesh <_meshName> already exists
+  // If it doesn't exists create it
+  // If it already exists verify if its dimension is the same as <_ptrMesh->_spaceDimension>
+  // rem : <_meshName> is the driver meshName not <ptrMesh->_meshName>
+  int dim = med_2_1::MEDdimLire(_medIdt, const_cast <char *> (_meshName.c_str()) );
+  if (dim < MED_VALID)
+  {
+    err = med_2_1::MEDgridCr(_medIdt,
+                    const_cast <char *> (_meshName.c_str()),
+                    _ptrMesh->_spaceDimension,
+                    (med_2_1::med_grid_type) ptrGrid->getGridType());
+    if (err != MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Unable to create Grid"));
+    else 
+      MESSAGE(LOC<<"Grid "<<_meshName<<" created in file "<<_fileName<<" !");
+  }
+  else if (dim != _ptrMesh->_spaceDimension) 
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Grid |" << _meshName.c_str() <<
+                                 "| already exists in file |" << _fileName <<
+                                 "| with dimension |" << dim <<
+                                 "| but the dimension of the mesh we want to write is |"
+                                 << _ptrMesh->_spaceDimension <<"|" )) ;
+
+  // Recompose the <_spaceDimension> strings in 1 string 
+  int lengthString ;
+  string valueString ;
+  for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
+    SCRUTE(i);
+    valueString = _ptrMesh->_coordinate->_coordinateName[i] ;
+    lengthString = (MED_TAILLE_PNOM21<valueString.size())?MED_TAILLE_PNOM21:valueString.size() ;
+    tmp_name.replace(i*MED_TAILLE_PNOM21,i*MED_TAILLE_PNOM21+lengthString,valueString,0,lengthString);
+    valueString = _ptrMesh->_coordinate->_coordinateUnit[i];
+    lengthString = (MED_TAILLE_PNOM21<valueString.size())?MED_TAILLE_PNOM21:valueString.size() ;
+    tmp_unit.replace(i*MED_TAILLE_PNOM21,i*MED_TAILLE_PNOM21+lengthString,valueString,0,lengthString);
+  }
+
+  // Pourquoi le stocker sous forme de chaîne ?
+  const string & coordinateSystem = _ptrMesh->_coordinate->_coordinateSystem;
+  if      (coordinateSystem  == "CARTESIAN") 
+    rep = med_2_1::MED_CART;
+  else if ( coordinateSystem == "CYLINDRICAL")
+    rep = med_2_1::MED_CYL;
+  else if ( coordinateSystem == "SPHERICAL" )
+    rep = med_2_1::MED_SPHER;
+  else
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Grid |" << _meshName.c_str() <<
+                                 "| doesn't have a valid coordinate system : |" 
+                                 << _ptrMesh->_coordinate->_coordinateSystem
+                                 << "|" )) ;  
+
+  med_2_1::med_int ArrayLen[] = { (med_2_1::med_int) ptrGrid->_iArrayLength,
+                     (med_2_1::med_int) ptrGrid->_jArrayLength,
+                     (med_2_1::med_int) ptrGrid->_kArrayLength  };
+  
+  // Write node coordinates for MED_BODY_FITTED grid
+  if (ptrGrid->getGridType() == MED_EN::MED_BODY_FITTED)
+  {
+
+    // Write Coordinates and families
+    double * coo = const_cast <double *>
+      (_ptrMesh->_coordinate->getCoordinates(MED_EN::MED_FULL_INTERLACE));
+    
+    // Write unused families
+    //CCRT unused => med_2_1::med_int
+    med_2_1::med_int * MEDArrayNodeFamily = new med_2_1::med_int[_ptrMesh->_numberOfNodes] ;
+
+    err = MEDbodyFittedEcr (_medIdt,
+                            const_cast <char *> (_ptrMesh->_name.c_str()),
+                            _ptrMesh->_spaceDimension,
+                            coo,
+                            ArrayLen,
+                            med_2_1::MED_FULL_INTERLACE,
+                            rep,
+                            const_cast <char *> (tmp_name.c_str()),
+                            const_cast <char *> (tmp_unit.c_str()),
+                            MEDArrayNodeFamily,
+                            _ptrMesh->_numberOfNodes,
+                            med_2_1::MED_REMP);
+    delete[] MEDArrayNodeFamily;
+
+    if (err != MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"error in MEDbodyFittedEcr()"));
+
+  }
+  else
+  {
+    // Write Arrays of Cartesian or Polar Grid
+
+    double * Array[] = { ptrGrid->_iArray,
+                         ptrGrid->_jArray,
+                         ptrGrid->_kArray };
+    int idim;
+    for (idim = 0; idim < _ptrMesh->_spaceDimension; ++idim)
+    {
+      err = med_2_1::MEDgridEcr (_medIdt,
+                        const_cast <char *> (_ptrMesh->_name.c_str()),
+                        _ptrMesh->_spaceDimension,
+                        Array [idim],
+                        ArrayLen [idim],
+                        idim,
+                        med_2_1::MED_FULL_INTERLACE,
+                        rep,
+                        const_cast <char *> (tmp_name.c_str()),
+                        const_cast <char *> (tmp_unit.c_str()),
+                        med_2_1::MED_REMP);
+      if (err != MED_VALID)
+        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't read grid coordinates for "
+                                     << idim << "-th dimention"));
+    }
+
+//      err = MEDfamGridEcr(_medIdt,
+//                          const_cast <char *> (_ptrMesh->_name.c_str()),
+//                          _ptrMesh->_MEDArrayNodeFamily,
+//                          _ptrMesh->_numberOfNodes,
+//                          med_2_1::MED_REMP,
+//                          med_2_1::MED_NOEUD);
+    if (err != MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"error in MEDfamGridEcr()"));
+
+  } // end Write  Cartesian or Polar Grid
+
+  END_OF(LOC);
+  return MED_VALID;
+}
+
+//=======================================================================
+//function : writeCoordinates
+//purpose  : 
+//=======================================================================
+
+int MED_MESH_WRONLY_DRIVER21::writeCoordinates() const {
+  const char * LOC = "int MED_MESH_WRONLY_DRIVER21::writeCoordinates() const : ";
+  BEGIN_OF(LOC);
+
+  med_2_1::med_err err = MED_ERROR;
+  med_2_1::med_repere rep;
+  string tmp_name(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM21,' ');
+  string tmp_unit(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM21,' ');
+    
+  // Recompose the <_spaceDimension> strings in 1 string 
+  int lengthString ;
+  string valueString ;
+  for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
+    valueString = _ptrMesh->_coordinate->_coordinateName[i] ;
+    lengthString = (MED_TAILLE_PNOM21<valueString.size())?MED_TAILLE_PNOM21:valueString.size() ;
+    tmp_name.replace(i*MED_TAILLE_PNOM21,i*MED_TAILLE_PNOM21+lengthString,valueString,0,lengthString);
+    valueString = _ptrMesh->_coordinate->_coordinateUnit[i];
+    lengthString = (MED_TAILLE_PNOM21<valueString.size())?MED_TAILLE_PNOM21:valueString.size() ;
+    tmp_unit.replace(i*MED_TAILLE_PNOM21,i*MED_TAILLE_PNOM21+lengthString,valueString,0,lengthString);
+  }
+
+  // Test if the mesh <_meshName> already exists
+  // If it doesn't exists create it
+  // If it already exists verify if its dimension is the same as <_ptrMesh->_spaceDimension>
+  // rem : <_meshName> is the driver meshName not <ptrMesh->_meshName>
+  int dim = med_2_1::MEDdimLire(_medIdt, const_cast <char *> (_meshName.c_str()) );
+  if (dim < MED_VALID)
+    if (med_2_1::MEDmaaCr(_medIdt,const_cast <char *> (_meshName.c_str()),_ptrMesh->_spaceDimension) != 0 )
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Unable to create Mesh : |" << _meshName << "|"));
+    else 
+      {
+       MESSAGE(LOC<<"Mesh "<<_meshName<<" created in file "<<_fileName<<" !");
+      }
+  else if (dim != _ptrMesh->_spaceDimension) 
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Mesh |" << _meshName.c_str() << "| already exists in file |" << _fileName
+                                << "| with dimension |" << dim << "| but the dimension of the mesh we want to write is |"
+                                << _ptrMesh->_spaceDimension <<"|" )) ;
+    
+  // Pourquoi le stocker sous forme de chaîne ?
+  const string & coordinateSystem = _ptrMesh->_coordinate->_coordinateSystem;
+  if      (coordinateSystem  == "CARTESIAN") 
+    rep = med_2_1::MED_CART;
+  else if ( coordinateSystem == "CYLINDRICAL")
+    rep = med_2_1::MED_CYL;
+  else if ( coordinateSystem == "SPHERICAL" )
+    rep = med_2_1::MED_SPHER;
+  else
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Mesh |" << _meshName.c_str() << "| doesn't have a valid coordinate system : |" 
+                                << _ptrMesh->_coordinate->_coordinateSystem
+                                << "|" )) ;  
+      
+  err = MEDcoordEcr(_medIdt, const_cast <char *> (_meshName.c_str()),
+                   _ptrMesh->_spaceDimension, 
+                   //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ), 
+                   const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ), 
+                   med_2_1::MED_FULL_INTERLACE, 
+                   _ptrMesh->_numberOfNodes,                 //  _ptrMesh->_coordinate->_numberOfNodes
+                   med_2_1::MED_REMP,    
+                   rep,
+                   const_cast <char *> (tmp_name.c_str()), 
+                   const_cast <char *> (tmp_unit.c_str()) 
+                   );  
+
+  if (err<0) 
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write coordinates of mesh |" << _meshName.c_str() << "| in file |" << _fileName
+                                << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                << " with units names |"  << tmp_name
+                                << "| and units |"       << tmp_unit
+                                << " |")) ;    
+    
+
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///
+       /// Ecrit les numéros optionnels des noeuds
+       /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+
+
+      if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) {
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgth=_ptrMesh->_coordinate->getNumberOfNodes();
+       med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+       for(int i2=0;i2<lgth;i2++)
+         temp[i2]=(med_2_1::med_int)(_ptrMesh->_coordinate->getNodesNumbers()[i2]);
+       err =  MEDnumEcr(_medIdt,const_cast <char *> (_meshName.c_str()),
+                         temp, 
+                         _ptrMesh->_numberOfNodes, med_2_1::MED_REMP,
+                         med_2_1::MED_NOEUD, med_2_1::med_geometrie_element(0) );
+       delete [] temp;
+#else        
+        err =  MEDnumEcr(_medIdt,const_cast <char *> (_meshName.c_str()),
+                         const_cast <int *> (_ptrMesh->_coordinate->getNodesNumbers() ), 
+                         _ptrMesh->_numberOfNodes, med_2_1::MED_REMP,
+                         med_2_1::MED_NOEUD, med_2_1::med_geometrie_element(0) );
+#endif
+
+        if (err<0) 
+          throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write optionnal numbers of mesh |" << _meshName.c_str() 
+                                       << "| in file |" << _fileName  << " |")) ;    
+      }
+      //////////////////////////////////////////////////////////////////////////////////////
+
+  END_OF(LOC);
+    
+  return MED_VALID;
+}
+
+
+
+
+int MED_MESH_WRONLY_DRIVER21::writeConnectivities(medEntityMesh entity) const {
+  
+  const char * LOC="int MED_MESH_WRONLY_DRIVER21::writeConnectivities() const : ";
+  BEGIN_OF(LOC);
+
+  med_2_1::med_err err;
+  
+  // REM SI LA METHODE EST APPELEE DIRECTEMENT ET QUE LE MAILLAGE N'EST PAS CREE IL Y A PB !
+  // PG : IMPOSSIBLE : LA METHODE EST PRIVEE !
+    
+    // A FAIRE : A tester surtout dans les methodes de MESH.
+    //    if ( _ptrMesh->_connectivity == (CONNECTIVITY *) MED_INVALID )
+  if ( _ptrMesh->_connectivity == (CONNECTIVITY *) NULL )
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The connectivity is not defined in the MESH object ")) ;
+    
+  if   ( _ptrMesh->existConnectivity(MED_NODAL,entity) ) { 
+
+    int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+    const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+    
+    for (int i=0; i<numberOfTypes; i++) {
+      
+      int    numberOfElements = _ptrMesh->getNumberOfElements (entity,types[i]);
+      const int * connectivity      = _ptrMesh->getConnectivity     (MED_EN::MED_FULL_INTERLACE, 
+                                                                    MED_NODAL, entity, types[i]); // ?? et SI MED_NODAL n'existe pas, recalcul auto ??
+      
+      // Pour l'instant la class utilise le multi.....
+      int multi = 0 ;
+      if (entity==MED_EN::MED_CELL)
+       if ( (types[i]/ 100) < _ptrMesh->_spaceDimension) 
+         multi=1 ;
+      int numberOfNodes = types[i]%100 ;
+      int * connectivityArray = new int[numberOfElements*(numberOfNodes+multi)];
+      
+      // version originale sans prise en compte des numéros optionnels 
+      //     
+      for (int j=0 ; j<numberOfElements; j++) 
+               {
+         for (int k=0; k<numberOfNodes; k++)
+           connectivityArray[j*(numberOfNodes+multi)+k]=connectivity[j*numberOfNodes+k] ;
+
+         if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
+       }
+      
+      //////////////////////////////////////////////////////////////////////////////////////
+      ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+      //////////////////////////////////////////////////////////////////////////////////////
+      ///
+      /// Dénumérote les sommets des mailles pour leur rendre leurs numéros optionnels
+      /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+
+//     if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) 
+//             {
+//             const int * nodesNumbers = _ptrMesh->_coordinate->getNodesNumbers();
+//                     for (int j=0 ; j<numberOfElements; j++) 
+//                     {
+//                     for (int k=0; k<numberOfNodes; k++) connectivityArray[j*(numberOfNodes+multi)+k]=nodesNumbers[connectivity[j*numberOfNodes+k]-1] ;
+//                     if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
+//                     }
+//             }
+//     else
+//             {
+//                     for (int j=0 ; j<numberOfElements; j++) 
+//                     {
+//                     for (int k=0; k<numberOfNodes; k++) connectivityArray[j*(numberOfNodes+multi)+k]=connectivity[j*numberOfNodes+k] ;
+//                     if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
+//                     }
+//             }
+
+      //////////////////////////////////////////////////////////////////////////////////////
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      int lgth=numberOfElements*(numberOfNodes+multi);
+      med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+      for(int i2=0;i2<lgth;i2++)
+       temp[i2]=(med_2_1::med_int)(connectivityArray[i2]);
+      err = MEDconnEcr( _medIdt, const_cast <char *> ( _meshName.c_str()), _ptrMesh->_spaceDimension,
+                       temp, med_2_1::MED_FULL_INTERLACE , numberOfElements,
+                       med_2_1::MED_REMP,
+                       (med_2_1::med_entite_maillage  ) entity, 
+                       (med_2_1::med_geometrie_element) types[i], med_2_1::MED_NOD );
+      delete [] temp;
+#else
+      err = MEDconnEcr( _medIdt, const_cast <char *> ( _meshName.c_str()), _ptrMesh->_spaceDimension,
+                       connectivityArray, med_2_1::MED_FULL_INTERLACE , numberOfElements,
+                       med_2_1::MED_REMP,
+                       (med_2_1::med_entite_maillage  ) entity, 
+                       (med_2_1::med_geometrie_element) types[i], med_2_1::MED_NOD );
+#endif
+      delete[] connectivityArray ;
+      if (err<0) // ETENDRE LES EXPLICATIONS
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write connectivities of mesh |" << _meshName.c_str() << "| in file |" << _fileName
+                                    << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                    )) ;
+    }
+  }
+  // Connctivity descending :
+  if   ( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) { 
+      
+    int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+    const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+      
+    for (int i=0; i<numberOfTypes; i++) {
+       
+      int    numberOfElements = _ptrMesh->getNumberOfElements (entity,types[i]);
+      const int * connectivity = _ptrMesh->getConnectivity(MED_EN::MED_FULL_INTERLACE, MED_DESCENDING, entity, types[i]); 
+      
+      // Pour l'instant la class utilise le multi.....
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      int lgth=_ptrMesh->getConnectivityLength(MED_EN::MED_FULL_INTERLACE, MED_DESCENDING, entity, types[i]);
+      med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+      for(int i2=0;i2<lgth;i2++)
+       temp[i2]=(med_2_1::med_int)(connectivity[i2]);
+      err = med_2_1::MEDconnEcr( _medIdt,
+                               const_cast <char *> ( _meshName.c_str()),
+                               _ptrMesh->_spaceDimension,
+                               temp,
+                               med_2_1::MED_FULL_INTERLACE,
+                               numberOfElements,
+                               med_2_1::MED_REMP,
+                               (med_2_1::med_entite_maillage  ) entity, 
+                               (med_2_1::med_geometrie_element) types[i],
+                               med_2_1::MED_DESC );
+      delete [] temp;
+#else
+      err = med_2_1::MEDconnEcr( _medIdt,
+                               const_cast <char *> ( _meshName.c_str()),
+                               _ptrMesh->_spaceDimension,
+                               const_cast <int *> (connectivity),
+                               med_2_1::MED_FULL_INTERLACE,
+                               numberOfElements,
+                               med_2_1::MED_REMP,
+                               (med_2_1::med_entite_maillage  ) entity, 
+                               (med_2_1::med_geometrie_element) types[i],
+                               med_2_1::MED_DESC );
+#endif
+       
+      if (err<0) // ETENDRE LES EXPLICATIONS
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write connectivities of mesh |" << _meshName.c_str() << "| in file |" << _fileName
+                                    << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                    )) ;
+            
+    }
+  }
+  END_OF(LOC);
+  return MED_VALID;
+}
+
+int MED_MESH_WRONLY_DRIVER21::writeFamilyNumbers() const {
+  
+  const char * LOC="int MED_MESH_WRONLY_DRIVER21::writeFamilyNumbers() const : ";
+  BEGIN_OF(LOC);
+
+  med_2_1::med_err err;
+  
+  // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArrayNodeFamily DOIT ETRE ENLEVER DE LA CLASSE MESH
+
+  { // Node related block
+    
+    // We build the array from the families list objects :
+    int NumberOfNodes = _ptrMesh->getNumberOfNodes() ;
+    int * MEDArrayNodeFamily = new int[NumberOfNodes] ;
+    // family 0 by default
+    for (int i=0; i<NumberOfNodes; i++)
+      MEDArrayNodeFamily[i]=0;
+    //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(MED_NODE);
+    vector<FAMILY*> * myFamilies = &_ptrMesh->_familyNode;
+    int NumberOfNodesFamilies = myFamilies->size() ;
+    //bool ToDestroy = false;
+    if (0 == NumberOfNodesFamilies) {
+      //ToDestroy = true ;
+      vector<GROUP*> myGroups = _ptrMesh->getGroups(MED_NODE);
+      int NumberOfGroups = myGroups.size() ;
+      // build families from groups
+      for (int i=0; i<NumberOfGroups; i++) {
+       SUPPORT * mySupport = myGroups[i] ;
+       FAMILY* myFamily = new FAMILY(*mySupport);
+       myFamily->setIdentifier(i+1);
+       myFamilies->push_back(myFamily);
+      }
+      NumberOfNodesFamilies=myFamilies->size() ;
+    }
+    for (int i=0 ; i<NumberOfNodesFamilies; i++) {
+      //SCRUTE(i);
+      //SCRUTE(myFamilies[i]->getName());
+      int FamilyIdentifier = (*myFamilies)[i]->getIdentifier() ;
+      int TotalNumber = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
+      if ((*myFamilies)[i]->isOnAllElements())
+       for (int j=0; j<TotalNumber; j++)
+         MEDArrayNodeFamily[j]=FamilyIdentifier;
+      else {
+       const int * Number = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
+       for (int j=0; j<TotalNumber; j++)
+         MEDArrayNodeFamily[Number[j]-1]=FamilyIdentifier ;
+      }
+    }
+    for(int j=0; j<NumberOfNodes; j++) {
+      SCRUTE(MEDArrayNodeFamily[j]);
+    }
+    if ( !_ptrMesh->getIsAGrid() ){
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      int lgth=NumberOfNodes;
+      med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+      for(int i2=0;i2<lgth;i2++)
+       temp[i2]=(med_2_1::med_int)(MEDArrayNodeFamily[i2]);
+      err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                     temp, NumberOfNodes,med_2_1::MED_REMP ,
+                     med_2_1::MED_NOEUD,
+                     (med_2_1::med_geometrie_element) MED_NONE);
+      delete [] temp;
+#else
+      err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                     MEDArrayNodeFamily, NumberOfNodes,med_2_1::MED_REMP ,
+                     med_2_1::MED_NOEUD,
+                     (med_2_1::med_geometrie_element) MED_NONE); 
+#endif
+    }
+    else{
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      int lgth=NumberOfNodes;
+      med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+      for(int i2=0;i2<lgth;i2++)
+       temp[i2]=(med_2_1::med_int)(MEDArrayNodeFamily[i2]);
+      err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                     temp, NumberOfNodes,med_2_1::MED_REMP ,
+                     med_2_1::MED_NOEUD,
+                     (med_2_1::med_geometrie_element) MED_NONE);
+      delete [] temp;
+#else
+      err = MEDfamGridEcr(_medIdt,
+                         const_cast <char *> (_ptrMesh->_name.c_str()),
+                         MEDArrayNodeFamily,
+                         NumberOfNodes,
+                         med_2_1::MED_REMP,
+                         med_2_1::MED_NOEUD);
+#endif
+    }
+
+    if ( err != MED_VALID) 
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write node family for the |"<< NumberOfNodes
+                                  << "| nodes in mesh |" 
+                                  << _ptrMesh->_name.c_str() << "|" ));
+    delete[] MEDArrayNodeFamily;
+    //if (true == ToDestroy)
+    //  for (int i=0; i<NumberOfNodesFamilies; i++)
+    //   delete myFamilies[i];
+  }
+    
+  { // CELLS RELATED BLOCK
+    medEntityMesh entity=MED_EN::MED_CELL;
+    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
+    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
+
+      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+
+      // We build the array from the families list objects :
+      int NumberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS);
+      int * MEDArrayFamily = new int[NumberOfElements] ;
+      // family 0 by default
+      for (int i=0; i<NumberOfElements; i++)
+       MEDArrayFamily[i]=0;
+      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity);
+      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyCell ;
+      int NumberOfFamilies = myFamilies->size() ;
+      //bool ToDestroy = false;
+      if (0 == NumberOfFamilies) {
+       //ToDestroy = true ;
+       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
+       int NumberOfGroups = myGroups.size() ;
+       // build families from groups
+       for (int i=0; i<NumberOfGroups; i++) {
+         SCRUTE( myGroups[i]->getName() );
+         SUPPORT * mySupport = myGroups[i] ;
+         FAMILY* myFamily = new FAMILY(*mySupport);
+         myFamily->setIdentifier(-i-1);
+         myFamilies->push_back(myFamily);
+       }
+       NumberOfFamilies=myFamilies->size() ;
+      }
+      for (int i=0 ; i<NumberOfFamilies; i++) {
+       int FamilyIdentifier = (*myFamilies)[i]->getIdentifier() ;
+       int TotalNumber = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
+       if ((*myFamilies)[i]->isOnAllElements())
+         for (int ii=0; ii<TotalNumber; ii++)
+           MEDArrayFamily[ii]=FamilyIdentifier;
+       else {
+         const int * Number = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
+         for (int ii=0; ii<TotalNumber; ii++)
+           MEDArrayFamily[Number[ii]-1]=FamilyIdentifier ;
+       }
+      }
+
+      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgth=NumberOfElements;
+       med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+       for(int i2=0;i2<lgth;i2++)
+         temp[i2]=(med_2_1::med_int) (MEDArrayFamily[i2]);
+#endif
+      for (int i=0; i<numberOfTypes; i++) {
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       temp+typeCount[i]-1,typeCount[i+1]-typeCount[i],
+                       med_2_1::MED_REMP ,
+                       (med_2_1::med_entite_maillage) entity,
+                       (med_2_1::med_geometrie_element) types[i]
+);
+#else
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       MEDArrayFamily+typeCount[i]-1,typeCount[i+1]-typeCount[i],
+                       med_2_1::MED_REMP ,
+                       (med_2_1::med_entite_maillage) entity,
+                       (med_2_1::med_geometrie_element) types[i]
+); 
+#endif
+       MESSAGE("OK "<<i);
+       if ( err != MED_VALID) 
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
+                                      << "| cells of geometric type |" << geoNames[ types[i]] <<"|in mesh |"      
+                                      << _ptrMesh->_name.c_str() << "|" ));   
+      }
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      delete [] temp;
+#endif
+      delete[] MEDArrayFamily ;
+      //if (true == ToDestroy) {
+      //  int NumberOfFamilies = myFamilies->size();
+      //  for (int i=0; i<NumberOfFamilies; i++)
+      //    delete myFamilies[i];
+      //}
+    }
+  }
+
+  { // FACE RELATED BLOCK
+    medEntityMesh entity=MED_EN::MED_FACE;
+    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
+    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
+
+      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+      SCRUTE(numberOfTypes);
+      
+      int numberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS) ;
+      int * familyArray = new int[numberOfElements] ;
+      for (int i=0;i<numberOfElements;i++)
+       familyArray[i]=0;
+
+      int numberOfFamilies = _ptrMesh->getNumberOfFamilies(entity) ;
+      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity) ;
+      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyFace ;
+      //bool ToDestroy = false;
+      if (0 == numberOfFamilies) {
+       //ToDestroy = true ;
+       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
+       int NumberOfGroups = myGroups.size() ;
+       // build families from groups
+       for (int i=0; i<NumberOfGroups; i++) {
+         SCRUTE( myGroups[i]->getName() );
+         SUPPORT * mySupport = myGroups[i] ;
+         FAMILY* myFamily = new FAMILY(*mySupport);
+         myFamily->setIdentifier(-i-1000);
+         myFamilies->push_back(myFamily);
+       }
+       numberOfFamilies=myFamilies->size() ;
+      }
+      for (int i=0;i<numberOfFamilies;i++) {
+       int familyNumber = (*myFamilies)[i]->getIdentifier() ;
+       int numberOfFamilyElements = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
+       if ((*myFamilies)[i]->isOnAllElements())
+         for (int ii=0; ii<numberOfFamilyElements; ii++)
+           familyArray[ii]=familyNumber;
+       else {
+         const int * myFamilyElements = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
+         for (int ii=0;ii<numberOfFamilyElements;ii++)
+           familyArray[myFamilyElements[ii]-1]=familyNumber;
+       }
+      }
+
+      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgth=numberOfElements;
+       med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+       for(int i2=0;i2<lgth;i2++)
+         temp[i2]=(med_2_1::med_int) (familyArray[i2]);
+#endif
+      for (int i=0; i<numberOfTypes; i++) {
+
+       int typeNumberOfElements = typeCount[i+1] - typeCount[i] ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       temp+typeCount[i]-1, typeNumberOfElements,
+                       med_2_1::MED_REMP ,
+                       (med_2_1::med_entite_maillage) entity,
+                       (med_2_1::med_geometrie_element) types[i]);
+#else
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       familyArray+typeCount[i]-1, typeNumberOfElements,
+                       med_2_1::MED_REMP ,
+                       (med_2_1::med_entite_maillage) entity,
+                       (med_2_1::med_geometrie_element) types[i]); 
+#endif
+       if ( err != MED_VALID) 
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
+                                      << "| faces of geometric type |" << geoNames[types[i]] <<"|in mesh |"      
+                                      << _ptrMesh->_name.c_str() << "|" ));   
+      }
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      delete [] temp;
+#endif
+      delete[] familyArray ;
+      //if (true == ToDestroy) {
+      //  int NumberOfFamilies = myFamilies->size();
+      //    for (int i=0; i<NumberOfFamilies; i++)
+      //      delete myFamilies[i];
+      //}
+    }
+  }
+
+  { // EDGE RELATED BLOCK
+    //medEntityMesh entity=MED_EN::MED_FACE;
+    medEntityMesh entity=MED_EN::MED_EDGE;
+    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
+    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
+
+      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+      
+      int numberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS) ;
+      int * familyArray = new int[numberOfElements] ;
+      for (int i=0;i<numberOfElements;i++)
+       familyArray[i]=0;
+
+      int numberOfFamilies = _ptrMesh->getNumberOfFamilies(entity) ;
+      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity) ;
+      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyEdge ;
+      //bool ToDestroy = false;
+      if (0 == numberOfFamilies) {
+       //ToDestroy = true ;
+       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
+       int NumberOfGroups = myGroups.size() ;
+       // build families from groups
+       for (int i=0; i<NumberOfGroups; i++) {
+         SCRUTE( myGroups[i]->getName() );
+         SUPPORT * mySupport = myGroups[i] ;
+         FAMILY* myFamily = new FAMILY(*mySupport);
+         myFamily->setIdentifier(-i-2000);
+         myFamilies->push_back(myFamily);
+       }
+       numberOfFamilies=myFamilies->size() ;
+      }
+      for (int i=0;i<numberOfFamilies;i++) {
+       int familyNumber = (*myFamilies)[i]->getIdentifier() ;
+       int numberOfFamilyElements = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
+       if ((*myFamilies)[i]->isOnAllElements())
+         for (int ii=0; ii<numberOfFamilyElements; ii++)
+           familyArray[ii]=familyNumber;
+       else {
+         const int * myFamilyElements = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
+         for (int ii=0;ii<numberOfFamilyElements;ii++)
+           familyArray[myFamilyElements[ii]-1]=familyNumber;
+       }
+      }
+
+      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgth=numberOfElements;
+       med_2_1::med_int *temp=new med_2_1::med_int[lgth];
+       for(int i2=0;i2<lgth;i2++)
+         temp[i2]=(med_2_1::med_int) (familyArray[i2]);
+#endif
+      for (int i=0; i<numberOfTypes; i++) {
+
+       int typeNumberOfElements = typeCount[i+1] - typeCount[i] ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       temp+typeCount[i]-1, typeNumberOfElements,
+                       med_2_1::MED_REMP ,
+                       (med_2_1::med_entite_maillage) entity,
+                       (med_2_1::med_geometrie_element) types[i]);
+#else
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       familyArray+typeCount[i]-1, typeNumberOfElements,
+                       med_2_1::MED_REMP ,
+                       (med_2_1::med_entite_maillage) entity,
+                       (med_2_1::med_geometrie_element) types[i]); 
+#endif
+       if ( err != MED_VALID) 
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
+                                      << "| edges of geometric type |" << geoNames[types[i]] <<"|in mesh |"      
+                                      << _ptrMesh->_name.c_str() << "|" ));   
+      }
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      delete [] temp;
+#endif
+      delete[] familyArray ;
+      //if (true == ToDestroy) {
+      //  int NumberOfFamilies = myFamilies->size();
+      //  for (int i=0; i<NumberOfFamilies; i++)
+      //    delete myFamilies[i];
+      //}
+    }
+  }
+    
+  END_OF(LOC);
+  return MED_VALID;
+}
+
+int MED_MESH_WRONLY_DRIVER21::writeFamilies(vector<FAMILY*> & families ) const {
+  
+  const char * LOC="int MED_MESH_WRONLY_DRIVER21::writeFamilies(vector<FAMILY*> families) const : ";
+  BEGIN_OF(LOC);
+
+  med_2_1::med_err err;
+  
+  MESSAGE(LOC<<" families.size() :"<<families.size());
+
+  for (unsigned int i=0; i< families.size(); i++) {
+
+    int      numberOfAttributes         = families[i]->getNumberOfAttributes ();
+    string   attributesDescriptions     = "";
+
+    // Recompose the attributes descriptions arg for MED
+    for (int j=0; j < numberOfAttributes; j++) {
+        
+      string attributeDescription = families[i]->getAttributeDescription(j+1);
+        
+      if ( attributeDescription.size() > MED_TAILLE_DESC )
+       throw MEDEXCEPTION( LOCALIZED(STRING(LOC) << "The size of the attribute description n° |" << j+1 << "| of the family |" << families[i]->getName()
+                                     << "| with identifier |" << families[i]->getIdentifier()  << "| is |" 
+                                     <<  attributeDescription.size()  <<"| and is more than |" <<  MED_TAILLE_DESC << "|")) ;
+        
+      attributesDescriptions += attributeDescription;
+    }
+      
+
+    int      numberOfGroups  = families[i]->getNumberOfGroups();
+    string   groupsNames(numberOfGroups*MED_TAILLE_LNOM,'\0') ;
+    // Recompose the groups names arg for MED
+    for (int j=0; j < numberOfGroups; j++) {
+
+      string groupName = families[i]->getGroupName(j+1);
+       
+      if ( groupName.size() > MED_TAILLE_LNOM )
+       throw MEDEXCEPTION( LOCALIZED(STRING(LOC) << "The size of the group name  n° |" << j+1 << "| of the family |" << families[i]->getName()
+                                     << "| with identifier |" << families[i]->getIdentifier()  << "| is |" 
+                                     <<  groupName.size()  <<"| and is more than |" << MED_TAILLE_LNOM << "|")) ;
+        
+
+      int length = min(MED_TAILLE_LNOM,(int)groupName.size());
+      groupsNames.replace(j*MED_TAILLE_LNOM,length, groupName,0,length);
+      
+    }
+
+    // test if the family already exists (HDF trick waiting a MED evolution to be replaced)
+    string dataGroupFam = "/ENS_MAA/"+_meshName+"/FAS/"+families[i]->getName()+"/";  
+    SCRUTE("|"<<dataGroupFam<<"|");
+    err =med_2_1::_MEDdatagroupOuvrir(_medIdt,const_cast <char *> (dataGroupFam.c_str()) ) ;
+    if ( err < MED_VALID ) {
+      SCRUTE(err);
+
+      MESSAGE(LOC<<"families[i]->getName().c_str() : "<<families[i]->getName().c_str());
+      MESSAGE(LOC<<"_meshName.c_str() : "<<_meshName.c_str());
+      MESSAGE(LOC<<"families[i]->getIdentifier() : "<<families[i]->getIdentifier());
+      MESSAGE(LOC<<"numberOfAttributes : "<<numberOfAttributes);
+       
+      //MESSAGE(LOC<<"families[i]->getAttributesIdentifiers() : "<<families[i]->getAttributesIdentifiers()[0]);
+      //MESSAGE(LOC<<"families[i]->getAttributesValues() : "<<families[i]->getAttributesValues()[0]);
+      MESSAGE(LOC<<"attributesDescriptions.c_str() : "<<attributesDescriptions.c_str());
+      MESSAGE(LOC<<"numberOfGroups : "<<numberOfGroups);
+      MESSAGE(LOC<<"groupsNames.c_str() : "<<groupsNames.c_str());
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      int lgth=families[i]->getNumberOfAttributes();
+      med_2_1::med_int *  AttributesIdentifier2 = new med_2_1::med_int[lgth] ;
+      med_2_1::med_int *  AttributesValues2     = new med_2_1::med_int[lgth] ;
+      for(med_2_1::med_int i2=0;i2<lgth;i2++)
+       {
+         AttributesIdentifier2[i2]=(med_2_1::med_int)(families[i]->getAttributesIdentifiers()[i2]);
+         AttributesValues2[i2]=(med_2_1::med_int)(families[i]->getAttributesValues()[i2]);
+       }
+      err = med_2_1::MEDfamCr( _medIdt, 
+                             const_cast <char *> ( _meshName.c_str() ),
+                             const_cast <char *> ( families[i]->getName().c_str() ),
+                             families[i]->getIdentifier(), 
+                             AttributesIdentifier2,
+                             AttributesValues2,
+                             const_cast <char *> (attributesDescriptions.c_str()), 
+                             numberOfAttributes,  
+                             const_cast <char *> (groupsNames.c_str()), 
+                             numberOfGroups);
+      delete [] AttributesIdentifier2;
+      delete [] AttributesValues2;
+#else
+      err = med_2_1::MEDfamCr( _medIdt, 
+                             const_cast <char *> ( _meshName.c_str() ),
+                             const_cast <char *> ( families[i]->getName().c_str() ),
+                             families[i]->getIdentifier(), 
+                             families[i]->getAttributesIdentifiers(),
+                             families[i]->getAttributesValues(),
+                             const_cast <char *> (attributesDescriptions.c_str()), 
+                             numberOfAttributes,  
+                             const_cast <char *> (groupsNames.c_str()), 
+                             numberOfGroups);
+#endif
+      SCRUTE(err);
+      if ( err != MED_VALID) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't create family |" << families[i]->getName()
+                                    << "| with identifier |" << families[i]->getIdentifier()  << "| groups names |" 
+                                    << groupsNames  <<"| and  attributes descriptions |" << attributesDescriptions << "|")) ;
+    }
+    else
+      med_2_1::_MEDdatagroupFermer(_medIdt);
+
+
+  }
+
+  END_OF(LOC);
+    
+  return MED_VALID;
+}
+
+
+// A FAIRE POUR LES NOEUDS ET LES ELEMENTS ret = MEDfamEcr(
+
+
+
+/*--------------------- RDWR PART -------------------------------*/
+
+MED_MESH_RDWR_DRIVER21::MED_MESH_RDWR_DRIVER21()
+{
+}
+
+MED_MESH_RDWR_DRIVER21::MED_MESH_RDWR_DRIVER21(const string & fileName,
+                                              MESH * ptrMesh):
+  MED_MESH_DRIVER(fileName,ptrMesh,MED_RDWR),
+  IMED_MESH_RDONLY_DRIVER(fileName,ptrMesh),
+  IMED_MESH_WRONLY_DRIVER(fileName,ptrMesh),
+  IMED_MESH_RDWR_DRIVER(fileName,ptrMesh),
+  MED_MESH_DRIVER21(fileName,ptrMesh,MED_RDWR),
+  MED_MESH_RDONLY_DRIVER21(fileName,ptrMesh),
+  MED_MESH_WRONLY_DRIVER21(fileName,ptrMesh)
+{
+  MESSAGE("MED_MESH_RDWR_DRIVER21::MED_MESH_RDWR_DRIVER21(const string & fileName, MESH * ptrMesh) has been created");
+}
+
+MED_MESH_RDWR_DRIVER21::MED_MESH_RDWR_DRIVER21(const MED_MESH_RDWR_DRIVER21 & driver): 
+  MED_MESH_DRIVER(driver),
+  IMED_MESH_RDONLY_DRIVER(driver),
+  IMED_MESH_WRONLY_DRIVER(driver),
+  IMED_MESH_RDWR_DRIVER(driver),
+  MED_MESH_DRIVER21(driver),
+  MED_MESH_RDONLY_DRIVER21(driver),
+  MED_MESH_WRONLY_DRIVER21(driver)
+{
+}
+
+MED_MESH_RDWR_DRIVER21::~MED_MESH_RDWR_DRIVER21() {
+  //MESSAGE("MED_MESH_RDWR_DRIVER21::MED_MESH_RDWR_DRIVER21(const string & fileName, MESH * ptrMesh) has been destroyed");
+} 
+  
+GENDRIVER * MED_MESH_RDWR_DRIVER21::copy(void) const
+{
+  return new MED_MESH_RDWR_DRIVER21(*this);
+}
+
+void MED_MESH_RDWR_DRIVER21::write(void) const
+{
+  MED_MESH_WRONLY_DRIVER21::write();
+}
+void MED_MESH_RDWR_DRIVER21::read (void)
+{
+  MED_MESH_RDONLY_DRIVER21::read();
+}
+
diff --git a/src/MEDMEM/MEDMEM_MedMeshDriver21.hxx b/src/MEDMEM/MEDMEM_MedMeshDriver21.hxx
new file mode 100644 (file)
index 0000000..9850da3
--- /dev/null
@@ -0,0 +1,194 @@
+#ifndef MED_MESH_DRIVER21_HXX
+#define MED_MESH_DRIVER21_HXX
+
+#include "MEDMEM_MedMeshDriver.hxx"
+#include "MEDMEM_define.hxx"
+#include "MEDMEM_Compatibility21_22.hxx"
+
+/*!
+
+  Driver Med for MESH.
+
+  Generic part : implement open and close methods.
+
+*/
+
+namespace MEDMEM {
+class MESH;
+class FAMILY;
+class GROUP;
+class CONNECTIVITY;
+
+class MED_MESH_DRIVER21 : public virtual MED_MESH_DRIVER
+{
+protected:
+
+  med_2_1::med_idt        _medIdt;
+  
+public :
+
+  // all MED cell type
+  static const med_2_1::med_geometrie_element all_cell_type[MED_NBR_GEOMETRIE_MAILLE];
+  
+  static const char * const all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE];
+
+  /*!
+    Constructor.
+  */
+  MED_MESH_DRIVER21() ;
+ /*!
+    Constructor.
+  */
+  MED_MESH_DRIVER21(const string & fileName,  
+                   MESH * ptrMesh, 
+                   MED_EN::med_mode_acces accessMode) ;
+  /*!
+    Copy constructor.
+  */
+  MED_MESH_DRIVER21(const MED_MESH_DRIVER21 & driver) ;
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MESH_DRIVER21() ;
+
+  void open();
+  void close();
+};
+
+/*!
+
+  Driver Med for MESH : Read only.
+
+  Implement read method.
+
+*/
+
+  class MED_MESH_RDONLY_DRIVER21 : public virtual IMED_MESH_RDONLY_DRIVER , public virtual MED_MESH_DRIVER21
+{
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_MESH_RDONLY_DRIVER21() ;
+  /*!
+    Constructor.
+  */
+  MED_MESH_RDONLY_DRIVER21(const string & fileName, MESH * ptrMesh) ;
+  /*!
+    Copy constructor.
+  */
+  MED_MESH_RDONLY_DRIVER21(const MED_MESH_RDONLY_DRIVER21 & driver) ;
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MESH_RDONLY_DRIVER21() ;
+  void read(void);
+private:
+  int getCOORDINATE();
+  int getCONNECTIVITY();
+  int getFAMILY();
+  int getNodalConnectivity(CONNECTIVITY * Connectivity) ;
+  int getNodesFamiliesNumber(int * MEDArrayNodeFamily) ;
+  int getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity) ;
+  void getGRID ();
+
+  GENDRIVER * copy ( void ) const ;
+
+};
+
+/*!
+
+  Driver Med for MESH : Write only.
+
+  Implement write method.
+
+*/
+
+class MED_MESH_WRONLY_DRIVER21 : public virtual IMED_MESH_WRONLY_DRIVER, public virtual MED_MESH_DRIVER21 {
+  
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_MESH_WRONLY_DRIVER21() ;
+  /*!
+    Constructor.
+  */
+  MED_MESH_WRONLY_DRIVER21(const string & fileName, MESH * ptrMesh) ;
+  /*!
+    Copy constructor.
+  */
+  MED_MESH_WRONLY_DRIVER21(const MED_MESH_WRONLY_DRIVER21 & driver) ;
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MESH_WRONLY_DRIVER21() ;
+
+  /*!
+    Write MESH in the specified file.
+  */
+  void write( void ) const;
+
+private:
+  int writeCoordinates    ()                           const;
+  int writeConnectivities (MED_EN::medEntityMesh entity)       const;
+  int writeFamilyNumbers  ()                           const;
+  int writeFamilies       (vector<FAMILY*> & families) const;
+  int writeGRID() const;
+
+  GENDRIVER * copy ( void ) const ;
+};
+
+
+/*!
+
+  Driver Med for MESH : Read write.
+  - Use read method from MED_MESH_RDONLY_DRIVER
+  - Use write method from MED_MESH_WRONLY_DRIVER
+
+*/
+
+class MED_MESH_RDWR_DRIVER21 : public IMED_MESH_RDWR_DRIVER, public MED_MESH_RDONLY_DRIVER21, public MED_MESH_WRONLY_DRIVER21 {
+
+public :
+
+  /*!
+    Constructor.
+  */
+  MED_MESH_RDWR_DRIVER21() ;
+  /*!
+    Constructor.
+  */
+  MED_MESH_RDWR_DRIVER21(const string & fileName, MESH * ptrMesh) ;
+  /*!
+    Copy constructor.
+  */
+  MED_MESH_RDWR_DRIVER21(const MED_MESH_RDWR_DRIVER21 & driver) ;
+
+  /*!
+    Destructor.
+  */
+  ~MED_MESH_RDWR_DRIVER21() ;
+
+  /*!
+    Write MESH in the specified file.
+  */
+  void write(void) const;
+  /*!
+    Read MESH in the specified file.
+  */
+  void read (void);
+
+private:
+  GENDRIVER * copy(void) const ;
+
+};
+};
+
+#endif /* MED_MESH_DRIVER21_HXX */
diff --git a/src/MEDMEM/MEDMEM_MedMeshDriver22.cxx b/src/MEDMEM/MEDMEM_MedMeshDriver22.cxx
new file mode 100644 (file)
index 0000000..1319ec7
--- /dev/null
@@ -0,0 +1,2848 @@
+#include "MEDMEM_MedMeshDriver22.hxx"
+
+#include "MEDMEM_DriversDef.hxx"
+
+#include "MEDMEM_Family.hxx"
+#include "MEDMEM_Group.hxx"
+#include "MEDMEM_Coordinate.hxx"
+#include "MEDMEM_Connectivity.hxx"
+#include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_CellModel.hxx"
+#include "MEDMEM_Grid.hxx"
+
+using namespace std;
+using namespace MED_EN;
+using namespace MEDMEM;
+
+namespace med_2_2 {
+  extern "C" {
+    extern med_idt _MEDdatagroupOuvrir(med_idt pid, char *nom);
+    extern med_err _MEDdatagroupFermer(med_idt id);
+  }
+}
+
+// Every memory allocation made in the MedDriver members function are desallocated in the Mesh destructor 
+
+MED_MESH_DRIVER22::MED_MESH_DRIVER22():  _medIdt(MED_INVALID)
+{
+}
+
+MED_MESH_DRIVER22::MED_MESH_DRIVER22(const string & fileName,
+                                    MESH * ptrMesh,
+                                    MED_EN::med_mode_acces accessMode): 
+  _medIdt(MED_INVALID), MED_MESH_DRIVER(fileName,ptrMesh,accessMode)
+{
+}
+  
+MED_MESH_DRIVER22::MED_MESH_DRIVER22(const MED_MESH_DRIVER22 & driver):
+  MED_MESH_DRIVER(driver),_medIdt(driver._medIdt)
+{
+}
+
+MED_MESH_DRIVER22::~MED_MESH_DRIVER22()
+{
+}
+
+void MED_MESH_DRIVER22::open()
+{
+  const char * LOC = "MED_MESH_DRIVER22::open()" ;
+  BEGIN_OF(LOC);
+
+  MESSAGE(LOC<<" : _fileName.c_str : "<< _fileName.c_str()<<",mode : "<< _accessMode);
+  _medIdt = med_2_2::MEDouvrir( (const_cast <char *> (_fileName.c_str())),(med_2_2::med_mode_acces) _accessMode);
+  MESSAGE(LOC<<" _medIdt : "<< _medIdt );
+  if (_medIdt > 0) 
+    _status = MED_OPENED; 
+  else {
+    _medIdt = MED_INVALID;
+    _status = MED_CLOSED;
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Could not open file "<<_fileName<<" in mode "<<_accessMode));
+  }
+  
+  END_OF(LOC);
+}
+  
+void MED_MESH_DRIVER22::close()
+{
+  const char * LOC = "MED_MESH_DRIVER22::close() " ;
+  BEGIN_OF(LOC);
+  int err = 0;
+  if ( _status == MED_OPENED) {
+    err = med_2_2::MEDfermer(_medIdt);
+    // san -- MED5873 : Calling H5close() here leads to failure of SALOMEDS::StudyManager_i::_SaveAs()
+    // method during study saving process. MEDfermer() seems sufficient for closing a file.
+    //H5close(); // If we call H5close() all the files are closed.
+    if (err != 0)
+      throw MEDEXCEPTION( LOCALIZED(STRING(LOC)
+                                   <<" Error when closing file !"
+                                   )
+                         );
+    MESSAGE(LOC <<": _medIdt= " << _medIdt );
+    MESSAGE(LOC<<": MEDfermer : err    = " << err );
+    _status = MED_CLOSED;
+    _medIdt = MED_INVALID;
+  }
+  END_OF(LOC);
+}
+
+//A FAIRE UTILISER LES MAPS...
+const med_2_2::med_geometrie_element  MED_MESH_DRIVER22::all_cell_type[MED_NBR_GEOMETRIE_MAILLE]=
+  { med_2_2::MED_POINT1,med_2_2::MED_SEG2,med_2_2::MED_SEG3,med_2_2::MED_TRIA3,med_2_2::MED_QUAD4,med_2_2::MED_TRIA6,med_2_2::MED_QUAD8,
+    med_2_2::MED_TETRA4,med_2_2::MED_PYRA5,med_2_2::MED_PENTA6,med_2_2::MED_HEXA8,med_2_2::MED_TETRA10,med_2_2::MED_PYRA13,
+    med_2_2::MED_PENTA15, med_2_2::MED_HEXA20};
+
+const char * const MED_MESH_DRIVER22::all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE]=
+  { "MED_POINT1","MED_SEG2","MED_SEG3","MED_TRIA3","MED_QUAD4","MED_TRIA6","MED_QUAD8",
+    "MED_TETRA4","MED_PYRA5","MED_PENTA6","MED_HEXA8","MED_TETRA10","MED_PYRA13",
+    "MED_PENTA15","MED_HEXA20"};
+
+
+//---------------------------------- RDONLY PART -------------------------------------------------------------
+
+MED_MESH_RDONLY_DRIVER22::MED_MESH_RDONLY_DRIVER22()
+{
+}
+  
+MED_MESH_RDONLY_DRIVER22::MED_MESH_RDONLY_DRIVER22(const string & fileName,
+                                                  MESH * ptrMesh):
+  IMED_MESH_RDONLY_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER22(fileName,ptrMesh,MED_RDONLY),MED_MESH_DRIVER(fileName,ptrMesh,MED_RDONLY)
+{ 
+  MESSAGE("MED_MESH_RDONLY_DRIVER22::MED_MESH_RDONLY_DRIVER22(const string & fileName, MESH * ptrMesh) has been created");
+}
+  
+MED_MESH_RDONLY_DRIVER22::MED_MESH_RDONLY_DRIVER22(const MED_MESH_RDONLY_DRIVER22 & driver): 
+   IMED_MESH_RDONLY_DRIVER(driver),MED_MESH_DRIVER22(driver),MED_MESH_DRIVER(driver)
+{
+}
+
+MED_MESH_RDONLY_DRIVER22::~MED_MESH_RDONLY_DRIVER22()
+{
+  //MESSAGE("MED_MESH_RDONLY_DRIVER22::~MED_MESH_RDONLY_DRIVER() has been destroyed");
+}
+  
+GENDRIVER * MED_MESH_RDONLY_DRIVER22::copy(void) const
+{
+  return new MED_MESH_RDONLY_DRIVER22(*this);
+}
+
+void MED_MESH_RDONLY_DRIVER22::read(void)
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER22::read() : " ;
+  BEGIN_OF(LOC);
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The _idt of file " << _fileName << " is : " << _medIdt <<  " (the file is not opened)." )) ;
+
+  _ptrMesh->_name =  _meshName;
+
+  SCRUTE(_ptrMesh->getIsAGrid());
+
+  if (_ptrMesh->getIsAGrid())
+    {
+      getGRID( );
+
+      // always call getFAMILY : families are requiered !!!!
+
+//        int nbFam = MEDnFam(_medIdt,
+//                       const_cast <char *> (_meshName.c_str()),
+//                       0,
+//                       MED_FR::MED_FAMILLE);
+//        if (nbFam > 0)
+       {
+//       getFAMILY();
+    
+         if (getFAMILY()!=MED_VALID)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getFAMILY when the mesh is a grid")) ;
+
+         buildAllGroups(_ptrMesh->_groupNode,_ptrMesh->_familyNode) ;
+       }
+
+      END_OF(LOC);
+      return;
+    }
+
+  if (getCOORDINATE()!=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getCOORDINATE"  )) ;
+  if (getCONNECTIVITY()!=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getCOONECTIVITY")) ;
+  
+  if (getFAMILY()!=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERREUR in getFAMILY"      )) ;
+
+  updateFamily();
+
+  // we build all groups
+  // on node
+  buildAllGroups(_ptrMesh->_groupNode,_ptrMesh->_familyNode) ;
+  // on cell
+  buildAllGroups(_ptrMesh->_groupCell,_ptrMesh->_familyCell) ;
+  // on face
+  buildAllGroups(_ptrMesh->_groupFace,_ptrMesh->_familyFace) ;
+  // on edge
+  buildAllGroups(_ptrMesh->_groupEdge,_ptrMesh->_familyEdge) ;
+
+//   MESSAGE(LOC<<"Checking of CellModel !!!!!!!");
+
+//   int nbOfTypes =  _ptrMesh->_connectivity->_numberOfTypes;
+//    for(int i=0;i<nbOfTypes;i++)
+//      {
+//        MESSAGE(LOC << _ptrMesh->_connectivity->_type[i]) ;
+//      }
+
+  END_OF(LOC);
+}
+
+//=======================================================================
+//function : getGRID
+//purpose  : 
+//=======================================================================
+
+void MED_MESH_RDONLY_DRIVER22::getGRID()
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER22::getGRID() : " ;
+  BEGIN_OF(LOC);
+  
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "med file is not opened"));
+  
+  GRID * ptrGrid = (GRID *) _ptrMesh;
+    
+  SCRUTE(ptrGrid);
+
+  int err, i;
+
+  int numberOfMeshesInFile = med_2_2::MEDnMaa(_medIdt);
+
+  if (numberOfMeshesInFile == MED_INVALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Problem in File where the mesh " << _meshName << " is supposed to be stored"));
+
+  for (int index = 0; index < numberOfMeshesInFile; index++)
+    {
+      char meshName[MED_TAILLE_NOM+1]="";
+      char meshDescription[MED_TAILLE_DESC+1]="";
+      int meshDim;
+      med_2_2::med_maillage meshType;
+
+      err = med_2_2::MEDmaaInfo(_medIdt, (index+1),meshName, &meshDim,
+                              &meshType, meshDescription) ;
+
+      MESSAGE(LOC<<": Mesh n°"<< (index+1) <<" nammed "<< meshName << " with the description " << meshDescription << " is structured");
+
+      if (_meshName == string(meshName))
+       {
+         _ptrMesh->_description = meshDescription;
+         _ptrMesh->_name = meshName;
+       }
+    }
+
+  MED_EN::med_grid_type gridType = ptrGrid->getGridType();
+
+  MESSAGE(LOC<<": Mesh processed is nammed "<< _ptrMesh->_name << " with the description " << _ptrMesh->_description << " is structured with the type " << gridType);
+
+  // Read the dimension of the mesh <_meshName>
+  int MeshDimension = med_2_2::MEDdimLire(_medIdt, const_cast <char *>
+                                        (_meshName.c_str())) ;
+
+  if (MeshDimension == MED_INVALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The mesh dimension |" <<
+                                MeshDimension << "| seems to be incorrect " <<
+                                "for the mesh : |" << _meshName << "|")) ;
+
+  _ptrMesh->_meshDimension = MeshDimension;
+
+  // Read or get the dimension of the space for the mesh <_meshName>
+  int SpaceDimension = MeshDimension;
+
+  int SpaceDimensionRead = med_2_2::MEDdimEspaceLire(_medIdt,
+                                                   const_cast <char *>
+                                                   (_meshName.c_str())) ;
+
+  if (SpaceDimensionRead != MED_INVALID) SpaceDimension = SpaceDimensionRead;
+
+  _ptrMesh->_spaceDimension = SpaceDimension;
+
+  med_2_2::med_repere rep ;
+  string tmp_nom_coord (MED_TAILLE_PNOM22*(_ptrMesh->_spaceDimension)+1,' ');
+  string tmp_unit_coord(MED_TAILLE_PNOM22*(_ptrMesh->_spaceDimension)+1,' ');
+  char * tmp_nom = (const_cast <char *> ( tmp_nom_coord.c_str())  ) ;
+  char * tmp_unit= (const_cast <char *> ( tmp_unit_coord.c_str()) ) ;
+
+  // Read Array length
+  int * ArrayLen[] = { & ptrGrid->_iArrayLength,
+                       & ptrGrid->_jArrayLength,
+                       & ptrGrid->_kArrayLength  };
+
+  MESSAGE(LOC << "The mesh is a " << _ptrMesh->_meshDimension << "D mesh on a " << _ptrMesh->_spaceDimension << "D space");
+
+  int NumberOfNodes;
+
+  //  if (gridType == MED_EN::MED_GRILLE_STANDARD)
+  if (gridType == MED_EN::MED_BODY_FITTED)
+    {
+      int * structure = new int[MeshDimension];
+
+      err = med_2_2::MEDstructureCoordLire(_medIdt,
+                                         const_cast <char *>
+                                         (_ptrMesh->_name.c_str()),
+                                         MeshDimension,structure);
+
+      if (err != MED_VALID)
+       throw MEDEXCEPTION(STRING(LOC) <<"Error in reading the structure of grid : |" << _meshName << "|" ) ;
+      
+      NumberOfNodes = 1;
+
+      for (int idim = 0; idim < MeshDimension; idim++)
+       {
+         MESSAGE(LOC<<"structure dim " << idim << " " << structure[idim]);
+
+         ArrayLen [idim][0] = structure[idim];
+         NumberOfNodes = NumberOfNodes*structure[idim];
+       }
+      
+      delete [] structure;
+
+//       NumberOfNodes = MED_FR::MEDnEntMaa(_medIdt,
+//                                      const_cast <char *>
+//                                      (_ptrMesh->_name.c_str()),
+//                                      MED_FR::MED_COOR,MED_FR::MED_NOEUD,
+//                                      (MED_FR::med_geometrie_element) 0,
+//                                      (MED_FR::med_connectivite) 0);
+
+      if ( NumberOfNodes == MED_INVALID )
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The number of nodes |" <<
+                                    NumberOfNodes <<
+                                    "| seems to be incorrect "
+                                    << "for the mesh : |" <<
+                                    _meshName << "|" )) ;
+
+      _ptrMesh->_numberOfNodes = NumberOfNodes ;
+
+      // create coordinates and its structure
+      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension,NumberOfNodes,
+                                            MED_EN::MED_FULL_INTERLACE);
+
+      err = MEDcoordLire(_medIdt,
+                        const_cast <char *> (_ptrMesh->_name.c_str()),
+                        _ptrMesh->_spaceDimension,
+                        //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ),
+                        const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ),
+                        med_2_2::MED_FULL_INTERLACE,
+                        MED_ALL, // we read all the coordinates
+                        NULL,    // we don't use a profile
+                        0,       // so the profile's size is 0
+                        &rep,tmp_nom,tmp_unit);
+
+      if (err != MED_VALID)
+        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't read coordinates of the |" <<
+                                    NumberOfNodes << "| nodes for the mesh : |" <<
+                                    _meshName << "| of space dimension |" <<
+                                    SpaceDimension << "| with units names |" <<
+                                    tmp_nom << "| and units |" <<
+                                    tmp_unit << " |")) ;
+
+      ptrGrid->_is_coordinates_filled = true;
+    }
+  else if ((gridType == MED_EN::MED_CARTESIAN) ||
+          (gridType == MED_EN::MED_POLAR))
+    {
+      NumberOfNodes = 1;
+
+      double * Array[] = { (double*) 0, (double*) 0, (double*) 0 };
+
+      for (int idim = 0; idim < _ptrMesh->_meshDimension; ++idim)
+       {
+         med_2_2::med_table table;
+         if (idim == 0) table = med_2_2::MED_COOR_IND1;
+         else if (idim == 1) table = med_2_2::MED_COOR_IND2;
+         else if (idim == 2) table = med_2_2::MED_COOR_IND3;
+
+         int length = med_2_2::MEDnEntMaa(_medIdt,
+                                         const_cast <char *> (_ptrMesh->_name.c_str()),
+                                         table,med_2_2::MED_NOEUD,
+                                         med_2_2::MED_NONE,
+                                         med_2_2::MED_NOD);
+         if ( length <= MED_VALID )
+           throw MEDEXCEPTION(STRING(LOC) <<"The number of nodes |" << length <<
+                              "| seems to be incorrect "
+                              << "for the mesh : |" << _meshName << "|" ) ;
+         
+         ArrayLen [idim][0] = length;
+         NumberOfNodes *= length;
+
+         Array [idim] = new double [ length ];
+
+         err = med_2_2::MEDindicesCoordLire(_medIdt, const_cast <char *>
+                                           (_ptrMesh->_name.c_str()),
+                                           _ptrMesh->_meshDimension,
+                                           Array [idim], length, (idim+1),
+                                           tmp_nom+(idim*MED_TAILLE_PNOM22),
+                                           tmp_unit+(idim*MED_TAILLE_PNOM22));
+
+         if (err != MED_VALID)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Error in reading coordinates indices " <<
+                                        idim << "of the grid : |" <<
+                                        _meshName << "|" )) ;
+       }
+
+      ptrGrid->_iArray = Array[0];
+      ptrGrid->_jArray = Array[1];
+      ptrGrid->_kArray = Array[2];
+
+      _ptrMesh->_numberOfNodes = NumberOfNodes ;
+    
+      // create coordinates
+      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension,NumberOfNodes,
+                                            MED_EN::MED_FULL_INTERLACE);
+
+      if (gridType == MED_EN::MED_CARTESIAN)
+       rep = med_2_2::MED_CART;
+      else if (gridType == MED_EN::MED_POLAR)
+       {
+         if (SpaceDimension == 2) rep = med_2_2::MED_CYL;
+         else if (SpaceDimension == 3) rep = med_2_2::MED_SPHER;
+       }
+    }
+  else
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<" bad grid type : " << gridType));
+
+  // set coordinate names
+
+  for (i=0; i<_ptrMesh->_spaceDimension; ++i ) {
+    string myStringName(tmp_nom_coord,i*MED_TAILLE_PNOM22,MED_TAILLE_PNOM22) ;
+    string myStringUnit(tmp_unit_coord,i*MED_TAILLE_PNOM22,MED_TAILLE_PNOM22) ;
+    // suppress space at the end
+    int j ;
+    for(j=MED_TAILLE_PNOM22-1;j>=0;j--)
+      if (myStringName[j] != ' ') break ;
+    _ptrMesh->_coordinate->_coordinateName[i]=string(myStringName,0,j+1);
+    for(j=MED_TAILLE_PNOM22-1;j>=0;j--)
+      if (myStringUnit[j] != ' ') break ;
+    _ptrMesh->_coordinate->_coordinateUnit[i]=string(myStringUnit,0,j+1);
+  }
+
+  string coordinateSystem = "UNDEFINED";
+
+  if( rep == med_2_2::MED_CART) coordinateSystem = "CARTESIAN";
+  else if ( rep == med_2_2::MED_CYL) coordinateSystem = "CYLINDRICAL";
+  else if ( rep == med_2_2::MED_SPHER) coordinateSystem = "SPHERICAL";
+
+  _ptrMesh->_coordinate->setCoordinatesSystem(coordinateSystem);
+
+  END_OF(LOC);
+}
+
+//=======================================================================
+//function : getCOORDINATE
+// A FAIRE : RENVOYER DU VOID
+//=======================================================================
+int  MED_MESH_RDONLY_DRIVER22::getCOORDINATE()
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER22::getCOORDINATE() : " ;
+
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED)
+    {
+      int err ;
+      
+  int numberOfMeshesInFile = med_2_2::MEDnMaa(_medIdt);
+
+  if (numberOfMeshesInFile == MED_INVALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Problem in File where the mesh " << _meshName << " is supposed to be stored"));
+
+  for (int index = 0; index < numberOfMeshesInFile; index++)
+    {
+      char meshName[MED_TAILLE_NOM+1]="";
+      char meshDescription[MED_TAILLE_DESC+1]="";
+      int meshDim;
+      med_2_2::med_maillage meshType;
+
+      err = med_2_2::MEDmaaInfo(_medIdt, (index+1), meshName, &meshDim,
+                              &meshType, meshDescription) ;
+
+      MESSAGE(LOC<<": Mesh n°"<< (index+1) <<" nammed "<< meshName << " with the description " << meshDescription << " is structured");
+
+      if (_meshName == string(meshName))
+       {
+         _ptrMesh->_description = meshDescription;
+       }
+    }
+
+
+      // Read the dimension of the mesh <_meshName>
+      int MeshDimension = med_2_2::MEDdimLire(_medIdt, const_cast <char *>
+                                            (_meshName.c_str())) ;
+
+      if ( MeshDimension == MED_INVALID ) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The mesh dimension |" <<
+                                    MeshDimension <<
+                                    "| seems to be incorrect " <<
+                                    "for the mesh : |" << _meshName << "|")) ;
+
+      _ptrMesh->_meshDimension = MeshDimension;
+
+      // Read or get the dimension of the space for the mesh <_meshName>
+      int SpaceDimension = MeshDimension;
+
+      int SpaceDimensionRead = med_2_2::MEDdimEspaceLire(_medIdt,
+                                                       const_cast <char *>
+                                                       (_meshName.c_str())) ;
+
+      if (SpaceDimensionRead  != MED_INVALID)
+       SpaceDimension = SpaceDimensionRead;
+
+      _ptrMesh->_spaceDimension = SpaceDimension;
+
+      // Read the number of nodes used in the mesh <_meshName>
+      // to be able to create a COORDINATE object
+      int NumberOfNodes=MEDnEntMaa(_medIdt,
+                                   const_cast <char *> (_meshName.c_str()),
+                                   med_2_2::MED_COOR,
+                                   med_2_2::MED_NOEUD,
+                                   (med_2_2::med_geometrie_element) MED_NONE,
+                                   (med_2_2::med_connectivite)      MED_NONE);
+      if ( NumberOfNodes <= MED_VALID )
+        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"The number of nodes |" << NumberOfNodes << "| seems to be incorrect "
+                                     << "for the mesh : |" << _meshName << "|" )) ;
+      _ptrMesh->_numberOfNodes = NumberOfNodes ;
+
+      // create a COORDINATE object
+      _ptrMesh->_coordinate = new COORDINATE(SpaceDimension, NumberOfNodes, MED_EN::MED_FULL_INTERLACE);
+      
+      med_2_2::med_repere rep ; // ATTENTION ---> DOIT ETRE INTEGRE DS MESH EF: FAIT NON?
+      string tmp_nom_coord (MED_TAILLE_PNOM22*(_ptrMesh->_spaceDimension)+1,'\0');
+      string tmp_unit_coord(MED_TAILLE_PNOM22*(_ptrMesh->_spaceDimension)+1,'\0');
+      char * tmp_nom = (const_cast <char *> ( tmp_nom_coord.c_str())  ) ;
+      char * tmp_unit= (const_cast <char *> ( tmp_unit_coord.c_str()) ) ;
+
+      err=MEDcoordLire(_medIdt,
+                       const_cast <char *> (_ptrMesh->_name.c_str()),
+                      _ptrMesh->_spaceDimension,
+                      //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ),
+                      const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ),
+                       med_2_2::MED_FULL_INTERLACE,
+                       MED_ALL,                      // we read all the coordinates
+                       NULL,                         // we don't use a profile
+                       0,                            // so the profile's size is 0
+                       &rep,tmp_nom,tmp_unit);
+      if (err != MED_VALID)
+        throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't read coordinates of the |" << NumberOfNodes << "| nodes "
+                                     << "for the mesh : |" << _meshName 
+                                     << "| of space dimension |" << SpaceDimension 
+                                     << "| with units names |"   << tmp_nom
+                                     << "| and units |"          << tmp_unit
+                                     << " |")) ;
+      
+
+      for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
+       string myStringName(tmp_nom_coord,i*MED_TAILLE_PNOM22,MED_TAILLE_PNOM22) ;
+       string myStringUnit(tmp_unit_coord,i*MED_TAILLE_PNOM22,MED_TAILLE_PNOM22) ;
+       // suppress space at the end
+       int j ;
+       for(j=MED_TAILLE_PNOM22-1;j>=0;j--)
+         if (myStringName[j] != ' ') break ;
+       _ptrMesh->_coordinate->_coordinateName[i]=string(myStringName,0,j+1);
+       for(j=MED_TAILLE_PNOM22-1;j>=0;j--)
+         if (myStringUnit[j] != ' ') break ;
+       _ptrMesh->_coordinate->_coordinateUnit[i]=string(myStringUnit,0,j+1);
+      }
+
+      // Pourquoi le stocker sous forme de chaîne ?
+      switch (rep)
+       {
+       case med_2_2::MED_CART : 
+         {
+           _ptrMesh->_coordinate->_coordinateSystem = "CARTESIAN";
+           break ;
+         }
+       case med_2_2::MED_CYL :
+         {
+           _ptrMesh->_coordinate->_coordinateSystem = "CYLINDRICAL";
+           break ;
+         }
+       case med_2_2::MED_SPHER :
+         {
+           _ptrMesh->_coordinate->_coordinateSystem = "SPHERICAL";
+           break ;
+         }
+       default :
+         {
+           _ptrMesh->_coordinate->_coordinateSystem = "UNDEFINED"; // ?Erreur ?
+           break ;
+         }
+       }
+
+      // Read the unused optional node Names
+      char * tmp_node_name = new char[NumberOfNodes*MED_TAILLE_PNOM22+1];
+      tmp_node_name[NumberOfNodes]='\0' ;
+      err=MEDnomLire(_medIdt,const_cast <char*> (_ptrMesh->_name.c_str()),
+                    tmp_node_name,NumberOfNodes*MED_TAILLE_PNOM22,med_2_2::MED_NOEUD,
+                    (med_2_2::med_geometrie_element) MED_NONE);
+      if (err == MED_VALID) 
+        MESSAGE(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : WARNING : Nodes have names but we do not read them !");
+      delete[] tmp_node_name ;
+
+
+      // ??? Read the unused optional node Numbers ???
+      med_2_2::med_int * tmp_node_number = new med_2_2::med_int[NumberOfNodes] ;
+      err=MEDnumLire(_medIdt,const_cast <char*> (_ptrMesh->_name.c_str()),
+                    tmp_node_number,NumberOfNodes,med_2_2::MED_NOEUD,(med_2_2::med_geometrie_element)0);
+      if (err == MED_VALID) {
+        // INFOS(LOC<<"WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING");
+        // INFOS(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : WARNING : Nodes have numbers but we do not take care of them !");
+        // INFOS(LOC<<"WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING");
+       MESSAGE(LOC<<"MED_MESH_RDONLY_DRIVER::getNoeuds() : Nodes have numbers, we DO TAKE care of them !");
+       _ptrMesh->_coordinate->_nodeNumber.set(NumberOfNodes) ; 
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       for(med_2_2::med_int i2=0;i2<NumberOfNodes;i2++)
+         _ptrMesh->_coordinate->_nodeNumber[i2]=(int)(tmp_node_number[i2]);
+#else
+       memcpy((int*)_ptrMesh->_coordinate->_nodeNumber,tmp_node_number,sizeof(int)*NumberOfNodes) ;
+#endif
+       
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///
+       /// Calcule _optionnalToCanonicNodesNumbers de telle sorte que _optionnalToCanonicNodesNumbers[OptionnalNumber]==CanonicNumber
+       
+//     _ptrMesh->_arePresentOptionnalNodesNumbers=1;
+//     for (int canonicNumber=1;canonicNumber<=NumberOfNodes;canonicNumber++) _ptrMesh->_optionnalToCanonicNodesNumbers[tmp_node_number[canonicNumber-1]]=canonicNumber;
+// ICI RETOUR A LA NORMALE::: AUCUNE PRISE EN COMPTE D'UN NUMEROTATION OPTIONNEL
+       _ptrMesh->_arePresentOptionnalNodesNumbers=0;
+      } 
+      else _ptrMesh->_arePresentOptionnalNodesNumbers=0;
+
+       //////////////////////////////////////////////////////////////////////////////////////
+
+      delete[] tmp_node_number ;
+      
+      END_OF(LOC);
+      return MED_VALID;
+    }
+  return MED_ERROR;
+}
+
+
+int MED_MESH_RDONLY_DRIVER22::getCONNECTIVITY() 
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER22::getCONNECTIVITY : " ;
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED)
+    {
+
+      int err = 0 ;
+      // read MED_CELL connectivity
+      CONNECTIVITY * Connectivity     = new CONNECTIVITY(MED_CELL) ;
+      Connectivity->_numberOfNodes    = _ptrMesh->_numberOfNodes ;   // EF : Pourquoi cet attribut est-il dans MESH et non dans COORDINATE ?
+
+      // Try to read nodal connectivity of the cells <Connectivity->_nodal>
+      // then try to read descending connectivity    <Connectivity->_descending>
+      // if neither nodal nor descending connectivity exists
+      // throw an exception.
+      err = getNodalConnectivity(Connectivity) ;
+      if (err!=MED_VALID)
+       {
+         Connectivity->_typeConnectivity = MED_DESCENDING ;
+         err = getDescendingConnectivity(Connectivity) ;
+       }
+      else 
+       getDescendingConnectivity(Connectivity) ; // we read it if there is one
+      
+      if (err!=MED_VALID)
+       {
+         delete Connectivity ;
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "We could not read " <<
+                                      "any Connectivity")) ;
+       }
+
+      if (Connectivity->_entityDimension != _ptrMesh->_meshDimension)
+       MESSAGE(LOC << "Small mesh dimension problem on the med file mounted in memory : diim stored " << _ptrMesh->_meshDimension << " dim computed using the connectivity " << Connectivity->_entityDimension);
+
+      _ptrMesh->_meshDimension = Connectivity->_entityDimension ; 
+
+      // At this point Connectivity->_typeConnectivity is either NODAL or DESCENDING
+      // If both connectivities are found Connectivity->_typeConnectivity is NODAL
+      // If space dimension is 3 
+      // try to read the nodal connectivity of the faces <ConnectivityFace->_nodal> then
+      // try to read the descending connectivity <ConnectivityFace->_descending>
+      // if there is no descending connectivity and the CELLS are
+      // defined in descending mode then throw an exception
+
+      // PROVISOIRE : if we have some face or edge in MED_MAILLE, we don't read more. There could not be have face or edge !!!!
+
+      if(Connectivity->_constituent==NULL) {
+
+      SCRUTE(_ptrMesh->_meshDimension);
+      SCRUTE(Connectivity->_entityDimension);
+      if (_ptrMesh->_meshDimension == 3) {
+        MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DES FACES..." );
+        CONNECTIVITY * ConnectivityFace = new CONNECTIVITY(MED_EN::MED_FACE) ;
+       ConnectivityFace->_typeConnectivity = Connectivity->_typeConnectivity ; // NODAL or DESCENDING
+       SCRUTE(ConnectivityFace->_typeConnectivity);
+       if (Connectivity->_typeConnectivity == MED_DESCENDING) {
+          MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DESCENDANTE DES FACES" );
+         err = getDescendingConnectivity(ConnectivityFace) ;
+         if (err!=MED_VALID)
+           throw MEDEXCEPTION ( LOCALIZED(STRING(LOC) << "No FACE in descending connectivity")) ;
+         getNodalConnectivity(ConnectivityFace) ; // if any !
+       } else {
+          MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE NODALE DES FACES" );
+         err = getNodalConnectivity(ConnectivityFace) ;
+         if (err!=MED_VALID) { // or error ????? we are in NODAL mode.
+           err = getDescendingConnectivity(ConnectivityFace) ;
+         } else
+           getDescendingConnectivity(ConnectivityFace); // if any !
+       }
+        if (err!=MED_VALID) {
+         delete ConnectivityFace ;
+         MESSAGE(LOC<<"No FACE defined.") ;
+       } else {
+          MESSAGE(LOC<<" SAUVEGARDE DE LA CONNECTIVITE DES FACES DANS L'OBJET CONNECTIVITY" );
+         Connectivity->_constituent=ConnectivityFace ; 
+        }
+      }
+
+      // read MED_EDGE connectivity
+      if (_ptrMesh->_meshDimension > 1) { // we are in 3 or 2D 
+        MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DES ARRETES...." );
+       CONNECTIVITY * ConnectivityEdge = new CONNECTIVITY(MED_EDGE) ;
+       ConnectivityEdge->_typeConnectivity = Connectivity->_typeConnectivity ;
+       if (Connectivity->_typeConnectivity == MED_DESCENDING) {
+          MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE DESCENDANTE DES ARRETES" );
+         err = getDescendingConnectivity(ConnectivityEdge) ;
+         if (err!=MED_VALID)
+           throw MEDEXCEPTION ( LOCALIZED(STRING(LOC) << "No EDGE in descending connectivity")) ;
+         getNodalConnectivity(ConnectivityEdge) ; // if any !
+       } else {
+          MESSAGE(LOC<<" ESSAI DE LECTURE DE LA CONNECTIVITE NODALE DES ARRETES" );
+         err = getNodalConnectivity(ConnectivityEdge) ;
+         if (err!=MED_VALID) { // or error ????? we are in NODAL mode.
+           err = getDescendingConnectivity(ConnectivityEdge) ;
+         } else
+           getDescendingConnectivity(ConnectivityEdge) ; // if any !
+       }
+       if (err!=MED_VALID) {
+         delete ConnectivityEdge ;
+         MESSAGE(LOC<<"No EDGE defined.") ;
+       } else {
+         if (_ptrMesh->_meshDimension == 3)
+           if (Connectivity->_constituent != NULL)
+             Connectivity->_constituent->_constituent=ConnectivityEdge ;
+           else
+             throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<< "EDGE defined but there are no FACE !")) ;
+         else { // IN 2D
+            MESSAGE(LOC<<" SAUVEGARDE DE LA CONNECTIVITE DES ARETES DANS L'OBJET CONNECTIVITY" );
+           Connectivity->_constituent=ConnectivityEdge ;
+          }
+        }
+      }
+      }
+      _ptrMesh->_connectivity  = Connectivity ;                                      
+
+      // all right !
+
+      // we have read all connectivity in file, now we must build descending connectivity if necessary !
+
+      // If connectivity descending is defined, we have nothing to do, all constituent are defined !
+      // If connectivity is only nodal, we must rebuild descending if we have some contituent !
+
+      //A FAIRE !!!!
+//        if (Connectivity->_descending == NULL)
+//     if (Connectivity->_constituent != NULL){
+//       // update Connectivity->_constituent
+//       CONNECTIVITY * myConstituentOld = Connectivity->_constituent ;
+//       Connectivity->_constituent = (CONNECTIVITY *)NULL ;
+//       Connectivity->calculateDescendingConnectivity() ;
+         
+//     }
+      
+      END_OF(LOC);
+      return MED_VALID;
+    }
+  return MED_ERROR;
+}
+
+int MED_MESH_RDONLY_DRIVER22::getNodalConnectivity(CONNECTIVITY * Connectivity)
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER22::getNodalConnectivity : " ;
+  BEGIN_OF(LOC);
+
+  int spaceDimension = _ptrMesh->_spaceDimension;
+
+  if (_status==MED_OPENED)
+    {
+      // Get the type of entity to work on (previously set in the Connectivity Object)
+      med_2_2::med_entite_maillage Entity = (med_2_2::med_entite_maillage) Connectivity->getEntity();
+      
+      // Get the number of cells of each type & store it in <tmp_cells_count>.
+      int * tmp_cells_count = new int[MED_NBR_GEOMETRIE_MAILLE] ;
+      int i;
+      for (i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++) 
+       {                       // EF :ON SCANNE DES GEOMETRIES INUTILES, UTILISER LES MAPS
+         tmp_cells_count[i]=MEDnEntMaa(_medIdt,(const_cast <char *> (_ptrMesh->_name.c_str())),
+                                       med_2_2::MED_CONN,(med_2_2::med_entite_maillage) Entity,
+                                       all_cell_type[i],med_2_2::MED_NOD); 
+
+
+         // Get the greatest dimension of the cells : Connectivity->_entityDimension
+         // We suppose there is no cells used as faces in MED 2.2.x , this is forbidden !!!
+         // In version prior to 2.2.x, it is possible
+         if (tmp_cells_count[i]>0) 
+           { 
+             Connectivity->_entityDimension=all_cell_type[i]/100;  
+             Connectivity->_numberOfTypes++;
+           }
+       }
+
+      
+
+      // begin classic geometric types
+      if (Connectivity->_numberOfTypes > 0)
+       {
+         // if MED version < 2.2.x, we read only entity with dimention = Connectivity->_entityDimension. Lesser dimension are face or edge !
+
+      med_int major, minor, release;
+
+      if ( med_2_2::MEDversionLire(_medIdt, &major, &minor, &release) != 0 )
+           {
+             // error : we suppose we have not a good med file !
+             delete[] tmp_cells_count ;
+             return MED_ERROR ;
+           }
+
+         // we get MED version number
+         // If MED version is < 2.2 then the cells which dimension
+         // is lesser than the main dimension ( Connectivity->_entityDimension )
+         // are either faces or edges
+
+         //        string medVersion(version_med);
+         //        int firstNumber = 
+         int * tmpEdgeCount = new int[MED_NBR_GEOMETRIE_MAILLE] ;
+         tmpEdgeCount[0]     = 0 ;
+         int numberOfEdgesTypes = 0;
+         int * tmpFaceCount = new int[MED_NBR_GEOMETRIE_MAILLE] ;
+         tmpFaceCount[0]     = 0 ;
+         int numberOfFacesTypes = 0;
+  
+//       if ((version_med != "2.2")&(Entity==MED_FR::MED_MAILLE))
+//     {
+//       Connectivity->_numberOfTypes=0;
+       
+//       for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)
+//         {
+//           tmpFaceCount[i]=0;
+//           tmpEdgeCount[i]=0;
+//           if (tmp_cells_count[i]!=0)
+//             {
+//               int dimension = all_cell_type[i]/100 ;
+//               if (Connectivity->_entityDimension==dimension) 
+//                 Connectivity->_numberOfTypes++ ;
+           
+//               if (dimension == 2)
+//                 if (Connectivity->_entityDimension==3)
+//                   {
+//                     tmpFaceCount[i]=tmp_cells_count[i] ;
+//                     tmp_cells_count[i]=0 ;
+//                     numberOfFacesTypes++;
+//                   }
+//               if (dimension == 1)
+//                 if (Connectivity->_entityDimension>dimension)
+//                   {
+//                     tmpEdgeCount[i]=tmp_cells_count[i] ;
+//                     tmp_cells_count[i]=0;
+//                     numberOfEdgesTypes++ ;
+//                   }
+//             }
+//         }
+//     }
+       
+      if (Entity==med_2_2::MED_MAILLE)
+       {
+             Connectivity->_numberOfTypes=0;
+       
+             for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++) 
+               {
+                 tmpFaceCount[i]=0;
+                 tmpEdgeCount[i]=0;
+                 if (tmp_cells_count[i]!=0) 
+                   {
+                     int dimension = all_cell_type[i]/100 ;
+                     if (Connectivity->_entityDimension==dimension) 
+                       Connectivity->_numberOfTypes++ ;
+               
+                     if (dimension == 2)
+                       if (Connectivity->_entityDimension==3) 
+                         {
+                           tmpFaceCount[i]=tmp_cells_count[i] ;
+                       //tmp_cells_count[i]=0 ;
+                       //Connectivity->_numberOfTypes++ ;
+                           numberOfFacesTypes++;
+                         }
+                     if (dimension == 1)
+                       if (Connectivity->_entityDimension>dimension) 
+                         {
+                           tmpEdgeCount[i]=tmp_cells_count[i] ;
+                       //tmp_cells_count[i]=0;
+                       //Connectivity->_numberOfTypes++ ;
+                           numberOfEdgesTypes++ ;
+                         }
+                   }
+               }
+           }
+
+         // bloc to read CELL :
+         {
+           // Prepare an array of indexes on the different cell types to create a MEDSKYLINEARRAY
+           // We use <tmp_cells_count> to calculate <Connectivity->_count> then we release it
+           Connectivity->_geometricTypes = new MED_EN::medGeometryElement [Connectivity->_numberOfTypes]   ;  // Double emploi pour des raisons pratiques 
+           Connectivity->_type           = new CELLMODEL                  [Connectivity->_numberOfTypes]   ;  //
+           Connectivity->_count          = new int                        [Connectivity->_numberOfTypes+1] ;
+           Connectivity->_count[0]       = 1;
+           
+           int size = 0 ; 
+           int typeNumber=1 ;
+           int i;
+           for ( i=1;i<MED_NBR_GEOMETRIE_MAILLE;i++)  
+             { // no point1 cell type (?)
+           int dimension = all_cell_type[i]/100 ;
+           if ((tmp_cells_count[i]>0) && (Connectivity->_entityDimension == dimension))
+                 {
+                   Connectivity->_count[typeNumber]=Connectivity->_count[typeNumber-1]+tmp_cells_count[i];
+
+                   CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER22::all_cell_type[i]) ;
+
+               Connectivity->_type[typeNumber-1] = t ;
+           
+                   Connectivity->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER22::all_cell_type[i] ;
+           
+                   // probleme avec les mailles de dimension < a dimension du maillage :
+                   // Il faut oter le zero a la lecture est le remettre a l'ecriture : ce n'est pas fait !!!!! On interdit ce cas pour l'instant !!!
+
+             
+                   size+=tmp_cells_count[i]*((MED_MESH_DRIVER22::all_cell_type[i])%100) ;
+           
+                   MESSAGE(LOC
+                           << Connectivity->_count[typeNumber]-1 << " cells of type " 
+                           << all_cell_type_tab[i] ); 
+                   typeNumber++;
+                 }
+             }
+       
+           // Creation of the MEDSKYLINEARRAY
+           //Connectivity->_nodal = new MEDSKYLINEARRAY(Connectivity->_count[Connectivity->_numberOfTypes]-1,size) ; 
+           //int * NodalIndex = Connectivity->_nodal->getIndex() ;
+           int * NodalValue = new int[size] ;
+           int * NodalIndex = new int[Connectivity->_count[Connectivity->_numberOfTypes]] ;
+           NodalIndex[0]=1 ;
+       
+           // Fill the MEDSKYLINEARRAY by reading the MED file.
+           int j=0;
+           for ( i=0;i<Connectivity->_numberOfTypes;i++) 
+             {
+               int multi = 0 ;
+               med_2_2::med_geometrie_element med_type = (med_2_2::med_geometrie_element) Connectivity->_type[i].getType() ;
+               //        if ( Connectivity->_type[i].getDimension() < Connectivity->_entityDimension) 
+               //        if (Connectivity->_entity == MED_CELL)
+               //          if ( Connectivity->_type[i].getDimension() < _ptrMesh->_spaceDimension) 
+               //            multi=1;
+         
+               //        int NumberOfCell = Connectivity->_count[i+1]-Connectivity->_count[i] ;
+               int NumberOfNodeByCell = Connectivity->_type[i].getNumberOfNodes() ;
+         
+               // initialise index
+               for ( j=Connectivity->_count[i]; j<Connectivity->_count[i+1];j++)
+                 NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByCell ; 
+
+           int tmp_numberOfCells = Connectivity->_count[i+1]-Connectivity->_count[i] ;
+               int * tmp_ConnectivityArray = new int[(NumberOfNodeByCell+multi)*tmp_numberOfCells];
+         
+               //        int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+           //                    Connectivity->_entityDimension,tmp_ConnectivityArray,
+               //                            MED_FR::MED_FULL_INTERLACE,NULL,0,Entity,med_type,MED_FR::MED_NOD);
+           int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                               spaceDimension,tmp_ConnectivityArray,
+                                   med_2_2::MED_FULL_INTERLACE,NULL,0,Entity,med_type,med_2_2::MED_NOD);
+
+           if ( err != MED_VALID)
+             {
+               delete[] tmp_ConnectivityArray;
+               delete[] tmp_cells_count;
+               delete[] tmpFaceCount;
+               delete[] tmpEdgeCount;
+               MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
+               return MED_ERROR ;
+             }
+
+           int * ConnectivityArray = NodalValue + NodalIndex[Connectivity->_count[i]-1]-1 ;
+
+           // version originale sans prise en compte des numéros optionnels
+           //
+           for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
+                 ConnectivityArray[j*NumberOfNodeByCell+k]=tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k] ;
+
+           //////////////////////////////////////////////////////////////////////////////
+           // Modification pour prise en compte de la numérotation optionnelle des noeuds ///
+           //////////////////////////////////////////////////////////////////////////////
+           //
+           // Rénumérote le tableau temporaire tmp_ConnectivityArray en utilisant _optionnalToCanonicNodesNumbers
+           // Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+                                                    
+                                                      //       if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) 
+                                                      //               {
+                                                      //               for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
+                                                      //                       ConnectivityArray[j*NumberOfNodeByCell+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k]] ;
+                                                      //               }
+                                                      //       else
+                                                      //               {
+                                                      //               for ( j=0; j<tmp_numberOfCells; j++) for (int k=0; k<NumberOfNodeByCell; k++) 
+                                                      //                       ConnectivityArray[j*NumberOfNodeByCell+k]=tmp_ConnectivityArray[j*(NumberOfNodeByCell+multi)+k] ;
+                                                      //               }
+           ////////////////////////////////////////////////////////////////////////////
+       
+                                                      delete[] tmp_ConnectivityArray;
+  
+             }
+
+           Connectivity->_nodal = new MEDSKYLINEARRAY(Connectivity->_count[Connectivity->_numberOfTypes]-1,
+                                                      size,
+                                                      NodalIndex,
+                                                      NodalValue) ; 
+
+           delete[] NodalIndex;
+           delete[] NodalValue;
+
+         } // end of bloc to read CELL
+
+
+         // Get Face if any
+         // ===============
+     
+         if (numberOfFacesTypes!=0) 
+           {
+
+             // Create a CONNECTIVITY constituent to put in the top level CONNECTIVITY recursive class
+             CONNECTIVITY * constituent = new CONNECTIVITY(numberOfFacesTypes,MED_EN::MED_FACE) ;
+             constituent->_entityDimension = 2 ;
+             constituent->_count[0]=1 ;
+
+             // In order to create the MEDSKYLINEARRAY of the constituent object we need :
+             // 1:
+             // To initialize the _count array of the constituent object (containning cumulated face count by geometric type)
+             // _count[0]=1 and _count[_numberOfTypes] give the size of NodalIndex
+             // 2:
+             // To calculate the total number of face nodes whatever the geometric type is.
+             // The result is the size of the array containning all the nodes : NodalValue
+             // 3 :
+             // To calculate the starting indexes of the different face types in NodalValue, 
+             // this is the NodalIndex array.
+        
+             int size       = 0 ; 
+             int typeNumber = 1 ;
+             int i;
+             for ( i=1; i < MED_NBR_GEOMETRIE_MAILLE; i++)
+               { // no point1 cell type (?)
+                 if (tmpFaceCount[i]>0)
+                   {
+                     constituent->_count[typeNumber] = constituent->_count[typeNumber-1] + tmpFaceCount[i];
+                     CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER22::all_cell_type[i]) ;
+                     constituent->_type[typeNumber-1]=t ;
+           
+                     constituent->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER22::all_cell_type[i] ;
+           
+                     size+=tmpFaceCount[i]*((MED_MESH_DRIVER22::all_cell_type[i])%100) ;
+                     typeNumber++;
+                   }
+               }
+       
+             // Creation of the MEDSKYLINEARRAY
+             //constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,size) ; 
+             //int * NodalIndex = constituent->_nodal->getIndex() ;
+             int * NodalValue = new int[size] ;
+             int * NodalIndex = new int[constituent->_count[constituent->_numberOfTypes]] ;
+             NodalIndex[0]=1 ;
+       
+             // Fill the MEDSKYLINEARRAY by reading the MED file.
+             for ( i=0; i<constituent->_numberOfTypes; i++) 
+               {
+                 med_2_2::med_geometrie_element med_type = (med_2_2::med_geometrie_element) constituent->_type[i].getType() ;
+
+                 int NumberOfNodeByFace = constituent->_type[i].getNumberOfNodes() ;
+         
+                 // initialise NodalIndex
+                 for (int j=constituent->_count[i]; j<constituent->_count[i+1];j++)
+                   NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByFace ; 
+         
+         int tmp_numberOfFaces = constituent->_count[i+1]-constituent->_count[i] ;
+         // Il faut ajouter 1 pour le zero a la lecture !!!
+          // ATTENTION UNIQUEMENT POUR MED < 2.2.x
+                 int * tmp_constituentArray = NULL;
+
+           MESSAGE(LOC << "Med file version used here " << major << " " << minor << " " << release);
+
+           if ((major == 2) && (minor <= 1))
+                   tmp_constituentArray = new int[(NumberOfNodeByFace+1)*tmp_numberOfFaces] ;
+           else if ((major == 2) && (minor >= 2))
+                   {
+                     tmp_constituentArray = new int[NumberOfNodeByFace*tmp_numberOfFaces] ;
+            MESSAGE(LOC<<": WE ARE USING MED2.2 so there is no +1 for calculating the size of  tmp_constituentArray !") ;
+         }
+
+                 int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                                     Connectivity->_entityDimension,tmp_constituentArray,
+                                     med_2_2::MED_FULL_INTERLACE,NULL,0,med_2_2::MED_MAILLE,med_type,med_2_2::MED_NOD);
+
+                 if ( err != MED_VALID) 
+                   {
+                     MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
+                     delete constituent ;
+                     delete[] tmp_constituentArray;
+                     delete[] tmpFaceCount;
+                     delete[] tmpEdgeCount;
+                     return MED_ERROR ;
+                   }
+
+                 int * constituentArray = NodalValue + NodalIndex[constituent->_count[i]-1]-1 ;
+         
+         // version originale sans prise en compte des numéros optionnels
+         //    
+                 int multi = 0; // quand est-ce que multi vaut 1 ?? en MED-fichier < 2.2 ??
+           MESSAGE(LOC << "Med file version used here " << major << " " << minor << " " << release);
+
+           if ((major == 2) && (minor <= 1))
+             for (int j=0; j<tmp_numberOfFaces; j++)
+               for (int k=0; k<NumberOfNodeByFace; k++)
+                 constituentArray[j*NumberOfNodeByFace+k]=tmp_constituentArray[j*(NumberOfNodeByFace+1)+k] ;
+           else if ((major == 2) && (minor >= 2))
+                 for (int j=0; j<tmp_numberOfFaces; j++)
+                   for (int k=0; k<NumberOfNodeByFace; k++)
+                 constituentArray[j*NumberOfNodeByFace+k]=tmp_constituentArray[j*(NumberOfNodeByFace+multi)+k] ;
+
+                 //////////////////////////////////////////////////////////////////////////////////////
+                 ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+                     //////////////////////////////////////////////////////////////////////////////////////
+                     ///
+                     /// Rénumérote le tableau temporaire tmp_constituentArray en utilisant _optionnalToCanonicNodesNumbers
+                     /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+       
+                     //        if (_ptrMesh->_arePresentOptionnalNodesNumbers) 
+                     //                {
+                     //                for (int j=0; j<tmp_numberOfFaces; j++) for (int k=0; k<NumberOfNodeByFace; k++)
+                     //                        constituentArray[j*NumberOfNodeByFace+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_constituentArray[j*(NumberOfNodeByFace+1)+k]] ;
+                     //                }
+                     //        else
+                     //                {
+                     //                for (int j=0; j<tmp_numberOfFaces; j++) for (int k=0; k<NumberOfNodeByFace; k++)
+                     //                        constituentArray[j*NumberOfNodeByFace+k]=tmp_constituentArray[j*(NumberOfNodeByFace+1)+k] ;
+                     //                }
+       
+                     //////////////////////////////////////////////////////////////////////////////////////
+         
+                     delete[] tmp_constituentArray;
+               }
+       
+             constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,
+                                                       size,
+                                                       NodalIndex,
+                                                       NodalValue) ;
+             delete[] NodalIndex ;
+             delete[] NodalValue ;
+
+
+             Connectivity->_constituent = constituent ;
+           }
+
+         delete[] tmpFaceCount;
+
+
+         // get Edge if any
+         // ===============
+         if (numberOfEdgesTypes!=0) 
+           {
+             CONNECTIVITY * constituent = new CONNECTIVITY(numberOfEdgesTypes,MED_EDGE) ;
+             constituent->_entityDimension = 1 ;
+             constituent->_count[0]=1 ;
+
+             int size = 0 ; 
+             int typeNumber=1 ;
+             // if you declare a variable <i> in two <for> initialization statement, 
+             // compiler gcc2.95.3 says nothing but there are two <i> variables in the same block 
+             //and the value you get in the common block seems to be the value of the first variable !
+             int i; 
+
+             for ( i=1; i<MED_NBR_GEOMETRIE_MAILLE; i++)  
+               { // no point1 cell type (?)
+                 if (tmpEdgeCount[i]>0) 
+                   {
+           
+                     constituent->_count[typeNumber]=constituent->_count[typeNumber-1]+tmpEdgeCount[i];
+                     CELLMODEL t( (MED_EN::medGeometryElement) MED_MESH_DRIVER22::all_cell_type[i]) ;
+                     constituent->_type[typeNumber-1]=t ;
+           
+                     constituent->_geometricTypes[typeNumber-1]=( MED_EN::medGeometryElement) MED_MESH_DRIVER22::all_cell_type[i] ;
+           
+                     size+=tmpEdgeCount[i]*((MED_MESH_DRIVER22::all_cell_type[i])%100) ;
+                     typeNumber++;
+                   }
+               }
+       
+             // Creation of the MEDSKYLINEARRAY
+             //constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,size) ; 
+             //int * NodalIndex = constituent->_nodal->getIndex() ;
+             int * NodalValue = new int[size] ;
+             int * NodalIndex = new int[constituent->_count[constituent->_numberOfTypes]] ;
+             NodalIndex[0]=1 ;
+       
+             // Fill the MEDSKYLINEARRAY by reading the MED file.
+             for ( i=0; i<constituent->_numberOfTypes; i++) 
+               {
+                 med_2_2::med_geometrie_element med_type = (med_2_2::med_geometrie_element) constituent->_type[i].getType() ;
+
+                 int NumberOfNodeByEdge = constituent->_type[i].getNumberOfNodes() ;
+         
+                 // initialise index
+                 for (int j=constituent->_count[i]; j<constituent->_count[i+1];j++)
+                   NodalIndex[j]=NodalIndex[j-1]+NumberOfNodeByEdge ; 
+         
+                 int tmp_numberOfEdges = constituent->_count[i+1]-constituent->_count[i] ;
+                 // Il faut ajouter 1 pour le zero a la lecture !!!
+
+                 // ATTENTION UNIQUEMENT POUR MED < 2.2.x
+                 int * tmp_constituentArray = NULL;
+
+             MESSAGE(LOC << "Med file version used here " << major << " " << minor << " " << release);
+
+             if ((major == 2) && (minor <= 1))
+                   tmp_constituentArray = new int[(NumberOfNodeByEdge+1)*tmp_numberOfEdges] ;
+             else if ((major == 2) && (minor >= 2))
+                   {
+                     tmp_constituentArray = new int[NumberOfNodeByEdge*tmp_numberOfEdges] ;
+            MESSAGE(LOC<<": WE ARE USING MED2.2 so there is no +1 for calculating the size of  tmp_constituentArray !") ;
+          }
+         
+                 int err=MEDconnLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                                     spaceDimension,tmp_constituentArray,
+                                     med_2_2::MED_FULL_INTERLACE,NULL,0,med_2_2::MED_MAILLE,med_type,med_2_2::MED_NOD);
+                 if ( err != MED_VALID) 
+                   {
+                     MESSAGE(LOC<<": MEDconnLire returns "<<err) ;
+                     delete constituent ;
+                     delete[] tmp_constituentArray;
+                     delete[] tmpEdgeCount;
+                     return MED_ERROR ;
+                   }
+
+                 int * constituentArray = NodalValue + NodalIndex[constituent->_count[i]-1]-1 ;
+         
+         // version originale sans prise en compte des numéros optionnels     
+         //
+                 int multi = 0; // quand est-ce que multi vaut 1 ?? en MED-fichier < 2.2 ??
+             MESSAGE(LOC << "Med file version used here " << major << " " << minor << " " << release);
+
+             if ((major == 2) && (minor <= 1))
+                 for (int j=0; j<tmp_numberOfEdges; j++)
+                   for (int k=0; k<NumberOfNodeByEdge; k++)
+                   constituentArray[j*NumberOfNodeByEdge+k]=tmp_constituentArray[j*(NumberOfNodeByEdge+multi)+k] ;
+             else if ((major == 2) && (minor >= 2))
+               for (int j=0; j<tmp_numberOfEdges; j++)
+                 for (int k=0; k<NumberOfNodeByEdge; k++)
+                   constituentArray[j*NumberOfNodeByEdge+k]=tmp_constituentArray[j*(NumberOfNodeByEdge)+k] ;
+
+                 //////////////////////////////////////////////////////////////////////////////////////
+                 ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+                     //////////////////////////////////////////////////////////////////////////////////////
+                     ///
+                     /// Rénumérote le tableau temporaire tmp_constituentArray en utilisant _optionnalToCanonicNodesNumbers
+                     /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+       
+                     //        if (_ptrMesh->_arePresentOptionnalNodesNumbers) 
+                     //                {
+                     //                for (int j=0; j<tmp_numberOfEdges; j++) for (int k=0; k<NumberOfNodeByEdge; k++)
+                     //                        constituentArray[j*NumberOfNodeByEdge+k]=_ptrMesh->_optionnalToCanonicNodesNumbers[tmp_constituentArray[j*(NumberOfNodeByEdge+1)+k]] ;
+                     //                }
+                     //        else
+                     //                {
+                     //                for (int j=0; j<tmp_numberOfEdges; j++) for (int k=0; k<NumberOfNodeByEdge; k++)
+                     //                        constituentArray[j*NumberOfNodeByEdge+k]=tmp_constituentArray[j*(NumberOfNodeByEdge+1)+k] ;
+                     //                }
+       
+                     //////////////////////////////////////////////////////////////////////////////////////
+
+                     delete[] tmp_constituentArray;
+               }
+
+             constituent->_nodal = new MEDSKYLINEARRAY(constituent->_count[constituent->_numberOfTypes]-1,
+                                                       size,
+                                                       NodalIndex,
+                                                       NodalValue) ;
+
+             delete[] NodalIndex ;
+             delete[] NodalValue ;
+
+             if (Connectivity->_entityDimension == 3) 
+               {
+                 if (Connectivity->_constituent==NULL)
+                   throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Edges are defined but there are no Faces !"));
+                 Connectivity->_constituent->_constituent = constituent ;
+               } else 
+                 Connectivity->_constituent = constituent ;
+           }
+
+         delete[] tmpEdgeCount; 
+
+      
+       } // end classic geometric types
+      delete[] tmp_cells_count;
+
+
+
+      // Lecture des polygones MED_CELL
+      int NumberOfPolygons = MEDnEntMaa(_medIdt,
+                                       const_cast <char *> (_ptrMesh->_name.c_str()),
+                                       med_2_2::MED_CONN,
+                                       Entity,
+                                       med_2_2::MED_POLYGONE,
+                                       med_2_2::MED_NOD);
+      if (NumberOfPolygons > 0)
+       {
+         if (Connectivity->_entityDimension == 1)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"In a 2D mesh, polygons need at least one 2D cell of a classic geometric type !"));
+         med_int ConnectivitySize;
+         med_err err1 = MEDpolygoneInfo(_medIdt,
+                                        const_cast <char *> (_ptrMesh->_name.c_str()),
+                                        Entity,
+                                        med_2_2::MED_NOD,
+                                        &ConnectivitySize);
+         if (err1 != MED_VALID)
+           {
+             MESSAGE(LOC<<": MEDpolygoneInfo returns "<<err1);
+             return MED_ERROR;
+           }
+      
+         med_int* PolygonsConnectivity = new med_int[ConnectivitySize];
+         med_int* PolygonsConnectivityIndex = new med_int[NumberOfPolygons+1];
+      
+         med_err err2 = MEDpolygoneConnLire(_medIdt,
+                                            const_cast <char *> (_ptrMesh->_name.c_str()),
+                                            PolygonsConnectivityIndex,
+                                            NumberOfPolygons+1,
+                                            PolygonsConnectivity,
+                                            Entity,
+                                            med_2_2::MED_NOD);
+         if (err2 != MED_VALID)
+           {
+             MESSAGE(LOC<<": MEDpolygoneConnLire returns "<<err2);
+             return MED_ERROR;
+           }
+      
+         if (Connectivity->_entityDimension == 2) // 2D mesh : polygons in Connectivity
+           Connectivity->setPolygonsConnectivity(MED_NODAL,(medEntityMesh) Entity,PolygonsConnectivity,PolygonsConnectivityIndex,ConnectivitySize,NumberOfPolygons);
+         else if (Connectivity->_entityDimension == 3)
+           {
+             if (Connectivity->_constituent == NULL) // 3D mesh : polygons in Connectivity->_constituent
+               Connectivity->_constituent = new CONNECTIVITY(MED_FACE);
+             Connectivity->_constituent->setPolygonsConnectivity(MED_NODAL,MED_FACE,PolygonsConnectivity,PolygonsConnectivityIndex,ConnectivitySize,NumberOfPolygons);
+           }
+      
+         delete[] PolygonsConnectivity;
+         delete[] PolygonsConnectivityIndex;
+       } // end polygons
+  
+
+
+      // Lecture des polyedres MED_CELL
+      med_int NumberOfPolyhedron = MEDnEntMaa(_medIdt,
+                                             const_cast <char *> (_ptrMesh->_name.c_str()),
+                                             med_2_2::MED_CONN,
+                                             Entity,
+                                             med_2_2::MED_POLYEDRE,
+                                             med_2_2::MED_NOD);
+      if (NumberOfPolyhedron > 0)
+       {
+         if (Connectivity->_entityDimension == 2 || Connectivity->_entityDimension == 1)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"In a 3D mesh, polyhedron need at least one 3D cell of a classic geometric type !"));
+         med_int FacesIndexSize, NumberOfNodes, NumberOfFaces;
+         med_err err3 = MEDpolyedreInfo(_medIdt,
+                                        const_cast <char *> (_ptrMesh->_name.c_str()),
+                                        med_2_2::MED_NOD,
+                                        &FacesIndexSize,
+                                        &NumberOfNodes);
+         NumberOfFaces = FacesIndexSize-1;
+         if (err3 != MED_VALID)
+           {
+             MESSAGE(LOC<<": MEDpolyhedreInfo returns "<<err3);
+             return MED_ERROR;
+           }
+      
+         med_int* Nodes = new med_int[NumberOfNodes];
+         med_int* FacesIndex = new med_int[NumberOfFaces+1];
+         med_int* PolyhedronIndex = new med_int[NumberOfPolyhedron+1];
+         
+         med_err err4 = MEDpolyedreConnLire(_medIdt,
+                                            const_cast <char *> (_ptrMesh->_name.c_str()),
+                                            PolyhedronIndex,
+                                            NumberOfPolyhedron+1,
+                                            FacesIndex,
+                                            NumberOfFaces+1,
+                                            Nodes,
+                                            med_2_2::MED_NOD);
+         if (err4 != MED_VALID)
+           {
+             MESSAGE(LOC<<": MEDpolyedreConnLire returns "<<err4);
+             return MED_ERROR;
+           }
+      
+         Connectivity->setPolyhedronConnectivity(MED_NODAL,Nodes,PolyhedronIndex,NumberOfNodes,NumberOfPolyhedron,FacesIndex,NumberOfFaces);
+         
+         delete[] Nodes;
+         delete[] FacesIndex;
+         delete[] PolyhedronIndex;
+       } // end polyhedron
+
+
+
+      // If there is no nodal connectivity, we return MED_ERROR !
+      if (Connectivity->_numberOfTypes == 0 && NumberOfPolygons == 0 && NumberOfPolyhedron == 0)
+       return MED_ERROR ;
+      else
+       return MED_VALID;
+
+    }
+}
+
+int  MED_MESH_RDONLY_DRIVER22::getFAMILY() 
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER22::getFAMILY() : " ;
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED)
+    {
+      int err = 0 ;
+
+      int * MEDArrayNodeFamily = NULL ;
+      int ** MEDArrayCellFamily = NULL ;
+      int ** MEDArrayFaceFamily = NULL ;
+      int ** MEDArrayEdgeFamily = NULL ;
+
+    // NODE :
+      MEDArrayNodeFamily = new int[_ptrMesh->getNumberOfNodes()] ;
+
+      err = getNodesFamiliesNumber(MEDArrayNodeFamily) ;
+      // error only if (_status!=MED_OPENED), other case exeception !
+      // CELL
+
+      MESSAGE(LOC << "error returned from getNodesFamiliesNumber " << err);
+
+      MEDArrayCellFamily = new int* [_ptrMesh->getNumberOfTypesWithPoly(MED_CELL)] ;
+      // ET SI IL N'Y A PAS DE CELLS ?
+
+      medGeometryElement * myTypes = _ptrMesh->getTypesWithPoly(MED_CELL);
+      for (int i=0;i<_ptrMesh->getNumberOfTypesWithPoly(MED_CELL);i++)
+       MEDArrayCellFamily[i] = new
+         int[_ptrMesh->getNumberOfElementsWithPoly(MED_CELL,myTypes[i])] ;
+
+      err = getCellsFamiliesNumber(MEDArrayCellFamily,
+                                  _ptrMesh->_connectivity,MED_CELL) ;
+      delete [] myTypes;
+
+      MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Cells " << err);
+
+    if (_ptrMesh->_connectivity->_constituent != NULL)
+      {
+       if (_ptrMesh->_connectivity->_constituent->_entity == MED_EN::MED_FACE)
+         {
+           // FACE
+           MEDArrayFaceFamily = new
+             int* [_ptrMesh->getNumberOfTypesWithPoly(MED_FACE)] ;
+
+           myTypes = _ptrMesh->getTypesWithPoly(MED_FACE);
+           for (int i=0;i<_ptrMesh->getNumberOfTypesWithPoly(MED_FACE);i++)
+             MEDArrayFaceFamily[i] = new
+               int[_ptrMesh->getNumberOfElementsWithPoly(MED_FACE,myTypes[i])] ;
+
+           err =
+             getCellsFamiliesNumber(MEDArrayFaceFamily,
+                                    _ptrMesh->_connectivity->_constituent,MED_FACE) ;
+           delete [] myTypes;
+           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Faces " << err);
+         }
+       else
+         {
+           // EDGE in 2D
+           MEDArrayEdgeFamily = new
+             int* [_ptrMesh->getNumberOfTypes(MED_EDGE)] ;
+
+           const medGeometryElement *myTypes2 = _ptrMesh->getTypes(MED_EDGE);
+           for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
+             MEDArrayEdgeFamily[i] = new
+               int[_ptrMesh->getNumberOfElements(MED_EDGE,myTypes2[i])] ;
+
+           err =
+             getCellsFamiliesNumber(MEDArrayEdgeFamily,
+                                    _ptrMesh->_connectivity->_constituent,MED_FACE) ;
+         
+           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Edges in 2D " << err);
+         }
+       // EDGE in 3D
+       if (_ptrMesh->_connectivity->_constituent->_constituent != NULL)
+         {
+           MEDArrayEdgeFamily = new
+             int* [_ptrMesh->getNumberOfTypes(MED_EDGE)] ;
+
+           const medGeometryElement *myTypes2 = _ptrMesh->getTypes(MED_EDGE);
+           for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
+             MEDArrayEdgeFamily[i] = new
+               int[_ptrMesh->getNumberOfElements(MED_EDGE,myTypes2[i])] ;
+
+           err =
+             getCellsFamiliesNumber(MEDArrayEdgeFamily,
+                                    _ptrMesh->_connectivity->_constituent->_constituent,MED_EDGE);
+           // we are in 3D !
+       
+           MESSAGE(LOC << "error returned from getCellsFamiliesNumber for Edges in 3D " << err);
+
+         }
+      }
+
+    int NumberOfFamilies = med_2_2::MEDnFam(_medIdt, const_cast <char *>
+                                          (_meshName.c_str())) ;
+
+    if ( NumberOfFamilies < 1 ) // at least family 0 must exist 
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"There is no FAMILY, FAMILY 0 must exists" ));
+
+    SCRUTE(NumberOfFamilies);
+
+    vector<FAMILY*> &NodeFamilyVector = _ptrMesh->_familyNode ;
+    vector<FAMILY*> &CellFamilyVector = _ptrMesh->_familyCell ;
+    vector<FAMILY*> &FaceFamilyVector = _ptrMesh->_familyFace ;
+    vector<FAMILY*> &EdgeFamilyVector = _ptrMesh->_familyEdge ;
+
+    int numberOfNodesFamilies = 0 ;
+    int numberOfCellsFamilies = 0 ;
+    int numberOfFacesFamilies = 0 ;
+    int numberOfEdgesFamilies = 0 ;
+
+    for (int i=0;i<NumberOfFamilies;i++)
+      {
+       int NumberOfAttributes = med_2_2::MEDnAttribut(_medIdt,
+                                                     const_cast <char *>
+                                                     (_meshName.c_str()),
+                                                     (i+1));
+      
+      if (NumberOfAttributes < 0) 
+       throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER22::getFAMILY() : NumberOfAttributes" );
+
+       int NumberOfGroups = med_2_2::MEDnGroupe(_medIdt, const_cast <char *>
+                                               (_meshName.c_str()),(i+1)) ;
+
+       if (NumberOfGroups < 0)
+         throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER22::getFAMILY() : NumberOfGroups" );
+      
+       int FamilyIdentifier ;
+       string FamilyName(MED_TAILLE_NOM,'\0');
+       int *  AttributesIdentifier = new int[NumberOfAttributes] ;
+       int *  AttributesValues     = new int[NumberOfAttributes] ;
+       string AttributesDescription(MED_TAILLE_DESC*NumberOfAttributes,' ') ;
+       string GroupsNames(MED_TAILLE_LNOM*NumberOfGroups+1,'\0') ;
+       err = med_2_2::MEDfamInfo(_medIdt,const_cast <char *>
+                                (_meshName.c_str()),
+                                (i+1),const_cast <char *>
+                                (FamilyName.c_str()), &FamilyIdentifier,
+                                AttributesIdentifier,AttributesValues,
+                                const_cast <char *>
+                                (AttributesDescription.c_str()),
+                                &NumberOfAttributes, const_cast <char *>
+                                (GroupsNames.c_str()),&NumberOfGroups);
+
+
+       SCRUTE(GroupsNames);
+       SCRUTE(FamilyName);
+       SCRUTE(err);
+       SCRUTE(i);
+
+      if (err != MED_VALID)
+       throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER22::getFAMILY() : ERROR when get FAMILY informations" );
+
+       if (FamilyIdentifier != 0 )
+         {
+           FAMILY * Family = new FAMILY(_ptrMesh,FamilyIdentifier,FamilyName,
+                                        NumberOfAttributes,
+                                        AttributesIdentifier,
+                                        AttributesValues,
+                                        AttributesDescription,
+                                        NumberOfGroups,GroupsNames,
+                                        MEDArrayNodeFamily,
+                                        MEDArrayCellFamily,
+                                        MEDArrayFaceFamily,
+                                        MEDArrayEdgeFamily) ;
+
+           // All good ?
+           // if nothing found, delete Family
+
+           if (Family->getNumberOfTypes() == 0)
+             {
+               MESSAGE(LOC<<"Nothing found for family "<<FamilyName<<
+                       " : skip");
+               delete Family;
+             }
+           else
+             switch (Family->getEntity())
+               {
+               case MED_EN::MED_NODE :
+                 NodeFamilyVector.push_back(Family) ;
+                 numberOfNodesFamilies++ ;
+                 break ;
+               case MED_EN::MED_CELL :
+                 CellFamilyVector.push_back(Family) ;
+                 numberOfCellsFamilies++ ;
+                 break ;
+               case MED_EN::MED_FACE :
+                 FaceFamilyVector.push_back(Family) ;
+                 numberOfFacesFamilies++ ;
+                 break ;
+               case MED_EN::MED_EDGE :
+                 EdgeFamilyVector.push_back(Family) ;
+                 numberOfEdgesFamilies++ ;
+                 break ;
+               }
+           //  MESSAGE(LOC << (*Family));
+         }
+
+       delete [] AttributesIdentifier ;
+       delete [] AttributesValues ;
+      }
+
+    if (MEDArrayNodeFamily != NULL)
+      delete[] MEDArrayNodeFamily ;
+
+    if (MEDArrayCellFamily != NULL)
+      {
+       for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_CELL);i++)
+         delete[] MEDArrayCellFamily[i] ;
+       delete[] MEDArrayCellFamily ;
+      }
+
+    if (MEDArrayFaceFamily != NULL)
+      {
+       for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_FACE);i++)
+         delete[] MEDArrayFaceFamily[i] ;
+       delete[] MEDArrayFaceFamily ;
+      }
+
+    if (MEDArrayEdgeFamily != NULL)
+      {
+       for (int i=0;i<_ptrMesh->getNumberOfTypes(MED_EDGE);i++)
+         delete[] MEDArrayEdgeFamily[i] ;
+       delete[] MEDArrayEdgeFamily ;
+      }
+
+    END_OF(LOC);
+    return MED_VALID ;
+    }
+
+  return MED_ERROR;
+}
+
+int  MED_MESH_RDONLY_DRIVER22::getNodesFamiliesNumber(int * MEDArrayNodeFamily)
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER22::getNodesFamiliesNumber() : " ;
+
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED)
+    {
+    int err = 0 ;
+
+      err = MEDfamLire(_medIdt, const_cast <char *>
+                      (_ptrMesh->_name.c_str()), MEDArrayNodeFamily,
+                      _ptrMesh->getNumberOfNodes(), med_2_2::MED_NOEUD,
+                      (med_2_2::med_geometrie_element) MED_NONE);
+
+      if ( err != MED_VALID)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "There is no family for the |"<< _ptrMesh->getNumberOfNodes() << "| nodes in mesh |" << _ptrMesh->_name.c_str() << "|"));
+
+      END_OF(LOC);
+      return MED_VALID;
+    }
+
+  return MED_ERROR;
+}
+
+int  MED_MESH_RDONLY_DRIVER22::getCellsFamiliesNumber(int **MEDArrayFamily,
+                                                     CONNECTIVITY *Connectivity,
+                                                     MED_EN::medEntityMesh entity) 
+{
+  const char * LOC = "MED_MESH_RDONLY_DRIVER22::getCellsFamiliesNumber " ;
+
+  BEGIN_OF(LOC);
+
+  if (_status==MED_OPENED)
+    {
+    int i, err = 0 ;
+    MED_EN::medGeometryElement *types=Connectivity->getGeometricTypesWithPoly(Connectivity->_entity);
+    for (i=0;i<Connectivity->getNumberOfTypesWithPoly(Connectivity->_entity);i++)
+      {
+       int NumberOfCell=Connectivity->getNumberOfElementsWithPoly(Connectivity->_entity,types[i]);
+       err=MEDfamLire(_medIdt,const_cast <char *> (_ptrMesh->_name.c_str()),
+                      MEDArrayFamily[i],NumberOfCell,
+                      (med_2_2::med_entite_maillage) Connectivity->_entity,
+                      (med_2_2::med_geometrie_element)types[i]);
+       if (err != MED_VALID)
+         {
+           err=MEDfamLire(_medIdt,const_cast <char *>
+                          (_ptrMesh->_name.c_str()),
+                          MEDArrayFamily[i],NumberOfCell,
+                          med_2_2::MED_MAILLE,
+                          (med_2_2::med_geometrie_element)types[i]);
+           if (err != MED_VALID)
+             throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Family not found for entity "<<Connectivity->_entity<<" and geometric type "<<Connectivity->_geometricTypes[i]));
+         }
+      }
+    delete [] types;
+    return MED_VALID;
+    }
+  return MED_ERROR;
+}
+
+/*--------------------- WRONLY PART -------------------------------*/
+
+MED_MESH_WRONLY_DRIVER22::MED_MESH_WRONLY_DRIVER22()
+{
+}
+  
+MED_MESH_WRONLY_DRIVER22::MED_MESH_WRONLY_DRIVER22(const string & fileName,
+                                                  MESH * ptrMesh):
+  MED_MESH_DRIVER22(fileName,ptrMesh,MED_WRONLY),IMED_MESH_WRONLY_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER(fileName,ptrMesh,MED_WRONLY)
+{
+  MESSAGE("MED_MESH_WRONLY_DRIVER22::MED_MESH_WRONLY_DRIVER22(const string & fileName, MESH * ptrMesh) has been created");
+}
+
+MED_MESH_WRONLY_DRIVER22::MED_MESH_WRONLY_DRIVER22(const MED_MESH_WRONLY_DRIVER22 & driver):
+  IMED_MESH_WRONLY_DRIVER(driver),MED_MESH_DRIVER22(driver),MED_MESH_DRIVER(driver)
+{
+}
+
+MED_MESH_WRONLY_DRIVER22::~MED_MESH_WRONLY_DRIVER22()
+{
+  //MESSAGE("MED_MESH_WRONLY_DRIVER22::MED_MESH_WRONLY_DRIVER22(const string & fileName, MESH * ptrMesh) has been destroyed");
+}
+
+GENDRIVER * MED_MESH_WRONLY_DRIVER22::copy(void) const
+{
+  return new MED_MESH_WRONLY_DRIVER22(*this);
+}
+
+void MED_MESH_WRONLY_DRIVER22::write(void) const
+{ 
+  const char * LOC = "void MED_MESH_WRONLY_DRIVER22::write(void) const : ";
+  BEGIN_OF(LOC);
+
+  // we must first create mesh !!
+  MESSAGE(LOC << "MeshName : |" << _meshName << "| FileName : |"<<_fileName<<"| MedIdt : | "<< _medIdt << "|");
+
+  if (_status!=MED_OPENED)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "File "<<_fileName<<" is not open. Open it before write !"));
+
+  if (_ptrMesh->getIsAGrid())
+  {
+    if ( writeGRID() != MED_VALID )
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeGRID()"  )) ;
+  }
+  else
+  {
+    if (writeCoordinates()!=MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeCoordinates()"  )) ;
+
+    if (writeConnectivities(MED_EN::MED_CELL)!=MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_CELL)"  )) ;
+    if (writeConnectivities(MED_EN::MED_FACE)!=MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_FACE)"  )) ;
+    if (writeConnectivities(MED_EN::MED_EDGE)!=MED_VALID)
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeConnectivities(MED_EDGE)"  )) ;
+  }
+
+  if (writeFamilyNumbers() !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilyNumbers()"  )) ;
+  
+
+  // well we must first write zero family :
+  if (_status==MED_OPENED) {
+    int err ;
+    // test if the family already exists (HDF trick waiting a MED evolution to be replaced)
+    string dataGroupFam = "/ENS_MAA/"+_meshName+"/FAS/FAMILLE_ZERO/";  
+    MESSAGE("|"<<dataGroupFam<<"|");
+    err =med_2_2::_MEDdatagroupOuvrir(_medIdt,const_cast <char *> (dataGroupFam.c_str()) );
+    if ( err < MED_VALID ) {
+      SCRUTE(err);
+
+      char familyName[MED_TAILLE_NOM+1];
+      //      strcpy(familyName,"FAMILLE_ZERO");
+      err = med_2_2::MEDfamCr( _medIdt,
+                             const_cast <char *> ( _meshName.c_str() ),
+                             familyName, 0,
+                             (int*)NULL, (int*)NULL, (char*)NULL, 0,
+                             (char*)NULL, 0);
+
+      SCRUTE(familyName);
+      
+      if ( err != MED_VALID) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't create family |FAMILLE_ZERO| with identifier |0| groups names || and  attributes descriptions ||")) ;
+    }
+    else
+      med_2_2::_MEDdatagroupFermer(_medIdt);
+     
+  }
+
+  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyNode)");
+  if (writeFamilies(_ptrMesh->_familyNode) !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyNode)"  )) ;
+
+  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyCell)");
+  if (writeFamilies(_ptrMesh->_familyCell) !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyCell)"  )) ;
+
+  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyFace)");
+  if (writeFamilies(_ptrMesh->_familyFace) !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyFace)"  )) ;
+
+  MESSAGE(LOC<<"writeFamilies(_ptrMesh->_familyEdge)");
+  if (writeFamilies(_ptrMesh->_familyEdge) !=MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "ERROR in writeFamilies(_ptrMesh->_familyEdge)"  )) ;
+
+  END_OF(LOC);
+} 
+
+//=======================================================================
+//function : writeGRID
+//purpose  : 
+//=======================================================================
+
+int MED_MESH_WRONLY_DRIVER22::writeGRID() const
+{
+  const char * LOC = "MED_MESH_WRONLY_DRIVER22::writeGRID() : " ;
+  BEGIN_OF(LOC);
+  
+  if (_status!=MED_OPENED)
+  {
+    MESSAGE (LOC<<" Not open !!!");
+    return MED_ERROR;
+  }
+  GRID * ptrGrid = (GRID*) _ptrMesh;
+  
+  med_2_2::med_err err = MED_ERROR;
+  med_2_2::med_repere rep;
+  string tmp_name(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM22,' ');
+  string tmp_unit(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM22,' ');
+
+  // Test if the mesh <_meshName> already exists
+  // If it doesn't exists create it
+  // If it already exists verify if its space and mesh dimensions are the same
+  // as <_ptrMesh->_spaceDimension>, <_ptrMesh->_meshDimension> respectively
+  // rem : <_meshName> is the driver meshName not <ptrMesh->_meshName>
+
+  int spaceDimension = med_2_2::MEDdimEspaceLire(_medIdt, const_cast <char *>
+                                               (_meshName.c_str()) );
+
+  int meshDimension = med_2_2::MEDdimLire(_medIdt, const_cast <char *>
+                                        (_meshName.c_str()) );
+
+
+  MESSAGE(LOC << "spacedim " << spaceDimension << " meshdim " << meshDimension);
+
+  MESSAGE(LOC << "From the mesh spacedim " << _ptrMesh->_spaceDimension << " meshdim " << _ptrMesh->_meshDimension);
+
+  if ((spaceDimension <= MED_VALID) && (meshDimension <= MED_VALID))
+    {
+      err = MEDmaaCr(_medIdt,
+                    const_cast <char *> (_meshName.c_str()),
+                    _ptrMesh->_meshDimension,med_2_2::MED_STRUCTURE,
+                    const_cast <char *> (_ptrMesh->_description.c_str()));
+
+      meshDimension =  _ptrMesh->_meshDimension;
+
+      if (err != MED_VALID)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Unable to create Grid"));
+      else 
+       MESSAGE(LOC<<"Grid "<<_meshName<<" created in file "<<_fileName<<" !");
+    }
+  else if ((spaceDimension != _ptrMesh->_spaceDimension)  &&
+          (meshDimension != _ptrMesh->_meshDimension))
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Grid |" << _meshName.c_str() <<
+                                 "| already exists in file |" << _fileName <<
+                                 "| with space dimension |" << spaceDimension <<
+                                 "| and mesh dimension |" << meshDimension <<
+                                 "| but the space dimension and the mesh dimension of the mesh we want to write are respectively |"
+                                 << _ptrMesh->_spaceDimension <<"|" <<
+                                _ptrMesh->_meshDimension <<"|" )) ;
+
+  MED_EN::med_grid_type gridType = ptrGrid->getGridType();
+
+  err = med_2_2::MEDnatureGrilleEcr(_medIdt,
+                                  const_cast <char *> (_meshName.c_str()),
+                                  (med_2_2::med_type_grille) gridType);
+
+  if (err != MED_VALID)
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Unable to write the type of the Grid"));
+
+  // Recompose the <_spaceDimension> strings in 1 string 
+  int lengthString ;
+  string valueString ;
+  for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
+    SCRUTE(i);
+    valueString = _ptrMesh->_coordinate->_coordinateName[i] ;
+    lengthString = (MED_TAILLE_PNOM22<valueString.size())?MED_TAILLE_PNOM22:valueString.size() ;
+    tmp_name.replace(i*MED_TAILLE_PNOM22,i*MED_TAILLE_PNOM22+lengthString,valueString,0,lengthString);
+    valueString = _ptrMesh->_coordinate->_coordinateUnit[i];
+    lengthString = (MED_TAILLE_PNOM22<valueString.size())?MED_TAILLE_PNOM22:valueString.size() ;
+    tmp_unit.replace(i*MED_TAILLE_PNOM22,i*MED_TAILLE_PNOM22+lengthString,valueString,0,lengthString);
+  }
+
+  // Pourquoi le stocker sous forme de chaîne ?
+  const string & coordinateSystem = _ptrMesh->_coordinate->_coordinateSystem;
+  if      (coordinateSystem  == "CARTESIAN") 
+    rep = med_2_2::MED_CART;
+  else if ( coordinateSystem == "CYLINDRICAL")
+    rep = med_2_2::MED_CYL;
+  else if ( coordinateSystem == "SPHERICAL" )
+    rep = med_2_2::MED_SPHER;
+  else
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Grid |" << _meshName.c_str() <<
+                                 "| doesn't have a valid coordinate system : |" 
+                                 << _ptrMesh->_coordinate->_coordinateSystem
+                                 << "|" )) ;  
+
+  med_2_2::med_int ArrayLen[] = { (med_2_2::med_int) ptrGrid->_iArrayLength,
+                     (med_2_2::med_int) ptrGrid->_jArrayLength,
+                     (med_2_2::med_int) ptrGrid->_kArrayLength  };
+  
+  // Write node coordinates for MED_BODY_FITTED grid
+  if (gridType == MED_EN::MED_BODY_FITTED)
+    {
+      // Write Coordinates and families
+//       double * coo = const_cast <double *>
+//     (_ptrMesh->_coordinate->getCoordinates(MED_EN::MED_FULL_INTERLACE));
+
+      err = MEDcoordEcr(_medIdt, const_cast <char *> (_meshName.c_str()),
+                       _ptrMesh->_spaceDimension, 
+                       //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ), 
+                       const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ), 
+                       med_2_2::MED_FULL_INTERLACE, _ptrMesh->_numberOfNodes,
+                       //  _ptrMesh->_coordinate->_numberOfNodes
+                       rep, const_cast <char *> (tmp_name.c_str()), 
+                       const_cast <char *> (tmp_unit.c_str()));
+
+      if (err != MED_VALID) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write coordinates of the grid |" << _meshName.c_str() << "| in file |" << _fileName
+                                    << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                    << " with units names |"  << tmp_name
+                                    << "| and units |"       << tmp_unit
+                                    << " |")) ;
+
+      int* structure = new int [meshDimension];
+
+      for (int idim = 0; idim < meshDimension; ++idim)
+       structure[idim] = ArrayLen [idim];
+
+      err = med_2_2::MEDstructureCoordEcr(_medIdt, const_cast <char *>
+                                        (_meshName.c_str()), meshDimension,
+                                        structure);
+
+      if (err != MED_VALID)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"error in writing the structure of the grid |" << _meshName.c_str()));
+
+      delete structure;
+    }
+  else if ((gridType == MED_EN::MED_CARTESIAN) ||
+          (gridType == MED_EN::MED_POLAR))
+    {
+      // Write Arrays of Cartesian or Polar Grid
+
+      double * Array[] = { ptrGrid->_iArray,
+                          ptrGrid->_jArray,
+                          ptrGrid->_kArray };
+
+      for (int idim = 0; idim < _ptrMesh->_meshDimension; ++idim)
+       {
+         string str_name = string (tmp_name,idim*MED_TAILLE_PNOM22,
+                                   MED_TAILLE_PNOM22);
+         string str_unit = string (tmp_unit,idim*MED_TAILLE_PNOM22,
+                                   MED_TAILLE_PNOM22);
+
+         err = med_2_2::MEDindicesCoordEcr(_medIdt, const_cast <char *>
+                                          (_ptrMesh->_name.c_str()),
+                                          _ptrMesh->_meshDimension,
+                                          Array[idim], ArrayLen[idim],
+                                          (idim+1), const_cast <char *>
+                                          (str_name.c_str()),
+                                          const_cast <char *>
+                                          (str_unit.c_str()));
+
+         if (err != MED_VALID)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<
+                                        "Can't write grid coordinates for " <<
+                                        idim << "-th dimention"));
+       }
+  } // end Write  Cartesian or Polar Grid
+
+  END_OF(LOC);
+  return MED_VALID;
+}
+
+//=======================================================================
+//function : writeCoordinates
+//purpose  : 
+//=======================================================================
+
+int MED_MESH_WRONLY_DRIVER22::writeCoordinates() const {
+  const char * LOC = "int MED_MESH_WRONLY_DRIVER22::writeCoordinates() const : ";
+  BEGIN_OF(LOC);
+
+  med_2_2::med_err err = MED_ERROR;
+  med_2_2::med_repere rep;
+  string tmp_name(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM22,' ');
+  string tmp_unit(_ptrMesh->_spaceDimension*MED_TAILLE_PNOM22,' ');
+    
+  // Recompose the <_spaceDimension> strings in 1 string 
+  int lengthString ;
+  string valueString ;
+  for (int i=0;i<_ptrMesh->_spaceDimension;i++) {
+    valueString = _ptrMesh->_coordinate->_coordinateName[i] ;
+    lengthString = (MED_TAILLE_PNOM22<valueString.size())?MED_TAILLE_PNOM22:valueString.size() ;
+    tmp_name.replace(i*MED_TAILLE_PNOM22,i*MED_TAILLE_PNOM22+lengthString,valueString,0,lengthString);
+    valueString = _ptrMesh->_coordinate->_coordinateUnit[i];
+    lengthString = (MED_TAILLE_PNOM22<valueString.size())?MED_TAILLE_PNOM22:valueString.size() ;
+    tmp_unit.replace(i*MED_TAILLE_PNOM22,i*MED_TAILLE_PNOM22+lengthString,valueString,0,lengthString);
+  }
+
+  // Test if the mesh <_meshName> already exists
+  // If it doesn't exists create it
+  // If it already exists verify if its space and mesh dimensions are the same
+  // as <_ptrMesh->_spaceDimension>, <_ptrMesh->_meshDimension> respectively
+  // rem : <_meshName> is the driver meshName not <ptrMesh->_meshName>
+
+  int spaceDimension = med_2_2::MEDdimEspaceLire(_medIdt, const_cast <char *>
+                                               (_meshName.c_str()));
+
+  int meshDimension = med_2_2::MEDdimLire(_medIdt, const_cast <char *>
+                                        (_meshName.c_str()) );
+
+  if ((spaceDimension != MED_VALID) && (meshDimension != MED_VALID))
+    {
+      err = MEDmaaCr(_medIdt, const_cast <char *> (_meshName.c_str()),
+                    _ptrMesh->_meshDimension, med_2_2::MED_NON_STRUCTURE,
+                    const_cast <char *> (_ptrMesh->_description.c_str()));
+
+      if (err != MED_VALID)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Unable to create Mesh : |" << _meshName << "|"));
+      else 
+       MESSAGE(LOC<<"Mesh "<<_meshName<<" created in file "<<_fileName<<" !");
+    }
+  else if ((spaceDimension != _ptrMesh->_spaceDimension)  &&
+          (meshDimension != _ptrMesh->_meshDimension))
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Mesh |" << _meshName.c_str() <<
+                                "| already exists in file |" << _fileName <<
+                                "| with space dimension |" << spaceDimension <<
+                                "| and mesh dimension |" << meshDimension <<
+                                "| but the space dimension and the mesh dimension of the mesh we want to write are respectively |"
+                                << _ptrMesh->_spaceDimension <<"|" <<
+                                _ptrMesh->_meshDimension << "|")) ;
+    
+  // Pourquoi le stocker sous forme de chaîne ?
+  const string & coordinateSystem = _ptrMesh->_coordinate->_coordinateSystem;
+  if      (coordinateSystem  == "CARTESIAN") 
+    rep = med_2_2::MED_CART;
+  else if ( coordinateSystem == "CYLINDRICAL")
+    rep = med_2_2::MED_CYL;
+  else if ( coordinateSystem == "SPHERICAL" )
+    rep = med_2_2::MED_SPHER;
+  else
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Mesh |" << _meshName.c_str() << "| doesn't have a valid coordinate system : |" 
+                                << _ptrMesh->_coordinate->_coordinateSystem
+                                << "|" )) ;  
+      
+//   err = MEDcoordEcr(_medIdt, const_cast <char *> (_meshName.c_str()),
+//                 _ptrMesh->_spaceDimension, 
+//                 //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ), 
+//                 const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ), 
+//                 MED_FR::MED_FULL_INTERLACE, 
+//                 _ptrMesh->_numberOfNodes,                 //  _ptrMesh->_coordinate->_numberOfNodes
+//                 MED_FR::MED_LECTURE_ECRITURE,    
+//                 rep,
+//                 const_cast <char *> (tmp_name.c_str()), 
+//                 const_cast <char *> (tmp_unit.c_str()) 
+//                 );
+
+  err = MEDcoordEcr(_medIdt, const_cast <char *> (_meshName.c_str()),
+                   _ptrMesh->_spaceDimension, 
+                   //const_cast <double *> ( _ptrMesh->_coordinate->_coordinate->get(MED_EN::MED_FULL_INTERLACE) ), 
+                   const_cast <double *> ( _ptrMesh->_coordinate->_coordinate.get(MED_EN::MED_FULL_INTERLACE) ), 
+                   med_2_2::MED_FULL_INTERLACE, _ptrMesh->_numberOfNodes,
+                   //  _ptrMesh->_coordinate->_numberOfNodes
+                   rep, const_cast <char *> (tmp_name.c_str()), 
+                   const_cast <char *> (tmp_unit.c_str()));
+
+  if (err<0) 
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write coordinates of mesh |" << _meshName.c_str() << "| in file |" << _fileName
+                                << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                << " with units names |"  << tmp_name
+                                << "| and units |"       << tmp_unit
+                                << " |")) ;    
+    
+
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+       //////////////////////////////////////////////////////////////////////////////////////
+       ///
+       /// Ecrit les numéros optionnels des noeuds
+       /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+
+
+      if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) {
+        
+        err =  MEDnumEcr(_medIdt, const_cast <char *> (_meshName.c_str()),
+                         const_cast <med_int *> (_ptrMesh->_coordinate->getNodesNumbers() ), 
+                         _ptrMesh->_numberOfNodes, med_2_2::MED_NOEUD,
+                        med_2_2::med_geometrie_element(0) );
+
+        if (err != MED_VALID) 
+          throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write optionnal numbers of mesh |" << 
+                                      _meshName.c_str() << "| in file |" <<
+                                      _fileName  << " |")) ;
+      }
+      //////////////////////////////////////////////////////////////////////////////////////
+
+  END_OF(LOC);
+    
+  return MED_VALID;
+}
+
+
+
+
+int MED_MESH_WRONLY_DRIVER22::writeConnectivities(medEntityMesh entity) const 
+{
+  const char * LOC="int MED_MESH_WRONLY_DRIVER22::writeConnectivities() const : ";
+  BEGIN_OF(LOC);
+
+  med_2_2::med_err err;
+  
+  // REM SI LA METHODE EST APPELEE DIRECTEMENT ET QUE LE MAILLAGE N'EST PAS CREE IL Y A PB !
+  // PG : IMPOSSIBLE : LA METHODE EST PRIVEE !
+    
+  // A FAIRE : A tester surtout dans les methodes de MESH.
+  //    if ( _ptrMesh->_connectivity == (CONNECTIVITY *) MED_INVALID )
+  if ( _ptrMesh->_connectivity == (CONNECTIVITY *) NULL )
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "The connectivity is not defined in the MESH object ")) ;
+
+
+  // Nodal connectivity for classic geometric types
+  if   ( _ptrMesh->existConnectivity(MED_NODAL,entity) ) 
+    {
+
+      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+
+      for (int i=0; i<numberOfTypes; i++) 
+       {
+
+         int    numberOfElements = _ptrMesh->getNumberOfElements (entity,types[i]);
+         const int * connectivity      = _ptrMesh->getConnectivity     (MED_EN::MED_FULL_INTERLACE, 
+                                                                        MED_NODAL, entity, types[i]); // ?? et SI MED_NODAL n'existe pas, recalcul auto ??
+      
+         // Pour l'instant la class utilise le multi.....
+         int multi = 0 ;
+         //      if (entity==MED_EN::MED_CELL)
+         //        if ( (types[i]/ 100) < _ptrMesh->_spaceDimension) 
+         //          multi=1 ;
+         int numberOfNodes = types[i]%100 ;
+         int * connectivityArray = new int[numberOfElements*(numberOfNodes+multi)];
+      
+         // version originale sans prise en compte des numéros optionnels 
+         //     
+         for (int j=0 ; j<numberOfElements; j++) 
+           {
+             for (int k=0; k<numberOfNodes; k++)
+               connectivityArray[j*(numberOfNodes+multi)+k]=connectivity[j*numberOfNodes+k] ;
+
+             if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
+           }
+      
+         //////////////////////////////////////////////////////////////////////////////////////
+         ///  Modification pour prise en compte de la numérotation optionnelle des noeuds   ///
+             //////////////////////////////////////////////////////////////////////////////////////
+             ///
+             /// Dénumérote les sommets des mailles pour leur rendre leurs numéros optionnels
+             /// Le traitement est identique Ã  la version originelle s'il n'y a pas de numérotation optionnelle
+
+             //        if (_ptrMesh->_arePresentOptionnalNodesNumbers==1) 
+             //                {
+             //                const int * nodesNumbers = _ptrMesh->_coordinate->getNodesNumbers();
+             //                for (int j=0 ; j<numberOfElements; j++) 
+             //                        {
+             //                        for (int k=0; k<numberOfNodes; k++) connectivityArray[j*(numberOfNodes+multi)+k]=nodesNumbers[connectivity[j*numberOfNodes+k]-1] ;
+             //                        if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
+             //                        }
+             //                }
+             //        else
+             //                {
+             //                for (int j=0 ; j<numberOfElements; j++) 
+             //                        {
+             //                        for (int k=0; k<numberOfNodes; k++) connectivityArray[j*(numberOfNodes+multi)+k]=connectivity[j*numberOfNodes+k] ;
+             //                        if (multi>0) connectivityArray[j*(numberOfNodes+multi)+numberOfNodes]=0;
+             //                        }
+             //                }
+
+             //////////////////////////////////////////////////////////////////////////////////////
+      
+             //       err = MEDconnEcr( _medIdt, const_cast <char *> ( _meshName.c_str()), _ptrMesh->_spaceDimension,
+             //                        connectivityArray, MED_FR::MED_FULL_INTERLACE , numberOfElements,
+             //                        MED_FR::MED_LECTURE_ECRITURE,
+             //                        (MED_FR::med_entite_maillage  ) entity, 
+             //                        (MED_FR::med_geometrie_element) types[i], MED_FR::MED_NOD );
+
+             //          err = MEDconnEcr(_medIdt, const_cast <char *> ( _meshName.c_str()),
+             //                           _ptrMesh->_spaceDimension, connectivityArray,
+             //                           MED_FR::MED_FULL_INTERLACE , numberOfElements,
+             //                           (MED_FR::med_entite_maillage  ) entity, 
+             //                           (MED_FR::med_geometrie_element) types[i],
+             //                           med_2_2::MED_NOD);
+             
+             err = MEDconnEcr(_medIdt, const_cast <char *> ( _meshName.c_str()),
+                              _ptrMesh->_spaceDimension, connectivityArray,
+                              med_2_2::MED_FULL_INTERLACE , numberOfElements,
+                              (med_2_2::med_entite_maillage  ) MED_CELL, 
+                              (med_2_2::med_geometrie_element) types[i],
+                              med_2_2::MED_NOD);
+
+             delete[] connectivityArray ;
+
+             if (err<0) // ETENDRE LES EXPLICATIONS
+               throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write connectivities of mesh |" << _meshName.c_str() << "| in file |" << _fileName
+                                            << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                            ));
+       }
+
+    }
+
+
+  // Polygons writing
+  if (_ptrMesh->existPolygonsConnectivity(MED_NODAL,entity))
+    {
+      err = MEDpolygoneConnEcr(_medIdt,
+                              const_cast <char *> (_meshName.c_str()),
+                              const_cast <med_int*> (_ptrMesh->getPolygonsConnectivityIndex(MED_NODAL,entity)),
+                              _ptrMesh->getNumberOfPolygons()+1,
+                              const_cast <med_int*> (_ptrMesh->getPolygonsConnectivity(MED_NODAL,entity)),
+                              (med_2_2::med_entite_maillage) entity,
+                              med_2_2::MED_NOD);
+
+      if (err<0)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write polygons nodal connectivities of mesh |" <<  _meshName.c_str() << "| in file |" << _fileName
+                                            << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                            ));
+    }
+
+
+  // Polyhedron writing
+  if (_ptrMesh->existPolyhedronConnectivity(MED_NODAL,entity))
+    {
+      err = MEDpolyedreConnEcr(_medIdt,
+                              const_cast <char *> (_meshName.c_str()),
+                              const_cast <med_int*> (_ptrMesh->getPolyhedronIndex(MED_NODAL)),
+                              _ptrMesh->getNumberOfPolyhedron()+1,
+                              const_cast <med_int*> (_ptrMesh->getPolyhedronFacesIndex()),
+                              _ptrMesh->getNumberOfPolyhedronFaces()+1,
+                              const_cast <med_int*> (_ptrMesh->getPolyhedronConnectivity(MED_NODAL)),
+                              med_2_2::MED_NOD);
+
+      if (err<0)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write polyhedron nodal connectivities of mesh |" << _meshName.c_str() << "| in file |" << _fileName
+                                    << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                            ));
+    }
+
+
+  // Descending connectivity for classic geometric types
+  if   ( _ptrMesh->existConnectivity(MED_DESCENDING,entity) )
+    {
+      
+      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+      
+      for (int i=0; i<numberOfTypes; i++)
+       {
+       
+         int    numberOfElements = _ptrMesh->getNumberOfElements (entity,types[i]);
+         const int * connectivity = _ptrMesh->getConnectivity(MED_EN::MED_FULL_INTERLACE, MED_DESCENDING, entity, types[i]); 
+      
+      // Pour l'instant la class utilise le multi.....
+         //       err = MED_FR::MEDconnEcr( _medIdt,
+         //                            const_cast <char *> ( _meshName.c_str()),
+         //                            _ptrMesh->_spaceDimension,
+         //                            const_cast <int *> (connectivity),
+         //                            MED_FR::MED_FULL_INTERLACE,
+         //                            numberOfElements,
+         //                            MED_FR::MED_LECTURE_ECRITURE,
+         //                            (MED_FR::med_entite_maillage  ) entity, 
+         //                            (MED_FR::med_geometrie_element) types[i],
+         //                            MED_FR::MED_DESC );
+
+         err = med_2_2::MEDconnEcr(_medIdt,
+                               const_cast <char *> ( _meshName.c_str()),
+                               _ptrMesh->_spaceDimension,
+                               const_cast <int *> (connectivity),
+                               med_2_2::MED_FULL_INTERLACE,
+                               numberOfElements,
+                               (med_2_2::med_entite_maillage  ) entity, 
+                               (med_2_2::med_geometrie_element) types[i],
+                               med_2_2::MED_DESC );
+       
+         if (err<0) // ETENDRE LES EXPLICATIONS
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write connectivities of mesh |" << _meshName.c_str() << "| in file |" << _fileName
+                                        << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                        )) ;
+            
+       }
+    }
+
+
+  // Polygons writing
+  if (_ptrMesh->existPolygonsConnectivity(MED_DESCENDING,entity))
+    {
+      err = MEDpolygoneConnEcr(_medIdt,
+                              const_cast <char *> (_meshName.c_str()),
+                              const_cast <med_int*> (_ptrMesh->getPolygonsConnectivityIndex(MED_DESCENDING,entity)),
+                              _ptrMesh->getNumberOfPolygons()+1,
+                              const_cast <med_int*> (_ptrMesh->getPolygonsConnectivity(MED_DESCENDING,entity)),
+                              (med_2_2::med_entite_maillage) entity,
+                              med_2_2::MED_DESC);
+
+      if (err<0)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write polygons descending connectivities of mesh |" <<  _meshName.c_str() << "| in file |" << _fileName
+                                            << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                            ));
+    }
+
+
+  // Polyhedron writing
+  if (_ptrMesh->existPolyhedronConnectivity(MED_DESCENDING,entity))
+    {
+      med_int NumberOfFaces = _ptrMesh->getPolyhedronIndex(MED_DESCENDING)[_ptrMesh->getNumberOfPolyhedron()]-1;
+      vector<med_int> FacesGeometricTypes(NumberOfFaces,MED_POLYGON); // by default all polyhedron faces are polygons
+
+      err = MEDpolyedreConnEcr(_medIdt,
+                              const_cast <char *> (_meshName.c_str()),
+                              const_cast <med_int*> (_ptrMesh->getPolyhedronIndex(MED_DESCENDING)),
+                              _ptrMesh->getNumberOfPolyhedron()+1,
+                              &FacesGeometricTypes[0],
+                              NumberOfFaces,
+                              const_cast <med_int*> (_ptrMesh->getPolyhedronConnectivity(MED_DESCENDING)),
+                              med_2_2::MED_DESC);
+
+      if (err<0)
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) <<"Can't write polyhedron descending connectivities of mesh |" << _meshName.c_str() << "| in file |" << _fileName
+                                            << "| with dimension |"  << _ptrMesh->_spaceDimension <<"| and" 
+                                            ));
+    }
+
+
+  END_OF(LOC);
+  return MED_VALID;
+}
+
+int MED_MESH_WRONLY_DRIVER22::writeFamilyNumbers() const {
+  
+  const char * LOC="int MED_MESH_WRONLY_DRIVER22::writeFamilyNumbers() const : ";
+  BEGIN_OF(LOC);
+
+  med_2_2::med_err err;
+  
+  // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArrayNodeFamily DOIT ETRE ENLEVER DE LA CLASSE MESH
+
+  { // Node related block
+    
+    // We build the array from the families list objects :
+    int NumberOfNodes = _ptrMesh->getNumberOfNodes() ;
+    int * MEDArrayNodeFamily = new int[NumberOfNodes] ;
+    // family 0 by default
+    for (int i=0; i<NumberOfNodes; i++)
+      MEDArrayNodeFamily[i]=0;
+    //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(MED_NODE);
+    vector<FAMILY*> * myFamilies = &_ptrMesh->_familyNode;
+    int NumberOfNodesFamilies = myFamilies->size() ;
+    //bool ToDestroy = false;
+    if (0 == NumberOfNodesFamilies) {
+      //ToDestroy = true ;
+      vector<GROUP*> myGroups = _ptrMesh->getGroups(MED_NODE);
+      int NumberOfGroups = myGroups.size() ;
+      // build families from groups
+      for (int i=0; i<NumberOfGroups; i++) {
+       SUPPORT * mySupport = myGroups[i] ;
+       FAMILY* myFamily = new FAMILY(*mySupport);
+       myFamily->setIdentifier(i+1);
+       myFamilies->push_back(myFamily);
+      }
+      NumberOfNodesFamilies=myFamilies->size() ;
+    }
+    for (int i=0 ; i<NumberOfNodesFamilies; i++) {
+      //SCRUTE(i);
+      //SCRUTE(myFamilies[i]->getName());
+      int FamilyIdentifier = (*myFamilies)[i]->getIdentifier() ;
+      int TotalNumber = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
+      if ((*myFamilies)[i]->isOnAllElements())
+       for (int j=0; j<TotalNumber; j++)
+         MEDArrayNodeFamily[j]=FamilyIdentifier;
+      else {
+       const int * Number = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
+       for (int j=0; j<TotalNumber; j++)
+         MEDArrayNodeFamily[Number[j]-1]=FamilyIdentifier ;
+      }
+    }
+
+    for(int j=0; j<NumberOfNodes; j++) {
+      SCRUTE(MEDArrayNodeFamily[j]);
+    }
+
+//     if ( !_ptrMesh->getIsAGrid() )
+
+      err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                   MEDArrayNodeFamily, NumberOfNodes, med_2_2::MED_NOEUD,
+                   (med_2_2::med_geometrie_element) MED_NONE);
+
+//     else
+//       err = MEDfamGridEcr(_medIdt,
+//                       const_cast <char *> (_ptrMesh->_name.c_str()),
+//                       MEDArrayNodeFamily,
+//                       NumberOfNodes,
+//                       MED_FR::MED_LECTURE_ECRITURE,
+//                       MED_FR::MED_NOEUD);
+
+    if ( err != MED_VALID) 
+      throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write node family for the |"<< NumberOfNodes
+                                  << "| nodes in mesh |" 
+                                  << _ptrMesh->_name.c_str() << "|" ));
+    delete[] MEDArrayNodeFamily;
+    //if (true == ToDestroy)
+    //  for (int i=0; i<NumberOfNodesFamilies; i++)
+    //   delete myFamilies[i];
+  }
+    
+  { // CELLS RELATED BLOCK
+    medEntityMesh entity=MED_EN::MED_CELL;
+    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
+    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
+
+      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+
+      // We build the array from the families list objects :
+      int NumberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS);
+      int * MEDArrayFamily = new int[NumberOfElements] ;
+      // family 0 by default
+      for (int i=0; i<NumberOfElements; i++)
+       MEDArrayFamily[i]=0;
+      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity);
+      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyCell ;
+      int NumberOfFamilies = myFamilies->size() ;
+      //bool ToDestroy = false;
+      if (0 == NumberOfFamilies) {
+       //ToDestroy = true ;
+       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
+       int NumberOfGroups = myGroups.size() ;
+       // build families from groups
+       for (int i=0; i<NumberOfGroups; i++) {
+         SCRUTE( myGroups[i]->getName() );
+         SUPPORT * mySupport = myGroups[i] ;
+         FAMILY* myFamily = new FAMILY(*mySupport);
+         myFamily->setIdentifier(-i-1);
+         myFamilies->push_back(myFamily);
+       }
+       NumberOfFamilies=myFamilies->size() ;
+      }
+      for (int i=0 ; i<NumberOfFamilies; i++) {
+       int FamilyIdentifier = (*myFamilies)[i]->getIdentifier() ;
+       int TotalNumber = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
+       if ((*myFamilies)[i]->isOnAllElements())
+         for (int ii=0; ii<TotalNumber; ii++)
+           MEDArrayFamily[ii]=FamilyIdentifier;
+       else {
+         const int * Number = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
+         for (int ii=0; ii<TotalNumber; ii++)
+           MEDArrayFamily[Number[ii]-1]=FamilyIdentifier ;
+       }
+      }
+
+      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgth=NumberOfElements;
+       med_2_2::med_int *temp=new med_2_2::med_int[lgth];
+       for(int i2=0;i2<lgth;i2++)
+         temp[i2]=(med_2_2::med_int) (MEDArrayFamily[i2]);
+#endif
+      for (int i=0; i<numberOfTypes; i++) {
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       temp+typeCount[i]-1,typeCount[i+1]-typeCount[i],
+                       med_2_2::MED_REMP ,
+                       (med_2_2::med_entite_maillage) entity,
+                       (med_2_2::med_geometrie_element) types[i]
+);
+#else
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       (MEDArrayFamily+typeCount[i]-1),
+                       (typeCount[i+1]-typeCount[i]),
+                       (med_2_2::med_entite_maillage) entity,
+                       (med_2_2::med_geometrie_element) types[i]); 
+
+       MESSAGE("OK "<<i);
+       if ( err != MED_VALID) 
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
+                                      << "| cells of geometric type |" << geoNames[types[i]] <<"|in mesh |"      
+                                      << _ptrMesh->_name.c_str() << "|" ));   
+      }
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      delete [] temp;
+#endif
+      delete[] MEDArrayFamily ;
+      //if (true == ToDestroy) {
+      //  int NumberOfFamilies = myFamilies->size();
+      //  for (int i=0; i<NumberOfFamilies; i++)
+      //    delete myFamilies[i];
+      //}
+    }
+  }
+
+  { // FACE RELATED BLOCK
+    medEntityMesh entity=MED_EN::MED_FACE;
+    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
+    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
+
+      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+      SCRUTE(numberOfTypes);
+      
+      int numberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS) ;
+      int * familyArray = new int[numberOfElements] ;
+      for (int i=0;i<numberOfElements;i++)
+       familyArray[i]=0;
+
+      int numberOfFamilies = _ptrMesh->getNumberOfFamilies(entity) ;
+      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity) ;
+      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyFace ;
+      //bool ToDestroy = false;
+      if (0 == numberOfFamilies) {
+       //ToDestroy = true ;
+       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
+       int NumberOfGroups = myGroups.size() ;
+       // build families from groups
+       for (int i=0; i<NumberOfGroups; i++) {
+         SCRUTE( myGroups[i]->getName() );
+         SUPPORT * mySupport = myGroups[i] ;
+         FAMILY* myFamily = new FAMILY(*mySupport);
+         myFamily->setIdentifier(-i-1000);
+         myFamilies->push_back(myFamily);
+       }
+       numberOfFamilies=myFamilies->size() ;
+      }
+      for (int i=0;i<numberOfFamilies;i++) {
+       int familyNumber = (*myFamilies)[i]->getIdentifier() ;
+       int numberOfFamilyElements = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
+       if ((*myFamilies)[i]->isOnAllElements())
+         for (int ii=0; ii<numberOfFamilyElements; ii++)
+           familyArray[ii]=familyNumber;
+       else {
+         const int * myFamilyElements = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
+         for (int ii=0;ii<numberOfFamilyElements;ii++)
+           familyArray[myFamilyElements[ii]-1]=familyNumber;
+       }
+      }
+
+      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgth=numberOfElements;
+       med_2_2::med_int *temp=new med_2_2::med_int[lgth];
+       for(int i2=0;i2<lgth;i2++)
+         temp[i2]=(med_2_2::med_int) (familyArray[i2]);
+#endif
+      for (int i=0; i<numberOfTypes; i++) {
+       int typeNumberOfElements = typeCount[i+1] - typeCount[i] ;
+
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       familyArray+typeCount[i]-1, typeNumberOfElements,
+                       (med_2_2::med_entite_maillage) entity,
+                       (med_2_2::med_geometrie_element) types[i]); 
+#endif
+       if ( err != MED_VALID) 
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
+                                      << "| faces of geometric type |" << geoNames[types[i]] <<"|in mesh |"      
+                                      << _ptrMesh->_name.c_str() << "|" ));   
+      }
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      delete [] temp;
+#endif
+      delete[] familyArray ;
+      //if (true == ToDestroy) {
+      //  int NumberOfFamilies = myFamilies->size();
+      //    for (int i=0; i<NumberOfFamilies; i++)
+      //      delete myFamilies[i];
+      //}
+    }
+  }
+
+  { // EDGE RELATED BLOCK
+    //medEntityMesh entity=MED_EN::MED_FACE;
+    medEntityMesh entity=MED_EN::MED_EDGE;
+    // SOLUTION TEMPORAIRE CAR _ptrMesh->_MEDArray____Family DOIT ETRE ENLEVER DE LA CLASSE MESH
+    if  ( ( _ptrMesh->existConnectivity(MED_NODAL,entity) )|( _ptrMesh->existConnectivity(MED_DESCENDING,entity) ) ) { 
+
+      int numberOfTypes           = _ptrMesh->getNumberOfTypes (entity) ;
+      const medGeometryElement  * types = _ptrMesh->getTypes         (entity) ;
+      
+      int numberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS) ;
+      int * familyArray = new int[numberOfElements] ;
+      for (int i=0;i<numberOfElements;i++)
+       familyArray[i]=0;
+
+      int numberOfFamilies = _ptrMesh->getNumberOfFamilies(entity) ;
+      //vector<FAMILY*> myFamilies = _ptrMesh->getFamilies(entity) ;
+      vector<FAMILY*> * myFamilies = &_ptrMesh->_familyEdge ;
+      //bool ToDestroy = false;
+      if (0 == numberOfFamilies) {
+       //ToDestroy = true ;
+       vector<GROUP*> myGroups = _ptrMesh->getGroups(entity);
+       int NumberOfGroups = myGroups.size() ;
+       // build families from groups
+       for (int i=0; i<NumberOfGroups; i++) {
+         SCRUTE( myGroups[i]->getName() );
+         SUPPORT * mySupport = myGroups[i] ;
+         FAMILY* myFamily = new FAMILY(*mySupport);
+         myFamily->setIdentifier(-i-2000);
+         myFamilies->push_back(myFamily);
+       }
+       numberOfFamilies=myFamilies->size() ;
+      }
+      for (int i=0;i<numberOfFamilies;i++) {
+       int familyNumber = (*myFamilies)[i]->getIdentifier() ;
+       int numberOfFamilyElements = (*myFamilies)[i]->getNumberOfElements(MED_ALL_ELEMENTS) ;
+       if ((*myFamilies)[i]->isOnAllElements())
+         for (int ii=0; ii<numberOfFamilyElements; ii++)
+           familyArray[ii]=familyNumber;
+       else {
+         const int * myFamilyElements = (*myFamilies)[i]->getNumber(MED_ALL_ELEMENTS) ;
+         for (int ii=0;ii<numberOfFamilyElements;ii++)
+           familyArray[myFamilyElements[ii]-1]=familyNumber;
+       }
+      }
+
+      const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ;
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+       int lgth=numberOfElements;
+       med_2_2::med_int *temp=new med_2_2::med_int[lgth];
+       for(int i2=0;i2<lgth;i2++)
+         temp[i2]=(med_2_2::med_int) (familyArray[i2]);
+#endif
+      for (int i=0; i<numberOfTypes; i++) {
+       int typeNumberOfElements = typeCount[i+1] - typeCount[i] ;
+
+       err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ),
+                       familyArray+typeCount[i]-1, typeNumberOfElements,
+                       (med_2_2::med_entite_maillage) entity,
+                       (med_2_2::med_geometrie_element) types[i]); 
+
+       if ( err != MED_VALID) 
+         throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i])
+                                      << "| edges of geometric type |" << geoNames[types[i]] <<"|in mesh |"      
+                                      << _ptrMesh->_name.c_str() << "|" ));   
+      }
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      delete [] temp;
+#endif
+      delete[] familyArray ;
+      //if (true == ToDestroy) {
+      //  int NumberOfFamilies = myFamilies->size();
+      //  for (int i=0; i<NumberOfFamilies; i++)
+      //    delete myFamilies[i];
+      //}
+    }
+  }
+    
+  END_OF(LOC);
+  return MED_VALID;
+}
+
+int MED_MESH_WRONLY_DRIVER22::writeFamilies(vector<FAMILY*> & families ) const
+{
+  
+  const char * LOC="int MED_MESH_WRONLY_DRIVER22::writeFamilies(vector<FAMILY*> families) const : ";
+  BEGIN_OF(LOC);
+
+  med_2_2::med_err err;
+  
+  MESSAGE(LOC<<" families.size() :"<<families.size());
+
+  for (unsigned int i=0; i< families.size(); i++) {
+
+    int      numberOfAttributes         = families[i]->getNumberOfAttributes ();
+    string   attributesDescriptions     = "";
+
+    // Recompose the attributes descriptions arg for MED
+    for (int j=0; j < numberOfAttributes; j++) {
+        
+      string attributeDescription = families[i]->getAttributeDescription(j+1);
+        
+      if ( attributeDescription.size() > MED_TAILLE_DESC )
+       throw MEDEXCEPTION( LOCALIZED(STRING(LOC) << "The size of the attribute description n° |" << j+1 << "| of the family |" << families[i]->getName()
+                                     << "| with identifier |" << families[i]->getIdentifier()  << "| is |" 
+                                     <<  attributeDescription.size()  <<"| and is more than |" <<  MED_TAILLE_DESC << "|")) ;
+        
+      attributesDescriptions += attributeDescription;
+    }
+      
+
+    int      numberOfGroups  = families[i]->getNumberOfGroups();
+    string   groupsNames(numberOfGroups*MED_TAILLE_LNOM,'\0') ;
+    // Recompose the groups names arg for MED
+    for (int j=0; j < numberOfGroups; j++) {
+
+      string groupName = families[i]->getGroupName(j+1);
+       
+      if ( groupName.size() > MED_TAILLE_LNOM )
+       throw MEDEXCEPTION( LOCALIZED(STRING(LOC) << "The size of the group name  n° |" << j+1 << "| of the family |" << families[i]->getName()
+                                     << "| with identifier |" << families[i]->getIdentifier()  << "| is |" 
+                                     <<  groupName.size()  <<"| and is more than |" << MED_TAILLE_LNOM << "|")) ;
+        
+
+      int length = min(MED_TAILLE_LNOM,(int)groupName.size());
+      groupsNames.replace(j*MED_TAILLE_LNOM,length, groupName,0,length);
+      
+    }
+
+    // test if the family already exists (HDF trick waiting a MED evolution to be replaced)
+
+    string dataGroupFam;
+    if (families[i]->getEntity() == MED_NODE)
+      dataGroupFam = "/ENS_MAA/"+_meshName+"/FAS/NOEUD/"+families[i]->getName()+"/";  
+    else
+      dataGroupFam = "/ENS_MAA/"+_meshName+"/FAS/ELEM/"+families[i]->getName()+"/"; 
+
+    SCRUTE("|"<<dataGroupFam<<"|");
+    err = med_2_2::_MEDdatagroupOuvrir(_medIdt,const_cast <char *> (dataGroupFam.c_str()) ) ;
+    if ( err < MED_VALID ) {
+      SCRUTE(err);
+
+      MESSAGE(LOC<<"families[i]->getName().c_str() : "<<families[i]->getName().c_str());
+      MESSAGE(LOC<<"_meshName.c_str() : "<<_meshName.c_str());
+      MESSAGE(LOC<<"families[i]->getIdentifier() : "<<families[i]->getIdentifier());
+      MESSAGE(LOC<<"numberOfAttributes : "<<numberOfAttributes);
+       
+      //MESSAGE(LOC<<"families[i]->getAttributesIdentifiers() : "<<families[i]->getAttributesIdentifiers()[0]);
+      //MESSAGE(LOC<<"families[i]->getAttributesValues() : "<<families[i]->getAttributesValues()[0]);
+      MESSAGE(LOC<<"attributesDescriptions.c_str() : "<<attributesDescriptions.c_str());
+      MESSAGE(LOC<<"numberOfGroups : "<<numberOfGroups);
+      MESSAGE(LOC<<"groupsNames.c_str() : "<<groupsNames.c_str());
+#if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
+      int lgth=families[i]->getNumberOfAttributes();
+      med_2_2::med_int *  AttributesIdentifier2 = new med_2_2::med_int[lgth] ;
+      med_2_2::med_int *  AttributesValues2     = new med_2_2::med_int[lgth] ;
+      for(med_2_2::med_int i2=0;i2<lgth;i2++)
+       {
+         AttributesIdentifier2[i2]=(med_2_2::med_int)(families[i]->getAttributesIdentifiers()[i2]);
+         AttributesValues2[i2]=(med_2_2::med_int)(families[i]->getAttributesValues()[i2]);
+       }
+      err = med_2_2::MEDfamCr( _medIdt, 
+                             const_cast <char *> ( _meshName.c_str() ),
+                             const_cast <char *> ( families[i]->getName().c_str() ),
+                             families[i]->getIdentifier(), 
+                             AttributesIdentifier2,
+                             AttributesValues2,
+                             const_cast <char *> (attributesDescriptions.c_str()), 
+                             numberOfAttributes,  
+                             const_cast <char *> (groupsNames.c_str()), 
+                             numberOfGroups);
+      delete [] AttributesIdentifier2;
+      delete [] AttributesValues2;
+#else
+      err = med_2_2::MEDfamCr( _medIdt, 
+                             const_cast <char *> ( _meshName.c_str() ),
+                             const_cast <char *> ( families[i]->getName().c_str() ),
+                             families[i]->getIdentifier(), 
+                             families[i]->getAttributesIdentifiers(),
+                             families[i]->getAttributesValues(),
+                             const_cast <char *> (attributesDescriptions.c_str()), 
+                             numberOfAttributes,  
+                             const_cast <char *> (groupsNames.c_str()), 
+                             numberOfGroups);
+#endif
+      SCRUTE(err);
+      if ( err != MED_VALID) 
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't create family |" << families[i]->getName()
+                                    << "| with identifier |" << families[i]->getIdentifier()  << "| groups names |" 
+                                    << groupsNames  <<"| and  attributes descriptions |" << attributesDescriptions << "|")) ;
+    }
+    else
+      med_2_2::_MEDdatagroupFermer(_medIdt);
+
+
+  }
+
+  END_OF(LOC);
+    
+  return MED_VALID;
+}
+
+
+// A FAIRE POUR LES NOEUDS ET LES ELEMENTS ret = MEDfamEcr(
+
+
+
+/*--------------------- RDWR PART -------------------------------*/
+
+MED_MESH_RDWR_DRIVER22::MED_MESH_RDWR_DRIVER22()
+{
+}
+
+MED_MESH_RDWR_DRIVER22::MED_MESH_RDWR_DRIVER22(const string & fileName,
+                                              MESH * ptrMesh):
+  MED_MESH_DRIVER(fileName,ptrMesh,MED_RDWR),
+  IMED_MESH_RDONLY_DRIVER(fileName,ptrMesh),
+  IMED_MESH_WRONLY_DRIVER(fileName,ptrMesh),
+  IMED_MESH_RDWR_DRIVER(fileName,ptrMesh),
+  MED_MESH_DRIVER22(fileName,ptrMesh,MED_RDWR),
+  MED_MESH_RDONLY_DRIVER22(fileName,ptrMesh),
+  MED_MESH_WRONLY_DRIVER22(fileName,ptrMesh)
+{
+  MESSAGE("MED_MESH_RDWR_DRIVER22::MED_MESH_RDWR_DRIVER22(const string & fileName, MESH * ptrMesh) has been created");
+}
+
+MED_MESH_RDWR_DRIVER22::MED_MESH_RDWR_DRIVER22(const MED_MESH_RDWR_DRIVER22 & driver):
+  MED_MESH_DRIVER(driver),
+  IMED_MESH_RDONLY_DRIVER(driver),
+  IMED_MESH_WRONLY_DRIVER(driver),
+  IMED_MESH_RDWR_DRIVER(driver),
+  MED_MESH_DRIVER22(driver),
+  MED_MESH_RDONLY_DRIVER22(driver),
+  MED_MESH_WRONLY_DRIVER22(driver)
+{
+}
+
+MED_MESH_RDWR_DRIVER22::~MED_MESH_RDWR_DRIVER22() {
+  //MESSAGE("MED_MESH_RDWR_DRIVER22::MED_MESH_RDWR_DRIVER22(const string & fileName, MESH * ptrMesh) has been destroyed");
+} 
+  
+GENDRIVER * MED_MESH_RDWR_DRIVER22::copy(void) const
+{
+  return new MED_MESH_RDWR_DRIVER22(*this);
+}
+
+void MED_MESH_RDWR_DRIVER22::write(void) const
+{
+  MED_MESH_WRONLY_DRIVER22::write();
+}
+void MED_MESH_RDWR_DRIVER22::read (void)
+{
+  MED_MESH_RDONLY_DRIVER22::read();
+}
+
diff --git a/src/MEDMEM/MEDMEM_MedMeshDriver22.hxx b/src/MEDMEM/MEDMEM_MedMeshDriver22.hxx
new file mode 100644 (file)
index 0000000..a19a939
--- /dev/null
@@ -0,0 +1,199 @@
+#ifndef MED_MESH_DRIVER22_HXX
+#define MED_MESH_DRIVER22_HXX
+
+#include "MEDMEM_MedMeshDriver.hxx"
+#include "MEDMEM_define.hxx"
+#include "MEDMEM_Compatibility21_22.hxx"
+
+/*!
+
+  Driver Med for MESH.
+
+  Generic part : implement open and close methods.
+
+*/
+
+namespace MEDMEM {
+class MESH;
+class FAMILY;
+class GROUP;
+class CONNECTIVITY;
+
+class MED_MESH_DRIVER22 : public virtual MED_MESH_DRIVER
+{
+protected:
+  
+  med_2_2::med_idt  _medIdt ;
+  
+public :
+
+  // all MED cell type
+  static const med_2_2::med_geometrie_element all_cell_type[MED_NBR_GEOMETRIE_MAILLE];
+  
+  static const char * const all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE];
+
+  /*!
+    Constructor.
+  */
+  MED_MESH_DRIVER22() ;
+  /*!
+    Constructor.
+  */
+  MED_MESH_DRIVER22(const string & fileName,  
+                   MESH * ptrMesh, 
+                   MED_EN::med_mode_acces accessMode) ;
+  /*!
+    Copy constructor.
+  */
+  MED_MESH_DRIVER22(const MED_MESH_DRIVER22 & driver) ;
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MESH_DRIVER22() ;
+
+  void open();
+  void close();
+};
+
+/*!
+
+  Driver Med for MESH : Read only.
+
+  Implement read method.
+
+*/
+
+class MED_MESH_RDONLY_DRIVER22 : public virtual IMED_MESH_RDONLY_DRIVER, public virtual MED_MESH_DRIVER22
+{
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_MESH_RDONLY_DRIVER22() ;
+  /*!
+    Constructor.
+  */
+  MED_MESH_RDONLY_DRIVER22(const string & fileName, MESH * ptrMesh) ;
+  /*!
+    Copy constructor.
+  */
+  MED_MESH_RDONLY_DRIVER22(const MED_MESH_RDONLY_DRIVER22 & driver) ;
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MESH_RDONLY_DRIVER22() ;
+  
+  /*!
+    Read MESH in the specified file.
+  */
+  void read ( void );
+
+private:
+  int getCOORDINATE();
+  int getCONNECTIVITY();
+  int getFAMILY();
+  int getNodalConnectivity(CONNECTIVITY * Connectivity) ;
+  int getNodesFamiliesNumber(int * MEDArrayNodeFamily) ;
+  int getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity) ;
+  void getGRID ();
+
+  GENDRIVER * copy ( void ) const ;
+
+};
+
+/*!
+
+  Driver Med for MESH : Write only.
+
+  Implement write method.
+
+*/
+
+class MED_MESH_WRONLY_DRIVER22 : public virtual IMED_MESH_WRONLY_DRIVER, public virtual MED_MESH_DRIVER22 {
+  
+public :
+  
+  /*!
+    Constructor.
+  */
+  MED_MESH_WRONLY_DRIVER22() ;
+  /*!
+    Constructor.
+  */
+  MED_MESH_WRONLY_DRIVER22(const string & fileName, MESH * ptrMesh) ;
+  /*!
+    Copy constructor.
+  */
+  MED_MESH_WRONLY_DRIVER22(const MED_MESH_WRONLY_DRIVER22 & driver) ;
+
+  /*!
+    Destructor.
+  */
+  virtual ~MED_MESH_WRONLY_DRIVER22() ;
+
+  /*!
+    Write MESH in the specified file.
+  */
+  void write( void ) const;
+
+private:
+  int writeCoordinates    ()                           const;
+  int writeConnectivities (MED_EN::medEntityMesh entity)       const;
+  int writeFamilyNumbers  ()                           const;
+  int writeFamilies       (vector<FAMILY*> & families) const;
+  int writeGRID() const;
+
+  GENDRIVER * copy ( void ) const ;
+};
+
+
+/*!
+
+  Driver Med for MESH : Read write.
+  - Use read method from MED_MESH_RDONLY_DRIVER
+  - Use write method from MED_MESH_WRONLY_DRIVER
+
+*/
+
+class MED_MESH_RDWR_DRIVER22 : public IMED_MESH_RDWR_DRIVER, public MED_MESH_RDONLY_DRIVER22, public MED_MESH_WRONLY_DRIVER22 {
+
+public :
+
+  /*!
+    Constructor.
+  */
+  MED_MESH_RDWR_DRIVER22() ;
+  /*!
+    Constructor.
+  */
+  MED_MESH_RDWR_DRIVER22(const string & fileName, MESH * ptrMesh) ;
+  /*!
+    Copy constructor.
+  */
+  MED_MESH_RDWR_DRIVER22(const MED_MESH_RDWR_DRIVER22 & driver) ;
+
+  /*!
+    Destructor.
+  */
+  ~MED_MESH_RDWR_DRIVER22() ;
+
+  /*!
+    Write MESH in the specified file.
+  */
+  void write(void) const;
+  /*!
+    Read MESH in the specified file.
+  */
+  void read (void);
+
+private:
+  GENDRIVER * copy(void) const ;
+
+};
+};
+
+#endif /* MED_MESH_DRIVER22_HXX */
diff --git a/src/MEDMEM/MEDMEM_MedVersion.cxx b/src/MEDMEM/MEDMEM_MedVersion.cxx
new file mode 100644 (file)
index 0000000..149cdef
--- /dev/null
@@ -0,0 +1,104 @@
+#include "MEDMEM_MedVersion.hxx"
+#include "utilities.h"
+#include "MEDMEM_Compatibility21_22.hxx"
+
+using namespace MEDMEM;
+using namespace MED_EN;
+
+medFileVersion MEDMEM::getMedFileVersion(const string & fileName)
+  throw (MEDEXCEPTION)
+{
+  medFileVersion version;
+
+  med_2_1::med_idt fid21;
+  med_2_2::med_idt fid22;
+
+  med_2_1::med_err ret21;
+  med_2_2::med_err ret22;
+
+  med_2_1::med_int major21;
+  med_2_1::med_int minor21;
+  med_2_1::med_int release21;
+
+  med_2_2::med_int major22;
+  med_2_2::med_int minor22;
+  med_2_2::med_int release22;
+
+  med_2_2::med_mode_acces access22 = med_2_2::MED_LECTURE;
+  med_2_1::med_mode_acces access21 = med_2_1::MED_LECT;
+
+  /*
+    Med Version 2.1 access to the file
+  */
+
+  fid21 = med_2_1::MEDouvrir((const_cast <char *> (fileName.c_str())),
+                            access21);
+
+  if (fid21 < 0)
+    throw MEDEXCEPTION("Problem in getMedFileVersion(const string &) Med file V2.1 access");
+
+  ret21 = med_2_1::MEDversionLire(fid21,&major21,&minor21,&release21);
+
+  if (ret21 < 0)
+    throw MEDEXCEPTION("Problem in getMedFileVersion(const string &) Med file V2.1 version numbers reading");
+
+  if ((minor21 == -1) || (release21 == -1))
+    {
+      MESSAGE("getMedFileVersion the file may have been produced by a version 2.1.x x<5");
+      minor21 = 1;
+      release21 = 5;
+    }
+
+  ret21 = med_2_1::MEDfermer(fid21);
+
+  if (ret21 < 0)
+    throw MEDEXCEPTION("Problem in getMedFileVersion(const string &) Med file V2.1 file closing");
+
+  /*
+    Med Version 2.2 access to the file
+  */
+
+  fid22 = med_2_2::MEDouvrir((const_cast <char *> (fileName.c_str())),
+                            access22);
+
+  if (fid22 < 0)
+    throw MEDEXCEPTION("Problem in getMedFileVersion(const string &) Med file V2.2 access");
+
+  ret22 = med_2_2::MEDversionLire(fid22,&major22,&minor22,&release22);
+
+  if (ret22 < 0)
+    throw MEDEXCEPTION("Problem in getMedFileVersion(const string &) Med file V2.2 version numbers reading");
+
+  if ((minor22 == -1) || (release22 == -1))
+    {
+      MESSAGE("getMedFileVersion the file may have been produced by a version 2.1.x x<5");
+      minor22 = 1;
+      release22 = 5;
+    }
+
+  ret22 = med_2_2::MEDfermer(fid22);
+
+  if (ret22 < 0)
+    throw MEDEXCEPTION("Problem in getMedFileVersion(const string &) Med file V2.2 file closing");
+
+  if ((major21 != major22) || (minor21 != minor22) || (release21 != release22))
+    throw MEDEXCEPTION("Problem in getMedFileVersion(const string &) Med file V21 and V22 version numbers are different");
+
+  MESSAGE("getMedFileVersion: status version 21 of the file major " << major21 << " minor " << minor21 << " release " << release21);
+
+  MESSAGE("getMedFileVersion: status version 22 of the file major " << major22 << " minor " << minor22 << " release " << release22);
+
+  if (major21 == 2)
+    {
+      if (minor21 == 1)
+       version = V21;
+      else if (minor21 > 1)
+       version = V22;
+    }
+  else
+    version = V22;
+
+  MESSAGE("getMedFileVersion the version of the file is " << version);
+
+  return version;
+}
diff --git a/src/MEDMEM/MEDMEM_MedVersion.hxx b/src/MEDMEM/MEDMEM_MedVersion.hxx
new file mode 100644 (file)
index 0000000..f68dca8
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef MED_VERSION_HXX
+#define MED_VERSION_HXX
+
+#include <string>
+#include "MEDMEM_Exception.hxx"
+#include "MEDMEM_define.hxx"
+
+namespace MEDMEM {
+
+  MED_EN::medFileVersion getMedFileVersion(const string & fileName)
+    throw (MEDEXCEPTION);
+}
+
+#endif /* MED_VERSION_HXX */
index 9a3a4485c6ee4c5cd5e617ee6b9ec5be1805f423..16dde5fbb3f16ffe8dfab4fb2cc6a44ae3319373 100644 (file)
@@ -4,8 +4,6 @@
 */
 
 #include <math.h>
 */
 
 #include <math.h>
-
-#include <list>
 #include <map>
 #include <sstream>
 
 #include <map>
 #include <sstream>
 
 #include "MEDMEM_Coordinate.hxx"
 #include "MEDMEM_Connectivity.hxx"
 #include "MEDMEM_CellModel.hxx"
 #include "MEDMEM_Coordinate.hxx"
 #include "MEDMEM_Connectivity.hxx"
 #include "MEDMEM_CellModel.hxx"
-
+#include "MEDMEM_Formulae.hxx"
+#include "MEDMEM_InterpolationHighLevelObjects.hxx"
 #include "MEDMEM_DriverFactory.hxx"
 
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 #include "MEDMEM_DriverFactory.hxx"
 
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
-//#include "MEDMEM_Grid.hxx" this inclision should have never be here !!!
-
-//update Families with content list
-//int family_count(int family_number, int count, int * entities_number, int * entities_list) ;
+#define MED_NOPDT -1
+#define MED_NONOR -1
 
 // ------- Drivers Management Part
 
 
 // ------- Drivers Management Part
 
@@ -246,6 +243,49 @@ MESH::~MESH() {
 
 }
 
 
 }
 
+/*
+  Method equivalent to getNumberOfTypes except that it includes not only classical Types but polygons/polyhedra also.
+ */
+int MESH::getNumberOfTypesWithPoly(MED_EN::medEntityMesh Entity) const
+{
+  if(_connectivity!= NULL)
+    return _connectivity->getNumberOfTypesWithPoly(Entity);
+  throw MEDEXCEPTION(LOCALIZED("MESH::getNumberOfTypesWithPoly( medEntityMesh ) : Connectivity not defined !"));
+}
+
+/*
+  Method equivalent to getTypesWithPoly except that it includes not only classical Types but polygons/polyhedra also.
+  WARNING the returned array MUST be deallocated.
+ */
+MED_EN::medGeometryElement * MESH::getTypesWithPoly(MED_EN::medEntityMesh Entity) const
+{
+  if (Entity == MED_EN::MED_NODE)
+    throw MEDEXCEPTION(LOCALIZED("MESH::getTypes( medEntityMesh ) : No medGeometryElement with MED_NODE entity !"));
+  if (_connectivity != NULL)
+    return _connectivity->getGeometricTypesWithPoly(Entity);
+  throw MEDEXCEPTION(LOCALIZED("MESH::getTypes( medEntityMesh ) : Connectivity not defined !"));
+}
+
+/*
+  Method equivalent to getNumberOfElementsWithPoly except that it includes not only classical Types but polygons/polyhedra also.
+ */
+int MESH::getNumberOfElementsWithPoly(MED_EN::medEntityMesh Entity, MED_EN::medGeometryElement Type) const
+{
+  if(Type==MED_POLYGON || Type==MED_POLYHEDRA)
+    {
+      int nbOfPolygs=_connectivity->getNumberOfElementOfPolyType(Entity);
+      return nbOfPolygs;
+    }
+  else if(Type==MED_ALL_ELEMENTS)
+    {
+      int nbOfClassicalTypes=getNumberOfElements(Entity,MED_ALL_ELEMENTS);
+      int nbOfClassicalTypes2=_connectivity->getNumberOfElementOfPolyType(Entity);
+      return nbOfClassicalTypes+nbOfClassicalTypes2;
+    }
+  else
+    return getNumberOfElements(Entity,Type);
+}
+
 MESH & MESH::operator=(const MESH &m)
 {
   const char * LOC = "MESH & MESH::operator=(const MESH &m) : ";
 MESH & MESH::operator=(const MESH &m)
 {
   const char * LOC = "MESH & MESH::operator=(const MESH &m) : ";
@@ -289,6 +329,12 @@ MESH & MESH::operator=(const MESH &m)
   return *this;
 }
 
   return *this;
 }
 
+bool MESH::operator==(const MESH& other) const
+{
+  BEGIN_OF("MESH::operator==");
+  return this==&other;
+}
+
 /*! Create a %MESH object using a %MESH driver of type %driverTypes (MED_DRIVER, ....) associated with file fileName. 
   The meshname driverName must already exists in the file.*/
 MESH::MESH(driverTypes driverType, const string &  fileName/*=""*/, const string &  driverName/*=""*/) throw (MEDEXCEPTION)
 /*! Create a %MESH object using a %MESH driver of type %driverTypes (MED_DRIVER, ....) associated with file fileName. 
   The meshname driverName must already exists in the file.*/
 MESH::MESH(driverTypes driverType, const string &  fileName/*=""*/, const string &  driverName/*=""*/) throw (MEDEXCEPTION)
@@ -306,22 +352,33 @@ MESH::MESH(driverTypes driverType, const string &  fileName/*=""*/, const string
   _drivers[current]->read();
   _drivers[current]->close();
 
   _drivers[current]->read();
   _drivers[current]->close();
 
-//   if (_isAGrid)
-//     ((GRID *) this)->fillMeshAfterRead();
-
   END_OF(LOC);
 };
 
   END_OF(LOC);
 };
 
+/*
+  for a deep comparison of 2 meshes.
+*/
+bool MESH::deepCompare(const MESH& other) const
+{
+  int size1=getSpaceDimension()*getNumberOfNodes();
+  int size2=other.getSpaceDimension()*other.getNumberOfNodes();
+  if(size1!=size2)
+    return false;
+  const double* coord1=getCoordinates(MED_FULL_INTERLACE);
+  const double* coord2=other.getCoordinates(MED_FULL_INTERLACE);
+  bool ret=true;
+  for(int i=0;i<size1 && ret;i++)
+    {
+      ret=(fabs(coord1[i]-coord2[i])<1e-15);
+    }
+  if(ret)
+    {
+      return _connectivity->deepCompare(*other._connectivity);
+    }
+  return ret;
+}
 
 
-//  Node MESH::Donne_Barycentre(const Maille &m) const
-//  {
-//    Node N=node[m[0]];
-//    for (int i=1;i<m.donne_nbr_sommets();i++) N=N+node[m[i]];
-//    N=N*(1.0/m.donne_nbr_sommets());
-//    return N;
-//  }
-
-ostream & MEDMEM::operator<<(ostream &os, const MESH &myMesh)
+ostream & ::MEDMEM::operator<<(ostream &os, const MESH &myMesh)
 {
   int spacedimension = myMesh.getSpaceDimension();
   int meshdimension  = myMesh.getMeshDimension();
 {
   int spacedimension = myMesh.getSpaceDimension();
   int meshdimension  = myMesh.getMeshDimension();
@@ -456,7 +513,6 @@ int MESH::getElementNumber(medConnectivity ConnectivityType, medEntityMesh Entit
   return cellsList.front() ;
 }
 
   return cellsList.front() ;
 }
 
-
 /*!
   Return a support which reference all elements on the boundary of mesh.
   
 /*!
   Return a support which reference all elements on the boundary of mesh.
   
@@ -469,109 +525,81 @@ SUPPORT * MESH::getBoundaryElements(medEntityMesh Entity)
   BEGIN_OF(LOC) ;
   // some test :
   // actually we could only get face (in 3D) and edge (in 2D)
   BEGIN_OF(LOC) ;
   // some test :
   // actually we could only get face (in 3D) and edge (in 2D)
-  if (_spaceDimension == 3) 
+  medEntityMesh entityToParse=Entity;
+  if(_spaceDimension == 3) 
     if (Entity != MED_FACE)
     if (Entity != MED_FACE)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 3D mesh for entity "<<Entity<<" !"));
-  if (_spaceDimension == 2) 
-    if (Entity != MED_EDGE)
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 2D mesh for entity "<<Entity<<" !"));
-  
-  // well, all rigth !
-  SUPPORT * mySupport = new SUPPORT(this,"Boundary",Entity);
-  //mySupport.setDescription("boundary of type ...");
-  mySupport->setAll(false);
+      if(Entity==MED_NODE)
+       entityToParse=MED_FACE;
+      else
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 3D mesh for entity "<<Entity<<" !"));
+  if(_spaceDimension == 2)
+    if(Entity != MED_EDGE)
+      if(Entity==MED_NODE)
+       entityToParse=MED_EDGE;
+      else
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 2D mesh for entity "<<Entity<<" !"));
   
   
-
   const int * myConnectivityValue = getReverseConnectivity(MED_DESCENDING) ;
   const int * myConnectivityIndex = getReverseConnectivityIndex(MED_DESCENDING) ;
   const int * myConnectivityValue = getReverseConnectivity(MED_DESCENDING) ;
   const int * myConnectivityIndex = getReverseConnectivityIndex(MED_DESCENDING) ;
-  int numberOf = getNumberOfElements(Entity,MED_ALL_ELEMENTS) ;
-  list<int> myElementsList ;
-  int size = 0 ;
+  int numberOf = getNumberOfElementsWithPoly(entityToParse,MED_ALL_ELEMENTS) ;
+  list<int> myElementsList;
+
   for (int i=0 ; i<numberOf; i++)
     if (myConnectivityValue[myConnectivityIndex[i]] == 0) {
   for (int i=0 ; i<numberOf; i++)
     if (myConnectivityValue[myConnectivityIndex[i]] == 0) {
-      myElementsList.push_back(i+1) ;
-      size++ ;
+      myElementsList.push_back(i+1);
+
     }
     }
-  // Well, we must know how many geometric type we have found
-  int * myListArray = new int[size] ;
-  int id = 0 ;
-  list<int>::iterator myElementsListIt ;
-  for (myElementsListIt=myElementsList.begin();myElementsListIt!=myElementsList.end();myElementsListIt++) {
-    myListArray[id]=(*myElementsListIt) ;
-    id ++ ;
-  }
+  if(Entity==MED_NODE)
+    return buildSupportOnNodeFromElementList(myElementsList,entityToParse);
+  else
+    return buildSupportOnElementsFromElementList(myElementsList,entityToParse);
+}
 
 
-  int numberOfGeometricType ;
-  medGeometryElement* geometricType ;
-  int * numberOfGaussPoint ;
-  int * geometricTypeNumber ;
-  int * numberOfElements ;
-  //MEDSKYLINEARRAY * mySkyLineArray = new MEDSKYLINEARRAY() ;
-  int * mySkyLineArrayIndex ;
+/*!
+  Method that do the same thing as buildSupportOnNodeFromElementList except that a SUPPORT is not created.
+ */
+void MESH::fillSupportOnNodeFromElementList(const list<int>& listOfElt, SUPPORT *supportToFill) const throw (MEDEXCEPTION)
+{
+  MED_EN::medEntityMesh entity=supportToFill->getEntity();
+  supportToFill->setAll(false);
+  supportToFill->setMesh((MESH *)this);
 
 
-  int numberOfType = getNumberOfTypes(Entity) ;
-  if (numberOfType == 1) { // wonderfull : it's easy !
-    numberOfGeometricType = 1 ;
-    geometricType = new medGeometryElement[1] ;
-    const medGeometryElement *  allType = getTypes(Entity);
-    geometricType[0] = allType[0] ;
-    numberOfGaussPoint = new int[1] ;
-    numberOfGaussPoint[0] = 1 ;
-    geometricTypeNumber = new int[1] ; // not use, but initialized to nothing
-    geometricTypeNumber[0] = 0 ;
-    numberOfElements = new int[1] ;
-    numberOfElements[0] = size ;
-    mySkyLineArrayIndex = new int[2] ;
-    mySkyLineArrayIndex[0]=1 ;
-    mySkyLineArrayIndex[1]=1+size ;
-  }
-  else {// hemmm
-    map<medGeometryElement,int> theType ;
-    for (myElementsListIt=myElementsList.begin();myElementsListIt!=myElementsList.end();myElementsListIt++) {
-      medGeometryElement myType = getElementType(Entity,*myElementsListIt) ;
-      if (theType.find(myType) != theType.end() )
-       theType[myType]+=1 ;
-      else
-       theType[myType]=1 ;
-    }
-    numberOfGeometricType = theType.size() ;
-    geometricType = new medGeometryElement[numberOfGeometricType] ;
-    //const medGeometryElement *  allType = getTypes(Entity); !! UNUSZED VARIABLE !!
-    numberOfGaussPoint = new int[numberOfGeometricType] ;
-    geometricTypeNumber = new int[numberOfGeometricType] ; // not use, but initialized to nothing
-    numberOfElements = new int[numberOfGeometricType] ;
-    mySkyLineArrayIndex = new int[numberOfGeometricType+1] ;
-    int index = 0 ;
-    mySkyLineArrayIndex[0]=1 ;
-    map<medGeometryElement,int>::iterator theTypeIt ;
-    for (theTypeIt=theType.begin();theTypeIt!=theType.end();theTypeIt++) {
-      geometricType[index] = (*theTypeIt).first ;
-      numberOfGaussPoint[index] = 1 ;
-      geometricTypeNumber[index] = 0 ;
-      numberOfElements[index] = (*theTypeIt).second ;
-      mySkyLineArrayIndex[index+1]=mySkyLineArrayIndex[index]+numberOfElements[index] ;
-      index++ ;
+  int i;
+  set<int> nodes;
+  for(list<int>::const_iterator iter=listOfElt.begin();iter!=listOfElt.end();iter++)
+    {
+      int lgth;
+      const int *conn=_connectivity->getConnectivityOfAnElementWithPoly(MED_NODAL,entity,*iter,lgth);
+      for(i=0;i<lgth;i++)
+       nodes.insert(conn[i]);
     }
     }
-  }
-  //mySkyLineArray->setMEDSKYLINEARRAY(numberOfGeometricType,size,mySkyLineArrayIndex,myListArray) ;
-  MEDSKYLINEARRAY * mySkyLineArray = new MEDSKYLINEARRAY(numberOfGeometricType,size,mySkyLineArrayIndex,myListArray) ;
+  list<int> nodesList;
+  for(set<int>::iterator iter2=nodes.begin();iter2!=nodes.end();iter2++)
+    nodesList.push_back(*iter2);
+  supportToFill->fillFromNodeList(nodesList);
+}
 
 
-  mySupport->setNumberOfGeometricType(numberOfGeometricType) ;
-  mySupport->setGeometricType(geometricType) ;
-  mySupport->setNumberOfGaussPoint(numberOfGaussPoint) ;
-  mySupport->setNumberOfElements(numberOfElements) ;
-  mySupport->setTotalNumberOfElements(size) ;
-  // mySupport->setGeometricTypeNumber(geometricTypeNumber) ;
-  mySupport->setNumber(mySkyLineArray) ;
-    
-  delete[] numberOfElements;
-  delete[] geometricTypeNumber;
-  delete[] numberOfGaussPoint;
-  delete[] geometricType;
-  delete[] mySkyLineArrayIndex;
-  delete[] myListArray;
-//   delete mySkyLineArray;
+/*!
+  Method created to factorize code. This method creates a new support on NODE (to deallocate) containing all the nodes id contained in elements 'listOfElt' of
+  entity 'entity'.
+ */
+SUPPORT *MESH::buildSupportOnNodeFromElementList(const list<int>& listOfElt,MED_EN::medEntityMesh entity) const throw (MEDEXCEPTION)
+{
+  SUPPORT * mySupport = new SUPPORT((MESH *)this,"Boundary",entity);
+  fillSupportOnNodeFromElementList(listOfElt,mySupport);
+  return mySupport;
+}
 
 
+/*!
+  Method created to factorize code. This method creates a new support on entity 'entity' (to deallocate) containing all the entities contained in 
+  elements 'listOfElt' of entity 'entity'.
+ */
+SUPPORT *MESH::buildSupportOnElementsFromElementList(const list<int>& listOfElt, MED_EN::medEntityMesh entity) const throw (MEDEXCEPTION)
+{
+  const char * LOC = "MESH::buildSupportOnElementsFromElementList : " ;
+  BEGIN_OF(LOC);
+  SUPPORT *mySupport=new SUPPORT((MESH *)this,"Boundary",entity);
+  mySupport->fillFromElementList(listOfElt);
   END_OF(LOC) ;
   return mySupport ;
 }
   END_OF(LOC) ;
   return mySupport ;
 }
@@ -598,20 +626,9 @@ FIELD<double>* MESH::getVolume(const SUPPORT * Support) const throw (MEDEXCEPTIO
   int nb_entity_type;
   // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
   int nb_entity_type;
   // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
-
-//    if (onAll)
-//      {
-//        nb_type = myMesh->getNumberOfTypes(support_entity);
-//        length_values = getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
-//        types = getTypes(support_entity);
-//      }
-//    else
-    {
-      nb_type = Support->getNumberOfTypes();
-      length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
-      types = Support->getTypes();
-    }
-
+  nb_type = Support->getNumberOfTypes();
+  length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
+  types = Support->getTypes();
   int index;
   FIELD<double>* Volume = new FIELD<double>(Support,1);
   //  double *volume = new double [length_values];
   int index;
   FIELD<double>* Volume = new FIELD<double>(Support,1);
   //  double *volume = new double [length_values];
@@ -631,10 +648,7 @@ FIELD<double>* MESH::getVolume(const SUPPORT * Support) const throw (MEDEXCEPTIO
   Volume->setIterationNumber(0);
   Volume->setOrderNumber(0);
   Volume->setTime(0.0);
   Volume->setIterationNumber(0);
   Volume->setOrderNumber(0);
   Volume->setTime(0.0);
-
-  //const double *volume = Volume->getValue(MED_FULL_INTERLACE);
   MEDARRAY<double> *volume = Volume->getvalue();
   MEDARRAY<double> *volume = Volume->getvalue();
-
   index = 1;
   const double * coord = getCoordinates(MED_FULL_INTERLACE);
 
   index = 1;
   const double * coord = getCoordinates(MED_FULL_INTERLACE);
 
@@ -642,29 +656,27 @@ FIELD<double>* MESH::getVolume(const SUPPORT * Support) const throw (MEDEXCEPTIO
     {
       medGeometryElement type = types[i] ;
       double xvolume;
     {
       medGeometryElement type = types[i] ;
       double xvolume;
-
-      if (onAll)
+      nb_entity_type = Support->getNumberOfElements(type);
+      if(type != MED_EN::MED_POLYHEDRA)
        {
        {
-         nb_entity_type = getNumberOfElements(support_entity,type);
-         global_connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,type);
-       }
-      else
-       {
-         // throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Support must be on all"));
-
-         nb_entity_type = Support->getNumberOfElements(type);
-         
-         const int * supp_number = Support->getNumber(type);
-         const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
-         const int * connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
-         int * global_connectivity_tmp = new int[(type%100)*nb_entity_type];
+         if (onAll)
+           {
+             global_connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,type);
+           }
+         else
+           {
+             const int * supp_number = Support->getNumber(type);
+             const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
+             const int * connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
+             int * global_connectivity_tmp = new int[(type%100)*nb_entity_type];
          
          
-         for (int k_type = 0; k_type<nb_entity_type; k_type++) {
-           for (int j_ent = 0; j_ent<(type%100); j_ent++) {
-             global_connectivity_tmp[k_type*(type%100)+j_ent] = connectivity[connectivityIndex[supp_number[k_type]-1]+j_ent-1];
-           }
-         }
-         global_connectivity = global_connectivity_tmp ;
+             for (int k_type = 0; k_type<nb_entity_type; k_type++) {
+               for (int j_ent = 0; j_ent<(type%100); j_ent++) {
+                 global_connectivity_tmp[k_type*(type%100)+j_ent] = connectivity[connectivityIndex[supp_number[k_type]-1]+j_ent-1];
+               }
+             }
+             global_connectivity = global_connectivity_tmp ;
+           }
        }
 
       switch (type)
        }
 
       switch (type)
@@ -674,32 +686,11 @@ FIELD<double>* MESH::getVolume(const SUPPORT * Support) const throw (MEDEXCEPTIO
            for (int tetra=0;tetra<nb_entity_type;tetra++)
              {
                int tetra_index = (type%100)*tetra;
            for (int tetra=0;tetra<nb_entity_type;tetra++)
              {
                int tetra_index = (type%100)*tetra;
-
                int N1 = global_connectivity[tetra_index]-1;
                int N2 = global_connectivity[tetra_index+1]-1;
                int N3 = global_connectivity[tetra_index+2]-1;
                int N4 = global_connectivity[tetra_index+3]-1;
                int N1 = global_connectivity[tetra_index]-1;
                int N2 = global_connectivity[tetra_index+1]-1;
                int N3 = global_connectivity[tetra_index+2]-1;
                int N4 = global_connectivity[tetra_index+3]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-
-               xvolume = ((x3-x1)*((y2-y1)*(z4-z1) - (z2-z1)*(y4-y1)) -
-                          (x2-x1)*((y3-y1)*(z4-z1) - (z3-z1)*(y4-y1)) +
-                          (x4-x1)*((y3-y1)*(z2-z1) - (z3-z1)*(y2-y1)))/6.0;
-
-               //volume[index] = xvolume ;
+               xvolume=CalculateVolumeForTetra(coord+dim_space*N1,coord+dim_space*N2,coord+dim_space*N3,coord+dim_space*N4);
                volume->setIJ(index,1,xvolume) ;
                index++;
              }
                volume->setIJ(index,1,xvolume) ;
                index++;
              }
@@ -710,40 +701,12 @@ FIELD<double>* MESH::getVolume(const SUPPORT * Support) const throw (MEDEXCEPTIO
            for (int pyra=0;pyra<nb_entity_type;pyra++)
              {
                int pyra_index = (type%100)*pyra;
            for (int pyra=0;pyra<nb_entity_type;pyra++)
              {
                int pyra_index = (type%100)*pyra;
-
                int N1 = global_connectivity[pyra_index]-1;
                int N2 = global_connectivity[pyra_index+1]-1;
                int N3 = global_connectivity[pyra_index+2]-1;
                int N4 = global_connectivity[pyra_index+3]-1;
                int N5 = global_connectivity[pyra_index+4]-1;
                int N1 = global_connectivity[pyra_index]-1;
                int N2 = global_connectivity[pyra_index+1]-1;
                int N3 = global_connectivity[pyra_index+2]-1;
                int N4 = global_connectivity[pyra_index+3]-1;
                int N5 = global_connectivity[pyra_index+4]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-               double x5 = coord[dim_space*N5];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-               double y5 = coord[dim_space*N5+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-               double z5 = coord[dim_space*N5+2];
-
-               xvolume = (((x3-x1)*((y2-y1)*(z5-z1) - (z2-z1)*(y5-y1)) -
-                           (x2-x1)*((y3-y1)*(z5-z1) - (z3-z1)*(y5-y1)) +
-                           (x5-x1)*((y3-y1)*(z2-z1) - (z3-z1)*(y2-y1))) +
-                          ((x4-x1)*((y3-y1)*(z5-z1) - (z3-z1)*(y5-y1)) -
-                           (x3-x1)*((y4-y1)*(z5-z1) - (z4-z1)*(y5-y1)) +
-                           (x5-x1)*((y4-y1)*(z3-z1) - (z4-z1)*(y3-y1)))
-                          )/6.0;
-
-               //volume[index] = xvolume ;
+               xvolume=CalculateVolumeForPyra(coord+dim_space*N1,coord+dim_space*N2,coord+dim_space*N3,coord+dim_space*N4,coord+dim_space*N5);
                volume->setIJ(index,1,xvolume) ;
                index = index++;
              }
                volume->setIJ(index,1,xvolume) ;
                index = index++;
              }
@@ -754,68 +717,13 @@ FIELD<double>* MESH::getVolume(const SUPPORT * Support) const throw (MEDEXCEPTIO
            for (int penta=0;penta<nb_entity_type;penta++)
              {
                int penta_index = (type%100)*penta;
            for (int penta=0;penta<nb_entity_type;penta++)
              {
                int penta_index = (type%100)*penta;
-
                int N1 = global_connectivity[penta_index]-1;
                int N2 = global_connectivity[penta_index+1]-1;
                int N3 = global_connectivity[penta_index+2]-1;
                int N4 = global_connectivity[penta_index+3]-1;
                int N5 = global_connectivity[penta_index+4]-1;
                int N6 = global_connectivity[penta_index+5]-1;
                int N1 = global_connectivity[penta_index]-1;
                int N2 = global_connectivity[penta_index+1]-1;
                int N3 = global_connectivity[penta_index+2]-1;
                int N4 = global_connectivity[penta_index+3]-1;
                int N5 = global_connectivity[penta_index+4]-1;
                int N6 = global_connectivity[penta_index+5]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-               double x5 = coord[dim_space*N5];
-               double x6 = coord[dim_space*N6];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-               double y5 = coord[dim_space*N5+1];
-               double y6 = coord[dim_space*N6+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-               double z5 = coord[dim_space*N5+2];
-               double z6 = coord[dim_space*N6+2];
-
-               double a1 = (x2-x3)/2.0, a2 = (y2-y3)/2.0, a3 = (z2-z3)/2.0;
-               double b1 = (x5-x6)/2.0, b2 = (y5-y6)/2.0, b3 = (z5-z6)/2.0;
-               double c1 = (x4-x1)/2.0, c2 = (y4-y1)/2.0, c3 = (z4-z1)/2.0;
-               double d1 = (x5-x2)/2.0, d2 = (y5-y2)/2.0, d3 = (z5-z2)/2.0;
-               double e1 = (x6-x3)/2.0, e2 = (y6-y3)/2.0, e3 = (z6-z3)/2.0;
-               double f1 = (x1-x3)/2.0, f2 = (y1-y3)/2.0, f3 = (z1-z3)/2.0;
-               double h1 = (x4-x6)/2.0, h2 = (y4-y6)/2.0, h3 = (z4-z6)/2.0;
-
-               double A = a1*c2*f3 - a1*c3*f2 - a2*c1*f3 + a2*c3*f1 +
-                 a3*c1*f2 - a3*c2*f1;
-               double B = b1*c2*h3 - b1*c3*h2 - b2*c1*h3 + b2*c3*h1 +
-                 b3*c1*h2 - b3*c2*h1;
-               double C = (a1*c2*h3 + b1*c2*f3) - (a1*c3*h2 + b1*c3*f2) -
-                 (a2*c1*h3 + b2*c1*f3) + (a2*c3*h1 + b2*c3*f1) +
-                 (a3*c1*h2 + b3*c1*f2) - (a3*c2*h1 + b3*c2*f1);
-               double D = a1*d2*f3 - a1*d3*f2 - a2*d1*f3 + a2*d3*f1 +
-                 a3*d1*f2 - a3*d2*f1;
-               double E = b1*d2*h3 - b1*d3*h2 - b2*d1*h3 + b2*d3*h1 +
-                 b3*d1*h2 - b3*d2*h1;
-               double F = (a1*d2*h3 + b1*d2*f3) - (a1*d3*h2 + b1*d3*f2) -
-                 (a2*d1*h3 + b2*d1*f3) + (a2*d3*h1 + b2*d3*f1) +
-                 (a3*d1*h2 + b3*d1*f2) - (a3*d2*h1 + b3*d2*f1);
-               double G = a1*e2*f3 - a1*e3*f2 - a2*e1*f3 + a2*e3*f1 +
-                 a3*e1*f2 - a3*e2*f1;
-               double H = b1*e2*h3 - b1*e3*h2 - b2*e1*h3 + b2*e3*h1 +
-                 b3*e1*h2 - b3*e2*h1;
-               double P = (a1*e2*h3 + b1*e2*f3) - (a1*e3*h2 + b1*e3*f2) -
-                 (a2*e1*h3 + b2*e1*f3) + (a2*e3*h1 + b2*e3*f1) +
-                 (a3*e1*h2 + b3*e1*f2) - (a3*e2*h1 + b3*e2*f1);
-
-               xvolume = -2.0*(2.0*(A + B + D + E + G + H) + C + F + P)/9.0;
-
-               //volume[index] = xvolume ;
+               xvolume=CalculateVolumeForPenta(coord+dim_space*N1,coord+dim_space*N2,coord+dim_space*N3,coord+dim_space*N4,coord+dim_space*N5,coord+dim_space*N6);
                volume->setIJ(index,1,xvolume) ;
                index++;
              }
                volume->setIJ(index,1,xvolume) ;
                index++;
              }
@@ -835,165 +743,88 @@ FIELD<double>* MESH::getVolume(const SUPPORT * Support) const throw (MEDEXCEPTIO
                int N6 = global_connectivity[hexa_index+5]-1;
                int N7 = global_connectivity[hexa_index+6]-1;
                int N8 = global_connectivity[hexa_index+7]-1;
                int N6 = global_connectivity[hexa_index+5]-1;
                int N7 = global_connectivity[hexa_index+6]-1;
                int N8 = global_connectivity[hexa_index+7]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-               double x5 = coord[dim_space*N5];
-               double x6 = coord[dim_space*N6];
-               double x7 = coord[dim_space*N7];
-               double x8 = coord[dim_space*N8];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-               double y5 = coord[dim_space*N5+1];
-               double y6 = coord[dim_space*N6+1];
-               double y7 = coord[dim_space*N7+1];
-               double y8 = coord[dim_space*N8+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-               double z5 = coord[dim_space*N5+2];
-               double z6 = coord[dim_space*N6+2];
-               double z7 = coord[dim_space*N7+2];
-               double z8 = coord[dim_space*N8+2];
-
-               double a1 = (x3-x4)/8.0, a2 = (y3-y4)/8.0, a3 = (z3-z4)/8.0;
-               double b1 = (x2-x1)/8.0, b2 = (y2-y1)/8.0, b3 = (z2-z1)/8.0;
-               double c1 = (x7-x8)/8.0, c2 = (y7-y8)/8.0, c3 = (z7-z8)/8.0;
-               double d1 = (x6-x5)/8.0, d2 = (y6-y5)/8.0, d3 = (z6-z5)/8.0;
-               double e1 = (x3-x2)/8.0, e2 = (y3-y2)/8.0, e3 = (z3-z2)/8.0;
-               double f1 = (x4-x1)/8.0, f2 = (y4-y1)/8.0, f3 = (z4-z1)/8.0;
-               double h1 = (x7-x6)/8.0, h2 = (y7-y6)/8.0, h3 = (z7-z6)/8.0;
-               double p1 = (x8-x5)/8.0, p2 = (y8-y5)/8.0, p3 = (z8-z5)/8.0;
-               double q1 = (x3-x7)/8.0, q2 = (y3-y7)/8.0, q3 = (z3-z7)/8.0;
-               double r1 = (x4-x8)/8.0, r2 = (y4-y8)/8.0, r3 = (z4-z8)/8.0;
-               double s1 = (x2-x6)/8.0, s2 = (y2-y6)/8.0, s3 = (z2-z6)/8.0;
-               double t1 = (x1-x5)/8.0, t2 = (y1-y5)/8.0, t3 = (z1-z5)/8.0;
-
-               double A = a1*e2*q3 - a1*e3*q2 - a2*e1*q3 + a2*e3*q1 +
-                 a3*e1*q2 - a3*e2*q1;
-               double B = c1*h2*q3 - c1*h3*q2 - c2*h1*q3 + c2*h3*q1 +
-                 c3*h1*q2 - c3*h2*q1;
-               double C = (a1*h2 + c1*e2)*q3 - (a1*h3 + c1*e3)*q2 -
-                 (a2*h1 + c2*e1)*q3 + (a2*h3 + c2*e3)*q1 +
-                 (a3*h1 + c3*e1)*q2 - (a3*h2 + c3*e2)*q1;
-               double D = b1*e2*s3 - b1*e3*s2 - b2*e1*s3 + b2*e3*s1 +
-                 b3*e1*s2 - b3*e2*s1;
-               double E = d1*h2*s3 - d1*h3*s2 - d2*h1*s3 + d2*h3*s1 +
-                 d3*h1*s2 - d3*h2*s1;
-               double F = (b1*h2 + d1*e2)*s3 - (b1*h3 + d1*e3)*s2 -
-                 (b2*h1 + d2*e1)*s3 + (b2*h3 + d2*e3)*s1 +
-                 (b3*h1 + d3*e1)*s2 - (b3*h2 + d3*e2)*s1;
-               double G = (a1*e2*s3 + b1*e2*q3) - (a1*e3*s2 + b1*e3*q2) -
-                 (a2*e1*s3 + b2*e1*q3) + (a2*e3*s1 + b2*e3*q1) +
-                 (a3*e1*s2 + b3*e1*q2) - (a3*e2*s1 + b3*e2*q1);
-               double H = (c1*h2*s3 + d1*h2*q3) - (c1*h3*s2 + d1*h3*q2) -
-                 (c2*h1*s3 + d2*h1*q3) + (c2*h3*s1 + d2*h3*q1) +
-                 (c3*h1*s2 + d3*h1*q2) - (c3*h2*s1 + d3*h2*q1);
-               double I = ((a1*h2 + c1*e2)*s3 + (b1*h2 + d1*e2)*q3) -
-                 ((a1*h3 + c1*e3)*s2 + (b1*h3 + d1*e3)*q2) -
-                 ((a2*h1 + c2*e1)*s3 + (b2*h1 + d2*e1)*q3) +
-                 ((a2*h3 + c2*e3)*s1 + (b2*h3 + d2*e3)*q1) +
-                 ((a3*h1 + c3*e1)*s2 + (b3*h1 + d3*e1)*q2) -
-                 ((a3*h2 + c3*e2)*s1 + (b3*h2 + d3*e2)*q1);
-               double J = a1*f2*r3 - a1*f3*r2 - a2*f1*r3 + a2*f3*r1 +
-                 a3*f1*r2 - a3*f2*r1;
-               double K = c1*p2*r3 - c1*p3*r2 - c2*p1*r3 + c2*p3*r1 +
-                 c3*p1*r2 - c3*p2*r1;
-               double L = (a1*p2 + c1*f2)*r3 - (a1*p3 + c1*f3)*r2 -
-                 (a2*p1 + c2*f1)*r3 + (a2*p3 + c2*f3)*r1 +
-                 (a3*p1 + c3*f1)*r2 - (a3*p2 + c3*f2)*r1;
-               double M = b1*f2*t3 - b1*f3*t2 - b2*f1*t3 + b2*f3*t1 +
-                 b3*f1*t2 - b3*f2*t1;
-               double N = d1*p2*t3 - d1*p3*t2 - d2*p1*t3 + d2*p3*t1 +
-                 d3*p1*t2 - d3*p2*t1;
-               double O = (b1*p2 + d1*f2)*t3 - (b1*p3 + d1*f3)*t2 -
-                 (b2*p1 + d2*f1)*t3 + (b2*p3 + d2*f3)*t1 +
-                 (b3*p1 + d3*f1)*t2 - (b3*p2 + d3*f2)*t1;
-               double P = (a1*f2*t3 + b1*f2*r3) - (a1*f3*t2 + b1*f3*r2) -
-                 (a2*f1*t3 + b2*f1*r3) + (a2*f3*t1 + b2*f3*r1) +
-                 (a3*f1*t2 + b3*f1*r2) - (a3*f2*t1 + b3*f2*r1);
-               double Q = (c1*p2*t3 + d1*p2*r3) - (c1*p3*t2 + d1*p3*r2) -
-                 (c2*p1*t3 + d2*p1*r3) + (c2*p3*t1 + d2*p3*r1) +
-                 (c3*p1*t2 + d3*p1*r2) - (c3*p2*t1 + d3*p2*r1);
-               double R = ((a1*p2 + c1*f2)*t3 + (b1*p2 + d1*f2)*r3) -
-                 ((a1*p3 + c1*f3)*t2 + (b1*p3 + d1*f3)*r2) -
-                 ((a2*p1 + c2*f1)*t3 + (b2*p1 + d2*f1)*r3) +
-                 ((a2*p3 + c2*f3)*t1 + (b2*p3 + d2*f3)*r1) +
-                 ((a3*p1 + c3*f1)*t2 + (b3*p1 + d3*f1)*r2) -
-                 ((a3*p2 + c3*f2)*t1 + (b3*p2 + d3*f2)*r1);
-               double S = (a1*e2*r3 + a1*f2*q3) - (a1*e3*r2 + a1*f3*q2) -
-                 (a2*e1*r3 + a2*f1*q3) + (a2*e3*r1 + a2*f3*q1) +
-                 (a3*e1*r2 + a3*f1*q2) - (a3*e2*r1 + a3*f2*q1);
-               double T = (c1*h2*r3 + c1*p2*q3) - (c1*h3*r2 + c1*p3*q2) -
-                 (c2*h1*r3 + c2*p1*q3) + (c2*h3*r1 + c2*p3*q1) +
-                 (c3*h1*r2 + c3*p1*q2) - (c3*h2*r1 + c3*p2*q1);
-               double U = ((a1*h2 + c1*e2)*r3 + (a1*p2 + c1*f2)*q3) -
-                 ((a1*h3 + c1*e3)*r2 + (a1*p3 + c1*f3)*q2) -
-                 ((a2*h1 + c2*e1)*r3 + (a2*p1 + c2*f1)*q3) +
-                 ((a2*h3 + c2*e3)*r1 + (a2*p3 + c2*f3)*q1) +
-                 ((a3*h1 + c3*e1)*r2 + (a3*p1 + c3*f1)*q2) -
-                 ((a3*h2 + c3*e2)*r1 + (a3*p2 + c3*f2)*q1);
-               double V = (b1*e2*t3 + b1*f2*s3) - (b1*e3*t2 + b1*f3*s2) -
-                 (b2*e1*t3 + b2*f1*s3) + (b2*e3*t1 + b2*f3*s1) +
-                 (b3*e1*t2 + b3*f1*s2) - (b3*e2*t1 + b3*f2*s1);
-               double W = (d1*h2*t3 + d1*p2*s3) - (d1*h3*t2 + d1*p3*s2) -
-                 (d2*h1*t3 + d2*p1*s3) + (d2*h3*t1 + d2*p3*s1) +
-                 (d3*h1*t2 + d3*p1*s2) - (d3*h2*t1 + d3*p2*s1);
-               double X = ((b1*h2 + d1*e2)*t3 + (b1*p2 + d1*f2)*s3) -
-                 ((b1*h3 + d1*e3)*t2 + (b1*p3 + d1*f3)*s2) -
-                 ((b2*h1 + d2*e1)*t3 + (b2*p1 + d2*f1)*s3) +
-                 ((b2*h3 + d2*e3)*t1 + (b2*p3 + d2*f3)*s1) +
-                 ((b3*h1 + d3*e1)*t2 + (b3*p1 + d3*f1)*s2) -
-                 ((b3*h2 + d3*e2)*t1 + (b3*p2 + d3*f2)*s1);
-               double Y = (a1*e2*t3 + a1*f2*s3 + b1*e2*r3 + b1*f2*q3) -
-                 (a1*e3*t2 + a1*f3*s2 + b1*e3*r2 + b1*f3*q2) -
-                 (a2*e1*t3 + a2*f1*s3 + b2*e1*r3 + b2*f1*q3) +
-                 (a2*e3*t1 + a2*f3*s1 + b2*e3*r1 + b2*f3*q1) +
-                 (a3*e1*t2 + a3*f1*s2 + b3*e1*r2 + b3*f1*q2) -
-                 (a3*e2*t1 + a3*f2*s1 + b3*e2*r1 + b3*f2*q1);
-               double Z = (c1*h2*t3 + c1*p2*s3 + d1*h2*r3 + d1*p2*q3) -
-                 (c1*h3*t2 + c1*p3*s2 + d1*h3*r2 + d1*p3*q2) -
-                 (c2*h1*t3 + c2*p1*s3 + d2*h1*r3 + d2*p1*q3) +
-                 (c2*h3*t1 + c2*p3*s1 + d2*h3*r1 + d2*p3*q1) +
-                 (c3*h1*t2 + c3*p1*s2 + d3*h1*r2 + d3*p1*q2) -
-                 (c3*h2*t1 + c3*p2*s1 + d3*h2*r1 + d3*p2*q1);
-               double AA = ((a1*h2 + c1*e2)*t3 + (a1*p2 + c1*f2)*s3 +
-                            (b1*h2 + d1*e2)*r3 + (b1*p2 + d1*f2)*q3) -
-                 ((a1*h3 + c1*e3)*t2 + (a1*p3 + c1*f3)*s2 +
-                  (b1*h3 + d1*e3)*r2 + (b1*p3 + d1*f3)*q2) -
-                 ((a2*h1 + c2*e1)*t3 + (a2*p1 + c2*f1)*s3 +
-                  (b2*h1 + d2*e1)*r3 + (b2*p1 + d2*f1)*q3) +
-                 ((a2*h3 + c2*e3)*t1 + (a2*p3 + c2*f3)*s1 +
-                  (b2*h3 + d2*e3)*r1 + (b2*p3 + d2*f3)*q1) +
-                 ((a3*h1 + c3*e1)*t2 + (a3*p1 + c3*f1)*s2 +
-                  (b3*h1 + d3*e1)*r2 + (b3*p1 + d3*f1)*q2) -
-                 ((a3*h2 + c3*e2)*t1 + (a3*p2 + c3*f2)*s1 +
-                  (b3*h2 + d3*e2)*r1 + (b3*p2 + d3*f2)*q1);
-
-               xvolume = 64.0*(8.0*(A + B + D + E + J + K + M + N) +
-                               4.0*(C + F + G + H + L + O + P + Q + S + T +
-                                    V + W) + 2.0*(I + R + U + X + Y + Z) +
-                               AA)/27.0;
-
-               //volume[index] = xvolume ;
+               xvolume=CalculateVolumeForHexa(coord+dim_space*N1,coord+dim_space*N2,coord+dim_space*N3,coord+dim_space*N4,coord+dim_space*N5,coord+dim_space*N6,coord+dim_space*N7,coord+dim_space*N8);
                volume->setIJ(index,1,xvolume) ;
                index++;
              }
            break;
          }
                volume->setIJ(index,1,xvolume) ;
                index++;
              }
            break;
          }
+       case MED_POLYHEDRA:
+         {
+           double bary[3];
+           if(onAll)
+             {
+               for (int polyhs=0;polyhs<nb_entity_type;polyhs++)
+                 {
+                   int lgthNodes,iPts,iFaces,iPtsInFace;
+                   int offsetWithClassicType=getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
+                   int *nodes=_connectivity->getNodesOfPolyhedron(offsetWithClassicType+polyhs+1,lgthNodes);
+                   int nbOfFaces,*nbOfNodesPerFaces;
+                   int **nodes1=_connectivity->getNodesPerFaceOfPolyhedron(offsetWithClassicType+polyhs+1,nbOfFaces,nbOfNodesPerFaces);
+                   double **pts=new double * [lgthNodes];
+                   double ***pts1=new double ** [nbOfFaces];
+                   for(iPts=0;iPts<lgthNodes;iPts++)
+                     pts[iPts]=(double *)(coord+3*(nodes[iPts]-1));
+                   for(iFaces=0;iFaces<nbOfFaces;iFaces++)
+                     {
+                       pts1[iFaces]=new double* [nbOfNodesPerFaces[iFaces]];
+                       for(iPtsInFace=0;iPtsInFace<nbOfNodesPerFaces[iFaces];iPtsInFace++)
+                         pts1[iFaces][iPtsInFace]=(double *)(coord+3*(nodes1[iFaces][iPtsInFace]-1));
+                     }
+                   delete [] nodes1;
+                   CalculateBarycenterDyn((const double **)pts,lgthNodes,3,bary);
+                   delete [] nodes;
+                   delete [] pts;
+                   xvolume=CalculateVolumeForPolyh((const double ***)pts1,nbOfNodesPerFaces,nbOfFaces,bary);
+                   delete [] nbOfNodesPerFaces;
+                   for(iFaces=0;iFaces<nbOfFaces;iFaces++)
+                       delete [] pts1[iFaces];
+                   delete [] pts1;
+                   volume->setIJ(index,1,xvolume) ;
+                   index++;
+                 }
+             }
+           else
+             {
+               const int * supp_number = Support->getNumber(MED_EN::MED_POLYHEDRA);
+               for (int polyhs=0;polyhs<nb_entity_type;polyhs++)
+                 {
+                   int lgthNodes,iPts,iFaces,iPtsInFace;
+                   int *nodes=_connectivity->getNodesOfPolyhedron(supp_number[polyhs],lgthNodes);
+                   int nbOfFaces,*nbOfNodesPerFaces;
+                   int **nodes1=_connectivity->getNodesPerFaceOfPolyhedron(supp_number[polyhs],nbOfFaces,nbOfNodesPerFaces);
+                   double **pts=new double * [lgthNodes];
+                   double ***pts1=new double ** [nbOfFaces];
+                   for(iPts=0;iPts<lgthNodes;iPts++)
+                     pts[iPts]=(double *)(coord+3*(nodes[iPts]-1));
+                   for(iFaces=0;iFaces<nbOfFaces;iFaces++)
+                     {
+                       pts1[iFaces]=new double* [nbOfNodesPerFaces[iFaces]];
+                       for(iPtsInFace=0;iPtsInFace<nbOfNodesPerFaces[iFaces];iPtsInFace++)
+                         pts1[iFaces][iPtsInFace]=(double *)(coord+3*(nodes1[iFaces][iPtsInFace]-1));
+                     }
+                   delete [] nodes1;
+                   CalculateBarycenterDyn((const double **)pts,lgthNodes,3,bary);
+                   delete [] nodes;
+                   delete [] pts;
+                   xvolume=CalculateVolumeForPolyh((const double ***)pts1,nbOfNodesPerFaces,nbOfFaces,bary);
+                   delete [] nbOfNodesPerFaces;
+                   for(iFaces=0;iFaces<nbOfFaces;iFaces++)
+                       delete [] pts1[iFaces];
+                   delete [] pts1;
+                   volume->setIJ(index,1,xvolume) ;    
+                   index++;
+                 }
+             }
+           break;
+         }
        default :
          throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Bad Support to get Volumes on it !"));
          break;
        }
 
        default :
          throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Bad Support to get Volumes on it !"));
          break;
        }
 
-      if (!onAll) delete [] global_connectivity ;
+      if (!onAll && type!=MED_EN::MED_POLYHEDRA) 
+       delete [] global_connectivity ;
     }
 
   return Volume;
     }
 
   return Volume;
@@ -1022,18 +853,9 @@ FIELD<double>* MESH::getArea(const SUPPORT * Support) const throw (MEDEXCEPTION)
   // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
 
   // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
 
-//    if (onAll)
-//      {
-//        nb_type = myMesh->getNumberOfTypes(support_entity);
-//        length_values = getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
-//        types = getTypes(support_entity);
-//      }
-//    else
-    {
-      nb_type = Support->getNumberOfTypes();
-      length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
-      types = Support->getTypes();
-    }
+  nb_type = Support->getNumberOfTypes();
+  length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
+  types = Support->getTypes();
 
   int index;
   FIELD<double>* Area;
 
   int index;
   FIELD<double>* Area;
@@ -1057,8 +879,7 @@ FIELD<double>* MESH::getArea(const SUPPORT * Support) const throw (MEDEXCEPTION)
   Area->setOrderNumber(0);
   Area->setTime(0.0);
 
   Area->setOrderNumber(0);
   Area->setTime(0.0);
 
-  double *area = new double[length_values];
-  //double *area = Area->getValue(MED_FULL_INTERLACE);
+  double *area = (double *)Area->getValue(MED_FULL_INTERLACE);
 
   const double * coord = getCoordinates(MED_FULL_INTERLACE);
   index = 0;
 
   const double * coord = getCoordinates(MED_FULL_INTERLACE);
   index = 0;
@@ -1066,34 +887,28 @@ FIELD<double>* MESH::getArea(const SUPPORT * Support) const throw (MEDEXCEPTION)
   for (int i=0;i<nb_type;i++)
     {
       medGeometryElement type = types[i] ;
   for (int i=0;i<nb_type;i++)
     {
       medGeometryElement type = types[i] ;
-      double xarea;
-
-      if (onAll)
-       {
-         nb_entity_type = getNumberOfElements(support_entity,type);
-         global_connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,type);
-       }
-      else
-       {
-         // throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Support must be on all !"));
-
-         nb_entity_type = Support->getNumberOfElements(type);
-         
-         const int * supp_number = Support->getNumber(type);
-         const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
-         const int * connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
-         int * global_connectivity_tmp = new int[(type%100)*nb_entity_type];
+      nb_entity_type = Support->getNumberOfElements(type);
+      const int *global_connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
+      if(type != MED_EN::MED_POLYGON && type != MED_EN::MED_POLYHEDRA)
+       { 
+         if (onAll)
+           {
+             global_connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,type);
+           }
+         else
+           {  
+             const int * supp_number = Support->getNumber(type);
+             const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
+             int * global_connectivity_tmp = new int[(type%100)*nb_entity_type];
          
          
-         for (int k_type = 0; k_type<nb_entity_type; k_type++) {
-           for (int j_ent = 0; j_ent<(type%100); j_ent++) {
-             global_connectivity_tmp[k_type*(type%100)+j_ent] = connectivity[connectivityIndex[supp_number[k_type]-1]+j_ent-1];
-           }
-         }
-
-         global_connectivity = global_connectivity_tmp ;
-
+             for (int k_type = 0; k_type<nb_entity_type; k_type++) {
+               for (int j_ent = 0; j_ent<(type%100); j_ent++) {
+                 global_connectivity_tmp[k_type*(type%100)+j_ent] = connectivity[global_connectivityIndex[supp_number[k_type]-1]+j_ent-1];
+               }
+             }
+             global_connectivity = global_connectivity_tmp ;
+           }
        }
        }
-
       switch (type)
        {
        case MED_TRIA3 : case MED_TRIA6 :
       switch (type)
        {
        case MED_TRIA3 : case MED_TRIA6 :
@@ -1106,33 +921,9 @@ FIELD<double>* MESH::getArea(const SUPPORT * Support) const throw (MEDEXCEPTION)
                int N2 = global_connectivity[tria_index+1]-1;
                int N3 = global_connectivity[tria_index+2]-1;
 
                int N2 = global_connectivity[tria_index+1]-1;
                int N3 = global_connectivity[tria_index+2]-1;
 
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-
-               if (dim_space==2)
-                 {
-                   xarea = - ((x2-x1)*(y3-y1) - (x3-x1)*(y2-y1))/2.0;
-                 }
-               else
-                 {
-                   double z1 = coord[dim_space*N1+2];
-                   double z2 = coord[dim_space*N2+2];
-                   double z3 = coord[dim_space*N3+2];
-
-                   xarea = sqrt(((y2-y1)*(z3-z1) - (y3-y1)*(z2-z1))*
-                                ((y2-y1)*(z3-z1) - (y3-y1)*(z2-z1)) +
-                                ((x3-x1)*(z2-z1) - (x2-x1)*(z3-z1))*
-                                ((x3-x1)*(z2-z1) - (x2-x1)*(z3-z1)) +
-                                ((x2-x1)*(y3-y1) - (x3-x1)*(y2-y1))*
-                                ((x2-x1)*(y3-y1) - (x3-x1)*(y2-y1)))/2.0;
-                 }
-
-               area[index] = xarea ;
+               area[index]=CalculateAreaForTria(coord+(dim_space*N1),
+                                                  coord+(dim_space*N2),
+                                                  coord+(dim_space*N3),dim_space);
                index++;
              }
            break;
                index++;
              }
            break;
@@ -1147,50 +938,48 @@ FIELD<double>* MESH::getArea(const SUPPORT * Support) const throw (MEDEXCEPTION)
                int N2 = global_connectivity[quad_index+1]-1;
                int N3 = global_connectivity[quad_index+2]-1;
                int N4 = global_connectivity[quad_index+3]-1;
                int N2 = global_connectivity[quad_index+1]-1;
                int N3 = global_connectivity[quad_index+2]-1;
                int N4 = global_connectivity[quad_index+3]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-
-               if (dim_space==2)
+               
+               area[index]=CalculateAreaForQuad(coord+dim_space*N1,
+                                                  coord+dim_space*N2,
+                                                  coord+dim_space*N3,
+                                                  coord+dim_space*N4,dim_space);
+               index++;
+             }
+           break;
+         }
+       case MED_POLYGON :
+         {
+           if(onAll)
+             {
+               const int * connectivity = getPolygonsConnectivity(MED_EN::MED_NODAL,support_entity);
+               const int * connectivity_index = getPolygonsConnectivityIndex(MED_EN::MED_NODAL,support_entity);
+               for (int polygs=0;polygs<nb_entity_type;polygs++)
                  {
                  {
-                   double a1 = (x2-x1)/4.0, a2 = (y2-y1)/4.0;
-                   double b1 = (x3-x4)/4.0, b2 = (y3-y4)/4.0;
-                   double c1 = (x3-x2)/4.0, c2 = (y3-y2)/4.0;
-                   double d1 = (x4-x1)/4.0, d2 = (y4-y1)/4.0;
-
-                   xarea = - 4.0*(b1*c2 - c1*b2 + a1*c2 - c1*a2 + b1*d2 -
-                                d1*b2 + a1*d2 - d1*a2);
+                   int size=connectivity_index[polygs+1]-connectivity_index[polygs];
+                   double **pts=new double * [size];
+                   for(int iPts=0;iPts<size;iPts++)
+                     pts[iPts]=(double *)(coord+dim_space*(connectivity[connectivity_index[polygs]+iPts-1]-1));
+                   area[index] = CalculateAreaForPolyg((const double **)pts,size,dim_space);
+                   delete [] pts;
+                   index++;
                  }
                  }
-               else
+             }
+           else
+             {
+               const int * supp_number = Support->getNumber(MED_EN::MED_POLYGON);
+               const int * connectivity = getPolygonsConnectivity(MED_EN::MED_NODAL,support_entity);
+               const int * connectivity_index = getPolygonsConnectivityIndex(MED_EN::MED_NODAL,support_entity);
+               int offsetWithClassicType=getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
+               for (int polygs=0;polygs<nb_entity_type;polygs++)
                  {
                  {
-                   double z1 = coord[dim_space*N1+2];
-                   double z2 = coord[dim_space*N2+2];
-                   double z3 = coord[dim_space*N3+2];
-                   double z4 = coord[dim_space*N4+2];
-
-                   xarea = (sqrt(((y2-y1)*(z4-z1) - (y4-y1)*(z2-z1))*
-                                 ((y2-y1)*(z4-z1) - (y4-y1)*(z2-z1)) +
-                                 ((x4-x1)*(z2-z1) - (x2-x1)*(z4-z1))*
-                                 ((x4-x1)*(z2-z1) - (x2-x1)*(z4-z1)) +
-                                 ((x2-x1)*(y4-y1) - (x4-x1)*(y2-y1))*
-                                 ((x2-x1)*(y4-y1) - (x4-x1)*(y2-y1))) +
-                            sqrt(((y4-y3)*(z2-z3) - (y2-y3)*(z4-z3))*
-                                 ((y4-y3)*(z2-z3) - (y2-y3)*(z4-z3)) +
-                                 ((x2-x3)*(z4-z3) - (x4-x3)*(z2-z3))*
-                                 ((x2-x3)*(z4-z3) - (x4-x3)*(z2-z3)) +
-                                 ((x4-x3)*(y2-y3) - (x2-x3)*(y4-y3))*
-                                 ((x4-x3)*(y2-y3) - (x2-x3)*(y4-y3))))/2.0;
+                   int size=connectivity_index[supp_number[polygs]-offsetWithClassicType]-connectivity_index[supp_number[polygs]-offsetWithClassicType-1];
+                   double **pts=new double * [size];
+                   for(int iPts=0;iPts<size;iPts++)
+                     pts[iPts]=(double *)(coord+dim_space*(connectivity[connectivity_index[supp_number[polygs]-offsetWithClassicType-1]+iPts-1]-1));
+                   area[index]=CalculateAreaForPolyg((const double **)pts,size,dim_space);
+                   delete [] pts;
+                   index++;
                  }
                  }
-
-               area[index] = xarea ;
-               index++;
              }
            break;
          }
              }
            break;
          }
@@ -1199,11 +988,10 @@ FIELD<double>* MESH::getArea(const SUPPORT * Support) const throw (MEDEXCEPTION)
          break;
        }
 
          break;
        }
 
-      if (!onAll) delete [] global_connectivity ;
+      if (!onAll) 
+       if(type != MED_EN::MED_POLYGON && type != MED_EN::MED_POLYHEDRA)
+         delete [] global_connectivity ;
     }
     }
-
-  Area->setValue(MED_FULL_INTERLACE,area);
-  delete[] area;
   return Area;
 }
 
   return Area;
 }
 
@@ -1230,18 +1018,9 @@ FIELD<double>* MESH::getLength(const SUPPORT * Support) const throw (MEDEXCEPTIO
   // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
 
   // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
 
-//    if (onAll)
-//      {
-//        nb_type = myMesh->getNumberOfTypes(support_entity);
-//        length_values = getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
-//        types = getTypes(support_entity);
-//      }
-//    else
-    {
-      nb_type = Support->getNumberOfTypes();
-      length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
-      types = Support->getTypes();
-    }
+  nb_type = Support->getNumberOfTypes();
+  length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
+  types = Support->getTypes();
 
   int index;
   FIELD<double>* Length;
 
   int index;
   FIELD<double>* Length;
@@ -1268,10 +1047,7 @@ FIELD<double>* MESH::getLength(const SUPPORT * Support) const throw (MEDEXCEPTIO
        }
       else
        {
        }
       else
        {
-         //throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Support must be on all !"));
-
          nb_entity_type = Support->getNumberOfElements(type);
          nb_entity_type = Support->getNumberOfElements(type);
-
          const int * supp_number = Support->getNumber(type);
          const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
          const int * connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
          const int * supp_number = Support->getNumber(type);
          const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
          const int * connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
@@ -1338,27 +1114,21 @@ FIELD<double>* MESH::getNormal(const SUPPORT * Support) const throw (MEDEXCEPTIO
     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no compatibility between *this and SUPPORT::_mesh : pointeur problem !"));
 
   int dim_space = getSpaceDimension();
     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no compatibility between *this and SUPPORT::_mesh : pointeur problem !"));
 
   int dim_space = getSpaceDimension();
+  int mesh_dim=getMeshDimension();
   medEntityMesh support_entity = Support->getEntity();
   bool onAll = Support->isOnAllElements();
 
   medEntityMesh support_entity = Support->getEntity();
   bool onAll = Support->isOnAllElements();
 
+  if( support_entity!=MED_EDGE && (mesh_dim!=1 || support_entity!=MED_CELL) && ( mesh_dim!=2 || support_entity!=MED_CELL ) && ( mesh_dim!=3 || support_entity!=MED_FACE ))
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"incompatible mesh dimension and entity"));
   int nb_type, length_values;
   const medGeometryElement* types;
   int nb_entity_type;
   // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
 
   int nb_type, length_values;
   const medGeometryElement* types;
   int nb_entity_type;
   // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
 
-//    if (onAll)
-//      {
-//        nb_type = myMesh->getNumberOfTypes(support_entity);
-//        length_values = getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
-//        types = getTypes(support_entity);
-//      }
-//    else
-    {
-      nb_type = Support->getNumberOfTypes();
-      length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
-      types = Support->getTypes();
-    }
+  nb_type = Support->getNumberOfTypes();
+  length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
+  types = Support->getTypes();
 
   int index;
 
 
   int index;
 
@@ -1376,9 +1146,7 @@ FIELD<double>* MESH::getNormal(const SUPPORT * Support) const throw (MEDEXCEPTIO
   Normal->setIterationNumber(MED_NOPDT);
   Normal->setOrderNumber(MED_NONOR);
   Normal->setTime(0.0);
   Normal->setIterationNumber(MED_NOPDT);
   Normal->setOrderNumber(MED_NONOR);
   Normal->setTime(0.0);
-
-  double * normal = new double [dim_space*length_values];
-  //double *normal = Normal->getValue(MED_FULL_INTERLACE);
+  double *normal = (double *)Normal->getValue(MED_FULL_INTERLACE);
 
   const double * coord = getCoordinates(MED_FULL_INTERLACE);
   index = 0;
 
   const double * coord = getCoordinates(MED_FULL_INTERLACE);
   index = 0;
@@ -1386,42 +1154,38 @@ FIELD<double>* MESH::getNormal(const SUPPORT * Support) const throw (MEDEXCEPTIO
   for (int i=0;i<nb_type;i++)
     {
       medGeometryElement type = types[i] ;
   for (int i=0;i<nb_type;i++)
     {
       medGeometryElement type = types[i] ;
-
+      nb_entity_type = Support->getNumberOfElements(type);
+      
       // Make sure we trying to get Normals on
       // TRIA3 or TRIA6 or QUAD4 QUAD8 (2D) cells on a 3D mesh
       // or on SEG2 or SEG3 (1D) cells on a 2D mesh
 
       if ( (((type==MED_TRIA3) || (type==MED_TRIA6) ||
       // Make sure we trying to get Normals on
       // TRIA3 or TRIA6 or QUAD4 QUAD8 (2D) cells on a 3D mesh
       // or on SEG2 or SEG3 (1D) cells on a 2D mesh
 
       if ( (((type==MED_TRIA3) || (type==MED_TRIA6) ||
-            (type==MED_QUAD4) || (type==MED_QUAD8)) &&
+            (type==MED_QUAD4) || (type==MED_QUAD8) || (type==MED_POLYGON)) &&
            (dim_space != 3)) || (((type==MED_SEG2) || (type==MED_SEG3)) &&
                                  (dim_space != 2)) )
        throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no compatibility between *this and SUPPORT::_mesh : dimension problem !"));
            (dim_space != 3)) || (((type==MED_SEG2) || (type==MED_SEG3)) &&
                                  (dim_space != 2)) )
        throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no compatibility between *this and SUPPORT::_mesh : dimension problem !"));
-
-      double xnormal1, xnormal2, xnormal3 ;
-
-      if (onAll)
-       {
-         nb_entity_type = getNumberOfElements(support_entity,type);
-         global_connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,type);
-       }
-      else
+      if(type != MED_EN::MED_POLYGON && type != MED_EN::MED_POLYHEDRA)
        {
        {
-         // throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Support must be on all for instance !"));
-         nb_entity_type = Support->getNumberOfElements(type);
-         
-         const int * supp_number = Support->getNumber(type);
-         const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
-         const int * connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
-         int * global_connectivity_tmp = new int[(type%100)*nb_entity_type];
-         
-         for (int k_type = 0; k_type<nb_entity_type; k_type++) {
-           for (int j_ent = 0; j_ent<(type%100); j_ent++) {
-             global_connectivity_tmp[k_type*(type%100)+j_ent] = connectivity[connectivityIndex[supp_number[k_type]-1]+j_ent-1];
-           }
-         }
-
-         global_connectivity = global_connectivity_tmp ;
-
+         if (onAll)
+           {
+             global_connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,type);
+           }
+         else
+           {  
+             const int * supp_number = Support->getNumber(type);
+             const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
+             const int * connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
+             int * global_connectivity_tmp = new int[(type%100)*nb_entity_type];
+             
+             for (int k_type = 0; k_type<nb_entity_type; k_type++) {
+               for (int j_ent = 0; j_ent<(type%100); j_ent++) {
+                 global_connectivity_tmp[k_type*(type%100)+j_ent] = connectivity[connectivityIndex[supp_number[k_type]-1]+j_ent-1];
+               }
+             }
+             
+             global_connectivity = global_connectivity_tmp ;
+           }
        }
 
       switch (type)
        }
 
       switch (type)
@@ -1431,32 +1195,10 @@ FIELD<double>* MESH::getNormal(const SUPPORT * Support) const throw (MEDEXCEPTIO
            for (int tria=0;tria<nb_entity_type;tria++)
              {
                int tria_index = (type%100)*tria;
            for (int tria=0;tria<nb_entity_type;tria++)
              {
                int tria_index = (type%100)*tria;
-
                int N1 = global_connectivity[tria_index]-1;
                int N2 = global_connectivity[tria_index+1]-1;
                int N3 = global_connectivity[tria_index+2]-1;
                int N1 = global_connectivity[tria_index]-1;
                int N2 = global_connectivity[tria_index+1]-1;
                int N3 = global_connectivity[tria_index+2]-1;
-
-               //double xarea; !! UNUSED VARIABLE !!
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-
-               xnormal1 = ((y2-y1)*(z3-z1) - (y3-y1)*(z2-z1))/2.0;
-               xnormal2 = ((x3-x1)*(z2-z1) - (x2-x1)*(z3-z1))/2.0;
-               xnormal3 = ((x2-x1)*(y3-y1) - (x3-x1)*(y2-y1))/2.0;
-
-               normal[3*index] = xnormal1 ;
-               normal[3*index+1] = xnormal2 ;
-               normal[3*index+2] = xnormal3 ;
-
+               CalculateNormalForTria(coord+dim_space*N1,coord+dim_space*N2,coord+dim_space*N3,normal+3*index);
                index++;
              }
            break;
                index++;
              }
            break;
@@ -1466,72 +1208,18 @@ FIELD<double>* MESH::getNormal(const SUPPORT * Support) const throw (MEDEXCEPTIO
            for (int quad=0;quad<nb_entity_type;quad++)
              {
                int quad_index = (type%100)*quad;
            for (int quad=0;quad<nb_entity_type;quad++)
              {
                int quad_index = (type%100)*quad;
-
                int N1 = global_connectivity[quad_index]-1;
                int N2 = global_connectivity[quad_index+1]-1;
                int N3 = global_connectivity[quad_index+2]-1;
                int N4 = global_connectivity[quad_index+3]-1;
                int N1 = global_connectivity[quad_index]-1;
                int N2 = global_connectivity[quad_index+1]-1;
                int N3 = global_connectivity[quad_index+2]-1;
                int N4 = global_connectivity[quad_index+3]-1;
-
-               double xarea;
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-
-               xnormal1 = (y2-y1)*(z4-z1) - (y4-y1)*(z2-z1);
-               xnormal2 = (x4-x1)*(z2-z1) - (x2-x1)*(z4-z1);
-               xnormal3 = (x2-x1)*(y4-y1) - (x4-x1)*(y2-y1);
-               xarea = sqrt(xnormal1*xnormal1 + xnormal2*xnormal2 +
-                            xnormal3*xnormal3);
-
-               xnormal1 = xnormal1/xarea;
-               xnormal2 = xnormal2/xarea;
-               xnormal3 = xnormal3/xarea;
-
-               xarea = (sqrt(((y2-y1)*(z4-z1) - (y4-y1)*(z2-z1))*
-                             ((y2-y1)*(z4-z1) - (y4-y1)*(z2-z1)) +
-                             ((x4-x1)*(z2-z1) - (x2-x1)*(z4-z1))*
-                             ((x4-x1)*(z2-z1) - (x2-x1)*(z4-z1)) +
-                             ((x2-x1)*(y4-y1) - (x4-x1)*(y2-y1))*
-                             ((x2-x1)*(y4-y1) - (x4-x1)*(y2-y1))) +
-                        sqrt(((y4-y3)*(z2-z3) - (y2-y3)*(z4-z3))*
-                             ((y4-y3)*(z2-z3) - (y2-y3)*(z4-z3)) +
-                             ((x2-x3)*(z4-z3) - (x4-x3)*(z2-z3))*
-                             ((x2-x3)*(z4-z3) - (x4-x3)*(z2-z3)) +
-                             ((x4-x3)*(y2-y3) - (x2-x3)*(y4-y3))*
-                             ((x4-x3)*(y2-y3) - (x2-x3)*(y4-y3))))/2.0;
-
-//                      sqrt(((y3-y2)*(z4-z3) - (y4-y3)*(z3-z2))*
-//                           ((y3-y2)*(z4-z3) - (y4-y3)*(z3-z2)) +
-//                           ((x4-x3)*(z2-z2) - (x3-x2)*(z4-z3))*
-//                           ((x4-x3)*(z4-z2) - (x3-x2)*(z4-z3)) +
-//                           ((x3-x2)*(y4-y3) - (x4-x3)*(y3-y2))*
-//                           ((x3-x2)*(y4-y3) - (x4-x3)*(y3-y2))))/2.0;
-
-               xnormal1 = xnormal1*xarea;
-               xnormal2 = xnormal2*xarea;
-               xnormal3 = xnormal3*xarea;
-
-               normal[3*index] = xnormal1 ;
-               normal[3*index+1] = xnormal2 ;
-               normal[3*index+2] = xnormal3 ;
-
+               CalculateNormalForQuad(coord+dim_space*N1,coord+dim_space*N2,coord+dim_space*N3,coord+dim_space*N4,normal+3*index);
                index++;
              }
            break;
          }
        case MED_SEG2 : case MED_SEG3 :
          {
                index++;
              }
            break;
          }
        case MED_SEG2 : case MED_SEG3 :
          {
+           double xnormal1, xnormal2;
            for (int edge=0;edge<nb_entity_type;edge++)
              {
                int edge_index = (type%100)*edge;
            for (int edge=0;edge<nb_entity_type;edge++)
              {
                int edge_index = (type%100)*edge;
@@ -1555,17 +1243,50 @@ FIELD<double>* MESH::getNormal(const SUPPORT * Support) const throw (MEDEXCEPTIO
              }
            break;
          }
              }
            break;
          }
+       case MED_POLYGON :
+         {
+           if(onAll)
+             {
+               const int * connectivity = getPolygonsConnectivity(MED_EN::MED_NODAL,support_entity);
+               const int * connectivity_index = getPolygonsConnectivityIndex(MED_EN::MED_NODAL,support_entity);
+               for (int polygs=0;polygs<nb_entity_type;polygs++)
+                 {
+                   int size=connectivity_index[polygs+1]-connectivity_index[polygs];
+                   double **pts=new double * [size];
+                   for(int iPts=0;iPts<size;iPts++)
+                     pts[iPts]=(double *)(coord+dim_space*(connectivity[connectivity_index[polygs]+iPts-1])-1);
+                   CalculateNormalForPolyg((const double **)pts,size,normal+3*index);
+                   delete [] pts;
+                   index++;
+                 }
+             }
+           else
+             {
+               const int * supp_number = Support->getNumber(MED_EN::MED_POLYGON);
+               const int * connectivity = getPolygonsConnectivity(MED_EN::MED_NODAL,support_entity);
+               const int * connectivity_index = getPolygonsConnectivityIndex(MED_EN::MED_NODAL,support_entity);
+               int offsetWithClassicType=getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
+               for (int polygs=0;polygs<nb_entity_type;polygs++)
+                 {
+                   int localPolygsNbP1=supp_number[polygs]-offsetWithClassicType;
+                   int size=connectivity_index[localPolygsNbP1]-connectivity_index[localPolygsNbP1-1];
+                   double **pts=new double * [size];
+                   for(int iPts=0;iPts<size;iPts++)
+                     pts[iPts]=(double *)(coord+dim_space*(connectivity[connectivity_index[localPolygsNbP1-1]+iPts-1])-1);
+                   CalculateNormalForPolyg((const double **)pts,size,normal+3*index);
+                   delete [] pts;
+                   index++;
+                 }
+             }
+           break;
+         }
        default :
          throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Bad Support to get Normals on it !"));
          break;
        }
        default :
          throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Bad Support to get Normals on it !"));
          break;
        }
-
-      if (!onAll) delete [] global_connectivity ;
+      if (!onAll && type!=MED_EN::MED_POLYGON) 
+       delete [] global_connectivity ;
     }
     }
-
-  Normal->setValue(MED_FULL_INTERLACE,normal);
-  delete[] normal ;
-
   END_OF(LOC);
 
   return Normal;
   END_OF(LOC);
 
   return Normal;
@@ -1574,10 +1295,6 @@ FIELD<double>* MESH::getNormal(const SUPPORT * Support) const throw (MEDEXCEPTIO
 FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCEPTION)
 {
   const char * LOC = "MESH::getBarycenter(SUPPORT*) : ";
 FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCEPTION)
 {
   const char * LOC = "MESH::getBarycenter(SUPPORT*) : ";
-  BEGIN_OF(LOC);
-
-  // Make sure that the MESH class is the same as the MESH class attribut
-  // in the class Support
   MESH* myMesh = Support->getMesh();
   if (this != myMesh)
     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no compatibility between *this and SUPPORT::_mesh !"));
   MESH* myMesh = Support->getMesh();
   if (this != myMesh)
     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no compatibility between *this and SUPPORT::_mesh !"));
@@ -1589,25 +1306,14 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
   int nb_type, length_values;
   const medGeometryElement* types;
   int nb_entity_type;
   int nb_type, length_values;
   const medGeometryElement* types;
   int nb_entity_type;
-  // !!!! WARNING : use of nodal global numbering in the mesh !!!!
   const int* global_connectivity;
   const int* global_connectivity;
+  const int * global_connectivityIndex;
 
 
-//    if (onAll)
-//      {
-//        nb_type = myMesh->getNumberOfTypes(support_entity);
-//        length_values = getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
-//        types = getTypes(support_entity);
-//      }
-//    else
-    {
-      nb_type = Support->getNumberOfTypes();
-      length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
-      types = Support->getTypes();
-    }
+  nb_type = Support->getNumberOfTypes();
+  length_values = Support->getNumberOfElements(MED_ALL_ELEMENTS);
+  types = Support->getTypes();
 
 
-  int index;
   FIELD<double>* Barycenter;
   FIELD<double>* Barycenter;
-
   Barycenter = new FIELD<double>(Support,dim_space);
   Barycenter->setName("BARYCENTER");
   Barycenter->setDescription("cells or faces barycenter");
   Barycenter = new FIELD<double>(Support,dim_space);
   Barycenter->setName("BARYCENTER");
   Barycenter->setDescription("cells or faces barycenter");
@@ -1618,45 +1324,37 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
     Barycenter->setComponentDescription(kp1,"desc-comp");
     Barycenter->setMEDComponentUnit(kp1,myMesh->getCoordinatesUnits()[k]);
   }
     Barycenter->setComponentDescription(kp1,"desc-comp");
     Barycenter->setMEDComponentUnit(kp1,myMesh->getCoordinatesUnits()[k]);
   }
-
   Barycenter->setValueType(MED_REEL64);
   Barycenter->setValueType(MED_REEL64);
-
   Barycenter->setIterationNumber(0);
   Barycenter->setOrderNumber(0);
   Barycenter->setTime(0.0);
   Barycenter->setIterationNumber(0);
   Barycenter->setOrderNumber(0);
   Barycenter->setTime(0.0);
-
-  double *barycenter = new double [dim_space*length_values];
-  //  double *barycenter = Barycenter->getValue(MED_FULL_INTERLACE);
-
+  double *barycenter=(double *)Barycenter->getValue(MED_FULL_INTERLACE);
   const double * coord = getCoordinates(MED_FULL_INTERLACE);
   const double * coord = getCoordinates(MED_FULL_INTERLACE);
-  index = 0;
-
+  int index=0;
   for (int i=0;i<nb_type;i++)
     {
       medGeometryElement type = types[i] ;
   for (int i=0;i<nb_type;i++)
     {
       medGeometryElement type = types[i] ;
-      double xbarycenter1, xbarycenter2, xbarycenter3;
-
-      if (onAll)
-       {
-         nb_entity_type = getNumberOfElements(support_entity,type);
-         global_connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,type);
-       }
-      else
+      nb_entity_type = Support->getNumberOfElements(type);
+      global_connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
+      if(type != MED_EN::MED_POLYGON && type != MED_EN::MED_POLYHEDRA )
        {
        {
-         // throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Support must be on all !"));
-         nb_entity_type = Support->getNumberOfElements(type);
-         
-         const int * supp_number = Support->getNumber(type);
-         const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
-         const int * connectivityIndex = getConnectivityIndex(MED_NODAL,support_entity);
-         int * global_connectivity_tmp = new int[(type%100)*nb_entity_type];
-         
-         for (int k_type = 0; k_type<nb_entity_type; k_type++) {
-           for (int j_ent = 0; j_ent<(type%100); j_ent++) {
-             global_connectivity_tmp[k_type*(type%100)+j_ent] = connectivity[connectivityIndex[supp_number[k_type]-1]+j_ent-1];
-           }
-         }
-         global_connectivity = global_connectivity_tmp;
+         if (onAll)
+           {
+             global_connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,type);
+           }
+         else
+           {
+             const int * supp_number = Support->getNumber(type);
+             const int * connectivity = getConnectivity(MED_FULL_INTERLACE,MED_NODAL,support_entity,MED_ALL_ELEMENTS);
+             int * global_connectivity_tmp = new int[(type%100)*nb_entity_type];
+
+             for (int k_type = 0; k_type<nb_entity_type; k_type++) {
+               for (int j_ent = 0; j_ent<(type%100); j_ent++) {
+                 global_connectivity_tmp[k_type*(type%100)+j_ent] = connectivity[global_connectivityIndex[supp_number[k_type]-1]+j_ent-1];
+               }
+             }
+             global_connectivity = global_connectivity_tmp;
+           }
        }
 
       switch (type)
        }
 
       switch (type)
@@ -1671,28 +1369,12 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
                int N2 = global_connectivity[tetra_index+1]-1;
                int N3 = global_connectivity[tetra_index+2]-1;
                int N4 = global_connectivity[tetra_index+3]-1;
                int N2 = global_connectivity[tetra_index+1]-1;
                int N3 = global_connectivity[tetra_index+2]-1;
                int N4 = global_connectivity[tetra_index+3]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-
-               xbarycenter1 = (x1 + x2 + x3 + x4)/4.0;
-               xbarycenter2 = (y1 + y2 + y3 + y4)/4.0;
-               xbarycenter3 = (z1 + z2 + z3 + z4)/4.0;
-               barycenter[3*index] = xbarycenter1 ;
-               barycenter[3*index+1] = xbarycenter2 ;
-               barycenter[3*index+2] = xbarycenter3 ;
+               double *pts[4];
+               pts[0]=(double *)coord+dim_space*N1;
+               pts[1]=(double *)coord+dim_space*N2;
+               pts[2]=(double *)coord+dim_space*N3;
+               pts[3]=(double *)coord+dim_space*N4;
+               CalculateBarycenter<4,3>((const double **)pts,barycenter+3*index);
                index++;
              }
            break;
                index++;
              }
            break;
@@ -1708,31 +1390,13 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
                int N3 = global_connectivity[pyra_index+2]-1;
                int N4 = global_connectivity[pyra_index+3]-1;
                int N5 = global_connectivity[pyra_index+4]-1;
                int N3 = global_connectivity[pyra_index+2]-1;
                int N4 = global_connectivity[pyra_index+3]-1;
                int N5 = global_connectivity[pyra_index+4]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-               double x5 = coord[dim_space*N5];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-               double y5 = coord[dim_space*N5+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-               double z5 = coord[dim_space*N5+2];
-
-               xbarycenter1 = (x1 + x2 + x3 + x4 + x5)/5.0;
-               xbarycenter2 = (y1 + y2 + y3 + y4 + y5)/5.0;
-               xbarycenter3 = (z1 + z2 + z3 + z4 + z5)/5.0;
-               barycenter[3*index] = xbarycenter1 ;
-               barycenter[3*index+1] = xbarycenter2 ;
-               barycenter[3*index+2] = xbarycenter3 ;
+               double *pts[5];
+               pts[0]=(double *)coord+dim_space*N1;
+               pts[1]=(double *)coord+dim_space*N2;
+               pts[2]=(double *)coord+dim_space*N3;
+               pts[3]=(double *)coord+dim_space*N4;
+               pts[4]=(double *)coord+dim_space*N5;
+               CalculateBarycenter<5,3>((const double **)pts,barycenter+3*index);
                index++;
              }
            break;
                index++;
              }
            break;
@@ -1749,34 +1413,14 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
                int N4 = global_connectivity[penta_index+3]-1;
                int N5 = global_connectivity[penta_index+4]-1;
                int N6 = global_connectivity[penta_index+5]-1;
                int N4 = global_connectivity[penta_index+3]-1;
                int N5 = global_connectivity[penta_index+4]-1;
                int N6 = global_connectivity[penta_index+5]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-               double x5 = coord[dim_space*N5];
-               double x6 = coord[dim_space*N6];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-               double y5 = coord[dim_space*N5+1];
-               double y6 = coord[dim_space*N6+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-               double z5 = coord[dim_space*N5+2];
-               double z6 = coord[dim_space*N6+2];
-
-               xbarycenter1 = (x1 + x2 + x3 + x4 + x5 + x6)/6.0;
-               xbarycenter2 = (y1 + y2 + y3 + y4 + y5 + y6)/6.0;
-               xbarycenter3 = (z1 + z2 + z3 + z4 + z5 + z6)/6.0;
-               barycenter[3*index] = xbarycenter1 ;
-               barycenter[3*index+1] = xbarycenter2 ;
-               barycenter[3*index+2] = xbarycenter3 ;
+               double *pts[6];
+               pts[0]=(double *)coord+dim_space*N1;
+               pts[1]=(double *)coord+dim_space*N2;
+               pts[2]=(double *)coord+dim_space*N3;
+               pts[3]=(double *)coord+dim_space*N4;
+               pts[4]=(double *)coord+dim_space*N5;
+               pts[5]=(double *)coord+dim_space*N6;
+               CalculateBarycenter<6,3>((const double **)pts,barycenter+3*index);
                index++;
              }
            break;
                index++;
              }
            break;
@@ -1795,42 +1439,16 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
                int N6 = global_connectivity[hexa_index+5]-1;
                int N7 = global_connectivity[hexa_index+6]-1;
                int N8 = global_connectivity[hexa_index+7]-1;
                int N6 = global_connectivity[hexa_index+5]-1;
                int N7 = global_connectivity[hexa_index+6]-1;
                int N8 = global_connectivity[hexa_index+7]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-               double x5 = coord[dim_space*N5];
-               double x6 = coord[dim_space*N6];
-               double x7 = coord[dim_space*N7];
-               double x8 = coord[dim_space*N8];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-               double y5 = coord[dim_space*N5+1];
-               double y6 = coord[dim_space*N6+1];
-               double y7 = coord[dim_space*N7+1];
-               double y8 = coord[dim_space*N8+1];
-
-               double z1 = coord[dim_space*N1+2];
-               double z2 = coord[dim_space*N2+2];
-               double z3 = coord[dim_space*N3+2];
-               double z4 = coord[dim_space*N4+2];
-               double z5 = coord[dim_space*N5+2];
-               double z6 = coord[dim_space*N6+2];
-               double z7 = coord[dim_space*N7+2];
-               double z8 = coord[dim_space*N8+2];
-
-               xbarycenter1 = (x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8)/8.0;
-               xbarycenter2 = (y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8)/8.0;
-               xbarycenter3 = (z1 + z2 + z3 + z4 + z5 + z6 + z7 + z8)/8.0;
-
-               barycenter[3*index] = xbarycenter1 ;
-               barycenter[3*index+1] = xbarycenter2 ;
-               barycenter[3*index+2] = xbarycenter3 ;
-
+               double *pts[8];
+               pts[0]=(double *)coord+dim_space*N1;
+               pts[1]=(double *)coord+dim_space*N2;
+               pts[2]=(double *)coord+dim_space*N3;
+               pts[3]=(double *)coord+dim_space*N4;
+               pts[4]=(double *)coord+dim_space*N5;
+               pts[5]=(double *)coord+dim_space*N6;
+               pts[6]=(double *)coord+dim_space*N7;
+               pts[7]=(double *)coord+dim_space*N8;
+               CalculateBarycenter<8,3>((const double **)pts,barycenter+3*index);
                index++;
              }
            break;
                index++;
              }
            break;
@@ -1840,43 +1458,17 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
            for (int tria=0;tria<nb_entity_type;tria++)
              {
                int tria_index = (type%100)*tria;
            for (int tria=0;tria<nb_entity_type;tria++)
              {
                int tria_index = (type%100)*tria;
-
                int N1 = global_connectivity[tria_index]-1;
                int N2 = global_connectivity[tria_index+1]-1;
                int N3 = global_connectivity[tria_index+2]-1;
                int N1 = global_connectivity[tria_index]-1;
                int N2 = global_connectivity[tria_index+1]-1;
                int N3 = global_connectivity[tria_index+2]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-
-               xbarycenter1 = (x1 + x2 + x3)/3.0;
-               xbarycenter2 = (y1 + y2 + y3)/3.0;
-
+               double *pts[3];
+               pts[0]=(double *)coord+dim_space*N1;
+               pts[1]=(double *)coord+dim_space*N2;
+               pts[2]=(double *)coord+dim_space*N3;
                if (dim_space==2)
                if (dim_space==2)
-                 {
-                   barycenter[2*index] = xbarycenter1 ;
-                   barycenter[2*index+1] = xbarycenter2 ;
-                 }
+                 CalculateBarycenter<3,2>((const double **)pts,barycenter+2*index);
                else
                else
-                 {
-                   double z1 =
-                     coord[dim_space*N1+2];
-                   double z2 =
-                     coord[dim_space*N2+2];
-                   double z3 =
-                     coord[dim_space*N3+2];
-
-                   xbarycenter3 = (z1 + z2 + z3)/3.0;
-
-                   barycenter[3*index] = xbarycenter1 ;
-                   barycenter[3*index+1] = xbarycenter2 ;
-                   barycenter[3*index+2] = xbarycenter3 ;
-                 }
-
+                 CalculateBarycenter<3,3>((const double **)pts,barycenter+3*index);
                index++;
              }
            break;
                index++;
              }
            break;
@@ -1886,43 +1478,19 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
            for (int quad=0;quad<nb_entity_type;quad++)
              {
                int quad_index = (type%100)*quad;
            for (int quad=0;quad<nb_entity_type;quad++)
              {
                int quad_index = (type%100)*quad;
-
                int N1 = global_connectivity[quad_index]-1;
                int N2 = global_connectivity[quad_index+1]-1;
                int N3 = global_connectivity[quad_index+2]-1;
                int N4 = global_connectivity[quad_index+3]-1;
                int N1 = global_connectivity[quad_index]-1;
                int N2 = global_connectivity[quad_index+1]-1;
                int N3 = global_connectivity[quad_index+2]-1;
                int N4 = global_connectivity[quad_index+3]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-               double x3 = coord[dim_space*N3];
-               double x4 = coord[dim_space*N4];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-               double y3 = coord[dim_space*N3+1];
-               double y4 = coord[dim_space*N4+1];
-
-               xbarycenter1 = (x1 + x2 + x3 + x4)/4.0;
-               xbarycenter2 = (y1 + y2 + y3 + y4)/4.0;
-
+               double *pts[4];
+               pts[0]=(double *)coord+dim_space*N1;
+               pts[1]=(double *)coord+dim_space*N2;
+               pts[2]=(double *)coord+dim_space*N3;
+               pts[3]=(double *)coord+dim_space*N4;
                if (dim_space==2)
                if (dim_space==2)
-                 {
-                   barycenter[2*index] = xbarycenter1 ;
-                   barycenter[2*index+1] = xbarycenter2 ;
-                 }
+                 CalculateBarycenter<4,2>((const double **)pts,barycenter+2*index);
                else
                else
-                 {
-                   double z1 = coord[dim_space*N1+2];
-                   double z2 = coord[dim_space*N2+2];
-                   double z3 = coord[dim_space*N3+2];
-                   double z4 = coord[dim_space*N4+2];
-
-                   xbarycenter3 = (z1 + z2 + z3 + z4)/4.0;
-
-                   barycenter[3*index] = xbarycenter1 ;
-                   barycenter[3*index+1] = xbarycenter2 ;
-                   barycenter[3*index+2] = xbarycenter3 ;
-                 }
+                 CalculateBarycenter<4,3>((const double **)pts,barycenter+3*index);
                index++;
              }
            break;
                index++;
              }
            break;
@@ -1932,36 +1500,88 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
            for (int edge=0;edge<nb_entity_type;edge++)
              {
                int edge_index = (type%100)*edge;
            for (int edge=0;edge<nb_entity_type;edge++)
              {
                int edge_index = (type%100)*edge;
-
                int N1 = global_connectivity[edge_index]-1;
                int N2 = global_connectivity[edge_index+1]-1;
                int N1 = global_connectivity[edge_index]-1;
                int N2 = global_connectivity[edge_index+1]-1;
-
-               double x1 = coord[dim_space*N1];
-               double x2 = coord[dim_space*N2];
-
-               double y1 = coord[dim_space*N1+1];
-               double y2 = coord[dim_space*N2+1];
-
-               xbarycenter1 = (x1 + x2)/2.0;
-               xbarycenter2 = (y1 + y2)/2.0;
-
+               double *pts[2];
+               pts[0]=(double *)coord+dim_space*N1;
+               pts[1]=(double *)coord+dim_space*N2;
                if (dim_space==2)
                if (dim_space==2)
+                 CalculateBarycenter<2,2>((const double **)pts,barycenter+2*index);
+               else
+                 CalculateBarycenter<2,3>((const double **)pts,barycenter+3*index);
+               index++;
+             }
+           break;
+         }
+       case MED_POLYGON :
+         {
+           if(onAll)
+             {
+               const int * connectivity = getPolygonsConnectivity(MED_EN::MED_NODAL,support_entity);
+               const int * connectivity_index = getPolygonsConnectivityIndex(MED_EN::MED_NODAL,support_entity);
+               for (int polygs=0;polygs<nb_entity_type;polygs++)
                  {
                  {
-                   barycenter[2*index] = xbarycenter1 ;
-                   barycenter[2*index+1] = xbarycenter2 ;
+                   int size=connectivity_index[polygs+1]-connectivity_index[polygs];
+                   double **pts=new double * [size];
+                   for(int iPts=0;iPts<size;iPts++)
+                     pts[iPts]=(double *)coord+dim_space*(connectivity[connectivity_index[polygs]+iPts-1]-1);
+                   CalculateBarycenterDyn((const double **)pts,size,dim_space,barycenter+dim_space*index);
+                   delete [] pts;
                  }
                  }
-               else
+             }
+           else
+             {
+               const int * supp_number = Support->getNumber(MED_EN::MED_POLYGON);
+               const int * connectivity = getPolygonsConnectivity(MED_EN::MED_NODAL,support_entity);
+               const int * connectivity_index = getPolygonsConnectivityIndex(MED_EN::MED_NODAL,support_entity);
+               int offsetWithClassicType=getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
+               for (int polygs=0;polygs<nb_entity_type;polygs++)
                  {
                  {
-                   double z1 = coord[dim_space*N1+2];
-                   double z2 = coord[dim_space*N2+2];
-
-                   xbarycenter3 = (z1 + z2)/2.0;
-
-                   barycenter[3*index] = xbarycenter1 ;
-                   barycenter[3*index+1] = xbarycenter2 ;
-                   barycenter[3*index+2] = xbarycenter3 ;
+                   int localPolygsNbP1=supp_number[polygs]-offsetWithClassicType;
+                   int size=connectivity_index[localPolygsNbP1]-connectivity_index[localPolygsNbP1-1];
+                   double **pts=new double * [size];
+                   for(int iPts=0;iPts<size;iPts++)
+                     pts[iPts]=(double *)coord+dim_space*(connectivity[connectivity_index[localPolygsNbP1-1]+iPts-1]-1);
+                   CalculateBarycenterDyn((const double **)pts,size,dim_space,barycenter+dim_space*index);
+                   delete [] pts;
+                 }
+             }
+           index++;
+           break;
+         }
+       case MED_EN::MED_POLYHEDRA:
+         {
+           if(onAll)
+             {
+               for (int polyhs=0;polyhs<nb_entity_type;polyhs++)
+                 {
+                   int lgthNodes;
+                   int offsetWithClassicType=getNumberOfElements(support_entity,MED_ALL_ELEMENTS);
+                   int *nodes=_connectivity->getNodesOfPolyhedron(offsetWithClassicType+polyhs+1,lgthNodes);
+                   double **pts=new double * [lgthNodes];
+                   for(int iPts=0;iPts<lgthNodes;iPts++)
+                     pts[iPts]=(double *)coord+3*(nodes[iPts]-1);
+                   CalculateBarycenterDyn((const double **)pts,lgthNodes,3,barycenter+3*index);
+                   delete [] pts;
+                   delete [] nodes;
+                   index++;
+                 }
+             }
+           else
+             {
+               const int * supp_number = Support->getNumber(MED_EN::MED_POLYHEDRA);
+               for (int polyhs=0;polyhs<nb_entity_type;polyhs++)
+                 {
+                   int lgthNodes;
+                   int *nodes=_connectivity->getNodesOfPolyhedron(supp_number[polyhs],lgthNodes);
+                   double **pts=new double * [lgthNodes];
+                   for(int iPts=0;iPts<lgthNodes;iPts++)
+                     pts[iPts]=(double *)coord+3*(nodes[iPts]-1);
+                   CalculateBarycenterDyn((const double **)pts,lgthNodes,3,barycenter+3*index);
+                   delete [] pts;
+                   delete [] nodes;
+                   index++;
                  }
                  }
-               index++;
              }
            break;
          }
              }
            break;
          }
@@ -1970,40 +1590,14 @@ FIELD<double>* MESH::getBarycenter(const SUPPORT * Support) const throw (MEDEXCE
          break;
        }
 
          break;
        }
 
-      if (!onAll) delete [] global_connectivity ;
+      if (!onAll)
+       if(type != MED_EN::MED_POLYGON && type != MED_EN::MED_POLYHEDRA)
+         delete [] global_connectivity;
     }
     }
-
-  Barycenter->setValue(MED_FULL_INTERLACE,barycenter);
-
-  delete[] barycenter ;
-
   END_OF(LOC);
   END_OF(LOC);
-
   return Barycenter;
 }
 
   return Barycenter;
 }
 
-//=======================================================================
-//function : checkGridFillCoords
-//purpose  : if this->_isAGrid, assure that _coordinate is filled
-//=======================================================================
-
-// inline void MESH::checkGridFillCoords() const
-// {
-//   if (_isAGrid)
-//     ((GRID *) this)->fillCoordinates();
-// }
-
-//=======================================================================
-//function : checkGridFillConnectivity
-//purpose  : if this->_isAGrid, assure that _connectivity is filled
-//=======================================================================
-
-// inline void MESH::checkGridFillConnectivity() const
-// {
-//   if (_isAGrid)
-//     ((GRID *) this)->fillConnectivity();
-// }
-
 bool MESH::isEmpty() const 
 {
     bool notempty = _name != "NOT DEFINED"                || _coordinate != NULL           || _connectivity != NULL ||
 bool MESH::isEmpty() const 
 {
     bool notempty = _name != "NOT DEFINED"                || _coordinate != NULL           || _connectivity != NULL ||
@@ -2032,9 +1626,6 @@ void MESH::read(int index)
                                      << _drivers.size() 
                                      )
                           );
                                      << _drivers.size() 
                                      )
                           );
-//   if (_isAGrid)
-//     ((GRID *) this)->fillMeshAfterRead();
-
   END_OF(LOC);
 }
 //=======================================================================
   END_OF(LOC);
 }
 //=======================================================================
@@ -2200,7 +1791,7 @@ SUPPORT * MESH::getSkin(const SUPPORT * Support3D) throw (MEDEXCEPTION)
   return a SUPPORT pointer on the union of all SUPPORTs in Supports.
   You should delete this pointer after use to avoid memory leaks.
 */
   return a SUPPORT pointer on the union of all SUPPORTs in Supports.
   You should delete this pointer after use to avoid memory leaks.
 */
-SUPPORT * MESH::mergeSupports(const vector<SUPPORT *> Supports) const throw (MEDEXCEPTION)
+SUPPORT * MESH::mergeSupports(const vector<SUPPORT *> Supports) throw (MEDEXCEPTION)
 {
   const char * LOC = "MESH:::mergeSupports(const vector<SUPPORT *> ) : " ;
   BEGIN_OF(LOC) ;
 {
   const char * LOC = "MESH:::mergeSupports(const vector<SUPPORT *> ) : " ;
   BEGIN_OF(LOC) ;
@@ -2320,7 +1911,7 @@ SUPPORT * MESH::mergeSupports(const vector<SUPPORT *> Supports) const throw (MED
   The (SUPPORT *) NULL pointer is returned if the intersection is empty.
   You should delete this pointer after use to avois memory leaks.
 */
   The (SUPPORT *) NULL pointer is returned if the intersection is empty.
   You should delete this pointer after use to avois memory leaks.
 */
-SUPPORT * MESH::intersectSupports(const vector<SUPPORT *> Supports) const throw (MEDEXCEPTION)
+SUPPORT * MESH::intersectSupports(const vector<SUPPORT *> Supports) throw (MEDEXCEPTION)
 {
   const char * LOC = "MESH:::intersectSupports(const vector<SUPPORT *> ) : " ;
   BEGIN_OF(LOC) ;
 {
   const char * LOC = "MESH:::intersectSupports(const vector<SUPPORT *> ) : " ;
   BEGIN_OF(LOC) ;
@@ -2454,7 +2045,6 @@ SUPPORT * MESH::intersectSupports(const vector<SUPPORT *> Supports) const throw
 // internal helper type
 struct _cell
 {
 // internal helper type
 struct _cell
 {
-    //int number;
     std::vector<int> groups;
     MED_EN::medGeometryElement geometricType;
 };
     std::vector<int> groups;
     MED_EN::medGeometryElement geometricType;
 };
@@ -2462,8 +2052,6 @@ struct _cell
 // Create families from groups
 void MESH::createFamilies() 
 {
 // Create families from groups
 void MESH::createFamilies() 
 {
-    int nbFam=0; // count the families we create, used as identifier ???????????
-
     int idFamNode = 0; // identifier for node families
     int idFamElement = 0; // identifier for cell, face or edge families
 
     int idFamNode = 0; // identifier for node families
     int idFamElement = 0; // identifier for cell, face or edge families
 
@@ -2549,15 +2137,6 @@ void MESH::createFamilies()
            }
            
            tab_families[key.str()].push_back(n+1); // fill the vector of contained cells associated whith the family
            }
            
            tab_families[key.str()].push_back(n+1); // fill the vector of contained cells associated whith the family
-       /*    fam = tab_families.find(key.str());
-           if( fam != tab_families.end())
-               fam->second.push_back(n+1); // +1 : convention Fortran de MED
-           else
-           {
-               vector<int> newfamily;
-               newfamily.push_back(n+1); // +1 : convention Fortran de MED
-               tab_families.insert(make_pair(key.str(),newfamily));
-           }*/
        }
 
 
        }
 
 
@@ -2664,3 +2243,39 @@ void MESH::createFamilies()
     // creation of support, check if it already exist.
     }
 }
     // creation of support, check if it already exist.
     }
 }
+
+int MESH::getElementContainingPoint(const double *coord)
+{
+  if(_spaceDimension==3)
+    {
+      Meta_Wrapper<3> *fromWrapper=new Meta_Wrapper<3> (getNumberOfNodes(),const_cast<double *>(getCoordinates(MED_FULL_INTERLACE)),
+                                                       const_cast<CONNECTIVITY *>(getConnectivityptr()));
+      Meta_Wrapper<3> *toWrapper=new Meta_Wrapper<3> (1,const_cast<double *>(coord));
+      Meta_Mapping<3> *mapping=new Meta_Mapping<3> (fromWrapper,toWrapper);
+      mapping->Cree_Mapping(1);
+      vector<int> vectormapping=mapping->Get_Mapping();
+      return vectormapping[0]+1;
+    }
+  else if(_spaceDimension==2)
+    {
+      Meta_Wrapper<2> *fromWrapper=new Meta_Wrapper<2> (getNumberOfNodes(),const_cast<double *>(getCoordinates(MED_FULL_INTERLACE)),
+                                                       const_cast<CONNECTIVITY *>(getConnectivityptr()));
+      Meta_Wrapper<2> *toWrapper=new Meta_Wrapper<2> (1,const_cast<double *>(coord));
+      Meta_Mapping<2> *mapping=new Meta_Mapping<2> (fromWrapper,toWrapper);
+      mapping->Cree_Mapping(1);
+      vector<int> vectormapping=mapping->Get_Mapping();
+      return vectormapping[0]+1;
+      }
+  else
+    throw MEDEXCEPTION("MESH::getElementContainingPoint : invalid _spaceDimension must be equal to 2 or 3 !!!");
+}
+
+//Presently disconnected in C++
+void MESH::addReference() const
+{
+}
+
+//Presently disconnected in C++
+void MESH::removeReference() const
+{
+}
index ebe7bdc96fe478f29b9a0a38a93dbe573720ba86..a0d229b0350301505294d862504860bfc8da63a9 100644 (file)
@@ -3,17 +3,17 @@
 
 #include <string>
 #include <vector>
 
 #include <string>
 #include <vector>
+#include <list>
 #include <map>
 
 #include "utilities.h"
 #include "MEDMEM_STRING.hxx"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_define.hxx"
 #include <map>
 
 #include "utilities.h"
 #include "MEDMEM_STRING.hxx"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_define.hxx"
-
-//#include "MEDMEM_Support.hxx"
 #include "MEDMEM_Coordinate.hxx"
 #include "MEDMEM_Connectivity.hxx"
 #include "MEDMEM_GenDriver.hxx"
 #include "MEDMEM_Coordinate.hxx"
 #include "MEDMEM_Connectivity.hxx"
 #include "MEDMEM_GenDriver.hxx"
+#include "MEDMEM_RCBase.hxx"
 
 /*! This class contains all the informations related with a MESH :
   - COORDINATES
 
 /*! This class contains all the informations related with a MESH :
   - COORDINATES
@@ -36,7 +36,7 @@ class CELLMODEL;
 class FAMILY;
 class GROUP;
 class SUPPORT;
 class FAMILY;
 class GROUP;
 class SUPPORT;
-class MESH
+class MESH : public RCBASE
 
 {
   //-----------------------//
 
 {
   //-----------------------//
@@ -46,6 +46,7 @@ class MESH
 protected :
 
   string        _name; // A POSITIONNER EN FCT DES IOS ?
 protected :
 
   string        _name; // A POSITIONNER EN FCT DES IOS ?
+  string        _description;
 
   mutable COORDINATE *   _coordinate;
   mutable CONNECTIVITY * _connectivity;
 
   mutable COORDINATE *   _coordinate;
   mutable CONNECTIVITY * _connectivity;
@@ -92,16 +93,22 @@ protected :
 //   inline void checkGridFillConnectivity() const;
   bool isEmpty() const;
   // if this->_isAGrid, assure that _coordinate and _connectivity are filled
 //   inline void checkGridFillConnectivity() const;
   bool isEmpty() const;
   // if this->_isAGrid, assure that _coordinate and _connectivity are filled
-
 public :
 
   // Add your personnal driver line (step 2)
 public :
 
   // Add your personnal driver line (step 2)
-  friend class MED_MESH_RDONLY_DRIVER;
-  friend class MED_MESH_WRONLY_DRIVER;
-
-  friend class MED_MED_RDONLY_DRIVER;
-  friend class MED_MED_WRONLY_DRIVER;
-  friend class MED_MED_RDWR_DRIVER;
+  friend class IMED_MESH_RDONLY_DRIVER;
+  friend class IMED_MESH_WRONLY_DRIVER;
+  friend class MED_MESH_RDONLY_DRIVER21;
+  friend class MED_MESH_WRONLY_DRIVER21;
+  friend class MED_MESH_RDONLY_DRIVER22;
+  friend class MED_MESH_WRONLY_DRIVER22;
+
+  friend class MED_MED_RDONLY_DRIVER21;
+  friend class MED_MED_WRONLY_DRIVER21;
+  friend class MED_MED_RDWR_DRIVER21;
+  friend class MED_MED_RDONLY_DRIVER22;
+  friend class MED_MED_WRONLY_DRIVER22;
+  friend class MED_MED_RDWR_DRIVER22;
 
   friend class GIBI_MESH_RDONLY_DRIVER;
   friend class GIBI_MESH_WRONLY_DRIVER;
 
   friend class GIBI_MESH_RDONLY_DRIVER;
   friend class GIBI_MESH_WRONLY_DRIVER;
@@ -117,6 +124,8 @@ public :
   MESH();
   MESH(MESH &m);
   MESH & operator=(const MESH &m);
   MESH();
   MESH(MESH &m);
   MESH & operator=(const MESH &m);
+  virtual bool operator==(const MESH& other) const;
+  virtual bool deepCompare(const MESH& other) const;
   MESH( driverTypes driverType, const string & fileName="",
        const string & meshName="") throw (MEDEXCEPTION);
   virtual ~MESH();
   MESH( driverTypes driverType, const string & fileName="",
        const string & meshName="") throw (MEDEXCEPTION);
   virtual ~MESH();
@@ -134,14 +143,10 @@ public :
   inline void write(int index=0, const string & driverName = "");
   inline void write(const GENDRIVER & genDriver);
 
   inline void write(int index=0, const string & driverName = "");
   inline void write(const GENDRIVER & genDriver);
 
-  //  void calculateReverseConnectivity();
-  //  void createFaces();      //Faces creation => full constituent informations
-  //  void buildConstituent(); // calculate descendent connectivity + face-cell connectivity
-
-
   inline void        setName(string name);
   inline void        setName(string name);
-
+  inline void        setDescription(string description);
   inline string       getName() const;
   inline string       getName() const;
+  inline string       getDescription() const;
   inline int         getSpaceDimension() const;
   inline int         getMeshDimension() const;
   inline bool        getIsAGrid();
   inline int         getSpaceDimension() const;
   inline int         getMeshDimension() const;
   inline bool        getIsAGrid();
@@ -156,16 +161,26 @@ public :
   //inline int *                    getNodesNumbers();
 
   virtual inline int             getNumberOfTypes(MED_EN::medEntityMesh Entity) const;
   //inline int *                    getNodesNumbers();
 
   virtual inline int             getNumberOfTypes(MED_EN::medEntityMesh Entity) const;
+  virtual int getNumberOfTypesWithPoly(MED_EN::medEntityMesh Entity) const;
   virtual inline const MED_EN::medGeometryElement * getTypes(MED_EN::medEntityMesh Entity) const;
   virtual inline const MED_EN::medGeometryElement * getTypes(MED_EN::medEntityMesh Entity) const;
+  virtual MED_EN::medGeometryElement * getTypesWithPoly(MED_EN::medEntityMesh Entity) const;
   virtual inline const CELLMODEL * getCellsTypes(MED_EN::medEntityMesh Entity) const;
   virtual const int * getGlobalNumberingIndex(MED_EN::medEntityMesh Entity) const;
   virtual inline int getNumberOfElements(MED_EN::medEntityMesh Entity,
                                         MED_EN::medGeometryElement Type) const;
   virtual inline const CELLMODEL * getCellsTypes(MED_EN::medEntityMesh Entity) const;
   virtual const int * getGlobalNumberingIndex(MED_EN::medEntityMesh Entity) const;
   virtual inline int getNumberOfElements(MED_EN::medEntityMesh Entity,
                                         MED_EN::medGeometryElement Type) const;
+  virtual int getNumberOfElementsWithPoly(MED_EN::medEntityMesh Entity,
+                                        MED_EN::medGeometryElement Type) const;
   virtual inline bool existConnectivity(MED_EN::medConnectivity ConnectivityType,
                                        MED_EN::medEntityMesh Entity) const;
   virtual inline bool existConnectivity(MED_EN::medConnectivity ConnectivityType,
                                        MED_EN::medEntityMesh Entity) const;
+  inline bool existPolygonsConnectivity(MED_EN::medConnectivity ConnectivityType,
+                                       MED_EN::medEntityMesh Entity) const;
+  inline bool existPolyhedronConnectivity(MED_EN::medConnectivity ConnectivityType,
+                                         MED_EN::medEntityMesh Entity) const;
 
   virtual inline MED_EN::medGeometryElement getElementType(MED_EN::medEntityMesh Entity,
                                                   int Number) const;
 
   virtual inline MED_EN::medGeometryElement getElementType(MED_EN::medEntityMesh Entity,
                                                   int Number) const;
+  virtual inline MED_EN::medGeometryElement getElementTypeWithPoly(MED_EN::medEntityMesh Entity,
+                                                  int Number) const;
   virtual inline void calculateConnectivity(MED_EN::medModeSwitch Mode,
                                            MED_EN::medConnectivity ConnectivityType,
                                            MED_EN::medEntityMesh Entity) const ;
   virtual inline void calculateConnectivity(MED_EN::medModeSwitch Mode,
                                            MED_EN::medConnectivity ConnectivityType,
                                            MED_EN::medEntityMesh Entity) const ;
@@ -179,6 +194,18 @@ public :
                                             MED_EN::medGeometryElement Type) const;
   virtual inline const int * getConnectivityIndex(MED_EN::medConnectivity ConnectivityType,
                                                  MED_EN::medEntityMesh Entity) const;
                                             MED_EN::medGeometryElement Type) const;
   virtual inline const int * getConnectivityIndex(MED_EN::medConnectivity ConnectivityType,
                                                  MED_EN::medEntityMesh Entity) const;
+
+  inline const int * getPolygonsConnectivity(MED_EN::medConnectivity ConnectivityType,
+                                            MED_EN::medEntityMesh Entity) const;
+  inline const int * getPolygonsConnectivityIndex(MED_EN::medConnectivity ConnectivityType,
+                                                  MED_EN::medEntityMesh Entity) const;
+  inline int getNumberOfPolygons() const;
+  inline const int * getPolyhedronConnectivity(MED_EN::medConnectivity ConnectivityType) const;
+  inline const int * getPolyhedronFacesIndex() const;
+  inline const int * getPolyhedronIndex(MED_EN::medConnectivity ConnectivityType) const;
+  inline int getNumberOfPolyhedronFaces() const;
+  inline int getNumberOfPolyhedron() const;
+
   virtual int                 getElementNumber(MED_EN::medConnectivity ConnectivityType, 
                                                MED_EN::medEntityMesh Entity, 
                                                MED_EN::medGeometryElement Type, 
   virtual int                 getElementNumber(MED_EN::medConnectivity ConnectivityType, 
                                                MED_EN::medEntityMesh Entity, 
                                                MED_EN::medGeometryElement Type, 
@@ -226,17 +253,17 @@ public :
   //                           throw (MEDEXCEPTION); // Il faut preciser !
 
   /*!
   //                           throw (MEDEXCEPTION); // Il faut preciser !
 
   /*!
-    return a SUPPORT pointer on the union of all SUPPORTs in Supports.
+    returns a SUPPORT pointer on the union of all SUPPORTs in Supports.
     You should delete this pointer after use to avois memory leaks.
   */
     You should delete this pointer after use to avois memory leaks.
   */
-  SUPPORT * mergeSupports(const vector<SUPPORT *> Supports) const throw (MEDEXCEPTION) ;
+  static SUPPORT * mergeSupports(const vector<SUPPORT *> Supports) throw (MEDEXCEPTION) ;
 
   /*!
 
   /*!
-    return a SUPPORT pointer on the intersection of all SUPPORTs in Supports.
+    returns a SUPPORT pointer on the intersection of all SUPPORTs in Supports.
     The (SUPPORT *) NULL pointer is returned if the intersection is empty.
     You should delete this pointer after use to avois memory leaks.
    */
     The (SUPPORT *) NULL pointer is returned if the intersection is empty.
     You should delete this pointer after use to avois memory leaks.
    */
-  SUPPORT * intersectSupports(const vector<SUPPORT *> Supports) const throw (MEDEXCEPTION) ;
+  static SUPPORT * intersectSupports(const vector<SUPPORT *> Supports) throw (MEDEXCEPTION) ;
 
   /*!
    * Create families from groups.
 
   /*!
    * Create families from groups.
@@ -246,6 +273,17 @@ public :
    * (There is no way to know which family has change.)
    */
   void createFamilies();
    * (There is no way to know which family has change.)
    */
   void createFamilies();
+  SUPPORT *buildSupportOnNodeFromElementList(const list<int>& listOfElt, MED_EN::medEntityMesh entity) const throw (MEDEXCEPTION);
+  void fillSupportOnNodeFromElementList(const list<int>& listOfElt, SUPPORT *supportToFill) const throw (MEDEXCEPTION);
+  SUPPORT *buildSupportOnElementsFromElementList(const list<int>& listOfElt, MED_EN::medEntityMesh entity) const throw (MEDEXCEPTION);
+  int getElementContainingPoint(const double *coord);
+  template<class T>
+  static FIELD<T> *mergeFields(const vector< FIELD<T>* >& others,bool meshCompare=false);
+  /*!
+   *For ref counter. Only for client
+   */
+  virtual void addReference() const;
+  virtual void removeReference() const;
 };
 
 // ---------------------------------------
 };
 
 // ---------------------------------------
@@ -348,6 +386,18 @@ inline string MESH::getName() const
   return _name;
 }
 
   return _name;
 }
 
+/*! Set the MESH description */
+inline void MESH::setDescription(string description)
+{
+  _description=description; //NOM interne Ã  la classe
+}
+
+/*! Get the MESH description */
+inline string MESH::getDescription() const
+{
+  return _description;
+}
+
 /*! Get the dimension of the space */
 inline int MESH::getSpaceDimension() const
 {
 /*! Get the dimension of the space */
 inline int MESH::getSpaceDimension() const
 {
@@ -439,12 +489,12 @@ inline int MESH::getNumberOfTypes(MED_EN::medEntityMesh entity) const
 }
 
 /*!
 }
 
 /*!
-  Get the list of geometric types used by a given entity.
+  Gets the list of geometric types used by a given entity.
   medEntityMesh entity : MED_CELL, MED_FACE, MED_EDGE, MED_ALL_ENTITIES
 
   REM : Don't use MED_NODE
 
   medEntityMesh entity : MED_CELL, MED_FACE, MED_EDGE, MED_ALL_ENTITIES
 
   REM : Don't use MED_NODE
 
-  If entity is not defined, return an exception.
+  If entity is not defined, it returns an exception.
 */
 inline const MED_EN::medGeometryElement * MESH::getTypes(MED_EN::medEntityMesh entity) const
 {
 */
 inline const MED_EN::medGeometryElement * MESH::getTypes(MED_EN::medEntityMesh entity) const
 {
@@ -471,7 +521,7 @@ inline const CELLMODEL * MESH::getCellsTypes(MED_EN::medEntityMesh Entity) const
   throw MEDEXCEPTION(LOCALIZED("MESH::getCellsTypes( medEntityMesh ) : Connectivity not defined !"));
 }
 
   throw MEDEXCEPTION(LOCALIZED("MESH::getCellsTypes( medEntityMesh ) : Connectivity not defined !"));
 }
 
-/*! Return an array of size NumbreOfTypes+1 which contains, for each
+/*! Returns an array of size NumbreOfTypes+1 which contains, for each
     geometric type of the given entity, the first global element number
     of this type.
 
     geometric type of the given entity, the first global element number
     of this type.
 
@@ -489,14 +539,14 @@ inline const int * MESH::getGlobalNumberingIndex(MED_EN::medEntityMesh entity) c
   throw MEDEXCEPTION(LOCALIZED("MESH::getNumberOfTypes( medEntityMesh ) : Connectivity not defined !"));
 }
 /*!
   throw MEDEXCEPTION(LOCALIZED("MESH::getNumberOfTypes( medEntityMesh ) : Connectivity not defined !"));
 }
 /*!
-  Return the number of element of given geometric type of given entity. Return 0 if query is not defined.
+  Returns the number of element of given geometric type of given entity. Return 0 if query is not defined.
 
   Example :
   - getNumberOfElements(MED_NODE,MED_NONE) : number of node
 
   Example :
   - getNumberOfElements(MED_NODE,MED_NONE) : number of node
-  - getNumberOfElements(MED_NODE,MED_TRIA3) : return 0 (not defined)
-  - getNumberOfElements(MED_FACE,MED_TRIA3) : return number of triangles
+  - getNumberOfElements(MED_NODE,MED_TRIA3) : returns 0 (not defined)
+  - getNumberOfElements(MED_FACE,MED_TRIA3) : returns number of triangles
   elements defined in face entity (0 if not defined)
   elements defined in face entity (0 if not defined)
-  - getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) : return total number
+  - getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) : returns total number
   of elements defined in cell entity
  */
 inline int MESH::getNumberOfElements(MED_EN::medEntityMesh entity, MED_EN::medGeometryElement Type) const
   of elements defined in cell entity
  */
 inline int MESH::getNumberOfElements(MED_EN::medEntityMesh entity, MED_EN::medGeometryElement Type) const
@@ -519,7 +569,7 @@ inline int MESH::getNumberOfElements(MED_EN::medEntityMesh entity, MED_EN::medGe
     }
 }
 /*!
     }
 }
 /*!
-  Return true if the wanted connectivity exist, else return false
+  Returns true if the wanted connectivity exist, else returns false
   (to use before a getSomething method).
  */
 inline bool MESH::existConnectivity(MED_EN::medConnectivity connectivityType, MED_EN::medEntityMesh entity) const
   (to use before a getSomething method).
  */
 inline bool MESH::existConnectivity(MED_EN::medConnectivity connectivityType, MED_EN::medEntityMesh entity) const
@@ -530,7 +580,25 @@ inline bool MESH::existConnectivity(MED_EN::medConnectivity connectivityType, ME
   return _connectivity->existConnectivity(connectivityType,entity);
 }
 /*!
   return _connectivity->existConnectivity(connectivityType,entity);
 }
 /*!
-  Return the geometric type of global element Number of entity Entity.
+  Returns true if the wanted polygons connectivity exist, else returns false
+*/
+inline bool MESH::existPolygonsConnectivity(MED_EN::medConnectivity connectivityType, MED_EN::medEntityMesh entity) const
+{
+  if (_connectivity == (CONNECTIVITY*) NULL)
+    throw MEDEXCEPTION("MESH::existPolygonsConnectivity(medConnectivity,medEntityMesh) : no connectivity defined !");
+  return _connectivity->existPolygonsConnectivity(connectivityType,entity);
+}
+/*!
+  Returns true if the wanted polyhedron connectivity exist, else returns false
+*/
+inline bool MESH::existPolyhedronConnectivity(MED_EN::medConnectivity connectivityType, MED_EN::medEntityMesh entity) const
+{
+  if (_connectivity == (CONNECTIVITY*) NULL)
+    throw MEDEXCEPTION("MESH::existPolyhedronConnectivity(medConnectivity,medEntityMesh) : no connectivity defined !");
+  return _connectivity->existPolyhedronConnectivity(connectivityType,entity);
+}
+/*!
+  Returns the geometric type of global element Number of entity Entity.
 
   Throw an exception if Entity is not defined or Number are wrong (too big).
  */
 
   Throw an exception if Entity is not defined or Number are wrong (too big).
  */
@@ -541,8 +609,19 @@ inline MED_EN::medGeometryElement MESH::getElementType(MED_EN::medEntityMesh Ent
     throw MEDEXCEPTION("MESH::getElementType(medEntityMesh,int) : no connectivity defined !");
   return _connectivity->getElementType(Entity,Number);
 }
     throw MEDEXCEPTION("MESH::getElementType(medEntityMesh,int) : no connectivity defined !");
   return _connectivity->getElementType(Entity,Number);
 }
+
+/*
+  Method equivalent to getElementType except that it includes not only classical Types but polygons/polyhedra also.
+ */
+MED_EN::medGeometryElement MESH::getElementTypeWithPoly(MED_EN::medEntityMesh Entity, int Number) const
+{
+  if (_connectivity==(CONNECTIVITY*)NULL)
+    throw MEDEXCEPTION("MESH::getElementType(medEntityMesh,int) : no connectivity defined !");
+  return _connectivity->getElementTypeWithPoly(Entity,Number);
+}
+
 /*!
 /*!
-  Calculate the ask connectivity. Return an exception if this could not be
+  Calculate the ask connectivity. Returns an exception if this could not be
   done. Do nothing if connectivity already exist.
  */
 
   done. Do nothing if connectivity already exist.
  */
 
@@ -555,7 +634,7 @@ inline void MESH::calculateConnectivity(MED_EN::medModeSwitch Mode,MED_EN::medCo
     throw MEDEXCEPTION(LOCALIZED("MESH::calculateConnectivity : only for MED_FULL_INTERLACE mode"));
 }
 /*!
     throw MEDEXCEPTION(LOCALIZED("MESH::calculateConnectivity : only for MED_FULL_INTERLACE mode"));
 }
 /*!
- Return the corresponding length of the array returned by MESH::getConnectivity with exactly the same arguments.
+ Returns the corresponding length of the array returned by MESH::getConnectivity with exactly the same arguments.
  Used particulary for wrapping CORBA and python.
  */
 inline int MESH::getConnectivityLength(MED_EN::medModeSwitch Mode,MED_EN::medConnectivity ConnectivityType,MED_EN::medEntityMesh entity, MED_EN::medGeometryElement Type) const
  Used particulary for wrapping CORBA and python.
  */
 inline int MESH::getConnectivityLength(MED_EN::medModeSwitch Mode,MED_EN::medConnectivity ConnectivityType,MED_EN::medEntityMesh entity, MED_EN::medGeometryElement Type) const
@@ -574,7 +653,7 @@ inline int MESH::getConnectivityLength(MED_EN::medModeSwitch Mode,MED_EN::medCon
   return size;
 }
 /*!
   return size;
 }
 /*!
-  Return the required connectivity in the right mode for the given
+  Returns the required connectivity in the right mode for the given
   geometric type of the given entity.
 
   To get connectivity for all geometric type, use Mode=MED_FULL_INTERLACE
   geometric type of the given entity.
 
   To get connectivity for all geometric type, use Mode=MED_FULL_INTERLACE
@@ -589,7 +668,7 @@ inline const int * MESH::getConnectivity(MED_EN::medModeSwitch Mode,MED_EN::medC
   throw MEDEXCEPTION(LOCALIZED("MESH::getConnectivity : only for MED_FULL_INTERLACE mode"));
 }
 /*!
   throw MEDEXCEPTION(LOCALIZED("MESH::getConnectivity : only for MED_FULL_INTERLACE mode"));
 }
 /*!
-  Return the required index array for a connectivity received in
+  Returns the required index array for a connectivity received in
   MED_FULL_ENTERLACE mode and MED_ALL_ELEMENTS type.
 
   This array allow to find connectivity of each elements.
   MED_FULL_ENTERLACE mode and MED_ALL_ELEMENTS type.
 
   This array allow to find connectivity of each elements.
@@ -605,7 +684,72 @@ inline const int * MESH::getConnectivityIndex(MED_EN::medConnectivity Connectivi
   return _connectivity->getConnectivityIndex(ConnectivityType, entity);
 }
 /*!
   return _connectivity->getConnectivityIndex(ConnectivityType, entity);
 }
 /*!
-  Return the corresponding length of the array returned by MESH::getReverseConnectivity with exactly the same arguments.
+  Return the required connectivity of polygons for the given entity.
+  You must also get the corresponding index array.
+ */
+inline const int * MESH::getPolygonsConnectivity(MED_EN::medConnectivity ConnectivityType,
+                                                MED_EN::medEntityMesh Entity) const
+{
+  return _connectivity->getPolygonsConnectivity(ConnectivityType,Entity);
+}
+/*!
+  Return the required index array for polygons connectivity.
+ */
+inline const int * MESH::getPolygonsConnectivityIndex(MED_EN::medConnectivity ConnectivityType,
+                                                     MED_EN::medEntityMesh Entity) const
+{
+  return _connectivity->getPolygonsConnectivityIndex(ConnectivityType,Entity);
+}
+/*!
+  Return the number of polygons.
+ */
+inline int MESH::getNumberOfPolygons() const
+{
+  return _connectivity->getNumberOfPolygons();
+}
+/*!
+  Return the required connectivity of polyhedron :
+  - in nodal mode, it gives you the polyhedron faces nodal connectivity.
+  - in descending mode, it gives you the polyhedron faces list.
+  You must also get :
+  - faces index and polyhedron index arrays in nodal mode.
+  - polyhedron index array in descending mode.
+ */
+inline const int * MESH::getPolyhedronConnectivity(MED_EN::medConnectivity ConnectivityType) const
+{
+  return _connectivity->getPolyhedronConnectivity(ConnectivityType);
+}
+/*!
+  Return the index array of polyhedron faces in nodal mode.
+  You must also get the polyhedron index array.
+ */
+inline const int * MESH::getPolyhedronFacesIndex() const
+{
+  return _connectivity->getPolyhedronFacesIndex();
+}
+/*!
+  Return the required polyhedron index array.
+ */
+inline const int * MESH::getPolyhedronIndex(MED_EN::medConnectivity ConnectivityType) const
+{
+  return _connectivity->getPolyhedronIndex(ConnectivityType);
+}
+/*!
+  Return the number of polyhedron faces.
+ */
+inline int MESH::getNumberOfPolyhedronFaces() const
+{
+  return _connectivity->getNumberOfPolyhedronFaces();
+}
+/*!
+  Return the number of polyhedron.
+ */
+inline int MESH::getNumberOfPolyhedron() const
+{
+  return _connectivity->getNumberOfPolyhedron();
+}
+/*!
+  Returns the corresponding length of the array returned by MESH::getReverseConnectivity with exactly the same arguments.
   Used particulary for wrapping CORBA and python.
  */
 
   Used particulary for wrapping CORBA and python.
  */
 
@@ -631,9 +775,9 @@ inline int MESH::getReverseConnectivityLength(MED_EN::medConnectivity Connectivi
   return getReverseConnectivityIndex(ConnectivityType)[nb]-1;
 }
 /*!
   return getReverseConnectivityIndex(ConnectivityType)[nb]-1;
 }
 /*!
-  Return the reverse connectivity required by ConnectivityType :
-  - If ConnectivityType=MED_NODAL : return connectivity node-cell
-  - If ConnectivityType=MED_DESCENDING : return connectivity face-cell
+  Returns the reverse connectivity required by ConnectivityType :
+  - If ConnectivityType=MED_NODAL : returns connectivity node-cell
+  - If ConnectivityType=MED_DESCENDING : returns connectivity face-cell
 
   You must get ReverseConnectivityIndex array to use it.
  */
 
   You must get ReverseConnectivityIndex array to use it.
  */
@@ -647,7 +791,7 @@ inline const int * MESH::getReverseConnectivity(MED_EN::medConnectivity Connecti
   return _connectivity->getReverseConnectivity(ConnectivityType,Entity);
 }
 /*!
   return _connectivity->getReverseConnectivity(ConnectivityType,Entity);
 }
 /*!
-  Return the corresponding length of the array returned by MESH::getReverseConnectivityIndex with exactly the same arguments.
+  Returns the corresponding length of the array returned by MESH::getReverseConnectivityIndex with exactly the same arguments.
   Used particulary for wrapping CORBA and python.
  */
 inline int MESH::getReverseConnectivityIndexLength(MED_EN::medConnectivity ConnectivityType,
   Used particulary for wrapping CORBA and python.
  */
 inline int MESH::getReverseConnectivityIndexLength(MED_EN::medConnectivity ConnectivityType,
@@ -670,7 +814,7 @@ inline int MESH::getReverseConnectivityIndexLength(MED_EN::medConnectivity Conne
     }
 }
 /*!
     }
 }
 /*!
-  Return the index array required by ConnectivityType.
+  Returns the index array required by ConnectivityType.
 
   This array allow to find reverse connectivity of each elements.
 
 
   This array allow to find reverse connectivity of each elements.
 
@@ -832,4 +976,69 @@ inline bool MESH::getIsAGrid()
 
 }
 
 
 }
 
+#include "MEDMEM_Support.hxx"
+
+namespace MEDMEM {
+
+//Create a new FIELD that should be deallocated based on a SUPPORT that should be deallocated too.
+template<class T>
+FIELD<T> *MESH::mergeFields(const vector< FIELD<T>* >& others,bool meshCompare)
+{
+  const char * LOC = "MESH::mergeFields(const vector< FIELD<T>* >& others,bool meshCompare): ";
+  BEGIN_OF(LOC);
+  int i,j;
+  if(others.size()==0)
+    return 0;
+  vector<SUPPORT *> sup;
+  typename vector< FIELD<T>* >::const_iterator iter;
+  for(iter=others.begin();iter!=others.end();iter++)
+    {
+      sup.push_back((SUPPORT *)(*iter)->getSupport());
+    }
+  iter=others.begin();
+  SUPPORT *retSup=mergeSupports(sup);
+  int retNumberOfComponents=(*iter)->getNumberOfComponents();
+  FIELD<T> *ret=new FIELD<T>(retSup,retNumberOfComponents,MED_EN::MED_FULL_INTERLACE);
+  ret->setValueType((*iter)->getValueType());
+  T* valuesToSet=(T*)ret->getValue(MED_EN::MED_FULL_INTERLACE);
+  int nbOfEltsRetSup=retSup->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
+  T* tempValues=new T[retNumberOfComponents];
+  if(retSup->isOnAllElements())
+    {
+      for(i=0;i<nbOfEltsRetSup;i++)
+       {
+         bool found=false;
+         for(iter=others.begin();iter!=others.end() && !found;iter++)
+           {
+             found=(*iter)->getValueOnElement(i+1,tempValues);
+             if(found)
+               for(j=0;j<retNumberOfComponents;j++)
+                 valuesToSet[i*retNumberOfComponents+j]=tempValues[j];
+           }
+       }
+    }
+  else
+    {
+      const int *eltsRetSup=retSup->getNumber(MED_EN::MED_ALL_ELEMENTS);
+      for(i=0;i<nbOfEltsRetSup;i++)
+       {
+         bool found=false;
+         for(iter=others.begin();iter!=others.end() && !found;iter++)
+           {
+             found=(*iter)->getValueOnElement(eltsRetSup[i],tempValues);
+             if(found)
+               for(j=0;j<retNumberOfComponents;j++)
+                 valuesToSet[i*retNumberOfComponents+j]=tempValues[j];
+           }
+         if(!found)
+           throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Merging error due to an error in merging support"));
+       }
+    }
+  delete [] tempValues;
+  END_OF(LOC);
+  return ret;
+}
+
+}
+
 #endif /* MESH_HXX */
 #endif /* MESH_HXX */
index 31d6a61bb7f4388198dedec0fc31df25949d8f4b..b88915dc30e0a28d09e7f804bf68e7df5980dcc4 100644 (file)
@@ -36,11 +36,12 @@ void MESHING::setSpaceDimension(const int SpaceDimension)
   _spaceDimension = SpaceDimension ;
 }
 
   _spaceDimension = SpaceDimension ;
 }
 
-/* Set the dimension of the MESHING */
-// void MESHING::setMeshDimension(const int MeshDimension)
-// {
-//    _meshDimension = MeshDimension ;
-// }
+/*! Set the dimension of the MESHING */
+void MESHING::setMeshDimension(const int MeshDimension)
+{
+   _meshDimension = MeshDimension ;
+   _connectivity->setEntityDimension(MeshDimension);
+}
 
 /*! Set the number of nodes used in the MESH */
 void MESHING::setNumberOfNodes(const int NumberOfNodes)
 
 /*! Set the number of nodes used in the MESH */
 void MESHING::setNumberOfNodes(const int NumberOfNodes)
@@ -246,6 +247,40 @@ void MESHING::setConnectivity(const int * Connectivity,
   _connectivity->setNodal(Connectivity,Entity,Type) ;
 }
 
   _connectivity->setNodal(Connectivity,Entity,Type) ;
 }
 
+void MESHING::setPolygonsConnectivity     (const int * ConnectivityIndex,
+                                          const int * ConnectivityValue,
+                                          int nbOfPolygons,
+                                          const MED_EN::medEntityMesh Entity)
+  throw (MEDEXCEPTION)
+{
+  if (_connectivity == (CONNECTIVITY*)NULL)
+    throw MEDEXCEPTION("No connectivity defined !");
+  if(_connectivity->getPolyTypeRelativeTo()==MED_EN::MED_POLYGON)
+    {
+      _connectivity->setPolygonsConnectivity(MED_NODAL, Entity, ConnectivityValue, ConnectivityIndex,ConnectivityIndex[nbOfPolygons]-1,nbOfPolygons) ;
+    }
+  else
+    throw MEDEXCEPTION("Invalid connectivity for polygons !!!");
+}
+
+void MESHING::setPolyhedraConnectivity     (const int * PolyhedronIndex,
+                                           const int * FacesIndex,
+                                           const int * Nodes,
+                                           int nbOfPolyhedra,
+                                           const MED_EN::medEntityMesh Entity)
+  throw (MEDEXCEPTION)
+{
+  if (_connectivity == (CONNECTIVITY*)NULL)
+    throw MEDEXCEPTION("No connectivity defined !");
+  if(_connectivity->getPolyTypeRelativeTo()==MED_EN::MED_POLYHEDRA)
+    {
+      int nbOfFacesOfAllPolyhedra=PolyhedronIndex[nbOfPolyhedra]-1;
+      _connectivity->setPolyhedronConnectivity(MED_NODAL, Nodes, PolyhedronIndex, FacesIndex[nbOfFacesOfAllPolyhedra]-1 , nbOfPolyhedra, FacesIndex, nbOfFacesOfAllPolyhedra) ;
+    }
+  else
+    throw MEDEXCEPTION("Invalid connectivity for polyhedra !!!");
+}
+
 /*!
   NOT YET IMPLEMENTED !! WARNING
 */
 /*!
   NOT YET IMPLEMENTED !! WARNING
 */
index 06cd0d395222da2492dff4da84237b4ff32c4389..52e4d1c3738fabf6f061d2e74c446487c2568ec9 100644 (file)
@@ -20,7 +20,7 @@ public :
   ~MESHING();
 
   void setSpaceDimension   (const int SpaceDimension) ;
   ~MESHING();
 
   void setSpaceDimension   (const int SpaceDimension) ;
-  //void setMeshDimension    (const int MeshDimension) ;
+  void setMeshDimension    (const int MeshDimension) ;
   void setNumberOfNodes    (const int NumberOfNodes) ;
   void setCoordinates      (const int SpaceDimension,
                            const int NumberOfNodes,
   void setNumberOfNodes    (const int NumberOfNodes) ;
   void setCoordinates      (const int SpaceDimension,
                            const int NumberOfNodes,
@@ -47,6 +47,19 @@ public :
                            const MED_EN::medEntityMesh Entity,
                            const MED_EN::medGeometryElement Type)
     throw (MEDEXCEPTION) ;
                            const MED_EN::medEntityMesh Entity,
                            const MED_EN::medGeometryElement Type)
     throw (MEDEXCEPTION) ;
+  
+  void setPolygonsConnectivity     (const int * ConnectivityIndex,
+                                   const int * ConnectivityValue,
+                                   int nbOfPolygons,
+                                   const MED_EN::medEntityMesh Entity)
+    throw (MEDEXCEPTION) ;
+
+  void setPolyhedraConnectivity     (const int * PolyhedronIndex,
+                                    const int * FacesIndex,
+                                    const int * Nodes,
+                                    int nbOfPolyhedra,
+                                    const MED_EN::medEntityMesh Entity)
+    throw (MEDEXCEPTION) ;
 
   void setConnectivities   (const int * ConnectivityIndex,
                            const int * ConnectivityValue,
 
   void setConnectivities   (const int * ConnectivityIndex,
                            const int * ConnectivityValue,
diff --git a/src/MEDMEM/MEDMEM_PolyhedronArray.cxx b/src/MEDMEM/MEDMEM_PolyhedronArray.cxx
new file mode 100644 (file)
index 0000000..dc37d6f
--- /dev/null
@@ -0,0 +1,17 @@
+using namespace std;
+#include "MEDMEM_PolyhedronArray.hxx"
+using namespace MEDMEM;
+using MED_EN::med_int;
+
+POLYHEDRONARRAY::POLYHEDRONARRAY():_numberOfPolyhedron(0), _numberOfFaces(0), _numberOfNodes(0), _polyhedronIndex((med_int*)NULL), _facesIndex((med_int*)NULL), _nodes((med_int*)NULL)
+{}
+
+POLYHEDRONARRAY::POLYHEDRONARRAY(med_int numberofpolyhedron,med_int numberoffaces,med_int numberofnodes):_numberOfPolyhedron(numberofpolyhedron), _numberOfFaces(numberoffaces), _numberOfNodes(numberofnodes), _polyhedronIndex(numberofpolyhedron+1), _facesIndex(numberoffaces+1), _nodes(numberofnodes)
+{}
+
+POLYHEDRONARRAY::POLYHEDRONARRAY(const POLYHEDRONARRAY& m):_numberOfPolyhedron(m._numberOfPolyhedron), _numberOfFaces(m._numberOfFaces), _numberOfNodes(m._numberOfNodes), _polyhedronIndex(m._numberOfPolyhedron+1), _facesIndex(m._numberOfFaces+1), _nodes(m._numberOfNodes)
+{
+  _polyhedronIndex.set(m._numberOfPolyhedron+1, m.getPolyhedronIndex());
+  _facesIndex.set(m._numberOfFaces+1, m.getFacesIndex());
+  _nodes.set(m._numberOfNodes, m.getNodes());
+}
diff --git a/src/MEDMEM/MEDMEM_PolyhedronArray.hxx b/src/MEDMEM/MEDMEM_PolyhedronArray.hxx
new file mode 100644 (file)
index 0000000..2a76330
--- /dev/null
@@ -0,0 +1,80 @@
+# ifndef __POLYHEDRONARRAY_H__
+# define __POLYHEDRONARRAY_H__
+
+#include "MEDMEM_Exception.hxx"
+#include "MEDMEM_PointerOf.hxx"
+#include "MEDMEM_define.hxx"
+
+namespace MEDMEM {
+class POLYHEDRONARRAY
+{
+private :
+  MED_EN::med_int   _numberOfPolyhedron;
+  MED_EN::med_int   _numberOfFaces;
+  MED_EN::med_int   _numberOfNodes;
+  PointerOf <MED_EN::med_int>   _polyhedronIndex;
+  PointerOf <MED_EN::med_int>   _facesIndex;
+  PointerOf <MED_EN::med_int>   _nodes;
+
+public :
+  POLYHEDRONARRAY();
+  POLYHEDRONARRAY(MED_EN::med_int numberofpolyhedron,MED_EN::med_int numberoffaces,MED_EN::med_int numberofnodes);
+  POLYHEDRONARRAY(const POLYHEDRONARRAY& m);
+
+  inline  MED_EN::med_int   getNumberOfPolyhedron()     const;
+  inline  MED_EN::med_int   getNumberOfFaces()          const;
+  inline  MED_EN::med_int   getNumberOfNodes()          const;
+  inline  const MED_EN::med_int*   getPolyhedronIndex()    const;
+  inline  const MED_EN::med_int*   getFacesIndex()         const;
+  inline  const MED_EN::med_int*   getNodes()              const;
+
+  inline  void      setPolyhedronIndex(const MED_EN::med_int* polyhedronindex);
+  inline  void      setFacesIndex(const MED_EN::med_int* facesindex);
+  inline  void      setNodes(const MED_EN::med_int* nodes);
+};
+
+// ----------------------------------------------------------
+//                       Methodes Inline
+// ----------------------------------------------------------
+inline MED_EN::med_int POLYHEDRONARRAY::getNumberOfPolyhedron() const
+{
+  return _numberOfPolyhedron;
+};
+inline MED_EN::med_int POLYHEDRONARRAY::getNumberOfFaces() const
+{
+  return _numberOfFaces;
+};
+inline MED_EN::med_int POLYHEDRONARRAY::getNumberOfNodes() const
+{
+  return _numberOfNodes;
+};
+inline const MED_EN::med_int* POLYHEDRONARRAY::getPolyhedronIndex() const
+{
+  return (const MED_EN::med_int*) _polyhedronIndex;
+};
+inline const MED_EN::med_int* POLYHEDRONARRAY::getFacesIndex() const
+{
+  return (const MED_EN::med_int*) _facesIndex;
+};
+inline const MED_EN::med_int* POLYHEDRONARRAY::getNodes() const
+{
+  return (const MED_EN::med_int*) _nodes;
+};
+
+
+inline void POLYHEDRONARRAY::setPolyhedronIndex(const MED_EN::med_int* polyhedronindex)
+{
+  _polyhedronIndex.set(_numberOfPolyhedron+1, polyhedronindex);
+}
+inline void POLYHEDRONARRAY::setFacesIndex(const MED_EN::med_int* facesindex)
+{
+  _facesIndex.set(_numberOfFaces+1, facesindex);
+}
+inline void POLYHEDRONARRAY::setNodes(const MED_EN::med_int* nodes)
+{
+  _nodes.set(_numberOfNodes, nodes);
+}
+
+}
+
+# endif
index c1122974f199541dd02a9375ee4a6e7edbd80ad4..c93ea9393d431c0f84444af3d02ff0160dc4e107 100644 (file)
@@ -398,7 +398,7 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
        //   the syntax corresponding to the use of input file is not implemented
        if ( isKeyWord(buf_ligne,"LOCA") )
        {
        //   the syntax corresponding to the use of input file is not implemented
        if ( isKeyWord(buf_ligne,"LOCA") )
        {
-           MESSAGE("Mot clé LOCA détecté");
+           MESSAGE("Mot clé LOCA détecté");
            processLoca=true;
            // if currentGroup is not empty, a group has been precessed 
            //  -> we store it, clear currentGroup, and start the precessing of a new group
            processLoca=true;
            // if currentGroup is not empty, a group has been precessed 
            //  -> we store it, clear currentGroup, and start the precessing of a new group
@@ -436,7 +436,7 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
        //   the syntax corresponding to structured grids is not implemented
        else if ( isKeyWord(buf_ligne,"GRID") )
        {
        //   the syntax corresponding to structured grids is not implemented
        else if ( isKeyWord(buf_ligne,"GRID") )
        {
-           MESSAGE("Mot clé GRID détecté");
+           MESSAGE("Mot clé GRID détecté");
            processLoca=false;
            pos=buf_ligne.find("UNST",0);
            if ( pos != string::npos ) // unstructured grid
            processLoca=false;
            pos=buf_ligne.find("UNST",0);
            if ( pos != string::npos ) // unstructured grid
@@ -468,7 +468,7 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
        //   the default option is HYBR
        else if ( isKeyWord(buf_ligne,"CONN") )
        {
        //   the default option is HYBR
        else if ( isKeyWord(buf_ligne,"CONN") )
        {
-           MESSAGE("Mot clé CONN détecté");
+           MESSAGE("Mot clé CONN détecté");
            processLoca=false;
            string fileCONN=getPorflowFileName(buf_ligne,"CONN");
            
            processLoca=false;
            string fileCONN=getPorflowFileName(buf_ligne,"CONN");
            
@@ -478,6 +478,7 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
 
            if(fileCONN.rfind('/') == string::npos)
                // no directory was specified -> we add dirName, which may be empty
 
            if(fileCONN.rfind('/') == string::npos)
                // no directory was specified -> we add dirName, which may be empty
+
                connFileName=dirName+fileCONN;
            else
                connFileName=fileCONN;
                connFileName=dirName+fileCONN;
            else
                connFileName=fileCONN;
@@ -488,7 +489,7 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
        //   expected syntax : COOR {VERT} {filename}
        else if ( isKeyWord(buf_ligne,"COOR") )
        {
        //   expected syntax : COOR {VERT} {filename}
        else if ( isKeyWord(buf_ligne,"COOR") )
        {
-           MESSAGE("Mot clé COOR détecté");
+           MESSAGE("Mot clé COOR");
            processLoca=false;
            string fileCOOR=getPorflowFileName(buf_ligne,"COOR");
 
            processLoca=false;
            string fileCOOR=getPorflowFileName(buf_ligne,"COOR");
 
@@ -561,11 +562,12 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
        if ( isGroupAList[i] ) 
        {
            // medi.groupes[i].groupes is a vector of element numbers; it points to it
        if ( isGroupAList[i] ) 
        {
            // medi.groupes[i].groupes is a vector of element numbers; it points to it
+           medi.groupes[i].mailles.resize( medi.groupes[i].groupes.size() );
            std::vector<int>::const_iterator it=medi.groupes[i].groupes.begin();
            std::vector<int>::const_iterator it=medi.groupes[i].groupes.begin();
-           for(  ; it!=medi.groupes[i].groupes.end(); ++it)
+           for(int j = 0 ; it!=medi.groupes[i].groupes.end(); ++it, ++j)
            {
                // insert the iterator to the corresponding cell we stored in p_ma_table
            {
                // insert the iterator to the corresponding cell we stored in p_ma_table
-               medi.groupes[i].mailles.insert( p_ma_table[*it] );
+               medi.groupes[i].mailles[j] = p_ma_table[*it];
            }
            
        }
            }
            
        }
@@ -574,12 +576,14 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
            int nelem=0;
            int nface=0;
            int ngeom=0;
            int nelem=0;
            int nface=0;
            int ngeom=0;
+           int ielem=0;
            std::set<_maille>::iterator p_ma;
            _maille maille2D;
            
            // medi.groupes[i].groupes is a vector of paired element and surface numbers
            // *it points to the element number,  *(it+1) points to the surface number
            std::vector<int>::const_iterator it=medi.groupes[i].groupes.begin();
            std::set<_maille>::iterator p_ma;
            _maille maille2D;
            
            // medi.groupes[i].groupes is a vector of paired element and surface numbers
            // *it points to the element number,  *(it+1) points to the surface number
            std::vector<int>::const_iterator it=medi.groupes[i].groupes.begin();
+           medi.groupes[i].mailles.resize( medi.groupes[i].groupes.size() / 2 );
            for(  ; it!=medi.groupes[i].groupes.end(); ++it)
            {
                nelem=*it;
            for(  ; it!=medi.groupes[i].groupes.end(); ++it)
            {
                nelem=*it;
@@ -598,17 +602,17 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
                maille2D.sommets.resize(l);
                maille2D.geometricType = get2DMedGeomType(l);
                p_ma = medi.maillage.insert(maille2D).first; // we insert the face in our mesh
                maille2D.sommets.resize(l);
                maille2D.geometricType = get2DMedGeomType(l);
                p_ma = medi.maillage.insert(maille2D).first; // we insert the face in our mesh
-               medi.groupes[i].mailles.insert(p_ma); // and insert an iterator on it in our group
+               medi.groupes[i].mailles[ielem++]=p_ma; // and insert an iterator on it in our group
                maille2D.sommets.clear();
            }
 
        }
                maille2D.sommets.clear();
            }
 
        }
-       // medi.groupes[i].groupes.clear(); // we don't need element numbers anymore
+        medi.groupes[i].groupes.clear(); // we don't need element numbers anymore
        
     }
 
     p_ma_table.clear(); // we don't need it anymore
        
     }
 
     p_ma_table.clear(); // we don't need it anymore
-    MESSAGE(LOC << "GIBI_MESH_RDONLY_DRIVER::read : RESULTATS STRUCTURE INTERMEDIAIRES : ");
+    MESSAGE(LOC << "PORFLOW_MESH_RDONLY_DRIVER::read : RESULTATS STRUCTURE INTERMEDIAIRES : ");
     MESSAGE(LOC <<  medi );
            // TRANSFORMATION EN STRUCTURES MED
     if ( ! _ptrMesh->isEmpty() )
     MESSAGE(LOC <<  medi );
            // TRANSFORMATION EN STRUCTURES MED
     if ( ! _ptrMesh->isEmpty() )
@@ -639,7 +643,7 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
 
        // appele en dernier car cette fonction detruit le maillage intermediaire!
        _ptrMesh->_connectivity = medi.getConnectivity(); 
 
        // appele en dernier car cette fonction detruit le maillage intermediaire!
        _ptrMesh->_connectivity = medi.getConnectivity(); 
-       MESSAGE(LOC << "GIBI_MESH_RDONLY_DRIVER::read : FIN ");
+       MESSAGE(LOC << "PORFLOW_MESH_RDONLY_DRIVER::read : FIN ");
 
        // calcul de la connectivite d-1 complete, avec renumerotation des groupes
        // if (_ptrMesh->_spaceDimension==3)
 
        // calcul de la connectivite d-1 complete, avec renumerotation des groupes
        // if (_ptrMesh->_spaceDimension==3)
@@ -647,9 +651,8 @@ void PORFLOW_MESH_RDONLY_DRIVER::read(void)
        // else if (_ptrMesh->_spaceDimension==2)
        //     _ptrMesh->_connectivity->updateGroup(_ptrMesh->_groupEdge) ;
        
        // else if (_ptrMesh->_spaceDimension==2)
        //     _ptrMesh->_connectivity->updateGroup(_ptrMesh->_groupEdge) ;
        
-       // Creation des familles Ã  partir des groupes
-       // NC : Cet appel pourra Ãªtre différé quand la gestion de la cohérence famille/groupes sera assurée
-       _ptrMesh->createFamilies();
+       // Creation des familles ?artir des groupes
+       // NC : Cet appel pourra ?e diff鲩 quand la gestion de la cohé²¥nce famille/groupes sera assur饊      _ptrMesh->createFamilies();
     }
 
 
     }
 
 
index 2f6cfbef2642382212b33b0ea2f74649696784ab..2478309738d0d1438a11b67a58b23090648730d4 100644 (file)
@@ -6,12 +6,15 @@
 
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_GenDriver.hxx"
 
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_GenDriver.hxx"
-#include "MEDMEM_DriverTools.hxx"
+//#include "MEDMEM_DriverTools.hxx"
 
 #include "MEDMEM_STRING.hxx"
 #include "MEDMEM_Exception.hxx"
 #include "utilities.h"
 
 
 #include "MEDMEM_STRING.hxx"
 #include "MEDMEM_Exception.hxx"
 #include "utilities.h"
 
+#include <vector>
+#include <set>
+
 /*!
 
   Driver PORFLOW for MESH.
 /*!
 
   Driver PORFLOW for MESH.
@@ -26,6 +29,8 @@ class MESH;
 class FAMILY;
 class GROUP;
 class CONNECTIVITY;
 class FAMILY;
 class GROUP;
 class CONNECTIVITY;
+class _intermediateMED;
+class _maille;
 class PORFLOW_MESH_DRIVER : public GENDRIVER
 {
 protected:
 class PORFLOW_MESH_DRIVER : public GENDRIVER
 {
 protected:
diff --git a/src/MEDMEM/MEDMEM_RCBase.hxx b/src/MEDMEM/MEDMEM_RCBase.hxx
new file mode 100644 (file)
index 0000000..65c6d30
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __MEDMEM_RCBASE_HXX__
+#define __MEDMEM_RCBASE_HXX__
+
+namespace MEDMEM {
+  
+  class RCBASE {
+  public:
+    virtual void addReference() const = 0;
+    virtual void removeReference() const = 0;
+  };
+
+}
+
+#endif
index cc1f6401d2342aeae75b847fd664ee2db58c23be..a739cafe8a6898c6bec21010302756e04debd3ec 100644 (file)
@@ -7,18 +7,16 @@
 #include <algorithm>
 #include <list>
 
 #include <algorithm>
 #include <list>
 
-//#include "utilities.h"
-//#include "MEDMEM_define.hxx"
 #include "MEDMEM_DriversDef.hxx"
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_DriversDef.hxx"
 #include "MEDMEM_Support.hxx"
-//#include "MEDMEM_Family.hxx"
-//#include "MEDMEM_Group.hxx"
 #include "MEDMEM_Mesh.hxx"
 
 using namespace std;
 using namespace MED_EN;
 using namespace MEDMEM;
 
 #include "MEDMEM_Mesh.hxx"
 
 using namespace std;
 using namespace MED_EN;
 using namespace MEDMEM;
 
+#define MED_NBR_GEOMETRIE_MAILLE 15
+
 /* This class is a generic class for family and group */
 
 /*!
 /* This class is a generic class for family and group */
 
 /*!
@@ -29,7 +27,6 @@ SUPPORT::SUPPORT(): _name(""),        _description("None"), _mesh((MESH*)NULL),
                    _entity(MED_CELL), _numberOfGeometricType(0),
                    _geometricType((medGeometryElement*)NULL),
                    _numberOfGaussPoint((int*)NULL),
                    _entity(MED_CELL), _numberOfGeometricType(0),
                    _geometricType((medGeometryElement*)NULL),
                    _numberOfGaussPoint((int*)NULL),
-                   //_geometricTypeNumber((int*)NULL),
                    _isOnAllElts(false),
                    _numberOfElements((int*)NULL),
                    _totalNumberOfElements(0),
                    _isOnAllElts(false),
                    _numberOfElements((int*)NULL),
                    _totalNumberOfElements(0),
@@ -48,7 +45,6 @@ SUPPORT::SUPPORT(MESH* Mesh, string Name/*=""*/, medEntityMesh Entity/*=MED_CELL
                _numberOfGeometricType(0),
                _geometricType((medGeometryElement*)NULL),
                _numberOfGaussPoint((int*)NULL),
                _numberOfGeometricType(0),
                _geometricType((medGeometryElement*)NULL),
                _numberOfGaussPoint((int*)NULL),
-               //_geometricTypeNumber((int*)NULL),
                _isOnAllElts(true), 
                _numberOfElements((int*)NULL),
                _totalNumberOfElements(0),
                _isOnAllElts(true), 
                _numberOfElements((int*)NULL),
                _totalNumberOfElements(0),
@@ -88,13 +84,6 @@ SUPPORT::SUPPORT(const SUPPORT & m)
     }
   else
     _numberOfGaussPoint = (int *) NULL;
     }
   else
     _numberOfGaussPoint = (int *) NULL;
-//    if (m._geometricTypeNumber != NULL)
-//      {
-//        _geometricTypeNumber = new int[m._numberOfGeometricType];
-//        memcpy(_geometricTypeNumber,m._geometricTypeNumber,m._numberOfGeometricType*sizeof(int));
-//      }
-//    else
-//      _geometricTypeNumber = (int *) NULL;
   _isOnAllElts = m._isOnAllElts;
   if (m._numberOfElements != NULL)
     {
   _isOnAllElts = m._isOnAllElts;
   if (m._numberOfElements != NULL)
     {
@@ -121,16 +110,7 @@ SUPPORT::~SUPPORT()
 //-----------------
 {
   MESSAGE("Destructeur ~SUPPORT()");
 //-----------------
 {
   MESSAGE("Destructeur ~SUPPORT()");
-  if (_geometricType != (medGeometryElement *) NULL) 
-    delete [] _geometricType ;
-  if (_numberOfGaussPoint != (int *) NULL) 
-    delete [] _numberOfGaussPoint ;
-  //      if (_geometricTypeNumber!=NULL) 
-  //                   delete[] _geometricTypeNumber ;
-  if (_numberOfElements != (int *) NULL) 
-    delete[] _numberOfElements ;
-  if (_number != (MEDSKYLINEARRAY *) NULL) 
-    delete _number ;
+  clearDataOnNumbers();
 }
 
 /*!
 }
 
 /*!
@@ -194,17 +174,18 @@ void SUPPORT::update()
       _numberOfGaussPoint = new int[1] ;
       _numberOfGaussPoint[0]=1;
     } else { // we duplicate information from _mesh
       _numberOfGaussPoint = new int[1] ;
       _numberOfGaussPoint[0]=1;
     } else { // we duplicate information from _mesh
-      _numberOfGeometricType=_mesh->getNumberOfTypes(_entity);
+      _numberOfGeometricType=_mesh->getNumberOfTypesWithPoly(_entity);
       if (_geometricType == (medGeometryElement *) NULL)
       if (_geometricType == (medGeometryElement *) NULL)
-       _geometricType = new medGeometryElement[_numberOfGeometricType] ;
-      memcpy(_geometricType,_mesh->getTypes(_entity),_numberOfGeometricType*sizeof(medGeometryElement));
+       _geometricType=_mesh->getTypesWithPoly(_entity);
+      else
+       memcpy(_geometricType,_mesh->getTypes(_entity),_numberOfGeometricType*sizeof(medGeometryElement));
       if (_numberOfElements == (int *) NULL)
        _numberOfElements = new int[_numberOfGeometricType] ;
       if (_numberOfGaussPoint == (int *) NULL)
        _numberOfGaussPoint = new int[_numberOfGeometricType] ;
       _totalNumberOfElements=0;
       for (int i=0;i<_numberOfGeometricType;i++) {
       if (_numberOfElements == (int *) NULL)
        _numberOfElements = new int[_numberOfGeometricType] ;
       if (_numberOfGaussPoint == (int *) NULL)
        _numberOfGaussPoint = new int[_numberOfGeometricType] ;
       _totalNumberOfElements=0;
       for (int i=0;i<_numberOfGeometricType;i++) {
-       _numberOfElements[i]=_mesh->getNumberOfElements(_entity,_geometricType[i]) ;
+       _numberOfElements[i]=_mesh->getNumberOfElementsWithPoly(_entity,_geometricType[i]) ;
        _totalNumberOfElements+=_numberOfElements[i];
        _numberOfGaussPoint[i]=1 ;
       }
        _totalNumberOfElements+=_numberOfElements[i];
        _numberOfGaussPoint[i]=1 ;
       }
@@ -220,164 +201,43 @@ void SUPPORT::update()
 void SUPPORT::blending(SUPPORT * mySupport) throw (MEDEXCEPTION)
 //-------------------
 {
 void SUPPORT::blending(SUPPORT * mySupport) throw (MEDEXCEPTION)
 //-------------------
 {
-  const char * LOC = "SUPPORT::blending() : " ;
-  BEGIN_OF(LOC) ;
-
-  MESSAGE(LOC<< "SUPPORT entry : " << *mySupport) ;
-
-  // on same entity :
-  if ( _entity != mySupport->getEntity() )
+  const char * LOC="SUPPORT::blending(SUPPORT *) : ";
+  BEGIN_OF(LOC);
+  if (_entity!=mySupport->getEntity())
     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
-
-  int * tmp_NumberOfElementsInType = new int[MED_NBR_GEOMETRIE_MAILLE];
-  medGeometryElement * myType = new medGeometryElement[MED_NBR_GEOMETRIE_MAILLE];
-  int * whereIsType = new int[MED_NBR_GEOMETRIE_MAILLE];
-  //MESH_ENTITIES myMeshEntities() ;
-  list<MED_EN::medGeometryElement>::const_iterator listIt ;
-  int it=0 ;
-  for(listIt=(meshEntities[_entity]).begin();listIt!=(meshEntities[_entity]).end();listIt++) {
-    tmp_NumberOfElementsInType[it]=0;
-    whereIsType[it]=0 ;
-    try {
-      int tmp_int = 0;
-      tmp_int = getNumberOfElements((medGeometryElement)(*listIt)) ;
-      tmp_NumberOfElementsInType[it]+=tmp_int ;
-      whereIsType[it]+=1 ;
-    }
-    catch (MEDEXCEPTION & ex) { SCRUTE(sizeof(ex)); };
-    try {
-      int tmp_int = 0;
-      tmp_int = mySupport->getNumberOfElements((medGeometryElement)(*listIt)) ;
-      tmp_NumberOfElementsInType[it]+=tmp_int ;
-      whereIsType[it]+=2 ;
-    }
-    catch (const MEDEXCEPTION & ex) {};
-    if (whereIsType[it]!=0) {
-      myType[it]=(medGeometryElement)(*listIt) ;
-      SCRUTE(myType[it]);SCRUTE(it);SCRUTE((*listIt));
-      it++;
+  if(!(*_mesh == *mySupport->getMesh()))
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Mesh are different !"));
+  if(_isOnAllElts)
+    return;
+  if(mySupport->isOnAllElements())
+    {
+      *this=*mySupport;
+      return;
     }
     }
-  }
-  // set new value :
-//   int * numberOfElements=_numberOfElements ;
-//   _numberOfElements = new int[it] ;
-  int * numberOfElements= new int[it];
-  _totalNumberOfElements = 0 ;
-  //int totalSize = 0 ;
-  int ** tmp_array = new int*[it];
-  for (int i=0;i<it;i++) {
-    int numberOfElementsInType = tmp_NumberOfElementsInType[i] ;
-    numberOfElements[i] = numberOfElementsInType ;
-    tmp_array[i] = new int[numberOfElementsInType] ;
-    //totalSize+=numberOfElementsInType*(myType[i]%100) ;
-    _totalNumberOfElements+=numberOfElementsInType ;
-    if (whereIsType[i] == 1) { // only first Support
-      memcpy(tmp_array[i],getNumber(myType[i]),sizeof(int)*numberOfElementsInType);
-    } else if (whereIsType[i] == 2) { // only second Support
-      memcpy(tmp_array[i],mySupport->getNumber(myType[i]),sizeof(int)*numberOfElementsInType);
-    } else if (whereIsType[i] == 3) { // more difficult :-)
-      set<int> elementList ;
-      //int i1 = 0 ; !! UNUSED VARIABLE !!
-      //int i2 = 0 ; !!UNUSED VARIABLE !!
-      int ii = 0 ;
-      const int * number1 = getNumber(myType[i]) ;
-      const int * number2 = mySupport->getNumber(myType[i]) ;
-
-      SCRUTE(number1);
-      SCRUTE(number2);
-
-      int numberOfElements1 = getNumberOfElements(myType[i]) ;
-      int numberOfElements2 = mySupport->getNumberOfElements(myType[i]) ;
-
-      SCRUTE(numberOfElements1);
-      SCRUTE(numberOfElements2);
-
-      MESSAGE(LOC << " Type : " << myType[i] << " " << i);
-
-      for(int j=0;j<numberOfElements1;j++){
-       elementList.insert(number1[j]) ;
-      }
-
-      for(int j=0;j<numberOfElements2;j++){
-       elementList.insert(number2[j]) ;
-      }
-
-      //create the array !
-      int newNumberOfElements = elementList.size() ;
-
-      SCRUTE(newNumberOfElements);
-
-      numberOfElements[i] = newNumberOfElements ;
-      int * tmp_arrayNew = new int[newNumberOfElements];
-
-      set<int>::iterator its ;
-      for(its=elementList.begin();its!=elementList.end(); its++) {
-       tmp_arrayNew[ii]=*its ;
-       ii++;
-      }
-
-      delete[] tmp_array[i] ;
-      tmp_array[i] = tmp_arrayNew ;
-      _totalNumberOfElements-=(numberOfElementsInType-newNumberOfElements) ;
-
-    } else
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"ERROR")) ;
-  }
-  delete[] whereIsType ;
-  delete[] tmp_NumberOfElementsInType ;
-  delete [] _numberOfElements;
-
-  _numberOfElements = numberOfElements;
-
-  _numberOfGeometricType = it ;
-  medGeometryElement * geometricType=_geometricType ;
-  _geometricType = new medGeometryElement[it] ;
-  int * numberOfGaussPoint=_numberOfGaussPoint ;
-  _numberOfGaussPoint= new int[it] ;
-//    int * geometricTypeNumber=_geometricTypeNumber ;
-//    _geometricTypeNumber = new int[it] ;
-
-//    MEDSKYLINEARRAY* numberNew = new MEDSKYLINEARRAY(it,_totalNumberOfElements);
-//    int * numberIndex = numberNew->getIndex() ;
-  int size = _mesh->getNumberOfElements(_entity,MED_ALL_ELEMENTS);
-  if (_totalNumberOfElements == size) _isOnAllElts = true;
-
-  int * numberValue = new int[_totalNumberOfElements] ;
-  int * numberIndex = new int[it+1] ;
-  numberIndex[0]=1;
-  for (int i=0;i<it;i++) {
-    memcpy(numberValue+numberIndex[i]-1,tmp_array[i],sizeof(int)*_numberOfElements[i]) ;
-    delete[] tmp_array[i] ;
-    numberIndex[i+1]=numberIndex[i]+_numberOfElements[i] ;
-
-    _geometricType[i]=myType[i] ;
-    _numberOfGaussPoint[i]=1 ;
-  }
-  if ( _number != (MEDSKYLINEARRAY *) NULL) delete _number ;
-  //_number = numberNew ;
-  _number = new MEDSKYLINEARRAY(it,_totalNumberOfElements,numberIndex,numberValue);
-  delete[] numberIndex;
-
-  delete[] numberValue;
-
-  delete[] myType ;
-  delete[] tmp_array ;
-
-  delete[] geometricType ;
-  delete[] numberOfGaussPoint ;
-//    delete[] geometricTypeNumber ;
-//  delete[] numberOfElements ;
-
-
-
-
-  MESSAGE(LOC<<"Printing of the object SUPPORT blended "<< *this);
-
-
-
-
+  if(mySupport->_totalNumberOfElements==0)
+    return;
+  const int *ids=getNumber(MED_ALL_ELEMENTS);
+  set<int> idsSet(ids,ids+getNumberOfElements(MED_ALL_ELEMENTS));
+  const int *idsMySupport=mySupport->getNumber(MED_ALL_ELEMENTS);
+  int mySupportSize=mySupport->getNumberOfElements(MED_ALL_ELEMENTS);
+  set<int>::iterator iter;
+  for(int i=0;i<mySupportSize;i++)
+    idsSet.insert(idsMySupport[i]);
+  int size=idsSet.size();
+  if(size!=0)
+    {
+      list<int> idsList;
+      for(iter=idsSet.begin();iter!=idsSet.end();iter++)
+       idsList.push_back(*iter);
+      if(_entity==MED_NODE)
+       fillFromNodeList(idsList);
+      else
+       fillFromElementList(idsList);
+    }
+  else
+    clearDataOnNumbers();
   END_OF(LOC);
   END_OF(LOC);
-};
+}
 
 /*!
     This function allows the user to set a support not on all entities Entity,
 
 /*!
     This function allows the user to set a support not on all entities Entity,
@@ -412,7 +272,13 @@ void SUPPORT::setpartial(string Description, int NumberOfGeometricType,
   _numberOfGaussPoint = new int[NumberOfGeometricType];
   int * index = new int[_numberOfGeometricType+1];
   index[0]=1;
   _numberOfGaussPoint = new int[NumberOfGeometricType];
   int * index = new int[_numberOfGeometricType+1];
   index[0]=1;
+  int elemDim = -1;
   for (int i=0;i<_numberOfGeometricType;i++) {
   for (int i=0;i<_numberOfGeometricType;i++) {
+    if(GeometricType[i]/100 != elemDim)
+      if(i==0)
+       elemDim=GeometricType[i]/100;
+      else
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"unhomogeneous geometric types (dimension) !"));
     _geometricType[i] = GeometricType[i] ;
     _numberOfElements[i] = NumberOfElements[i] ;
     _numberOfGaussPoint[i] = 1 ;
     _geometricType[i] = GeometricType[i] ;
     _numberOfElements[i] = NumberOfElements[i] ;
     _numberOfGaussPoint[i] = 1 ;
@@ -573,157 +439,115 @@ void SUPPORT::getBoundaryElements() throw (MEDEXCEPTION)
 void SUPPORT::intersecting(SUPPORT * mySupport) throw (MEDEXCEPTION)
 //-------------------
 {
 void SUPPORT::intersecting(SUPPORT * mySupport) throw (MEDEXCEPTION)
 //-------------------
 {
-  const char * LOC = "SUPPORT::intersecting(SUPPORT *) : " ;
-  BEGIN_OF(LOC) ;
-
-  MESSAGE(LOC<< "SUPPORT entry : " << *mySupport) ;
-
-  MESSAGE(LOC<< "SUPPORT (calling object) : " << *this) ;
-
-  // on same entity :
-  if ( _entity != mySupport->getEntity() )
+  const char * LOC="SUPPORT::intersecting(SUPPORT *) : ";
+  BEGIN_OF(LOC);
+  if (_entity!=mySupport->getEntity())
     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
     throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
-
-  int * tmp_NumberOfElementsInType = new int[MED_NBR_GEOMETRIE_MAILLE];
-  medGeometryElement * myType = new medGeometryElement[MED_NBR_GEOMETRIE_MAILLE];
-  int * whereIsType = new int[MED_NBR_GEOMETRIE_MAILLE];
-  //MESH_ENTITIES myMeshEntities() ;
-  list<MED_EN::medGeometryElement>::const_iterator listIt ;
-  int it=0 ;
-  for(listIt=(meshEntities[_entity]).begin();listIt!=(meshEntities[_entity]).end();listIt++) {
-    tmp_NumberOfElementsInType[it]=0;
-    whereIsType[it]=0 ;
-    myType[it]= MED_NONE;
-    try {
-      tmp_NumberOfElementsInType[it]+=getNumberOfElements((medGeometryElement)(*listIt)) ;
-      whereIsType[it]+=1 ;
-    }
-    catch (const MEDEXCEPTION & ex) {};
-    try {
-      tmp_NumberOfElementsInType[it]+=mySupport->getNumberOfElements((medGeometryElement)(*listIt)) ;
-      whereIsType[it]+=2 ;
-    }
-    catch (const MEDEXCEPTION & ex) {};
-    if (whereIsType[it]==3) {
-      myType[it]=(medGeometryElement)(*listIt) ;
-      it++;
+  if(!(*_mesh == *mySupport->getMesh()))
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Mesh are different !"));
+  if(mySupport->isOnAllElements())
+    return;
+  if(_isOnAllElts)
+    {
+      *this=*mySupport;
+      return;
     }
     }
-  }
-
-  MESSAGE("it = "<< it);
-
-  // set new value :
-  int * numberOfElements=_numberOfElements ;
-  _numberOfElements = new int[it] ;
-  _totalNumberOfElements = 0 ;
-  //int totalSize = 0 ;
-  int ** tmp_array = new int*[it];
-  for (int i=0;i<it;i++) {
-    int numberOfElementsInType = tmp_NumberOfElementsInType[i] ;
-    _numberOfElements[i] = numberOfElementsInType ;
-    tmp_array[i] = new int[numberOfElementsInType] ;
-    _totalNumberOfElements+=numberOfElementsInType ;
-    if (whereIsType[i] == 3) {
-      const int * number1 = getNumber(myType[i]) ;
-      const int * number2 = mySupport->getNumber(myType[i]) ;
-
-      SCRUTE(number1);
-      SCRUTE(number2);
-
-      int numberOfElements1 = numberOfElements[i] ;
-      int numberOfElements2 = mySupport->getNumberOfElements(myType[i]) ;
-
-      SCRUTE(numberOfElements1);
-      SCRUTE(numberOfElements2);
-
-      set<int> setList1(number1,number1+numberOfElements1);
-      set<int> setList2(number2,number2+numberOfElements2);
-
-      for(set<int>::iterator its=setList1.begin();its!=setList1.end(); its++)
-       {
-         MESSAGE("Number1 " << *its);
-       }
-
-      for(set<int>::iterator its=setList2.begin();its!=setList2.end(); its++)
-       {
-         MESSAGE("Number2 " << *its);
-       }
-
-      set<int> setListIntersect;
-
-      set_intersection(setList1.begin(),setList1.end(),setList2.begin(),
-                      setList2.end(),inserter(setListIntersect,
-                                              setListIntersect.begin()));
-
-      for(set<int>::iterator its=setListIntersect.begin();
-         its!=setListIntersect.end(); its++)
-       {
-         MESSAGE("Number1 intersect Number2 " << *its);
-       }
-
-      int newNumberOfElements = setListIntersect.size() ;
-
-      SCRUTE(newNumberOfElements);
-
-      _numberOfElements[i] = newNumberOfElements ;
-      int * tmp_arrayNew = new int[newNumberOfElements];
-
-      int ii = 0 ;
-
-      for(set<int>::iterator its=setListIntersect.begin();
-         its!=setListIntersect.end(); its++) {
-       tmp_arrayNew[ii]=*its ;
-       SCRUTE(tmp_arrayNew[ii]);
-       ii++;
-      }
-
-      delete[] tmp_array[i] ;
-      tmp_array[i] = tmp_arrayNew ;
-      _totalNumberOfElements-=(numberOfElementsInType-newNumberOfElements) ;
-
-    } else
-      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"ERROR")) ;
-  }
-  delete[] whereIsType ;
-  delete[] tmp_NumberOfElementsInType ;
-
-  _numberOfGeometricType = it ;
-  medGeometryElement * geometricType=_geometricType ;
-  _geometricType = new medGeometryElement[it] ;
-  int * numberOfGaussPoint=_numberOfGaussPoint ;
-  _numberOfGaussPoint= new int[it] ;
-
-  int size = _mesh->getNumberOfElements(_entity,MED_ALL_ELEMENTS);
-  if (_totalNumberOfElements == size) _isOnAllElts = true;
-
-  int * numberValue = new int[_totalNumberOfElements] ;
-  int * numberIndex = new int[it+1] ;
-  numberIndex[0]=1;
-  for (int i=0;i<it;i++) {
-    memcpy(numberValue+numberIndex[i]-1,tmp_array[i],sizeof(int)*_numberOfElements[i]) ;
-    delete[] tmp_array[i] ;
-    numberIndex[i+1]=numberIndex[i]+_numberOfElements[i] ;
-
-    _geometricType[i]=myType[i] ;
-    _numberOfGaussPoint[i]=1 ;
-  }
-  if ( _number != (MEDSKYLINEARRAY *) NULL) delete _number ;
-
-  _number = new MEDSKYLINEARRAY(it,_totalNumberOfElements,numberIndex,numberValue);
-  delete[] numberIndex;
+  if(_totalNumberOfElements==0)
+    return;
+  const int *ids=getNumber(MED_ALL_ELEMENTS);
+  set<int> idsSet(ids,ids+getNumberOfElements(MED_ALL_ELEMENTS));
+  const int *idsMySupport=mySupport->getNumber(MED_ALL_ELEMENTS);
+  int mySupportSize=mySupport->getNumberOfElements(MED_ALL_ELEMENTS);
+  set<int> idsSetMySupport(idsMySupport,idsMySupport+mySupportSize);
+  set<int>::iterator iter;
+  list<int> idsList;
+  for(iter=idsSet.begin();iter!=idsSet.end();iter++)
+    if(idsSetMySupport.find(*iter)!=idsSetMySupport.end())
+      idsList.push_back(*iter);
+  int size=idsSet.size();
+  if(size!=0)
+    {
+      if(_entity==MED_NODE)
+       fillFromNodeList(idsList);
+      else
+       fillFromElementList(idsList);
+    }
+  else
+    {
+      clearDataOnNumbers();
+    }
+  END_OF(LOC);
+};
 
 
-  delete[] numberValue;
+/*!
+  operator = perform et deep copy except for attribute _mesh
+ */
+SUPPORT& MEDMEM::SUPPORT::operator=(const SUPPORT &other)
+{
+  const char * LOC = "SUPPORT::operator=(const SUPPORT & m) : ";
+  BEGIN_OF(LOC);
 
 
-  delete[] myType ;
-  delete[] tmp_array ;
+  _name=other._name;
+  _description=other._description;
+  _mesh=other._mesh;
+  _entity=other._entity;
+  _isOnAllElts=other._isOnAllElts;
+  clearDataOnNumbers();
+  _numberOfGeometricType=other._numberOfGeometricType;
+  _totalNumberOfElements=other._totalNumberOfElements;
 
 
-  delete[] geometricType ;
-  delete[] numberOfGaussPoint ;
-//    delete[] geometricTypeNumber ;
-  delete[] numberOfElements ;
+  if(other._geometricType != NULL)
+    {
+      _geometricType=new medGeometryElement[other._numberOfGeometricType];
+      memcpy(_geometricType,other._geometricType,other._numberOfGeometricType*sizeof(medGeometryElement));
+    }
+  if (other._numberOfGaussPoint != NULL)
+    {
+      _numberOfGaussPoint=new int[other._numberOfGeometricType];
+      memcpy(_numberOfGaussPoint,other._numberOfGaussPoint,other._numberOfGeometricType*sizeof(int));
+    }
+  if(other._numberOfElements != NULL)
+    {
+      _numberOfElements=new int[_numberOfGeometricType];
+      memcpy(_numberOfElements,other._numberOfElements,_numberOfGeometricType*sizeof(int));
+    }
+  if(!_isOnAllElts)
+    {
+      _number=new MEDSKYLINEARRAY(* other._number);
+    }
+  return *this;
+}
 
 
-  END_OF(LOC);
-};
+/*!
+  Method that cleans up all the fields related to _numbers. Defined for code factorization.
+ */
+//--------------------------------------------------
+void MEDMEM::SUPPORT::clearDataOnNumbers()
+//--------------------------------------------------
+{
+  _numberOfGeometricType=0;
+  _totalNumberOfElements=0;
+  if(_geometricType)
+    {
+      delete [] _geometricType;
+      _geometricType=(medGeometryElement *) NULL;
+    }
+  if(_numberOfGaussPoint)
+    {
+      delete [] _numberOfGaussPoint;
+      _numberOfGaussPoint=(int *) NULL;
+    }
+  if(_numberOfElements)
+    {
+      delete [] _numberOfElements;
+      _numberOfElements=(int *) NULL;
+    }
+  if(_number)
+    {
+      delete _number;
+      _number=(MEDSKYLINEARRAY *) NULL;
+    }
+}
 
 /*!
   operator == This operator does not compare attributs _name and _description.
 
 /*!
   operator == This operator does not compare attributs _name and _description.
@@ -738,9 +562,9 @@ bool MEDMEM::SUPPORT::operator == (const SUPPORT &support) const
 
   bool operatorReturn = false;
 
 
   bool operatorReturn = false;
 
-  operatorReturn = (_mesh == support._mesh) && (_entity == support._entity) &&
+  operatorReturn = (*_mesh == *support._mesh) && (_entity == support._entity) &&
     (_numberOfGeometricType == support._numberOfGeometricType) &&
     (_numberOfGeometricType == support._numberOfGeometricType) &&
-    (_isOnAllElts == support._isOnAllElts) &&
+    ((_isOnAllElts && support._isOnAllElts) || (!_isOnAllElts && !support._isOnAllElts)) &&
     (_totalNumberOfElements == support._totalNumberOfElements);
 
   if (operatorReturn)
     (_totalNumberOfElements == support._totalNumberOfElements);
 
   if (operatorReturn)
@@ -771,3 +595,466 @@ bool MEDMEM::SUPPORT::operator == (const SUPPORT &support) const
 
   return operatorReturn;
 };
 
   return operatorReturn;
 };
+
+void SUPPORT::changeElementsNbs(MED_EN::medEntityMesh entity, const int *renumberingFromOldToNew, int limitNbClassicPoly, const int *renumberingFromOldToNewPoly)
+{
+  if(entity != _entity)
+    throw MEDEXCEPTION("SUPPORT::changeElementsNbs : Renumbering on a mismatch entity");
+  list<int> newNbs;
+  if(!_isOnAllElts)
+    {
+      const int *oldNbs=_number->getValue();
+      for(int i=0;i<_totalNumberOfElements;i++)
+       {
+         int globNb=oldNbs[i];
+         if(globNb<=limitNbClassicPoly)
+           newNbs.push_back(renumberingFromOldToNew[globNb-1]);
+         else
+           newNbs.push_back(renumberingFromOldToNewPoly[globNb-limitNbClassicPoly-1]);
+       }
+      newNbs.sort();
+      fillFromElementList(newNbs);
+    }
+  else
+    update();
+}
+
+/*!
+  operator == + in case false a test if coordinates and connectivity of _mesh and support->_mesh are the same
+*/
+bool MEDMEM::SUPPORT::deepCompare(const SUPPORT &support) const
+{
+  bool operatorReturn =(_entity == support._entity) &&
+    (_numberOfGeometricType == support._numberOfGeometricType) &&
+    ( (_isOnAllElts && support._isOnAllElts) || (!_isOnAllElts  && !support._isOnAllElts) ) &&
+    (_totalNumberOfElements == support._totalNumberOfElements);
+  if (operatorReturn)
+    {
+      if (!_isOnAllElts)
+       {
+         for (int i=0; i<_numberOfGeometricType && operatorReturn; i++)
+           {
+             operatorReturn = (_geometricType[i] == support._geometricType[i]) &&
+               (_numberOfElements[i] == support._numberOfElements[i]) &&
+               (_numberOfGaussPoint[i] == support._numberOfGaussPoint[i]);
+             if (operatorReturn)
+               {
+                 for (int j=0; j<_numberOfElements[i]; j++)
+                   {
+                     operatorReturn = (getNumber(_geometricType[i])[j] ==
+                        support.getNumber(_geometricType[i])[j]);
+                   }
+               }
+           }
+       }
+    }
+  if(operatorReturn)
+    {
+      if(!(*_mesh == *support._mesh))
+       {
+         return _mesh->deepCompare(*support._mesh);
+       }
+    }
+  return operatorReturn;
+}
+
+/*!
+ States if this is included in other.
+ */
+bool MEDMEM::SUPPORT::belongsTo(const SUPPORT& other, bool deepCompare) const
+{
+  if(!(*_mesh == *other._mesh))
+    {
+      if(!deepCompare)
+       return false;
+      if(!_mesh->deepCompare(*other._mesh))
+       return false;
+    }
+  if(_entity!=other._entity)
+    return false;
+  if(other._isOnAllElts)
+    return true;
+  if(_isOnAllElts && !other._isOnAllElts)
+    return false;
+  if(_numberOfGeometricType>other._numberOfGeometricType)
+    return false;
+  for(int i=0; i<_numberOfGeometricType; i++)
+    {
+      MED_EN::medGeometryElement curGeomType=_geometricType[i];
+      int iOther=-1;
+      for(int j=0; j<other._numberOfGeometricType; j++)
+         if(other._geometricType[j]==curGeomType)
+             iOther=j;
+      if(iOther==-1)
+       return false;
+      if(_numberOfElements[i]>other._numberOfElements[iOther])
+       return false;
+      const int *numbers1=_number->getI(i+1);
+      const int *numbers2=other._number->getI(iOther+1);
+      for (int k=0; k<_numberOfElements[i]; k++)
+       {
+         bool found=false;
+         for(int l=0;l<other._numberOfElements[iOther] && !found;l++)
+           {
+             if(numbers1[k]==numbers2[l])
+               found=true;
+           }
+         if(!found)
+           return false;
+       }
+    }
+  return true;
+}
+/*!
+  Method used to sort array of id.
+ */
+int compareId(const void *x, const void *y)
+{
+  const int *x1=(const int *)x;
+  const int *y1=(const int *)y;
+  if(*x1<*y1)
+    return -1;
+  else if(*x1>*y1)
+    return 1;
+  else
+    return 0;
+}
+
+/*!
+  performs a common operation : Sub builds a sorted int array that is obtained by supression of all ids contained
+  in array defined by (idsToSuppress,lgthIdsToSuppress) from array [start ... end]
+  Example sub(0,7,{1,2,5},3) => {0,3,4,6,7} - WARNING returned list should be deallocated !
+ */
+list<int> *MEDMEM::SUPPORT::sub(int start,int end,const int *idsToSuppress,int lgthIdsToSuppress)
+{
+  int size=end-start+1;
+  int sizeRet=size-lgthIdsToSuppress;
+  list<int> *ret;
+  if(sizeRet<0)
+    throw MEDEXCEPTION("MEDMEM::SUPPORT::sub");
+  else if(sizeRet==0)
+    {
+      return 0;
+    }
+  if(idsToSuppress==0)
+    {
+      ret=new list<int>;
+      for(int l=0;l<size;l++)
+       ret->push_back(start+l);
+      return ret;
+    }
+  ret=new list<int>;
+  int *temp=new int[lgthIdsToSuppress];
+  memcpy(temp,idsToSuppress,sizeof(int)*lgthIdsToSuppress);
+  qsort(temp,lgthIdsToSuppress,sizeof(int),compareId);
+  int k=0;
+  for(int i=start;i<=end;i++)
+    if(temp[k]!=i)
+      ret->push_back(i);
+    else
+      k++;
+  delete [] temp;
+  return ret;
+}
+
+/*!
+  performs a common operation : Sub builds a sorted int array that is obtained by supression of all ids contained
+  in array defined by (idsToSuppress,lgthIdsToSuppress) from array [start ... end]
+  Example sub({1,3,4,5,6,7,9},7,{1,2,5},3) => {3,4,6,7,9}  - WARNING returned list should be deallocated !
+ */
+list<int> *MEDMEM::SUPPORT::sub(const int *ids,int lgthIds,const int *idsToSuppress,int lgthIdsToSuppress)
+{
+  list<int> *ret;
+  int i,j=0;
+  if(lgthIds<0)
+    throw MEDEXCEPTION("MEDMEM::SUPPORT::sub");
+  else if(lgthIds==0)
+    return 0;
+  ret=new list<int>;
+  int *temp1=new int[lgthIds];
+  memcpy(temp1,ids,sizeof(int)*lgthIds);
+  qsort(temp1,lgthIds,sizeof(int),compareId);
+  int *temp2=new int[lgthIdsToSuppress];
+  memcpy(temp2,idsToSuppress,sizeof(int)*lgthIdsToSuppress);
+  qsort(temp2,lgthIdsToSuppress,sizeof(int),compareId);
+  for(i=0;i<lgthIds;)
+    {
+      if(j>=lgthIdsToSuppress)
+         ret->push_back(temp1[i++]);
+      else if(temp1[i]>temp2[j])
+       j++;
+      else if(temp1[i]<temp2[j])
+       ret->push_back(temp1[i++]);
+      else
+       i++;
+    }
+  delete [] temp1;
+  delete [] temp2;
+  return ret;
+}
+
+/*!
+  returns a new SUPPORT (responsability to caller to destroy it)
+  that is the complement to "this", lying on the same entity than "this".
+ */
+SUPPORT *MEDMEM::SUPPORT::getComplement() const
+{
+  SUPPORT *ret;
+  const int nbOfElt=_mesh->getNumberOfElements(_entity,MED_EN::MED_ALL_ELEMENTS);
+  int nbOfEltInSupp=getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
+  if(_isOnAllElts || nbOfElt==nbOfEltInSupp)
+    {
+      ret=new SUPPORT;
+      ret->setMesh(_mesh);
+      ret->setEntity(_entity);
+      string name="Complement of ";
+      name+=_name;
+      ret->setName(name);
+      return ret;
+    }
+  const int *nbs=_number->getValue();
+  list<int> *ids=sub(1,nbOfElt,nbs,nbOfEltInSupp);
+  if(_entity==MED_EN::MED_NODE)
+    ret=_mesh->buildSupportOnNodeFromElementList(*ids,_entity);
+  else
+    ret=_mesh->buildSupportOnElementsFromElementList(*ids,_entity);
+  delete ids;
+  return ret;
+}
+
+/*!
+  returns a new support the user should delete.
+ */
+SUPPORT *MEDMEM::SUPPORT::substract(const SUPPORT& other) const throw (MEDEXCEPTION)
+{
+  const char * LOC = "SUPPORT *MEDMEM::subtract(const SUPPORT * other) : ";
+  BEGIN_OF(LOC);
+  SUPPORT *ret;
+  if (_entity!=other.getEntity())
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
+  if(!(*_mesh == *other.getMesh()))
+    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Mesh are different !"));
+  if(other._isOnAllElts)
+    {
+      ret=new SUPPORT;
+      ret->setMesh(_mesh);
+      ret->setEntity(_entity);
+      return ret;
+    }
+  if(_isOnAllElts)
+    return other.getComplement();
+  int nbOfEltInThis=getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
+  const int *nbsThis=_number->getValue();
+  int nbOfEltInOther=other.getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
+  const int *nbsOther=other._number->getValue();
+  list<int> *ids=sub(nbsThis,nbOfEltInThis,nbsOther,nbOfEltInOther);
+  if(_entity==MED_EN::MED_NODE)
+    ret=_mesh->buildSupportOnNodeFromElementList(*ids,_entity);
+  else
+    ret=_mesh->buildSupportOnElementsFromElementList(*ids,_entity);
+  delete ids;
+  return ret;
+  END_OF(LOC);
+}
+
+/*!
+  returns a new support the user has to delete. Entity is either MED_NODE to obtain node elements lying on boundary of "this"
+  or MED_FACE,MED_EDGE (depends on the this->_mesh dimension).
+ */
+SUPPORT *MEDMEM::SUPPORT::getBoundaryElements(MED_EN::medEntityMesh Entity) const throw (MEDEXCEPTION)
+{
+  const char * LOC = "SUPPORT *MEDMEM::SUPPORT::getBoundaryElements(MED_EN::medEntityMesh Entity) : ";
+  BEGIN_OF(LOC);
+  int spaceDimension=_mesh->getSpaceDimension();
+  MED_EN::medEntityMesh baseEntity=Entity;
+  if (spaceDimension == 3) 
+    if (Entity!=MED_FACE)
+      if(Entity==MED_NODE)
+       baseEntity=MED_FACE;
+      else
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 3D mesh for entity "<<Entity<<" !"));
+  if (spaceDimension == 2) 
+    if (Entity!=MED_EDGE)
+      if(Entity==MED_NODE)
+       baseEntity=MED_EDGE;
+      else
+       throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 2D mesh for entity "<<Entity<<" !"));
+  if(_isOnAllElts)
+    return _mesh->getBoundaryElements(Entity);
+
+  const int * myConnectivityValue=_mesh->getReverseConnectivity(MED_DESCENDING);
+  const int * myConnectivityIndex=_mesh->getReverseConnectivityIndex(MED_DESCENDING);
+  int numberOf=_mesh->getNumberOfElements(baseEntity,MED_ALL_ELEMENTS);
+  const int *ids=_number->getValue();
+  set<int> idsSet(ids,ids+_totalNumberOfElements);
+  list<int> myElementsList;
+  for (int i=0;i<numberOf;i++)
+    {
+      int nbOfDP1EntitySharing=0;
+      if(idsSet.find(myConnectivityValue[myConnectivityIndex[i]-1])!=idsSet.end())
+       nbOfDP1EntitySharing++;
+      if(idsSet.find(myConnectivityValue[myConnectivityIndex[i]])!=idsSet.end())
+       nbOfDP1EntitySharing++;
+      if(nbOfDP1EntitySharing==1)
+       myElementsList.push_back(i+1);
+    }
+  if(Entity==MED_NODE)
+    {
+      return _mesh->buildSupportOnNodeFromElementList(myElementsList,baseEntity);
+    }
+  else
+    {
+      return _mesh->buildSupportOnElementsFromElementList(myElementsList,baseEntity);
+    }
+}
+
+/*!
+  Method that fills this and updates all its attributes in order to lye on the the listOfNode.
+ */
+void MEDMEM::SUPPORT::fillFromNodeList(const list<int>& listOfNode) throw (MEDEXCEPTION)
+{
+  setEntity(MED_EN::MED_NODE);
+  clearDataOnNumbers();
+  int size=listOfNode.size();
+  int totalNbInMesh=_mesh->getNumberOfElements(_entity,MED_ALL_ELEMENTS);
+  if(totalNbInMesh==size)
+    {
+    _isOnAllElts=true;
+    update();
+    return;
+    }
+  else
+    _isOnAllElts=false;
+  int numberOfGeometricType=1;
+  medGeometryElement* geometricType=new medGeometryElement[1];
+  geometricType[0]=MED_NONE;
+  int *numberOfGaussPoint=new int[1];
+  numberOfGaussPoint[0]=1;
+  int *numberOfElements=new int[1];
+  numberOfElements[0]=size;
+  int *mySkyLineArrayIndex=new int[2];
+  mySkyLineArrayIndex[0]=1;
+  mySkyLineArrayIndex[1]=1+numberOfElements[0];
+  int *tab=new int[numberOfElements[0]];
+  int i=0;
+  for(list<int>::const_iterator iter2=listOfNode.begin();iter2!=listOfNode.end();iter2++)
+    tab[i++]=*iter2;
+  MEDSKYLINEARRAY * mySkyLineArray = new MEDSKYLINEARRAY(1,numberOfElements[0],mySkyLineArrayIndex,tab,true);
+  setNumberOfGeometricType(numberOfGeometricType);
+  setGeometricType(geometricType);
+  setNumberOfGaussPoint(numberOfGaussPoint);
+  setNumberOfElements(numberOfElements);
+  setTotalNumberOfElements(numberOfElements[0]);
+  setNumber(mySkyLineArray);
+  
+  delete[] numberOfElements;
+  delete[] numberOfGaussPoint;
+  delete[] geometricType;
+}
+
+/*
+  Method created to factorize code. This method fills the current SUPPORT on entity 'entity' containing all the entities contained in 
+  elements 'listOfElt' of entity 'entity'. Warning this method should be called after both the attributes this->_mesh and this->_entity are correctly set.
+ */
+void MEDMEM::SUPPORT::fillFromElementList(const list<int>& listOfElt) throw (MEDEXCEPTION)
+{
+  clearDataOnNumbers();
+  int size=listOfElt.size();
+  int totalNbInMesh=_mesh->getNumberOfElementsWithPoly(_entity,MED_ALL_ELEMENTS);
+  if(totalNbInMesh==size){
+    _isOnAllElts=true;
+    update();
+    return;
+  }
+  else
+  _isOnAllElts=false;
+  // Well, we must know how many geometric type we have found
+  int * myListArray = new int[size] ;
+  int id = 0 ;
+  list<int>::const_iterator myElementsListIt ;
+  for (myElementsListIt=listOfElt.begin();myElementsListIt!=listOfElt.end();myElementsListIt++)
+    myListArray[id++]=(*myElementsListIt) ;
+  int numberOfGeometricType ;
+  medGeometryElement* geometricType ;
+  int * numberOfGaussPoint ;
+  int * numberOfElements ;
+  int * mySkyLineArrayIndex ;
+
+  int numberOfType = _mesh->getNumberOfTypesWithPoly(_entity) ;
+  if (numberOfType == 1) {
+    numberOfGeometricType = 1 ;
+    geometricType = new medGeometryElement[1] ;
+    medGeometryElement *  allType = _mesh->getTypesWithPoly(_entity);
+    geometricType[0] = allType[0] ;
+    numberOfGaussPoint = new int[1] ;
+    numberOfGaussPoint[0] = 1 ;
+    numberOfElements = new int[1] ;
+    numberOfElements[0] = size ;
+    mySkyLineArrayIndex = new int[2] ;
+    mySkyLineArrayIndex[0]=1 ;
+    mySkyLineArrayIndex[1]=1+size ;
+    delete [] allType;
+  }
+  else {// hemmm
+    map<medGeometryElement,int> theType ;
+    for (myElementsListIt=listOfElt.begin();myElementsListIt!=listOfElt.end();myElementsListIt++) {
+      medGeometryElement myType = _mesh->getElementTypeWithPoly(_entity,*myElementsListIt) ;
+      if (theType.find(myType) != theType.end() )
+       theType[myType]+=1 ;
+      else
+       theType[myType]=1 ;
+    }
+    numberOfGeometricType = theType.size() ;
+    geometricType = new medGeometryElement[numberOfGeometricType] ;
+    numberOfGaussPoint = new int[numberOfGeometricType] ;
+    numberOfElements = new int[numberOfGeometricType] ;
+    mySkyLineArrayIndex = new int[numberOfGeometricType+1] ;
+    int index = 0 ;
+    mySkyLineArrayIndex[0]=1 ;
+    map<medGeometryElement,int>::iterator theTypeIt ;
+    for (theTypeIt=theType.begin();theTypeIt!=theType.end();theTypeIt++) {
+      geometricType[index] = (*theTypeIt).first ;
+      numberOfGaussPoint[index] = 1 ;
+      numberOfElements[index] = (*theTypeIt).second ;
+      mySkyLineArrayIndex[index+1]=mySkyLineArrayIndex[index]+numberOfElements[index] ;
+      index++ ;
+    }
+  }
+  MEDSKYLINEARRAY * mySkyLineArray = new MEDSKYLINEARRAY(numberOfGeometricType,size,mySkyLineArrayIndex,myListArray,true) ;
+  setNumberOfGeometricType(numberOfGeometricType) ;
+  setGeometricType(geometricType) ;
+  setNumberOfGaussPoint(numberOfGaussPoint) ;
+  setNumberOfElements(numberOfElements) ;
+  setTotalNumberOfElements(size) ;
+  setNumber(mySkyLineArray) ;
+
+  delete[] numberOfElements;
+  delete[] numberOfGaussPoint;
+  delete[] geometricType;
+}
+
+/*! set the reference _mesh to Mesh */
+//--------------------------------------
+void SUPPORT::setMesh(MESH *Mesh)
+//--------------------------------------
+{
+  if(_mesh)
+    _mesh->removeReference();
+  _mesh=Mesh;
+  if(_mesh)
+    _mesh->addReference();
+}
+
+/*!
+  addReference : reference counter presently disconnected in C++ -> just connected for client.
+*/
+void MEDMEM::SUPPORT::addReference() const
+{
+}
+
+/*!
+  removeReference : reference counter presently disconnected in C++ -> just connected for client.
+*/
+void MEDMEM::SUPPORT::removeReference() const
+{
+}
index 4c8b46305ea9a8d24949c10c81badf60fcba836a..ef322fa84da36c236e13f21ac1b0a09ff67afdcc 100644 (file)
@@ -8,12 +8,14 @@
 
 #include <vector>
 #include <string>
 
 #include <vector>
 #include <string>
+#include <list>
 
 #include "utilities.h"
 #include "MEDMEM_STRING.hxx"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_SkyLineArray.hxx"
 
 #include "utilities.h"
 #include "MEDMEM_STRING.hxx"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_SkyLineArray.hxx"
+#include "MEDMEM_RCBase.hxx"
 
 /*!
 
 
 /*!
 
@@ -26,7 +28,7 @@
 
 namespace MEDMEM {
 class MESH ;
 
 namespace MEDMEM {
 class MESH ;
-class SUPPORT
+class SUPPORT : public RCBASE
 {
 protected:
   /*!
 {
 protected:
   /*!
@@ -115,21 +117,6 @@ protected:
 
   // the two following arrays are defined only if _isOnAllElts is false :
 
 
   // the two following arrays are defined only if _isOnAllElts is false :
 
-  /*
-    \if developper
-    array of size _numberOfType+1 wich contains for
-    each geometric type, index in _number._value
-    (if _all is true, we must ask _mesh to get
-    information). _typeIndex[i+1]-_typeIndex[i]
-    represents count of entities of ith geometric
-    type. _typeIndex[_numberOfType] contains total
-    entities count. If _numberOf[i]=0,
-    _typeIndex[i+1]=_typeIndex[i]
-    defined only if _isOnAllElts is false
-    \endif
-  */
-  //  int *      _typeIndex;
-
   /*!
     \if developper
     Array of size _index[_numberOfType]-1 wich contain number of
   /*!
     \if developper
     Array of size _index[_numberOfType]-1 wich contain number of
@@ -146,20 +133,20 @@ public:
   virtual ~SUPPORT();
   friend ostream & operator<<(ostream &os,const SUPPORT &my);
 
   virtual ~SUPPORT();
   friend ostream & operator<<(ostream &os,const SUPPORT &my);
 
+  SUPPORT& operator=(const SUPPORT &support);
   bool operator == (const SUPPORT &support) const;
   bool operator == (const SUPPORT &support) const;
-
+  bool deepCompare(const SUPPORT &support) const;
   // function to set all value when SUPPORT was created by MedMedDriver without all MESH information !!! Change with new API !
   void update();
 
   inline void setName(string Name);
   inline void setDescription(string Description);
   // function to set all value when SUPPORT was created by MedMedDriver without all MESH information !!! Change with new API !
   void update();
 
   inline void setName(string Name);
   inline void setDescription(string Description);
-  inline void setMesh(MESH *Mesh);
+  void setMesh(MESH *Mesh);
   inline void setAll(bool All);
   inline void setEntity(MED_EN::medEntityMesh Entity);
   inline void setNumberOfGeometricType(int NumberOfGeometricType);
   inline void setGeometricType(const MED_EN::medGeometryElement *GeometricType);
   inline void setNumberOfGaussPoint(const int *NumberOfGaussPoint);
   inline void setAll(bool All);
   inline void setEntity(MED_EN::medEntityMesh Entity);
   inline void setNumberOfGeometricType(int NumberOfGeometricType);
   inline void setGeometricType(const MED_EN::medGeometryElement *GeometricType);
   inline void setNumberOfGaussPoint(const int *NumberOfGaussPoint);
-  //  inline void setGeometricTypeNumber(int *GeometricTypeNumber);
   inline void setNumberOfElements(const int *NumberOfElements);
   inline void setTotalNumberOfElements(int TotalNumberOfElements);
   inline void setNumber(MEDSKYLINEARRAY * Number);
   inline void setNumberOfElements(const int *NumberOfElements);
   inline void setTotalNumberOfElements(int TotalNumberOfElements);
   inline void setNumber(MEDSKYLINEARRAY * Number);
@@ -175,8 +162,6 @@ public:
   inline const MED_EN::medGeometryElement* getTypes() const ;
   inline const int *  getNumberOfGaussPoint() const throw (MEDEXCEPTION);
   inline int          getNumberOfGaussPoint(MED_EN::medGeometryElement geomElement) const throw (MEDEXCEPTION);
   inline const MED_EN::medGeometryElement* getTypes() const ;
   inline const int *  getNumberOfGaussPoint() const throw (MEDEXCEPTION);
   inline int          getNumberOfGaussPoint(MED_EN::medGeometryElement geomElement) const throw (MEDEXCEPTION);
-  //inline int *  getGeometricTypeNumber() const;
-  //inline int    getTotalNumberOfElement() const;
   inline int    getNumberOfElements(MED_EN::medGeometryElement GeometricType) const throw (MEDEXCEPTION);
   virtual inline MEDSKYLINEARRAY *  getnumber() const throw (MEDEXCEPTION);
   virtual inline const int *  getNumber(MED_EN::medGeometryElement GeometricType) const throw (MEDEXCEPTION);
   inline int    getNumberOfElements(MED_EN::medGeometryElement GeometricType) const throw (MEDEXCEPTION);
   virtual inline MEDSKYLINEARRAY *  getnumber() const throw (MEDEXCEPTION);
   virtual inline const int *  getNumber(MED_EN::medGeometryElement GeometricType) const throw (MEDEXCEPTION);
@@ -189,8 +174,21 @@ public:
                  int *NumberOfEntity, int *NumberValue);
 
   void getBoundaryElements() throw (MEDEXCEPTION);
                  int *NumberOfEntity, int *NumberValue);
 
   void getBoundaryElements() throw (MEDEXCEPTION);
-
+  void changeElementsNbs(MED_EN::medEntityMesh entity, const int *renumberingFromOldToNew, int limitNbClassicPoly, const int *renumberingFromOldToNewPoly=0);
   void intersecting(SUPPORT * mySupport) throw (MEDEXCEPTION) ;
   void intersecting(SUPPORT * mySupport) throw (MEDEXCEPTION) ;
+  bool belongsTo(const SUPPORT& other, bool deepCompare=false) const;
+  SUPPORT *getComplement() const;
+  SUPPORT *substract(const SUPPORT& other) const throw (MEDEXCEPTION) ;
+  SUPPORT *getBoundaryElements(MED_EN::medEntityMesh Entity) const throw (MEDEXCEPTION);
+  void fillFromNodeList(const list<int>& listOfNode) throw (MEDEXCEPTION);
+  void fillFromElementList(const list<int>& listOfElt) throw (MEDEXCEPTION);
+  void clearDataOnNumbers();
+  //A.G. Addings for RC
+  virtual void addReference() const;
+  virtual void removeReference() const;
+protected:
+  static list<int> *sub(int start,int end,const int *idsToSuppress,int lgthIdsToSuppress);
+  static list<int> *sub(const int *ids,int lgthIds,const int *idsToSuppress,int lgthIdsToSuppress);
 };
 
 // _____________________
 };
 
 // _____________________
@@ -249,15 +247,14 @@ inline const int * SUPPORT::getNumber(MED_EN::medGeometryElement GeometricType)
   throw (MEDEXCEPTION)
 //---------------------------------------------------------------------
 {
   throw (MEDEXCEPTION)
 //---------------------------------------------------------------------
 {
-  const char * LOC = "Support::getNumber : " ;
   if (_isOnAllElts)
   if (_isOnAllElts)
-    throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined, support is on all entity !")) ;
+    throw MEDEXCEPTION("Support::getNumber : Not defined, support is on all entity !") ;
   if (GeometricType==MED_EN::MED_ALL_ELEMENTS)
     return _number->getValue() ;
   for (int i=0;i<_numberOfGeometricType;i++)
     if (_geometricType[i]==GeometricType)
       return _number->getI(i+1) ;
   if (GeometricType==MED_EN::MED_ALL_ELEMENTS)
     return _number->getValue() ;
   for (int i=0;i<_numberOfGeometricType;i++)
     if (_geometricType[i]==GeometricType)
       return _number->getI(i+1) ;
-  throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"GeometricType not found !")) ;
+  throw MEDEXCEPTION("Support::getNumber : GeometricType not found !") ;
 }
 
 /*!
 }
 
 /*!
@@ -308,13 +305,6 @@ inline int SUPPORT::getNumberOfGaussPoint(MED_EN::medGeometryElement geomElement
   } else
     throw MEDEXCEPTION("Support::getNumberOfGaussPoint : Not defined !") ;
 }
   } else
     throw MEDEXCEPTION("Support::getNumberOfGaussPoint : Not defined !") ;
 }
-//  inline int SUPPORT::getNumberLength() const
-//  throw (MEDEXCEPTION)
-//  {
-//      if (_isOnAllElts)
-//        throw MEDEXCEPTION("Support::getNumberLength : Not defined, support is on all entity !") ;
-//        return _number->getLength() ;
-//  }
 
 /*! set the attribute _name to Name */
 //--------------------------------------
 
 /*! set the attribute _name to Name */
 //--------------------------------------
@@ -332,14 +322,6 @@ inline void SUPPORT::setDescription(string Description)
   _description=Description;
 }
 
   _description=Description;
 }
 
-/*! set the reference _mesh to Mesh */
-//--------------------------------------
-inline void SUPPORT::setMesh(MESH *Mesh)
-//--------------------------------------
-{
-  _mesh=Mesh;
-}
-
 /*! set the attribute _isOnAllElts to All */
 //------------------------------------------
 inline void SUPPORT::setAll(bool All)
 /*! set the attribute _isOnAllElts to All */
 //------------------------------------------
 inline void SUPPORT::setAll(bool All)
@@ -353,18 +335,6 @@ inline void SUPPORT::setAll(bool All)
 inline void SUPPORT::setEntity(MED_EN::medEntityMesh Entity)
 {
   _entity=Entity;
 inline void SUPPORT::setEntity(MED_EN::medEntityMesh Entity)
 {
   _entity=Entity;
-//   if ( Entity == MED_NODE) {
-//     _numberOfGeometricType=1 ;
-//     if (_geometricType == (medGeometryElement *) NULL)
-//       _geometricType=new medGeometryElement[1] ;
-//     else 
-//       {
-//     // delete previous ???
-//     delete [] _geometricType;
-//     _geometricType=new medGeometryElement[1] ;
-//       }
-//     _geometricType[0]=MED_NONE ;
-//   }
 }
 
 /*! set the attribute _numberOfGeometricType to NumberOfGeometricType */
 }
 
 /*! set the attribute _numberOfGeometricType to NumberOfGeometricType */
@@ -396,7 +366,6 @@ inline void SUPPORT::setGeometricType(const MED_EN::medGeometryElement *Geometri
     _geometricType=new MED_EN::medGeometryElement[_numberOfGeometricType];
   for (int i=0;i<_numberOfGeometricType;i++)
     _geometricType[i] = GeometricType[i];
     _geometricType=new MED_EN::medGeometryElement[_numberOfGeometricType];
   for (int i=0;i<_numberOfGeometricType;i++)
     _geometricType[i] = GeometricType[i];
-  //  _geometricType=GeometricType;
 }
 
 /*! set the attribute _numberOfGaussPoint to NumberOfGaussPoint */
 }
 
 /*! set the attribute _numberOfGaussPoint to NumberOfGaussPoint */
@@ -408,17 +377,8 @@ inline void SUPPORT::setNumberOfGaussPoint(const int *NumberOfGaussPoint)
     _numberOfGaussPoint=new int[_numberOfGeometricType];
   for (int i=0;i<_numberOfGeometricType;i++)
     _numberOfGaussPoint[i] = NumberOfGaussPoint[i];
     _numberOfGaussPoint=new int[_numberOfGeometricType];
   for (int i=0;i<_numberOfGeometricType;i++)
     _numberOfGaussPoint[i] = NumberOfGaussPoint[i];
-  //  _numberOfGaussPoint = NumberOfGaussPoint ;
 }
 
 }
 
-/*! set the attribute _geometricTypeNumber to GeometricTypeNumber */
-//-------------------------------------------------------------------
-//inline void SUPPORT::setGeometricTypeNumber(int *GeometricTypeNumber)
-//-------------------------------------------------------------------
-//{
-//  _geometricTypeNumber=GeometricTypeNumber;
-//}
-
 /*!
   Set the attribute _numberOfElements to NumberOfElements and 
   calculate the total number of elements.
 /*!
   Set the attribute _numberOfElements to NumberOfElements and 
   calculate the total number of elements.
@@ -532,24 +492,9 @@ inline MED_EN::medEntityMesh SUPPORT::getEntity() const
 inline const MED_EN::medGeometryElement * SUPPORT::getTypes() const
 //---------------------------------------------------
 {
 inline const MED_EN::medGeometryElement * SUPPORT::getTypes() const
 //---------------------------------------------------
 {
-  //    if ((_isOnAllElts)&(_entity != MED_NODE))
-  //      return _mesh->getTypes(_entity) ;
-  //    else
   return _geometricType;
 }
 
   return _geometricType;
 }
 
-//---------------------------------------------------
-//inline int * SUPPORT::getGeometricTypeNumber() const
-//---------------------------------------------------
-//  {
-//    const char * LOC = "SUPPORT::getGeometricTypeNumber() : ";
-//    if (_isOnAllElts)
-//      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined (is on all elements) !"));
-//    if (_geometricTypeNumber==NULL)
-//      throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined !"));
-//    return _geometricTypeNumber;
-//  }
-
 }//End namespace MEDMEM
 
 
 }//End namespace MEDMEM
 
 
index 2de4f0454295300614f57684f12085581c0069d7..e708004de33c10c0b129bf478593b912e2e640e6 100644 (file)
 #include "MEDMEM_GenDriver.hxx"
 #include "utilities.h"
 
 #include "MEDMEM_GenDriver.hxx"
 #include "utilities.h"
 
-#include "MEDMEM_STRING.hxx"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_Unit.hxx"
 #include "MEDMEM_Array.hxx"
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_Unit.hxx"
 #include "MEDMEM_Array.hxx"
 #include "MEDMEM_Support.hxx"
-//#include "MEDMEM_Field.hxx"
 #include "MEDMEM_Mesh.hxx"
 #include "MEDMEM_CellModel.hxx"
 
 #include "MEDMEM_Mesh.hxx"
 #include "MEDMEM_CellModel.hxx"
 
@@ -50,7 +48,7 @@ public :
     Constructor.
   */
   VTK_FIELD_DRIVER():GENDRIVER(),
     Constructor.
   */
   VTK_FIELD_DRIVER():GENDRIVER(),
-                     _ptrField((FIELD<T> *)MED_NULL), _fieldName(""),
+                     _ptrField((FIELD<T> *) 0), _fieldName(""),
                     _fieldNum(MED_INVALID)
   {
     const char * LOC = "VTK_FIELD_DRIVER::VTK_FIELD_DRIVER() ";
                     _fieldNum(MED_INVALID)
   {
     const char * LOC = "VTK_FIELD_DRIVER::VTK_FIELD_DRIVER() ";
index 797fe8db4e5d6c23dbd19d9b88202d367b436d45..d412a0452229d78a8a21d3e4536d94a460e6687c 100644 (file)
@@ -16,6 +16,8 @@ using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
+#define MED_NULL     NULL
+
 VTK_MESH_DRIVER::VTK_MESH_DRIVER(): GENDRIVER(), 
                                    _ptrMesh((MESH * const)MED_NULL)
 {
 VTK_MESH_DRIVER::VTK_MESH_DRIVER(): GENDRIVER(), 
                                    _ptrMesh((MESH * const)MED_NULL)
 {
index 8bbb23ee46a88df772c2e801bf68a73d9af05b47..b91e9ca292b4afe204f75845729153c70ce4c110 100644 (file)
@@ -7,29 +7,22 @@
 #include <assert.h>
 
 // UTILE AUX DEUX NAMESPACES
 #include <assert.h>
 
 // UTILE AUX DEUX NAMESPACES
+extern "C"{
 #include <hdf5.h>
 #include <hdf5.h>
+}
 
 
-# include <med.hxx>
-# include <med_proto.hxx>
-
-// namespace MED_FR {
-//   extern "C" { 
-// # include <med.h>
-// # include <med_proto.h>
-//   }
-// }
 
 namespace MED_EN {
 
 namespace MED_EN {
-  extern "C" { 
+  extern "C" { // on est la 
   
   
-#define MED_NULL       (void *) NULL
-#define MED_MAX_PARA     20
+// #define MED_NULL       (void *) NULL
+// #define MED_MAX_PARA     20
 
 
-#define MED_TAILLE_DESC 200
-#define MED_TAILLE_IDENT  8
-#define MED_TAILLE_NOM   32
-#define MED_TAILLE_LNOM  80    
-#define MED_TAILLE_PNOM   8 
+// #define MED_TAILLE_DESC 200
+// #define MED_TAILLE_IDENT  8
+// #define MED_TAILLE_NOM   32
+// #define MED_TAILLE_LNOM  80    
+// #define MED_TAILLE_PNOM   8
 
 
     typedef long medGeometryElement;
 
 
     typedef long medGeometryElement;
@@ -49,6 +42,8 @@ namespace MED_EN {
     const medGeometryElement MED_PYRA13 = 313;
     const medGeometryElement MED_PENTA15 = 315;
     const medGeometryElement MED_HEXA20 = 320;
     const medGeometryElement MED_PYRA13 = 313;
     const medGeometryElement MED_PENTA15 = 315;
     const medGeometryElement MED_HEXA20 = 320;
+    const medGeometryElement MED_POLYGON = 400;
+    const medGeometryElement MED_POLYHEDRA = 500;
     const medGeometryElement MED_ALL_ELEMENTS = 999;
 
     typedef long medEntityMesh;
     const medGeometryElement MED_ALL_ELEMENTS = 999;
 
     typedef long medEntityMesh;
@@ -68,15 +63,15 @@ namespace MED_EN {
     
     typedef enum {MED_CARTESIAN, MED_POLAR, MED_BODY_FITTED} med_grid_type;
     
     
     typedef enum {MED_CARTESIAN, MED_POLAR, MED_BODY_FITTED} med_grid_type;
     
-    typedef enum {MED_LECT,MED_ECRI,MED_REMP} med_mode_acces; 
-    
-    typedef enum {MED_COOR, MED_CONN, MED_NOM, MED_NUM, MED_FAM} med_table;
+    typedef enum {MED_LECT,MED_ECRI,MED_REMP} med_mode_acces;
+
+    typedef enum {ASCENDING=7,DESCENDING=77} med_sort_direc;
     
     
-    typedef enum {MED_REEL64=6, MED_INT32=24,MED_INT64=26, MED_INT} med_type_champ;
+    typedef enum {MED_REEL64=6, MED_INT32=24,MED_INT64=26} med_type_champ;
 
 
-#define MED_NBR_GEOMETRIE_MAILLE 15
-#define MED_NBR_GEOMETRIE_FACE 4
-#define MED_NBR_GEOMETRIE_ARETE 2
+// #define MED_NBR_GEOMETRIE_MAILLE 15
+// #define MED_NBR_GEOMETRIE_FACE 4
+// #define MED_NBR_GEOMETRIE_ARETE 2
 
 typedef enum {MED_CART, MED_CYL, MED_SPHER} med_repere; 
 
 
 typedef enum {MED_CART, MED_CYL, MED_SPHER} med_repere; 
 
@@ -88,25 +83,25 @@ typedef enum {MED_COMP, MED_DTYPE} med_dim_champ;
 
 typedef enum {MED_HDF_VERSION, MED_VERSION, MED_FICH_DES} med_fich_info; 
 
 
 typedef enum {MED_HDF_VERSION, MED_VERSION, MED_FICH_DES} med_fich_info; 
 
-#define MED_NOPG   1                   /* -> pas de point de Gauss                    */
-#define MED_NOPFL  ""                  /* -> pas de profils utilisateur               */
-#define MED_NOPFLi "                                "  /* Variable Interne                      */
-#define MED_NOPF   0                   /* -> pas de profils pour _MEDdataseNnumEcrire */
-#define MED_NOPDT -1                   /* rem: pas de pas de temps negatifs           */
-#define MED_NONOR -1                   /* rem: pas de n°ordre negatif                 */
-#define MED_DIM1   1                   /* PAS */
-  //#define MED_ALL    0 !!!!! NB: WARNING MED_ALL deja utilise dans l'enum medGeometryElement !!!!!!!!
-#define MED_ALL    0
+// #define MED_NOPG   1                   /* -> pas de point de Gauss                    */
+// #define MED_NOPFL  ""                  /* -> pas de profils utilisateur               */
+// #define MED_NOPFLi "                                "  /* Variable Interne                      */
+// #define MED_NOPF   0                   /* -> pas de profils pour _MEDdataseNnumEcrire */
+// #define MED_NOPDT -1                   /* rem: pas de pas de temps negatifs           */
+// #define MED_NONOR -1                   /* rem: pas de n°ordre negatif                 */
+// #define MED_DIM1   1                   /* PAS */
+//   //#define MED_ALL    0 !!!!! NB: WARNING MED_ALL deja utilise dans l'enum medGeometryElement !!!!!!!!
+// #define MED_ALL    0
 
 #if defined(SUN4SOL2) || defined(PCLINUX) || defined(OSF1_32) || defined(IRIX64_32) || defined(RS6000)
 /* interface C/FORTRAN */
 /* this true only with g77 and gcc : we must change it to use directly NOMF_... and INT32 or INT64 - it will be more simple to understand and to use ! */
 
 #if defined(SUN4SOL2) || defined(PCLINUX) || defined(OSF1_32) || defined(IRIX64_32) || defined(RS6000)
 /* interface C/FORTRAN */
 /* this true only with g77 and gcc : we must change it to use directly NOMF_... and INT32 or INT64 - it will be more simple to understand and to use ! */
-#define NOMF_POST_UNDERSCORE 
+// #define NOMF_POST_UNDERSCORE 
 
 /* correspondance des types avec HDF 5 */
 typedef hsize_t        med_size;
 typedef hssize_t       med_ssize;
 
 /* correspondance des types avec HDF 5 */
 typedef hsize_t        med_size;
 typedef hssize_t       med_ssize;
-typedef hid_t          med_idt;
+    //typedef hid_t          med_idt;
 typedef herr_t         med_err;
 
 /* types elementaires */
 typedef herr_t         med_err;
 
 /* types elementaires */
@@ -118,7 +113,7 @@ typedef double         med_float;
 /* correspondance des types avec HDF 5 */
 typedef hsize_t        med_size;
 typedef hssize_t       med_ssize;
 /* correspondance des types avec HDF 5 */
 typedef hsize_t        med_size;
 typedef hssize_t       med_ssize;
-typedef hid_t          med_idt;
+    //typedef hid_t          med_idt;
 typedef herr_t         med_err;
 
 /* types elementaires */
 typedef herr_t         med_err;
 
 /* types elementaires */
@@ -127,12 +122,12 @@ typedef double         med_float;
 #endif
 
 #if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
 #endif
 
 #if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
-#define NOMF_POST_UNDERSCORE
+// #define NOMF_POST_UNDERSCORE
 
 /* correspondance des types avec HDF 5 */
 typedef hsize_t        med_size;
 typedef hssize_t       med_ssize;
 
 /* correspondance des types avec HDF 5 */
 typedef hsize_t        med_size;
 typedef hssize_t       med_ssize;
-typedef hid_t          med_idt;
+    //typedef hid_t          med_idt;
 typedef herr_t         med_err;
 
 /* types elementaires */
 typedef herr_t         med_err;
 
 /* types elementaires */
@@ -145,7 +140,7 @@ typedef double         med_float;
 /* correspondance des types avec HDF 5 */
 typedef hsize_t        med_size;
 typedef hssize_t       med_ssize;
 /* correspondance des types avec HDF 5 */
 typedef hsize_t        med_size;
 typedef hssize_t       med_ssize;
-typedef hid_t          med_idt;
+    //typedef hid_t          med_idt;
 typedef herr_t         med_err;
 
 /* types elementaires */
 typedef herr_t         med_err;
 
 /* types elementaires */
@@ -154,18 +149,18 @@ typedef double         med_float;
 #endif
 
 
 #endif
 
 
-#if defined(NOMF_PRE_UNDERSCORE) && defined(NOMF_POST_UNDERSCORE)
-#   define NOMF(x)     _##x##_
-#endif
-#if defined(NOMF_PRE_UNDERSCORE) && !defined(NOMF_POST_UNDERSCORE)
-#   define NOMF(x)     _##x
-#endif
-#if !defined(NOMF_PRE_UNDERSCORE) && defined(NOMF_POST_UNDERSCORE)
-#   define NOMF(x)     x##_
-#endif
-#if !defined(NOMF_PRE_UNDERSCORE) && !defined(NOMF_POST_UNDERSCORE)
-#   define NOMF(x)     x
-#endif
+// #if defined(NOMF_PRE_UNDERSCORE) && defined(NOMF_POST_UNDERSCORE)
+// #   define NOMF(x)     _##x##_
+// #endif
+// #if defined(NOMF_PRE_UNDERSCORE) && !defined(NOMF_POST_UNDERSCORE)
+// #   define NOMF(x)     _##x
+// #endif
+// #if !defined(NOMF_PRE_UNDERSCORE) && defined(NOMF_POST_UNDERSCORE)
+// #   define NOMF(x)     x##_
+// #endif
+// #if !defined(NOMF_PRE_UNDERSCORE) && !defined(NOMF_POST_UNDERSCORE)
+// #   define NOMF(x)     x
+// #endif
 
   //#include "med_proto.h"
 
 
   //#include "med_proto.h"
 
@@ -227,8 +222,15 @@ typedef double         med_float;
 // retour des fonctions
 #define OK 0
 #define KO 1
 // retour des fonctions
 #define OK 0
 #define KO 1
-// fin
 
 
+  /*
+    enum definition for the used Med File version V2.1 or V2.2
+    because of incompatibility between them.
+  */
+
+  typedef enum {V21 = 26, V22 = 75} medFileVersion;
+
+// fin
 }
 // End Of NameSpace MED_EN
 
 }
 // End Of NameSpace MED_EN
 
diff --git a/src/MEDMEM/MEDMEM_medimport_src.cxx b/src/MEDMEM/MEDMEM_medimport_src.cxx
new file mode 100644 (file)
index 0000000..936475e
--- /dev/null
@@ -0,0 +1,2207 @@
+/*************************************************************************
+* COPYRIGHT (C) 1999 - 2003  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
+*
+*************************************************************************/
+#include "MEDMEM_medimport_src.hxx"
+
+using namespace med_2_2;
+using namespace MEDMEM;
+
+extern "C" {
+  extern med_err MEDgaussInfo(med_idt fid, int indice, char * locname,
+                             med_geometrie_element * type_geo,
+                             med_int * ngauss );
+
+  extern void _MEDmodeErreurVerrouiller(void);
+
+  extern med_err _MEDnomGeometrie(char *nom_geo,
+                                 med_geometrie_element type_geo);
+}
+
+med_err med_2_2::OLD_MEDattrNumLire(med_idt pere, med_type_champ type,
+                                   char *nom, unsigned char *val,
+                                   hid_t hdf_file)
+{
+  med_idt attid;
+  med_err ret;
+  int type_hdf;
+
+  if ((attid = H5Aopen_name(pere,nom)) < 0)
+    return -1;
+
+  switch(type) 
+    {
+    case MED_FLOAT64 :
+#if defined(PCLINUX) || defined(OSF1)
+/*       type_hdf = H5T_IEEE_F64BE; */
+      if (H5Tequal(hdf_file,H5T_IEEE_F64BE))
+       type_hdf = H5T_IEEE_F64LE;
+      if (H5Tequal(hdf_file,H5T_IEEE_F64LE))
+       type_hdf = H5T_IEEE_F64BE;
+#else 
+/*       type_hdf = H5T_IEEE_F64LE; */
+      if (H5Tequal(hdf_file,H5T_IEEE_F64BE))
+       type_hdf = H5T_IEEE_F64LE;
+      if (H5Tequal(hdf_file,H5T_IEEE_F64LE))
+       type_hdf = H5T_IEEE_F64BE;
+#endif
+      break;
+      
+    case MED_INT :
+#if defined(IRIX64) || defined(OSF1)
+      type_hdf = H5T_NATIVE_LONG; 
+#else
+      type_hdf = H5T_NATIVE_INT;
+#endif
+      break;
+      
+    default :
+      return -1;
+    }
+
+  if ((ret = H5Aread(attid,type_hdf,val)) < 0)
+    return -1;
+
+  if ((ret = H5Aclose(attid)) < 0)
+    return -1;
+
+  return 0;
+}
+
+
+med_err med_2_2::OLD_MEDdatasetNumLire(med_idt pere, char *nom,
+                                      med_type_champ type,
+                                      med_mode_switch interlace,
+                                      med_size nbdim, med_size fixdim, 
+                                      med_size psize, med_ssize * pfltab,
+                                      med_int ngauss,
+                                      unsigned char *val,hid_t hdf_file)
+{
+  med_idt    dataset, dataspace = 0, memspace = 0;
+  med_ssize  start_mem[1],start_data[1],*pflmem=0,*pfldsk=0;
+  med_size   stride[1],count[1],pcount[1],size[1],pflsize[1];
+  med_err    ret;
+  int        i,j,index,type_hdf;
+  hid_t      datatype;
+  size_t     typesize;
+  int        dim, firstdim, dimutil, lastdim;
+  med_mode_profil pflmod;
+
+  /* Verify fixdim is between [0, nbdim] ( 0 is MED_ALL ) */
+  if ( ( fixdim < 0 ) || ( fixdim > nbdim ) ) 
+    return -1;
+  /* block pflmod to MED_COMPACT (until med2.2) */
+  pflmod = MED_COMPACT;
+
+  switch(type)
+    {
+    case MED_FLOAT64 :
+      /* 1) IA32 is LE but due to an (?HDF convertion BUG?) when using H5T_NATIVE_DOUBLE/MED_REEL64? under PCLINUX
+        the file read under SGI is incorrect
+        2) Compaq OSF/1 is LE, since we force SGI64,SUN4SOL2,HP to write double in LE even if they are BE, mips OSF/1 must be BE
+        REM  : Be careful of compatibility between MED files when changing this (med2.2)                    */
+#if defined(PCLINUX) || defined(OSF1)
+/*       type_hdf = H5T_IEEE_F64BE; */
+      if (H5Tequal(hdf_file,H5T_IEEE_F64BE))
+       type_hdf = H5T_IEEE_F64LE;
+      if (H5Tequal(hdf_file,H5T_IEEE_F64LE))
+       type_hdf = H5T_IEEE_F64BE;
+#else 
+/*       type_hdf = H5T_IEEE_F64LE; */
+      if (H5Tequal(hdf_file,H5T_IEEE_F64BE))
+       type_hdf = H5T_IEEE_F64LE;
+      if (H5Tequal(hdf_file,H5T_IEEE_F64LE))
+       type_hdf = H5T_IEEE_F64BE;
+#endif
+      break;
+
+    case MED_INT32 :
+      type_hdf = H5T_NATIVE_INT;
+      break;
+
+    case MED_INT64 :
+      type_hdf = H5T_NATIVE_LONG;
+      break;
+
+    default :
+      return -1;
+    }
+
+  /* Ouverture du Dataset Ã  lire */
+  if ((dataset = H5Dopen(pere,nom)) < 0)
+    return -1;
+
+  /* Interrogation de la taille du dataset */
+  if ( (datatype  = H5Dget_type(dataset )) < 0) return -1;
+  if ( (typesize  = H5Tget_size(datatype)) < 0) return -1;
+  size[0] = H5Dget_storage_size(dataset) / typesize; 
+  if ( H5Tclose(datatype) < 0) return -1;
+
+  /* Create dataspace */
+  if ((dataspace = H5Screate_simple(1,size,NULL)) < 0)
+    return -1;
+  
+  switch(interlace)
+    {
+    case MED_FULL_INTERLACE :
+
+      /*Initialisation des indices de boucle du traitement de l'entrelacement en fonction de la dimension fixee*/
+      if ( fixdim != MED_ALL) 
+       { 
+         firstdim = fixdim-1;
+         lastdim  = fixdim;
+         dimutil  = 1;
+       } else  {
+         firstdim = 0;
+         lastdim = nbdim;
+         dimutil  = nbdim; 
+       }
+
+      count [0] = (*size)/(nbdim);
+      
+
+      /*rem: Pas de vérification de l'assertion (*size)=n*nbdim */
+      if ( psize == MED_NOPF ) {  
+
+      /* Creation d'un data space mémoire de dimension 1, de longeur size, et de longeur maxi size */
+      if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
+       return -1;
+
+       stride[0] = nbdim;  
+
+       for (dim=firstdim; dim < lastdim; dim++) {
+                 
+         start_mem[0] = dim;
+         if ( (ret = H5Sselect_hyperslab (memspace, H5S_SELECT_SET, start_mem, stride, 
+                                          count, NULL)) <0)
+           return -1; 
+         
+         start_data[0] = dim*count[0];
+         if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL, 
+                                          count, NULL)) <0)
+           return -1; 
+         
+         if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,
+                            H5P_DEFAULT, val)) < 0)
+           return -1;
+       }
+       
+      } else {
+
+       pflsize [0] = psize*ngauss*nbdim;
+       pcount  [0] = psize*ngauss*dimutil;
+       pflmem     = (med_ssize *) malloc (sizeof(med_ssize)*pcount[0]);
+       pfldsk     = (med_ssize *) malloc (sizeof(med_ssize)*pcount[0]);
+       
+       switch(pflmod)
+         { /* switch pflmod pour FULL_INTERLACE*/
+         case MED_GLOBAL :
+
+           /* Creation d'un data space mémoire de dimension 1, de longeur size, et de longeur maxi size */
+           if ( (memspace = H5Screate_simple (1, size, NULL)) <0)
+             return -1;
+
+           for (dim=firstdim; dim < lastdim; dim++) {
+             
+             for (i=0; i < psize; i++)              /* i balaye les Ã©lements du profil */
+               for (j=0; j < ngauss; j++) {         
+                 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
+                 pflmem[index] = (pfltab[i]-1)*ngauss*nbdim + j*nbdim+dim;
+                 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;             
+               }
+           }
+           
+           if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], (const hssize_t **) pflmem ) ) <0) 
+             return -1; 
+           
+           if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, pcount[0], (const hssize_t **) pfldsk ) ) <0) 
+             return -1; 
+           
+           break;
+       
+         case MED_COMPACT :
+       
+           /* Creation d'un data space mémoire de dimension 1, de la longeur du profil          */
+           /* La dimension utilisée est ici nbdim, même pour un profil compact on suppose       */
+           /*  que l'utilisateur a toutes les coordonées stockées, même si il en demande qu'une */ 
+           
+           if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
+             return -1;
+           
+           for (dim=firstdim; dim < lastdim; dim++) {
+             
+             for (i=0; i < psize; i++)              /* i balaye les Ã©lements du profil */
+               for (j=0; j < ngauss; j++) {         
+                 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
+                 pflmem[index] = i*ngauss*nbdim + j*nbdim+dim;
+                 pfldsk[index] = dim*count[0] + (pfltab[i]-1)*ngauss+j;             
+               }             
+           }
+           
+           if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], (const hssize_t **) pflmem ) ) <0) 
+             return -1; 
+           
+           if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET, pcount[0], (const hssize_t **) pfldsk ) ) <0) 
+             return -1; 
+           
+           break;
+
+         default :
+           return -1; 
+         }
+       
+       if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
+         return -1;
+       
+       free(pflmem);
+       free(pfldsk);
+      }
+      
+      break;
+      
+    case MED_NO_INTERLACE :
+
+      /*Initialisation des indices de boucle du traitement de l'entrelacement en fonction de la dimension fixee*/
+
+      count[0] = (*size)/nbdim;
+      
+      if ( psize == MED_NOPF ) {  
+       
+       if ( fixdim != MED_ALL) 
+         start_data[0] = (fixdim-1)*count[0];
+       else {
+         count[0] = *size;
+         start_data[0] =  0;
+       };
+       
+       if ( (ret = H5Sselect_hyperslab (dataspace, H5S_SELECT_SET, start_data, NULL, 
+                                        count, NULL)) <0)
+         return -1; 
+       
+       if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,
+                          H5P_DEFAULT, val)) < 0)
+         return -1;
+       
+      } else {
+
+       if ( fixdim != MED_ALL) 
+         { 
+           firstdim = fixdim-1;
+           lastdim  = fixdim;
+           dimutil  = 1;
+         } else        {
+           firstdim = 0;
+           lastdim  = nbdim;
+           dimutil  = nbdim; 
+         }
+
+       pflsize [0] = psize*ngauss*nbdim;       
+       pcount  [0] = psize*ngauss*dimutil; /* nom pas très coherent avec count !!! A revoir */ 
+       pfldsk      = (med_ssize *) malloc(sizeof(med_ssize)*pcount[0]);
+       
+       switch(pflmod)
+         { /*switch plfmod pour NO_INTERLACE */
+         case MED_GLOBAL :
+           
+           for (dim=firstdim; dim < lastdim; dim++) {
+             
+             for (i=0; i < psize; i++)              /* i balaye le nbre d'élements du profil                */
+               for (j=0; j < ngauss; j++) { 
+                 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
+                 pfldsk[index] = dim*count[0]+(pfltab[i]-1)*ngauss+j;      
+               }
+           }
+           
+           if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], (const hssize_t **) pfldsk ) ) <0) 
+             return -1;
+           
+           if ((ret = H5Dread(dataset,type_hdf,dataspace,dataspace,H5P_DEFAULT, val)) < 0)
+             return -1;
+             
+           break;
+           
+         case MED_COMPACT :
+           
+           /* Creation d'un data space mémoire de dimension 1, de la longeur du profil          */
+           /* La dimension utilisée est ici nbdim, même pour un profil compact on suppose       */
+           /*  que l'utilisateur a toutes les coordonées stockées, même si il en demande qu'une */ 
+
+           if ( (memspace = H5Screate_simple (1, pflsize, NULL)) <0)
+             return -1;
+
+           pflmem     = (med_ssize *) malloc (sizeof(med_ssize)*pcount[0]);
+           
+           /* Le profil COMPACT est contigüe, mais il est possible que l'on selectionne uniquemenent une dimension*/
+
+           for (dim=firstdim; dim < lastdim; dim++) {
+             
+             for (i=0; i < psize; i++)              /* i balaye le nbre d'élements du profil                */
+               for (j=0; j < ngauss; j++) {
+                 index = i*ngauss+j + (dim-firstdim)*(psize*ngauss);
+                 pflmem[index] = dim*(psize*ngauss) + (pfltab[i]-1)*ngauss+j;
+                 pfldsk[index] = dim*count[0]  + (pfltab[i]-1)*ngauss+j;           
+               }
+           }
+           
+           if ( (ret = H5Sselect_elements(memspace ,H5S_SELECT_SET, pcount[0], (const hssize_t **) pflmem ) ) <0) 
+             return -1; 
+           
+           if ( (ret = H5Sselect_elements(dataspace,H5S_SELECT_SET,pcount[0], (const hssize_t **) pfldsk ) ) <0) 
+             return -1;          
+           
+           if ((ret = H5Dread(dataset,type_hdf,memspace,dataspace,H5P_DEFAULT, val)) < 0)
+             return -1;
+           
+           break;
+           
+         default :
+           return -1;      
+           
+         }
+       
+       free(pfldsk);
+       
+      };
+      
+      break;
+      
+    default :
+      return -1;
+    }
+  
+  
+
+  if (memspace) 
+    if ((ret = H5Sclose(memspace)) < 0)
+      return -1;
+
+  if ((ret = H5Sclose(dataspace)) < 0)
+    return -1;
+  
+  if ((ret = H5Dclose(dataset)) < 0)
+    return -1;      
+
+  return 0;
+}
+
+
+void med_2_2::conversion_chaine(char *ancienne_chaine,
+                              char *nouvelle_chaine,
+                              med_int n)
+{
+  int i;
+  int j;
+  char tmp[MED_TAILLE_PNOM+1];
+
+  for (i=0;i<n;i++) {
+    if (i == n-1) {
+      strcpy(tmp,ancienne_chaine+i*ANCIEN_MED_TAILLE_PNOM);
+      if (strlen(tmp) < ANCIEN_MED_TAILLE_PNOM)
+       for(j=strlen(tmp);j<ANCIEN_MED_TAILLE_PNOM;j++) 
+         tmp[j] = ' ';
+    }
+    else
+      strncpy(tmp,ancienne_chaine+i*ANCIEN_MED_TAILLE_PNOM,ANCIEN_MED_TAILLE_PNOM);
+    tmp[ANCIEN_MED_TAILLE_PNOM] = '\0';
+    /*          12345678 */
+    strcat(tmp,"        ");
+    /*     printf("[%s]\n",tmp); */
+    if (i == 0)
+      strcpy(nouvelle_chaine,tmp);
+    else
+      strcat(nouvelle_chaine,tmp);
+  }
+  *(nouvelle_chaine+MED_TAILLE_PNOM*n) = '\0';
+} 
+
+void med_2_2::MAJ_version(med_idt fid) throw (MEDEXCEPTION)
+{
+  med_err ret;
+  med_idt gid;
+  med_int majeur, mineur, release;
+
+  /* On ecrit le bon numero de version */
+  majeur = 2;
+  mineur = 2;
+  release = 1;
+  gid = _MEDdatagroupOuvrir(fid,MED_NOM_INFOS);
+  if (gid < 0)
+    gid = _MEDdatagroupCreer(fid,MED_NOM_INFOS);
+
+//   EXIT_IF(gid < 0,"Ouverture du groupe HDF MED_NOM_INFOS",NULL);
+
+  if (gid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDattrEntierEcrire(gid,MED_NOM_MAJEUR,&majeur);
+
+//   EXIT_IF(ret < 0,"Ecriture du numéro majeur",NULL);
+
+  if (ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDattrEntierEcrire(gid,MED_NOM_MINEUR,&mineur);
+
+//   EXIT_IF(ret < 0,"Ecriture du numéro mineur",NULL);
+
+  if (ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDattrEntierEcrire(gid,MED_NOM_RELEASE,&release);
+
+//   EXIT_IF(ret < 0,"Ecrriture du numéro de release",NULL);
+
+  if (ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDdatagroupFermer(gid);
+
+//   EXIT_IF(ret < 0,"Fermeture du groupe HDF MED_NOM_INFOS",NULL);
+
+  if (ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+  
+}
+
+void med_2_2::MAJ_noeuds_maillage(med_idt mid, med_int dimension)
+  throw (MEDEXCEPTION)
+{
+  med_idt nid, gid, tid;
+  med_float *coo;
+  char *nom, *unit;
+  char tmp[MED_TAILLE_PNOM+1];
+  char *nouvelle_chaine;
+  med_int n;
+  med_size dimd[1];
+  med_err ret;
+  int i;
+  hid_t hdf_type;
+  med_repere repere;
+
+  /* Accès aux noeuds du maillage */
+  nid = _MEDdatagroupOuvrir(mid,MED_NOM_NOE);
+
+//   EXIT_IF(nid < 0,"Ouverture du groupe HDF MED_NOM_NOE",NULL);
+
+  if(nid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* Lecture du nombre de noeuds */
+  gid = _MEDdatasetOuvrir(nid,MED_NOM_COO);
+  if (gid > 0) 
+     ret = _MEDattrEntierLire(gid,MED_NOM_NBR,&n);
+
+//   EXIT_IF(gid < 0,"Lecture du nombre de noeuds",NULL);
+
+  if(gid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+  
+  /* Mise a jour des coordonnees */
+  /* On cree un groupe HDF tampon */
+  /* Lecture des coordonnées */
+  hdf_type = H5Dget_type(gid);
+
+//   EXIT_IF(hdf_type < 0,"Lecture du type HDF de stockage des coordonnées",NULL);
+
+  if(hdf_type < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  coo = (med_float *) malloc(sizeof(med_float)*n*dimension);
+
+//   EXIT_IF(coo == NULL,NULL,NULL);
+
+  if(coo == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = OLD_MEDdatasetNumLire(nid,MED_NOM_COO,MED_FLOAT64, 
+                             MED_FULL_INTERLACE,dimension,MED_ALL, 
+                             0,NULL,MED_NOPG, 
+                             (unsigned char*) coo,hdf_type); 
+
+//   EXIT_IF(ret < 0,"Lecture des coordonnées des noeuds",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  dimd[0] = n*dimension;
+  /*   printf("EGALITE des types : %d \n",H5Tequal(hdf_type,H5T_NATIVE_DOUBLE)); */
+  /*   printf("Avant conversion : [%f] [%f] [%f] \n",*(coo),*(coo+1),*(coo+2)); */
+  if (! H5Tequal(hdf_type,H5T_NATIVE_DOUBLE)) {
+    ret = H5Tconvert(hdf_type,H5T_NATIVE_DOUBLE,(hsize_t)*dimd,(void *)coo,NULL,0);
+    /*   printf("Après conversion Ã©ventuelle : [%f] [%f] [%f] \n",*(coo),*(coo+1),*(coo+2)); */
+
+//     EXIT_IF(ret < 0,"Conversion des coordonnées des noeuds",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+  }
+  ret = H5Tclose(hdf_type);
+
+//   EXIT_IF(ret < 0,"Fermeture du data type HDF",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* On reporte les coordonnées dans le groupe HDF TMP */
+  ret = _MEDdatasetNumEcrire(nid,"TMP",MED_FLOAT64,MED_FULL_INTERLACE,
+                            dimension,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
+                            (unsigned char*) coo);
+
+//   EXIT_IF(ret < 0,"Ecriture des coordonnées des noeuds après conversion",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  free(coo);
+
+  /* Ecriture du nombre de noeuds et du type du repertoire dans le dataset TMP */
+  tid = _MEDdatasetOuvrir(nid,"TMP");
+
+//   EXIT_IF(tid < 0,"Ouverture du dataset HDF TMP",NULL);
+
+  if(tid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDattrEntierEcrire(tid,MED_NOM_NBR,&n);
+
+//   EXIT_IF(ret < 0,"Ecriture du nombre de noeuds dans le dataset HDF TMP",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDattrEntierLire(gid,MED_NOM_REP,&repere);
+
+//   EXIT_IF(ret < 0,"Lecture du type de repere des coordonnées", NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDattrEntierEcrire(tid,MED_NOM_REP,&repere);
+
+//   EXIT_IF(ret < 0,"Ecriture du type de répertoire dans le dataset HDF TMP",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* Mise a jour des noms et types des unités des coordonnees */
+  nom = (char *) malloc(dimension*ANCIEN_MED_TAILLE_PNOM+1);
+
+//   EXIT_IF(nom == NULL,NULL,NULL);
+
+  if(nom == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  unit = (char *) malloc(dimension*ANCIEN_MED_TAILLE_PNOM+1);
+
+//   EXIT_IF(unit == NULL,NULL,NULL);
+
+  if(unit == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  nouvelle_chaine = (char *) malloc(dimension*MED_TAILLE_PNOM+1);
+
+//   EXIT_IF(nouvelle_chaine == NULL,NULL,NULL);
+
+  if(nouvelle_chaine == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDattrStringLire(gid,MED_NOM_NOM,dimension*ANCIEN_MED_TAILLE_PNOM,nom);
+
+//   EXIT_IF(ret < 0,"Lecture des noms des coordonnées des noeuds",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDattrStringLire(gid,MED_NOM_UNI,dimension*ANCIEN_MED_TAILLE_PNOM,unit);
+
+//   EXIT_IF(ret < 0,"Lecture des unités des coordonnées des noeuds",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  conversion_chaine(nom,nouvelle_chaine,dimension);
+  ret = _MEDattrStringEcrire(tid,MED_NOM_NOM,dimension*MED_TAILLE_PNOM,nouvelle_chaine);
+
+//   EXIT_IF(ret < 0,"Ecriture des nouveaux noms des coordonnées des noeuds",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  conversion_chaine(unit,nouvelle_chaine,dimension);
+  ret = _MEDattrStringEcrire(tid,MED_NOM_UNI,dimension*MED_TAILLE_PNOM,nouvelle_chaine);
+
+//   EXIT_IF(ret < 0,"Ecriture des nouvelles unités des coordonnées des noeuds",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  free(nom);
+  free(unit);
+  free(nouvelle_chaine);
+
+  /* Fermeture de l'accès aux coordonnées */
+  ret = _MEDdatasetFermer(gid);
+
+//   EXIT_IF(ret < 0,"Fermeture du dataset HDF MED_NOM_COO",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = H5Gunlink(nid,MED_NOM_COO);
+
+//   EXIT_IF(ret < 0,"Suppression des anciennes coordonnées",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDdatasetFermer(tid);
+
+//   EXIT_IF(ret < 0,"Fermeture du dataset HDF TMP",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = H5Gmove(nid,"TMP",MED_NOM_COO);
+
+//   EXIT_IF(ret < 0,"Mise en place des nouvelles coordonnées",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* Mise a jour des noms des noeuds */
+  nom = (char *) malloc(n*ANCIEN_MED_TAILLE_PNOM+1);
+
+//   EXIT_IF(nom == NULL,NULL,NULL);
+
+  if(nom == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  nouvelle_chaine = (char *) malloc(n*MED_TAILLE_PNOM+1);
+
+//   EXIT_IF(nouvelle_chaine == NULL,NULL,NULL);
+
+  if(nouvelle_chaine == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDdatasetStringLire(nid,MED_NOM_NOM,nom);
+  if (ret == 0) {
+    conversion_chaine(nom,nouvelle_chaine,n);
+    H5Gunlink(nid,MED_NOM_NOM);
+    dimd[0] = n*MED_TAILLE_PNOM+1;
+    ret = _MEDdatasetStringEcrire(nid,MED_NOM_NOM,dimd,nouvelle_chaine);  
+
+//     EXIT_IF(ret < 0,"Ecriture des nouveaux noms des noeuds",NULL);  
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    gid = _MEDdatasetOuvrir(nid,MED_NOM_NOM);
+    ret = _MEDattrEntierEcrire(gid,MED_NOM_NBR,&n);
+    ret = _MEDdatasetFermer(gid);
+  }
+  free(nom);
+  free(nouvelle_chaine);
+
+  /* on ferme tout */
+  ret = _MEDdatagroupFermer(nid);
+
+//   EXIT_IF(ret < 0,"Fermeture de l'accès aux noeuds",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+}
+
+void med_2_2::MAJ_elements_maillage(med_idt mid, med_int dimension)
+  throw (MEDEXCEPTION)
+{
+  med_idt eid,gid,did,tid;
+  med_err ret;
+  int i,j;
+  med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = {MED_POINT1,MED_SEG2, 
+                                                           MED_SEG3,MED_TRIA3,
+                                                           MED_TRIA6,MED_QUAD4,
+                                                           MED_QUAD8,MED_TETRA4,
+                                                           MED_TETRA10,MED_HEXA8,
+                                                           MED_HEXA20,MED_PENTA6,
+                                                           MED_PENTA15,MED_PYRA5,
+                                                           MED_PYRA13};
+  int taille, edim;
+  char *nom, *nouvelle_chaine;
+  char nomgroup[MED_TAILLE_NOM_ENTITE+1];
+  med_int n;
+  med_size dimd[1];
+  med_int *old_conn,*conn;
+  
+  /* On ne regarde que les mailles et la connectivité nodale */
+  eid = _MEDdatagroupOuvrir(mid,MED_NOM_MAI);
+
+//   EXIT_IF(eid < 0,"Ouverture du groupe HDF MED_NOM_MAI",NULL);
+
+  if(eid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* On normalise selon tous les types geometriques */
+  for (i=0;i<MED_NBR_GEOMETRIE_MAILLE;i++) {
+    
+    /* On recupere le nom du groupe HDF */
+    _MEDnomGeometrie(nomgroup,typmai[i]);
+
+    /* On accède au type s'il existe dans le fichier */
+    gid = _MEDdatagroupOuvrir(eid,nomgroup);
+    if (gid < 0)
+      continue;
+
+    /* Nombre d'element ? */
+    did = _MEDdatasetOuvrir(gid,MED_NOM_NOD);
+
+//     EXIT_IF(did < 0,"Ouverture du dataset HDF MED_NOM_NOD",NULL);
+
+    if(did < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    ret = _MEDattrEntierLire(did,MED_NOM_NBR,&n);
+
+//     EXIT_IF(ret < 0,"Lecture du nombre d'elements",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    ret = _MEDdatasetFermer(did);
+
+//     EXIT_IF(ret < 0,"Fermeture du dataset HDF MED_NOM_NOD",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* on normalise la connectivité si edim < dimension */
+    edim = typmai[i] / 100;
+    if (edim < dimension) {
+      taille = typmai[i]%100 + 1;
+      old_conn = (med_int *) malloc(sizeof(med_int)*taille*n);
+
+//       EXIT_IF(old_conn == NULL,NULL,NULL);
+
+      if(old_conn == NULL)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+#if defined(IRIX64)||defined(OSF1)
+      ret = OLD_MEDdatasetNumLire(gid,MED_NOM_NOD,MED_INT64,
+                                 MED_NO_INTERLACE,(med_size)taille,MED_ALL,
+                                 0,NULL,MED_NOPG,
+                                 (unsigned char*) old_conn,H5T_NATIVE_INT);
+#else
+      ret = OLD_MEDdatasetNumLire(gid,MED_NOM_NOD,MED_INT32,
+                                 MED_NO_INTERLACE,(med_size) taille,MED_ALL,
+                                 0,NULL,MED_NOPG,
+                                 (unsigned char*) old_conn,H5T_NATIVE_INT);
+#endif 
+      /* On recopie dans le bon tableau */
+      taille --;
+      conn = (med_int *) malloc(sizeof(med_int)*taille*n);
+
+//       EXIT_IF(conn == NULL,NULL,NULL);
+
+      if(conn == NULL)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      for (j=0;j<n*taille;j++)
+       *(conn+j) = *(old_conn+j);
+      dimd[0] = n*taille;
+#if defined(IRIX64)||defined(OSF1)
+      ret = _MEDdatasetNumEcrire(gid,"TMP",MED_INT64,MED_NO_INTERLACE,
+                                taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
+                                (unsigned char*) conn);
+#else
+      ret = _MEDdatasetNumEcrire(gid,"TMP",MED_INT32,MED_NO_INTERLACE,
+                                taille,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
+                                (unsigned char*) conn);
+#endif
+
+//       EXIT_IF(ret < 0,"Ecriture de la nouvelle connectivité des mailles",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+      
+      /* Ecriture du nombre de mailles dans le dataset HDF TMP */
+      tid = _MEDdatasetOuvrir(gid,"TMP");
+
+//       EXIT_IF(tid < 0,"Ouverture du dataset HDF TMP",NULL);
+
+      if(tid < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      ret = _MEDattrEntierEcrire(tid,MED_NOM_NBR,&n);
+
+//       EXIT_IF(ret < 0,"Ecriture du nombre de noeuds dans le dataset HDF TMP",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      ret = _MEDdatasetFermer(tid);
+
+//       EXIT_IF(ret < 0,"Fermeture du dataset HDF TMP",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      /* Fermeture de l'accès aux connectivites */
+      ret = H5Gunlink(gid,MED_NOM_NOD);
+
+//       EXIT_IF(ret < 0,"Suppression des anciennes connectivités",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      ret = H5Gmove(gid,"TMP",MED_NOM_NOD);
+
+//       EXIT_IF(ret < 0,"Mise en place des nouvelles connectivités",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      /* on libere la memoire */
+      free(old_conn);
+      free(conn);
+    }
+     
+    /* Mise a niveau des noms */
+    nom = (char *) malloc(n*ANCIEN_MED_TAILLE_PNOM+1);
+
+//     EXIT_IF(nom == NULL,NULL,NULL);
+
+    if(nom == NULL)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    nouvelle_chaine = (char *) malloc(n*MED_TAILLE_PNOM+1);
+
+//     EXIT_IF(nouvelle_chaine == NULL,NULL,NULL);
+
+    if(nouvelle_chaine == NULL)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    ret = _MEDdatasetStringLire(gid,MED_NOM_NOM,nom);
+    if (ret == 0) {
+      conversion_chaine(nom,nouvelle_chaine,n);
+      H5Gunlink(gid,MED_NOM_NOM);
+      dimd[0] = n*MED_TAILLE_PNOM+1;
+      ret = _MEDdatasetStringEcrire(gid,MED_NOM_NOM,dimd,nouvelle_chaine);  
+
+//       EXIT_IF(ret < 0,"Ecriture des nouveaux noms des Ã©léments",NULL);  
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      did = _MEDdatasetOuvrir(gid,MED_NOM_NOM);
+      ret = _MEDattrEntierEcrire(did,MED_NOM_NBR,&n);
+      ret = _MEDdatasetFermer(did);
+    }
+    free(nom);
+    free(nouvelle_chaine);
+
+    /* on ferme avant de passer au type geometrique suivant */
+    ret = _MEDdatagroupFermer(gid);
+
+//     EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+  }
+
+  /* On ferme tout */
+  ret = _MEDdatagroupFermer(eid);
+
+//   EXIT_IF(ret < 0,"Fermeture de l'accès aux mailles",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+}
+
+void med_2_2::MAJ_familles_maillage(med_idt mid) throw (MEDEXCEPTION)
+{
+  med_idt fid, gid;
+  char *nouvelle_chaine;
+  int n;
+  med_size dimd[1];
+  med_err ret;
+  int i;
+  char chemin[MED_TAILLE_FAS+2*MED_TAILLE_NOM+1];
+  char nom[MED_TAILLE_NOM+1];
+  char *noeuds, *elements;
+  int nnoeuds = 0;
+  int nelements = 0;
+  med_int numero;
+  char *groupe_noeuds = "NOEUD";
+  char *groupe_elements = "ELEME";
+  char *nom_famille_zero = "FAMILLE_ZERO";
+  char famille0[MED_TAILLE_NOM+1];
+  int *index_noeuds, *index_elements;
+  char stockage[MED_TAILLE_DESC];
+  med_float *valr;
+
+  /* Combien de famille ? */
+  fid = _MEDdatagroupOuvrir(mid,"FAS");
+
+//   EXIT_IF(fid < 0,"Ouverture du groupe HDF 'FAS'",NULL);
+
+  if(fid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  n = 0;
+  _MEDnObjets(fid,".",&n);
+
+//   EXIT_IF(n < 0,"Lecture du nombre de famille",NULL);
+
+  if(n < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  noeuds = (char *) malloc(n*MED_TAILLE_NOM+1);
+
+//   EXIT_IF(noeuds == NULL,NULL,NULL);
+
+  if(noeuds == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  index_noeuds = (int *) malloc(sizeof(int)*(n+1));
+
+//   EXIT_IF(index_noeuds == NULL,NULL,NULL);
+
+  if(index_noeuds < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+  
+  elements = (char *) malloc(n*MED_TAILLE_NOM+1);
+
+//   EXIT_IF(elements == NULL,NULL,NULL);
+
+  if(elements == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  index_elements = (int *) malloc(sizeof(int)*(n+1));
+
+//   EXIT_IF(index_elements == NULL,NULL,NULL);
+  
+  if(index_elements == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* On recupere les familles une par une et on les
+     normalise */
+  for (i=0;i<n;i++) {
+    ret = _MEDobjetIdentifier(fid,".",i,nom);
+
+//     EXIT_IF(ret < 0,"Identification d'une famille",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* On accede a la famille */
+    gid = _MEDdatagroupOuvrir(fid,nom);
+
+//     EXIT_IF(gid < 0,"Ouverture de l'accès Ã  la famille",nom);
+
+    if(gid < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* On lit le numero de la famille */
+    ret = _MEDattrEntierLire(gid,MED_NOM_NUM,&numero);
+
+//     EXIT_IF(ret < 0,"Lecture du numéro de la famille",nom);
+     
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* On ferme l'acces a la famille */
+    ret = _MEDdatagroupFermer(gid);
+
+//     EXIT_IF(ret < 0,"Fermeture de l'accès a la famille",nom);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    if (numero == 0) 
+      strcpy(famille0,nom);
+
+    if (numero < 0) {
+      if (nelements == 0) { 
+       *(index_elements) = 0;
+       strcpy(elements,nom);
+      }
+      else
+       strcat(elements,nom);
+      nelements ++;
+      *(index_elements+nelements) = strlen(nom) + *(index_elements+nelements-1);
+    }
+
+    if (numero > 0) {
+      if (nnoeuds == 0) {
+       strcpy(noeuds,nom);
+       *(index_noeuds) = 0;
+      }
+      else
+       strcat(noeuds,nom);
+      nnoeuds++;
+      *(index_noeuds+nnoeuds) = strlen(nom) + *(index_noeuds+nnoeuds-1);
+    }
+  }
+
+  /* Normalisation de la famille 0 */
+  ret = H5Gmove(fid,famille0,nom_famille_zero);
+
+//   EXIT_IF(ret < 0,"Normalisation de la famille ZERO",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* On cree les groupes HDF pour les familles de noeuds et d'elements */
+  gid = _MEDdatagroupCreer(fid,groupe_noeuds); 
+
+//   EXIT_IF(gid < 0,"Creation du grupe HDF pour les familles de noeuds",NULL); 
+
+  if(gid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDdatagroupFermer(gid); 
+
+//   EXIT_IF(ret < 0,"Fermeture du groupe HDF pour les familles de noeuds",NULL); 
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  gid = _MEDdatagroupCreer(fid,groupe_elements); 
+
+//   EXIT_IF(gid < 0,"Creation du groupe HDF pour les familles d'éléments",NULL); 
+
+  if(gid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  ret = _MEDdatagroupFermer(gid); 
+
+//   EXIT_IF(ret < 0,"Fermeture du groupe HDF pour les familles d'éléments",NULL); 
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* On deplace les groupes HDF des familles en fonction de la nature de 
+     chaque famille */
+  for (i=0;i<nnoeuds;i++) {
+    strncpy(nom,noeuds+*(index_noeuds+i),*(index_noeuds+i+1)-*(index_noeuds+i));
+    nom[*(index_noeuds+i+1)-*(index_noeuds+i)] = '\0';
+    strcpy(stockage,groupe_noeuds);
+    strcat(stockage,"/");
+    strcat(stockage,nom);
+    ret = H5Gmove(fid,nom,stockage); 
+
+//     EXIT_IF(ret < 0,"Normalisation de la famille",nom); 
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+  }
+
+  for (i=0;i<nelements;i++) {
+    strncpy(nom,elements+*(index_elements+i),*(index_elements+i+1)-*(index_elements+i));
+    nom[*(index_elements+i+1)-*(index_elements+i)] = '\0';
+    strcpy(stockage,groupe_elements);
+    strcat(stockage,"/"); 
+    strcat(stockage,nom);
+    ret = H5Gmove(fid,nom,stockage);  
+
+//     EXIT_IF(ret < 0,"Normalisation de la famille",nom);  
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+  }
+
+  /* On libere la memoire */
+  free(noeuds);
+  free(index_noeuds);
+  free(elements);
+  free(index_elements);
+
+  /* On ferme tout */
+  ret = _MEDdatagroupFermer(fid);
+
+//   EXIT_IF(ret < 0,"Fermeture du groupe HDF 'FAS'",NULL);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+}
+
+void med_2_2::MAJ_maillages(med_idt fid) throw (MEDEXCEPTION)
+{
+  med_idt gid;
+  med_err ret;
+  int n,i;
+  char nom[MED_TAILLE_NOM+1];
+  char chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1];
+  char description[MED_TAILLE_DESC+1] = "Maillage converti au format MED V2.2";
+  med_int type = (med_int) MED_NON_STRUCTURE;
+  med_int dimension;
+  
+  /* Lecture du nombre de maillages */
+  n = 0;
+  _MEDnObjets(fid,MED_MAA,&n);
+
+//   EXIT_IF(n < 0,"Erreur a la lecture du nombre de maillage",NULL);
+
+  if(n < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* 
+   * Mise a jour des maillages :
+   *  - type : MED_NON_STRUCTURE
+   *  - description : "Maillage converti au format V2.2"
+   */
+  for (i=0;i<n;i++) {
+    /* on recupere le nom du maillage */
+    ret = _MEDobjetIdentifier(fid,MED_MAA,i,nom);
+
+//     EXIT_IF(ret < 0,"Identification d'un maillage",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+//     fprintf(stdout,"  >>> Normalisation du maillage [%s] \n",nom);
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: >>> Normalisation du maillage [" << nom << "]");
+
+    /* on accede au maillage */
+    strcpy(chemin,MED_MAA);
+    strcat(chemin,nom);
+    gid = _MEDdatagroupOuvrir(fid,chemin); 
+
+//     EXIT_IF(gid < 0,"Accès au maillage",nom);
+
+    if(gid < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* lecture de la dimension du maillage */
+    ret = _MEDattrEntierLire(gid,MED_NOM_DIM,&dimension);
+
+//     EXIT_IF(ret < 0,"Lecture de la dimension du maillage",nom);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* Ecriture du type et de la description */
+    ret = _MEDattrStringEcrire(gid,MED_NOM_DES,MED_TAILLE_DESC,description);
+
+//     EXIT_IF(ret < 0,"Ecriture de la description du maillage ",nom);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    ret = _MEDattrEntierEcrire(gid,MED_NOM_TYP,&type);
+
+//     EXIT_IF(ret < 0,"Ecriture de la dimension du maillage ",nom);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+    
+    /* Mise a jour des noeuds du maillage */ 
+    MAJ_noeuds_maillage(gid,dimension);  
+
+//     fprintf(stdout,"  ... Normalisation des noeuds effectuée ... \n");
+
+    MESSAGE("med File convertor 2.1 to 2.2 ::  ... Normalisation des noeuds effectuée ...");
+
+    /* Mise a jour des Ã©léments du maillage */ 
+    MAJ_elements_maillage(gid,dimension);  
+
+//     fprintf(stdout,"  ... Normalisation des Ã©léments effectuée ... \n");
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: ... Normalisation des Ã©léments effectuée ...");
+
+    /* Mise a jour des familles du maillage */
+    MAJ_familles_maillage(gid);
+
+//     fprintf(stdout,"  ... Normalisation des familles effectuée ... \n");
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: ... Normalisation des familles effectuée ...");
+    
+    /* On ferme tout */
+    ret = _MEDdatagroupFermer(gid);
+
+//     EXIT_IF(ret < 0,"Fermeture de l'accès au maillage",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+//     fprintf(stdout,"  >>> Normalisation du maillage [%s] ... OK ... \n",nom);
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: Normalisation du maillage [" << nom << "] ... OK ... ");
+  }
+}
+
+void med_2_2::MAJ_localisation_Gauss(med_idt fid,char *nom_modele,
+                                    med_int ngauss)
+  throw (MEDEXCEPTION)
+{
+  med_err ret;
+  med_geometrie_element type;
+  med_float *refcoo, *gaucoo, *poids;
+  char nom_type[4];
+  med_int edim, nsom,n,nlu;
+  int i;
+  char nom[MED_TAILLE_NOM+1];
+
+  /* On regarde si la localisation bidon existe deja 
+     Si oui on s'en va */
+  n = MEDnGauss(fid);
+  if (n > 0)
+    for (i=1;i<=n;i++) {
+      ret = MEDgaussInfo(fid,i,nom,&type,&nlu);
+      if (! strcmp(nom,nom_modele)) return;
+    }
+  
+  /* On deduit le type en fonction de nom_modele */
+  strncpy(nom_type,nom_modele,3);
+  nom_type[3] = '\0';
+  if (! strcmp(nom_type,MED_NOM_SE2))
+    type = MED_SEG2;
+  if (! strcmp(nom_type,MED_NOM_SE3))
+    type = MED_SEG3; 
+  if (! strcmp(nom_type,MED_NOM_TR3))
+    type = MED_TRIA3; 
+  if (! strcmp(nom_type,MED_NOM_TR6))
+    type = MED_TRIA6;
+  if (! strcmp(nom_type,MED_NOM_QU4))
+    type = MED_QUAD4; 
+  if (! strcmp(nom_type,MED_NOM_QU8))
+    type = MED_QUAD8;
+  if (! strcmp(nom_type,MED_NOM_TE4))
+    type = MED_TETRA4; 
+  if (! strcmp(nom_type,MED_NOM_T10))
+    type = MED_TETRA10; 
+    if (! strcmp(nom_type,MED_NOM_HE8))
+    type = MED_HEXA8; 
+  if (! strcmp(nom_type,MED_NOM_H20))
+    type = MED_HEXA20;
+  if (! strcmp(nom_type,MED_NOM_PE6))
+    type = MED_PENTA6; 
+  if (! strcmp(nom_type,MED_NOM_P15))
+    type = MED_PENTA15;
+  if (! strcmp(nom_type,MED_NOM_PY5))
+    type = MED_PYRA5; 
+  if (! strcmp(nom_type,MED_NOM_P13))
+    type = MED_PYRA13;
+
+  /* Dimension de la maille */
+  edim = type / 100;
+  nsom = type % 100;
+
+  /* On definit des coordonnées et des poids bidon */
+  refcoo = (med_float*) malloc(sizeof(med_float)*edim*nsom);
+
+//   EXIT_IF(refcoo == NULL,NULL,NULL);
+
+  if(refcoo == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  for (i=0;i<edim*nsom;i++) *(refcoo+i) = 0.;
+  gaucoo = (med_float*) malloc(sizeof(med_float)*edim*ngauss);
+
+//   EXIT_IF(gaucoo == NULL,NULL,NULL);
+
+  if(gaucoo == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  for (i=0;i<edim*ngauss;i++) *(gaucoo+i) = 0.;
+  poids  = (med_float*) malloc(sizeof(med_float)*ngauss);
+
+//   EXIT_IF(poids == NULL,NULL,NULL);
+
+  if(poids == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  for (i=0;i<ngauss;i++) *(poids+i) = 0.;
+
+  /* On ecrit la localisation bidon */
+  ret = MEDgaussEcr(fid,type,refcoo,MED_FULL_INTERLACE,ngauss,gaucoo,poids,nom_modele);
+
+//   EXIT_IF(ret < 0,"Ecriture de la localisation des points de Gauss",nom_modele);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* On libere la memoire */
+  free(refcoo);
+  free(gaucoo);
+  free(poids);
+}
+
+void med_2_2::MAJ_champs(med_idt fid) throw (MEDEXCEPTION)
+{
+  med_idt gid,eid,pid,mid,did,aid;
+  med_err ret;
+  int n,i,j,k;
+  char nom[MED_TAILLE_NOM+1];
+  char chemin[MED_TAILLE_CHA+MED_TAILLE_NOM+1];
+  char maillage[MED_TAILLE_NOM+1];
+  med_int type;
+  char *comp, *unit;
+  char *nouvelle_chaine;
+  med_int ncomp;
+  int nent, npdt;
+  char noment[MED_TAILLE_NOM+1];
+  char nompdt[2*MED_MAX_PARA+1];
+  char oldunidt[ANCIEN_MED_TAILLE_PNOM+1];
+  char unitdt[MED_TAILLE_PNOM+1];
+  char tmp[MED_TAILLE_DESC+1];
+  med_int att;
+  char profil[MED_TAILLE_NOM+1];
+  char gauss[MED_TAILLE_NOM+1];
+  med_float *valr;
+  med_int nval;
+  hid_t hdf_type;
+  med_size dimd[1];
+  med_float pdt;
+  
+  /* Lecture du nombre de champs */
+  n = 0;
+  _MEDnObjets(fid,MED_CHA,&n);
+
+//   EXIT_IF(n < 0,"Erreur a la lecture du nombre de champ",NULL);
+
+  if(n < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  for (i=0;i<n;i++) {
+    /* on recupere le nom du champ */
+    ret = _MEDobjetIdentifier(fid,MED_CHA,i,nom);
+
+//     EXIT_IF(ret < 0,"Identification d'un champ",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+//     fprintf(stdout,"  >>> Normalisation du champ [%s] \n",nom);
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: Normalisation du champ [" << nom << "]");
+
+    /* on accede au champ */
+    strcpy(chemin,MED_CHA);
+    strcat(chemin,nom);
+    gid = _MEDdatagroupOuvrir(fid,chemin); 
+
+//     EXIT_IF(gid < 0,"Accès au champ",nom);
+
+    if(gid < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* Lecture du nombre de composantes */ 
+    ret = _MEDattrEntierLire(gid,MED_NOM_NCO,&ncomp);
+
+//     EXIT_IF(ret < 0,"Lecture du nombre de composante",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* Lecture du type du champ */
+    ret = _MEDattrEntierLire(gid,MED_NOM_TYP,&type);
+
+//     EXIT_IF(ret < 0,"Lecture du type du champ",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    /* Normalisation des nom et unites des composantes */
+    comp = (char *) malloc(ncomp*ANCIEN_MED_TAILLE_PNOM+1);
+
+//     EXIT_IF(comp == NULL,NULL,NULL);
+
+    if(comp == NULL)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    unit = (char *) malloc(ncomp*ANCIEN_MED_TAILLE_PNOM+1);
+
+//     EXIT_IF(unit == NULL,NULL,NULL);
+
+    if(unit == NULL)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    nouvelle_chaine = (char *) malloc(ncomp*MED_TAILLE_PNOM+1);
+
+//     EXIT_IF(nouvelle_chaine == NULL,NULL,NULL);
+
+    if(nouvelle_chaine == NULL)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    ret = _MEDattrStringLire(gid,MED_NOM_NOM,ncomp*ANCIEN_MED_TAILLE_PNOM,comp);
+
+//     EXIT_IF(ret < 0,"Lecture des noms des composantes du champ",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    conversion_chaine(comp,nouvelle_chaine,ncomp);
+    H5Adelete(gid,MED_NOM_NOM);
+    ret = _MEDattrStringEcrire(gid,MED_NOM_NOM,MED_TAILLE_PNOM*ncomp,nouvelle_chaine);
+
+//     EXIT_IF(ret < 0,"Ecriture des nouveaux noms des composantes du champ",NULL);  
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    free(comp);
+
+    ret = _MEDattrStringLire(gid,MED_NOM_UNI,ncomp*ANCIEN_MED_TAILLE_PNOM,unit);
+
+//     EXIT_IF(ret < 0,"Lecture des unités des composantes du champ",NULL);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    conversion_chaine(unit,nouvelle_chaine,ncomp);
+    H5Adelete(gid,MED_NOM_UNI);
+    ret = _MEDattrStringEcrire(gid,MED_NOM_UNI,MED_TAILLE_PNOM*ncomp,nouvelle_chaine);
+
+//     EXIT_IF(ret < 0,"Ecriture des nouvelles unités des composantes du champ",NULL);  
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    free(unit);
+
+    free(nouvelle_chaine);
+
+//     fprintf(stdout,"  ... Normalisation des noms et unités des composantes effectuée...\n");
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: ... Normalisation des noms et unités des composantes effectuée...");
+
+    /* On ajoute le groupe HDF correspondant au maillage */
+    /* On recupere le nom du maillage par defaut */
+    nent = 0;
+    _MEDnObjets(gid,"./",&nent);
+
+//     EXIT_IF(nent < 0,"Erreur a la lecture du nombre d'entité dans un champ",NULL);
+
+    if(nent < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+    for (j=0;j<nent;j++) {
+      /* on recupere le nom du groupe HDF correspondant a l'entite */ 
+      ret = _MEDobjetIdentifier(gid,"./",j,noment);
+
+//       EXIT_IF(ret < 0,"Identification des objets de niveau 1 dans le champ",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      /* On ouvre le groupe HDF */
+      eid = _MEDdatagroupOuvrir(gid,noment);
+
+//       EXIT_IF(eid < 0,"Ouverture du groupe HDF de niveau 1",NULL);
+
+      if(eid < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      /* On recupere le nombre de pas de temps */
+      npdt = 0;
+      _MEDnObjets(eid,"./",&npdt);
+
+//       EXIT_IF(nent < 0,"Erreur a la lecture du nombre de pas de temps",NULL);
+      
+      if(nent < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      /* On traite chaque pas de temps */
+      for (k=0;k<npdt;k++) {
+       /* On recupere le nom du groupe HDF correspondant au pas de temps */ 
+       ret = _MEDobjetIdentifier(eid,"./",k,nompdt);
+
+//     EXIT_IF(ret < 0,"Identification des objets de niveau 2 dans le champ",NULL);
+       
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* On ouvre le groupe HDF correspondant au pas de temps */
+       pid = _MEDdatagroupOuvrir(eid,nompdt);
+
+//     EXIT_IF(pid < 0,"Ouverture du groupe HDF de niveau 2",NULL);
+
+       if(pid < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* On lit le pas de temps */
+       aid = H5Aopen_name(pid,MED_NOM_PDT);
+
+//     EXIT_IF(aid < 0,"Ouverture de l'attribut HDF MED_NOM_PDT",NULL);
+
+       if(aid < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       hdf_type = H5Aget_type(aid);
+
+//     EXIT_IF(hdf_type < 0,"Lecture du type de l'attribut HDF MED_NOM_PDT",NULL);
+
+       if(hdf_type < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       ret = H5Aclose(aid);
+
+//     EXIT_IF(ret < 0,"Fermeture de l'attribut MED_NOM_PDT",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       ret = OLD_MEDattrNumLire(pid,MED_FLOAT64,MED_NOM_PDT,(unsigned char*)(&pdt),hdf_type);
+
+//     EXIT_IF(ret < 0,"Lecture du pas de temps dans MED_NOM_PDT",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       dimd[0] = 1;
+       /*      printf("EGALITE des types : %d \n",H5Tequal(hdf_type,H5T_NATIVE_DOUBLE)); */
+       /*      printf("Avant conversion : [%f]\n",pdt); */
+       if (! H5Tequal(hdf_type,H5T_NATIVE_DOUBLE)) {
+         ret = H5Tconvert(hdf_type,H5T_NATIVE_DOUBLE,(hsize_t)*dimd,(void *)(&pdt),NULL,0);
+         /*    printf("Après conversion Ã©ventuelle : [%f] \n",pdt); */
+
+//       EXIT_IF(ret < 0,"Conversion du pas de temps",NULL);
+
+         if(ret < 0)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+       }
+       H5Tclose(hdf_type);
+       /*      printf("pdt = %f\n",pdt); */
+       H5Adelete(pid,MED_NOM_PDT);
+       ret = _MEDattrFloatEcrire(pid,MED_NOM_PDT,&pdt);
+
+//     EXIT_IF(ret < 0,"Ecriture du nouveau pas de temps",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* On met a jour l'unité du pas de temps : 8 -> 16 caractères 
+           Si on rencontre "        " => on ecrit "" 
+        */
+       ret = _MEDattrStringLire(pid,MED_NOM_UNI,ANCIEN_MED_TAILLE_PNOM,oldunidt);
+
+//     EXIT_IF(ret < 0,"Lecture de l'unite du pas de temps",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       if (! strcmp(oldunidt,ANCIEN_MED_BLANC_PNOM))
+         strcpy(unitdt,"");
+       else
+         conversion_chaine(oldunidt,unitdt,1);
+       H5Adelete(pid,MED_NOM_UNI);
+       ret = _MEDattrStringEcrire(pid,MED_NOM_UNI,MED_TAILLE_PNOM,unitdt);
+
+//     EXIT_IF(ret < 0,"Ecriture de la nouvelle unité du pas de temps",NULL);  
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* On recupere le nom du maillage */
+       ret = _MEDattrStringLire(pid,MED_NOM_MAI,MED_TAILLE_NOM,maillage);
+
+//     EXIT_IF(ret < 0,"Lecture du nom du maillage du pas de temps",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* On cree le groupe HDF de niveau 3 qui porte le nom du maillage */
+       mid = _MEDdatagroupCreer(pid,maillage);
+
+//     EXIT_IF(mid < 0,"Creation du groupe HDF de niveau 3",NULL);
+
+       if(mid < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* Déplacement de l'attribut MED_NOM_NBR */
+       ret = _MEDattrEntierLire(pid,MED_NOM_NBR,&nval);
+
+//     EXIT_IF(ret < 0,"Lecture de l'attribut MED_NOM_NBR",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       ret = H5Adelete(pid,MED_NOM_NBR);
+
+//     EXIT_IF(ret < 0,"Destruction de l'attribut MED_NOM_NBR",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       ret = _MEDattrEntierEcrire(mid,MED_NOM_NBR,&nval);
+
+//     EXIT_IF(ret < 0,"Ecriture de l'attribut MED_NOM_NBR au niveau 3",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* Deplacement de l'attribut MED_NOM_NGA */
+       ret = _MEDattrEntierLire(pid,MED_NOM_NGA,&att);
+
+//     EXIT_IF(ret < 0,"Lecture de l'attribut MED_NOM_NGA",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       ret = H5Adelete(pid,MED_NOM_NGA);
+
+//     EXIT_IF(ret < 0,"Destruction de l'attribut MED_NOM_NGA",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       ret = _MEDattrEntierEcrire(mid,MED_NOM_NGA,&att);
+
+//     EXIT_IF(ret < 0,"Ecriture de l'attribut MED_NOM_NGA au niveau 3",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* Ecriture de l'attribut MED_NOM_GAU : localisation des points de Gauss */
+       if (att < 2)
+         strcpy(gauss,MED_NOM_BLANC);
+       else {
+         /* on prend en compte que les 3 dernières lettres de noment : 
+            Exemple : "MAI.QU4" => gauss="QU4_LocalisationDefaut_MEDIMPORT */
+         strcpy(gauss,noment+4);
+         strcat(gauss,"_LocalisationDefaut_MEDIMPORT");
+         /* On ecrit en plus la localisation bidon des points de Gauss */
+         MAJ_localisation_Gauss(fid,gauss,att);
+       }
+       ret = _MEDattrStringEcrire(mid,MED_NOM_GAU,MED_TAILLE_NOM,gauss);
+
+//     EXIT_IF(ret < 0,"Ecriture de la localisation des points de Gauss",NULL);
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* Deplacement de l'attribut MED_NOM_PFL */
+       ret = _MEDattrStringLire(pid,MED_NOM_PFL,MED_TAILLE_NOM,profil);
+
+//     EXIT_IF(ret < 0,"Lecture de l'attribut MED_NOM_PFL",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       ret = H5Adelete(pid,MED_NOM_PFL);
+
+//     EXIT_IF(ret < 0,"Desctruction de l'attribut MED_NOM_PFL",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       ret = _MEDattrStringEcrire(mid,MED_NOM_PFL,MED_TAILLE_NOM,profil);
+
+//     EXIT_IF(ret < 0,"Ecriture de l'attribut MED_NOM_PFL au niveau 3",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* On ferme le groupe HDF de niveau 3 */
+       ret = _MEDdatagroupFermer(mid);
+
+//     EXIT_IF(ret < 0,"fermeture du groupe HDF de niveau 3",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+       /* On deplace du niveau 2 -> 3, le dataset MED_NOM_CO 
+           avec si type==MED_FLOAT_64 une conversion au passage */
+       strcpy(tmp,maillage);
+       strcat(tmp,"/");
+       strcat(tmp,MED_NOM_CO);
+       if (type != MED_FLOAT64) {
+         ret = H5Gmove(pid,MED_NOM_CO,tmp);
+
+//       EXIT_IF(ret < 0,"Transfert du dataset MED_NOM_CO",NULL);
+
+         if(ret < 0)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+       } else {
+         did = _MEDdatasetOuvrir(pid,MED_NOM_CO);
+
+//       EXIT_IF(did < 0,"Ouverture du dataset HDF des valeurs",NULL);
+
+         if(did < 0)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+         hdf_type = H5Dget_type(did);
+
+//       EXIT_IF(hdf_type < 0,"Lecture du type HDF de stockage des valeurs",NULL);
+
+         if(hdf_type < 0)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+         ret = _MEDdatasetFermer(did);
+
+//       EXIT_IF(ret < 0,"Fermeture du dataset HDF des valeurs",NULL);
+
+         if(ret < 0)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+         valr = (med_float *) malloc(sizeof(med_float)*ncomp*nval);
+
+//       EXIT_IF(valr == NULL,NULL,NULL);
+
+         if(valr == NULL)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+         ret = OLD_MEDdatasetNumLire(pid,MED_NOM_CO,MED_FLOAT64,
+                                     MED_FULL_INTERLACE,ncomp,MED_ALL,
+                                     0,NULL,MED_NOPG,
+                                     (unsigned char*) valr,hdf_type);
+
+//       EXIT_IF(ret < 0,"Lecture des valeurs du champ",NULL);
+
+         if(ret < 0)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+         H5Gunlink(pid,MED_NOM_CO);
+         dimd[0] = ncomp*nval;
+         ret = H5Tconvert(hdf_type,H5T_NATIVE_DOUBLE,(hsize_t)*dimd,(void *)valr,NULL,0);
+
+//       EXIT_IF(ret < 0,"Conversion des valeurs",NULL);
+
+         if(ret < 0)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+         H5Tclose(hdf_type);
+         /* On reporte les valeurs dans le groupe HDF TMP */
+         ret = _MEDdatasetNumEcrire(pid,tmp,MED_FLOAT64,MED_FULL_INTERLACE,
+                                    ncomp,MED_ALL,MED_NOPF,MED_NO_PFLMOD,0,MED_NOPG,dimd,
+                                    (unsigned char*) valr);
+
+//       EXIT_IF(ret < 0,"Ecriture des valeurs après conversion",NULL);
+
+         if(ret < 0)
+           throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+         free(valr);
+       }
+         
+       /* On ferme le groupe HDF de niveau 2*/
+       ret = _MEDdatagroupFermer(pid);
+
+//     EXIT_IF(ret < 0,"Fermeture du groupe HDF de niveau 2",NULL);
+
+       if(ret < 0)
+         throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+      }
+
+      /* On ferme le groupe HDF */
+      ret = _MEDdatagroupFermer(eid);
+
+ //      EXIT_IF(ret < 0,"Fermeture du groupe HDF de niveau 1",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+    }
+
+//     fprintf(stdout,"  ... Normalisation de tous les pas de temps effectuée...\n");
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: ... Normalisation de tous les pas de temps effectuée...\n");
+
+    /* On ferme tout */
+    ret = _MEDdatagroupFermer(gid);
+
+//     EXIT_IF(ret < 0,"Fermeture de l'accès au champ",NULL);
+    
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+//     fprintf(stdout,"  >>> Normalisation du champ [%s] : ... OK ... \n",nom);
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: Normalisation du champ [" << nom << "] : ... OK ... ");
+  }
+}
+
+void med_2_2::MAJ_profils(med_idt fid,med_int nprofil) throw (MEDEXCEPTION)
+{
+  med_err ret;
+  med_int i;
+  char nom[MED_TAILLE_NOM+1];
+  char chemin[MED_TAILLE_DESC+1];
+  med_idt gid;
+  med_int att;
+
+  for (i=0;i<nprofil;i++)
+    {    
+      /* on recupere le nom du profil */
+      ret = _MEDobjetIdentifier(fid,MED_PROFILS,i,nom);
+
+ //      EXIT_IF(ret < 0,"Identification d'un profil",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+//       fprintf(stdout,"  >>> Normalisation du profil [%s] \n",nom);
+
+      MESSAGE("med File convertor 2.1 to 2.2 ::  Normalisation du profil [" << nom << "] ");
+
+      /* on accede au profil */
+      strcpy(chemin,MED_PROFILS);
+      strcat(chemin,nom);
+      gid = _MEDdatagroupOuvrir(fid,chemin); 
+
+//       EXIT_IF(gid < 0,"Accès au profil",nom);
+
+      if(gid < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+
+      /* On change l'attribut MED_NOM_N => MED_NOM_NBR */
+      ret = _MEDattrEntierLire(gid,"N",&att);
+
+//       EXIT_IF(ret < 0,"Lecture de l'attribut MED_NOM_N",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      ret = H5Adelete(gid,"N");
+
+//       EXIT_IF(ret < 0,"Destruction de l'attribut MED_NOM_N",NULL);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      ret = _MEDattrEntierEcrire(gid,MED_NOM_NBR,&att);
+
+//       EXIT_IF(ret < 0,"Ecriture de l'attribut MED_NOM_NBR dans le profil ",nom);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+      /* on ferme le profil */
+      ret = _MEDdatagroupFermer(gid);
+
+//       EXIT_IF(ret < 0,"Fermeture de l'acces au profil",nom);
+
+      if(ret < 0)
+       throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+//       fprintf(stdout,"  >>> Normalisation du profil [%s] effectuée \n",nom);
+
+      MESSAGE("med File convertor 2.1 to 2.2 :: Normalisation du profil [" << nom << "]");
+    }
+}
+
+char * MEDMEM::med2_1_To_med2_2(char * fileNameIn) throw (MEDEXCEPTION)
+{
+  med_idt fid, gid;
+  med_err ret;
+  med_int majeur, mineur, release;
+/*   char *nom; */
+  char *commande;
+  med_int nprofil;
+  char chemin_profils[MED_TAILLE_PROFILS+1];
+  char chemin_liens[MED_TAILLE_LIENS+1];
+
+  char * InternalFileNameOut;
+
+  char * envHome = (char *) malloc(sizeof(char)*(strlen("HOME")+1));
+
+  strcpy(envHome,"HOME");
+
+  char * envHomeChar = getenv(envHome);
+
+  /* Test du nombre d'argument */
+//   EXIT_IF(argc != 2,"Nombre de parametre incorrect",NULL);
+
+  /* Test du format du fichier */
+/*   EXIT_IF(MEDformatConforme(argv[1]) < 0, */
+/*       "Le fichier n'est pas au format HDF 5 : ", argv[1]); */
+
+//   EXIT_IF(MEDformatConforme(fileNameIn) < 0,
+//       "Le fichier n'est pas au format HDF 5 : ", fileNameIn);
+
+  if(MEDformatConforme(fileNameIn) < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check the med File you wanted to mount in memory");
+
+  /* opening the old file to check the versions (Med File and HDF) */
+
+  fid = MEDouvrir(fileNameIn,MED_LECTURE);
+
+/*   EXIT_IF(fid < 0,"Ouverture du fichier : ", */
+/*       nom); */
+
+//   EXIT_IF(fid < 0,"Ouverture du fichier : ",
+//       InternalFileNameOut);
+
+  MESSAGE("med File convertor 2.1 to 2.2 ::  opening of the old file id " << fid);
+
+  if(fid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file : openning of the file");
+
+  /* Verification du numero de version */
+  ret = MEDversionLire(fid,&majeur,&mineur,&release); 
+
+//   EXIT_IF(ret < 0,"Lecture du numero de version de MED-fichier",NULL);  
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+  if (majeur == 2 && mineur == 2) {  
+/*     fprintf(stdout,"Le fichier %s est déjà au format V2.2 !!! \n",nom);   */
+
+//     fprintf(stdout,"Le fichier %s est déjà au format V2.2 !!! \n",InternalFileNameOut);  
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: the file " << fileNameIn << " is already a med 2.2 file");
+
+    ret = MEDfermer(fid);  
+/*     EXIT_IF(ret < 0,"Fermeture du fichier",argv[1]);  */
+
+//     EXIT_IF(ret < 0,"Fermeture du fichier",fileNameIn); 
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+    return fileNameIn ;
+  }
+
+  ret = MEDfermer(fid); 
+
+  /*
+    we are sure now that the file is an old version one
+    creation of the directory if it does not existe
+  */
+
+  commande = (char *) malloc(sizeof(char)*(strlen("mkdir ")+
+                                          strlen(envHomeChar)+
+                                          strlen("/TMP_Med2_2Files/")+1));
+
+//   EXIT_IF(commande == NULL,NULL,NULL);
+
+  if(commande == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+  strcpy(commande,"ls ");
+  strcat(commande,envHomeChar);
+  strcat(commande,"/TMP_Med2_2Files/");
+
+  int systemReturn = system(commande);
+
+  if (systemReturn != 0)
+    {
+      strcpy(commande,"mkdir ");
+      strcat(commande,envHomeChar);
+      strcat(commande,"/TMP_Med2_2Files/");
+
+      systemReturn = system(commande);
+    }
+
+  free(commande);
+
+  free(envHome);
+
+  string::size_type pos1 = string(fileNameIn).rfind('/');
+  string::size_type pos = strlen(fileNameIn);
+  InternalFileNameOut = (char *) malloc(sizeof(char)*(strlen(envHomeChar)+
+                                                     strlen("/TMP_Med2_2Files/")
+                                                     +strlen(string(fileNameIn,pos1+1,pos-pos1-1).c_str())+1));
+
+  strcpy(InternalFileNameOut,envHomeChar);
+  strcat(InternalFileNameOut,"/TMP_Med2_2Files/");
+  strcat(InternalFileNameOut,string(fileNameIn,pos1+1,pos-pos1-1).c_str());
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: " << InternalFileNameOut);
+
+  /* Creation et ouverture du fichier que l'on va convertire au format MED V2.2 */
+/*   commande = (char *) malloc(sizeof(char)*(strlen("cp ")+2*strlen(argv[1])+strlen(" ")+strlen("2.2")+1)); */
+
+  commande = (char *) malloc(sizeof(char)*(strlen("cp -f ") +
+                                          strlen(fileNameIn) + strlen(" ") +
+                                          strlen(InternalFileNameOut) + 
+                                          strlen(" ; chmod ug+rw ") +
+                                          strlen(InternalFileNameOut) + 1));
+
+//   EXIT_IF(commande == NULL,NULL,NULL);
+
+  if(commande == NULL)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+/*   nom = (char *) malloc(sizeof(char)*(strlen(argv[1])+strlen("2.2")+1)); */
+
+/*   nom = (char *) malloc(sizeof(char)*(strlen(fileNameIn)+strlen("2.2")+1)); */
+
+/*   EXIT_IF(nom == NULL,NULL,NULL); */
+/*   strcpy(nom,argv[1]); */
+
+/*   strcpy(nom,fileNameIn); */
+
+/*   strcat(nom,"2.2"); */
+
+//   strcpy(fileNameOut,fileNameIn);
+
+//   strcat(fileNameOut,"2.2");
+
+  strcpy(commande,"cp -f ");
+/*   strcat(commande,argv[1]); */
+
+  strcat(commande,fileNameIn);
+
+  strcat(commande," ");
+/*   strcat(commande,nom); */
+
+  strcat(commande,InternalFileNameOut);
+
+  strcat(commande," ; chmod ug+rw ");
+
+  strcat(commande,InternalFileNameOut);
+
+  system(commande);
+/*   fprintf(stdout,">>> Creation du fichier %s : %s \n",nom,commande); */
+
+//   fprintf(stdout,">>> Creation du fichier %s : %s \n",InternalFileNameOut,commande);
+
+  MESSAGE("med File convertor 2.1 to 2.2 ::  Creation du fichier " << InternalFileNameOut << " with the commande " << commande);
+
+  free(commande);
+
+/*   fid = MEDouvrir(nom,MED_LECTURE_ECRITURE); */
+
+  fid = MEDouvrir(InternalFileNameOut,MED_LECTURE_ECRITURE);
+
+/*   EXIT_IF(fid < 0,"Ouverture du fichier : ", */
+/*       nom); */
+
+//   EXIT_IF(fid < 0,"Ouverture du fichier : ",
+//       InternalFileNameOut);
+
+  MESSAGE("med File convertor 2.1 to 2.2 ::  opening of the new file id " << fid);
+
+  if(fid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file : openning of the file");
+
+  /* On avertit qu'on commence la conversion */
+
+//   fprintf(stdout,">>> Lancement de la normalisation du fichier selon le format MED V2.2 ...\n");
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: Running the convertor fromV 2.1 to V2.2");
+
+  /* On inhibe le gestionnaire d'erreur HDF5 */
+  _MEDmodeErreurVerrouiller();  
+
+  /* Mise a jour du numero de version */
+
+//   fprintf(stdout,"- Lancement de la mise Ã  jour du numéro de version ... \n");
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: Running the update of the version number");
+
+  MAJ_version(fid);
+
+//   fprintf(stdout,"  Numéro de version : ... OK ... \n");
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: Version number OK ...");
+
+  /* Mise a jour des maillages : type = MED_NON_STRUCTURE, description, ... */
+
+//   fprintf(stdout,"- Lancement de la mise Ã  jour des maillages ... \n"); 
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: Running the update of all meshes");
+
+  MAJ_maillages(fid); 
+
+//   fprintf(stdout,"  Maillage(s) : ... OK ...\n"); 
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: meshes are OK....");
+
+  /* Mise a jour des champs */
+
+//   fprintf(stdout,"- Lancement de la mise Ã  jour des champs de résultats ... \n");
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: Running of the update of all fields ..");
+
+  MAJ_champs(fid);
+
+//   fprintf(stdout,"  Champs(s) : ... OK ...\n");
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: Fields are OK ..");
+
+  /* Mise a jour des profils eventuels */
+  nprofil = MEDnProfil(fid);
+  if (nprofil > 0) {
+//     fprintf(stdout,"- Lancement de la mise Ã  jour des profils ... \n");
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: Running the update of all profils");
+
+    MAJ_profils(fid,nprofil);
+
+//     fprintf(stdout,"  Profils(s) : ... OK ...\n");
+
+    MESSAGE("med File convertor 2.1 to 2.2 :: Profils are OK ... ");
+  } else {
+    strncpy(chemin_profils,MED_PROFILS,MED_TAILLE_PROFILS-1);
+    chemin_profils[MED_TAILLE_PROFILS-1] = '\0';
+    gid = _MEDdatagroupCreer(fid,chemin_profils);
+
+//     EXIT_IF(gid < 0,"Creation du groupe HDF sur les profils",chemin_profils);
+
+    if(gid < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+    ret = _MEDdatagroupFermer(gid);
+
+//     EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les profils",chemin_profils);
+
+    if(ret < 0)
+      throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+  }
+
+  /* On cree le groupe HDF pour les liens */
+  strncpy(chemin_liens,MED_LIENS,MED_TAILLE_LIENS-1);
+  chemin_liens[MED_TAILLE_LIENS-1] = '\0';
+  gid = _MEDdatagroupCreer(fid,chemin_liens);
+
+//   EXIT_IF(gid < 0,"Creation du groupe HDF sur les liens",chemin_liens);
+
+  if(gid < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+  ret = _MEDdatagroupFermer(gid);
+
+//   EXIT_IF(ret < 0,"Fermeture du groupe HDF sur les liens",chemin_liens);
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+  /* Fermeture du fichier */
+  ret = MEDfermer(fid);
+/*   EXIT_IF(ret < 0,"Fermeture du fichier",nom); */
+
+//   EXIT_IF(ret < 0,"Fermeture du fichier",InternalFileNameOut);
+
+  if(ret < 0)
+    throw MEDEXCEPTION("Problem in the med File convertor 2.1 to 2.2, you should check you have enough memory and/or space disc to write the new med 2.2 file");
+
+  /* On avertit que c'est fini */
+/*   fprintf(stdout,">>> Conversion du fichier %s au format MED V2.2. terminée\n", */
+/*       nom); */
+
+//   fprintf(stdout,">>> Conversion du fichier %s au format MED V2.2. terminée\n",
+//       InternalFileNameOut);
+
+  /* On libere la memoire */
+/*   free(nom); */
+
+  char * fileNameOut = new char[strlen(InternalFileNameOut)+1];
+
+  fileNameOut = strcpy(fileNameOut,InternalFileNameOut);
+
+  free(InternalFileNameOut);
+
+  MESSAGE("med File convertor 2.1 to 2.2 :: Convertion of the med file " << fileNameOut << " has run OK");
+
+  return fileNameOut;
+}
diff --git a/src/MEDMEM/MEDMEM_medimport_src.hxx b/src/MEDMEM/MEDMEM_medimport_src.hxx
new file mode 100644 (file)
index 0000000..c72f166
--- /dev/null
@@ -0,0 +1,285 @@
+/*************************************************************************
+* COPYRIGHT (C) 1999 - 2003  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
+*
+*************************************************************************/
+#ifndef IMPORT_HXX
+#define IMPORT_HXX
+
+#include "utilities.h"
+#include "MEDMEM_STRING.hxx"
+#include "MEDMEM_Exception.hxx"
+// #include "MEDMEM_define.hxx"
+
+
+/*
+  Med File V 2.2 attributes in the med_2_2 namespace
+*/
+
+#undef MED_H
+
+namespace med_2_2 {
+  extern "C" { 
+#include <med.h>
+#include <med_proto.h>
+#include <med_hdfi.h>
+
+    /*
+      Med File V 2.2 attributes more addings to encapsulate the Med File V2_2
+      medimport utilitary
+    */
+
+#define MED_NOM_INFOS "INFOS_GENERALES"
+#define MED_NOM_MAJEUR "MAJ"
+#define MED_NOM_MINEUR "MIN"
+#define MED_NOM_RELEASE "REL"
+#define MED_NOM_NOE "NOE"
+#define MED_NOM_NBR "NBR"
+#define MED_NOM_REP "REP"
+#define MED_NOM_NOM "NOM"
+#define MED_NOM_UNI "UNI"
+#define MED_NOM_COO "COO"
+#define MED_TAILLE_NOM_ENTITE 3
+#define MED_NOM_MAI "MAI"
+#define MED_NOM_NOD "NOD"
+#define MED_TAILLE_FAS 5
+#define MED_NOM_NUM "NUM"
+#define MED_TAILLE_MAA 9
+#define MED_MAA "/ENS_MAA/"
+#define MED_NOM_DIM "DIM"
+#define MED_NOM_DES "DES"
+#define MED_NOM_TYP "TYP"
+#define MED_NOM_PO1 "PO1"
+#define MED_NOM_SE2 "SE2"
+#define MED_NOM_SE3 "SE3"
+#define MED_NOM_TR3 "TR3"
+#define MED_NOM_TR6 "TR6"
+#define MED_NOM_QU4 "QU4"
+#define MED_NOM_QU8 "QU8"
+#define MED_NOM_TE4 "TE4"
+#define MED_NOM_T10 "T10"
+#define MED_NOM_HE8 "HE8"
+#define MED_NOM_H20 "H20"
+#define MED_NOM_PE6 "PE6"
+#define MED_NOM_P15 "P15"
+#define MED_NOM_PY5 "PY5"
+#define MED_NOM_P13 "P13"
+#define MED_CHA "/CHA/"
+#define MED_TAILLE_CHA 5
+#define MED_NOM_NCO "NCO"
+#define MED_NOM_PDT "PDT"
+#define MED_NOM_NGA "NGA"
+#define MED_NOM_GAU "GAU"
+#define MED_NOM_PFL "PFL"
+#define MED_NOM_CO  "CO"
+#define MED_PROFILS "/PROFILS/"
+#define MED_TAILLE_PROFILS 9 
+#define MED_LIENS "/LIENS/"
+#define MED_TAILLE_LIENS 7 
+  }
+}
+
+// namespace med_2_2 {
+//   extern "C" {
+// #include <med_hdfi.h>
+// #include <med_misc.h>
+
+// #define MED_NOM_MAJEUR "MAJ"
+// #define MED_NOM_MINEUR "MIN"
+// #define MED_NOM_RELEASE "REL"
+
+// #define MED_NUM_MAJEUR 2
+// #define MED_NUM_MINEUR 2
+// #define MED_NUM_RELEASE 1
+
+// #define MED_NOM_INFOS "INFOS_GENERALES"
+
+// #define MED_NOM_DESCRIPTEUR "descripteur de fichier"
+// #define MED_VERSION_ACTUELLE "2.2.1"
+// #define HDF_VERSION_ACTUELLE "5-1.4.4"
+
+// /* Noms des data sets ou attributs correspondant a des entites MED */
+// #define MED_TAILLE_NOM_ENTITE 3
+// #define MED_NOM_NUM "NUM"
+// #define MED_NOM_NBR "NBR"
+// #define MED_NOM_NOM "NOM"
+// #define MED_NOM_UNV "UNV"
+// #define MED_NOM_NNS "NNS"
+// #define MED_NOM_NNM "NNM"
+// #define MED_NOM_NNI "NNI"
+// #define MED_NOM_GRO "GRO"
+// #define MED_NOM_ATT "ATT"
+// #define MED_NOM_NCO "NCO"
+// #define MED_NOM_DIM "DIM"
+// #define MED_NOM_ESP "ESP"
+// #define MED_NOM_FAM "FAM"
+// #define MED_NOM_IDE "IDE"
+// #define MED_NOM_VAL "VAL"
+// #define MED_NOM_DES "DES"
+// #define MED_NOM_COR "COR"
+// #define MED_NOM_DIM "DIM"
+// #define MED_NOM_NOE "NOE"
+// #define MED_NOM_COO "COO"
+// #define MED_NOM_IN1 "IN1"
+// #define MED_NOM_IN2 "IN2"
+// #define MED_NOM_IN3 "IN3"
+// #define MED_NOM_REP "REP"
+// #define MED_NOM_UNI "UNI"
+// #define MED_NOM_NOD "NOD"
+// #define MED_NOM_TYP "TYP"
+// #define MED_NOM_GTY "GTY"
+// #define MED_NOM_CO  "CO"
+// #define MED_NOM_NCW "NCW"
+// #define MED_NOM_TYW "TYW"
+
+// #define MED_NOM_MAI "MAI"
+// #define MED_NOM_FAC "FAC"
+// #define MED_NOM_ARE "ARE"
+
+// #define MED_NOM_PO1 "PO1"
+// #define MED_NOM_SE2 "SE2"
+// #define MED_NOM_SE3 "SE3"
+// #define MED_NOM_TR3 "TR3"
+// #define MED_NOM_TR6 "TR6"
+// #define MED_NOM_QU4 "QU4"
+// #define MED_NOM_QU8 "QU8"
+// #define MED_NOM_TE4 "TE4"
+// #define MED_NOM_T10 "T10"
+// #define MED_NOM_HE8 "HE8"
+// #define MED_NOM_H20 "H20"
+// #define MED_NOM_PE6 "PE6"
+// #define MED_NOM_P15 "P15"
+// #define MED_NOM_PY5 "PY5"
+// #define MED_NOM_P13 "P13"
+
+// #define MED_NOM_TAI "TAI"
+// #define MED_NOM_TTI "TTI"
+// #define MED_NOM_IFN "IFN"
+// #define MED_NOM_IFD "IFD"
+// #define MED_NOM_INN "INN"
+// #define MED_NOM_IND "IND"
+// #define MED_NOM_POG "POG"
+// #define MED_NOM_POE "POE"
+
+// #define MED_NOM_GEO "GEO"
+// #define MED_NOM_GAU "GAU"
+// #define MED_NOM_NGA "NGA"
+// #define MED_NOM_PFL "PFL"
+// #define MED_NOM_NDT "NDT"
+// #define MED_NOM_PDT "PDT"
+// #define MED_NOM_NOR "NOR"
+// #define MED_NOM_LIE "LIE"
+
+// /* Nom du DATA GROUP CONTENANT TOUS LES MAILLAGES DU FICHIER HDF */
+// #define MED_MAA "/ENS_MAA/"
+// #define MED_TAILLE_MAA 9
+
+// /* Nom du data group ou ranger les champs solution */
+// #define MED_CHA "/CHA/"
+// #define MED_TAILLE_CHA 5
+
+// /* Nom du data group point de montage */
+// #define MED_MNT "/MNT/"
+// #define MED_TAILLE_MNT 5
+
+// /* Nom du data group ou ranger les familles */
+// #define FAMILLE_ZERO "FAMILLE_ZERO"
+// #define MED_FAS "/FAS/"
+// #define MED_TAILLE_FAS 5
+// #define MED_FAS_NOEUD "/NOEUD/"
+// #define MED_FAS_NOEUD_NOM "NOEUD"
+// #define MED_FAS_ELEME "/ELEME/"
+// #define MED_FAS_ELEME_NOM "ELEME"
+// #define MED_TAILLE_FAS_ENTITE 7
+
+
+// /* Nom du data group ou ranger les equivalences */
+// #define MED_EQS "/EQS/"
+// #define MED_TAILLE_EQS 5
+
+// /* Nom du data group contenant les profils */
+// #define MED_PROFILS "/PROFILS/"
+// #define MED_TAILLE_PROFILS 9 
+
+// /* Nom du data group contenant la localisation des points de GAUSS */
+// #define MED_GAUSS "/GAUSS/"
+// #define MED_TAILLE_GAUSS 7 
+
+// /* Nom du groupe HDF ou sont rangees les valeurs numeriques scalaires 
+//    non liees au modele de donnees
+// */
+// #define MED_NUM_DATA  "/NUM_DATA/"
+// #define MED_TAILLE_NUM_DATA 10
+
+// /* Nom du data group contenant les liens */
+// #define MED_LIENS "/LIENS/"
+// #define MED_TAILLE_LIENS 7 
+
+//   }
+// }
+
+#include <stdio.h>
+#include <string.h>
+
+#define ANCIEN_MED_TAILLE_PNOM 8
+/*                              12345678 */
+#define ANCIEN_MED_BLANC_PNOM  "        "
+
+namespace med_2_2 {
+
+med_err OLD_MEDattrNumLire(med_idt pere, med_type_champ type, char *nom,
+                          unsigned char *val, hid_t hdf_file);
+
+med_err OLD_MEDdatasetNumLire(med_idt pere, char *nom, med_type_champ type,
+                             med_mode_switch interlace, med_size nbdim,
+                             med_size fixdim, med_size psize,
+                             med_ssize * pfltab, med_int ngauss,
+                             unsigned char *val,hid_t hdf_file);
+
+void conversion_chaine(char *ancienne_chaine, char *nouvelle_chaine,
+                      med_int n);
+
+void MAJ_version(med_idt fid) throw (MEDMEM::MEDEXCEPTION) ;
+
+void MAJ_noeuds_maillage(med_idt mid, med_int dimension) throw (MEDMEM::MEDEXCEPTION) ;
+
+void MAJ_elements_maillage(med_idt mid, med_int dimension)
+  throw (MEDMEM::MEDEXCEPTION);
+
+void MAJ_familles_maillage(med_idt mid) throw (MEDMEM::MEDEXCEPTION) ;
+
+void MAJ_maillages(med_idt fid) throw (MEDMEM::MEDEXCEPTION) ;
+
+void MAJ_localisation_Gauss(med_idt fid,char *nom_modele,med_int ngauss)
+  throw (MEDMEM::MEDEXCEPTION) ;
+
+void MAJ_champs(med_idt fid) throw (MEDMEM::MEDEXCEPTION) ;
+
+void MAJ_profils(med_idt fid,med_int nprofil) throw (MEDMEM::MEDEXCEPTION) ;
+}
+
+namespace MEDMEM {
+
+/*!
+  This method is supposed to be the same as the med File V2.2 medimport
+  utility. fileNameIn is .med V2.1 file supplied by the user including
+  all the directory path. fileNameOut is .med V2.2 file produced by this
+  command in the directory $HOME/TMP_Med2_2Files/
+*/
+
+char * med2_1_To_med2_2(char * fileNameIn) throw (MEDMEM::MEDEXCEPTION) ;
+}
+
+#endif /* IMPORT_HXX */
index 905d7eafce2fee45cf1e20d04b1ee30adb69bd2e..84bcc75e95b552811195dad480e37a92b08600c9 100644 (file)
@@ -53,6 +53,7 @@ MEDMEM_Group.hxx \
 MEDMEM_Array.hxx \
 MEDMEM_Exception.hxx \
 MEDMEM_MedFieldDriver.hxx \
 MEDMEM_Array.hxx \
 MEDMEM_Exception.hxx \
 MEDMEM_MedFieldDriver.hxx \
+MEDMEM_AsciiFieldDriver.hxx \
 MEDMEM_Med.hxx \
 MEDMEM_MedMedDriver.hxx \
 MEDMEM_MedMeshDriver.hxx \
 MEDMEM_Med.hxx \
 MEDMEM_MedMedDriver.hxx \
 MEDMEM_MedMeshDriver.hxx \
@@ -69,7 +70,18 @@ MEDMEM_Meshing.hxx \
 MEDMEM_STRING.hxx \
 MEDMEM_Support.hxx \
 MEDMEM_Unit.hxx \
 MEDMEM_STRING.hxx \
 MEDMEM_Support.hxx \
 MEDMEM_Unit.hxx \
-MEDMEM_Grid.hxx
+MEDMEM_Grid.hxx \
+MEDMEM_RCBase.hxx \
+MEDMEM_medimport_src.hxx \
+MEDMEM_MedVersion.hxx \
+MEDMEM_Compatibility21_22.hxx \
+MEDMEM_MedFieldDriver21.hxx \
+MEDMEM_MedMeshDriver21.hxx \
+MEDMEM_MedMedDriver21.hxx \
+MEDMEM_PolyhedronArray.hxx \
+MEDMEM_MedFieldDriver22.hxx \
+MEDMEM_MedMedDriver22.hxx \
+MEDMEM_MedMeshDriver22.hxx
 
 # Libraries targets
 
 
 # Libraries targets
 
@@ -99,16 +111,23 @@ MEDMEM_Support.cxx \
 MEDMEM_Unit.cxx \
 MEDMEM_VtkMedDriver.cxx \
 MEDMEM_VtkMeshDriver.cxx \
 MEDMEM_Unit.cxx \
 MEDMEM_VtkMedDriver.cxx \
 MEDMEM_VtkMeshDriver.cxx \
-MEDMEM_Grid.cxx
-
+MEDMEM_Grid.cxx \
+MEDMEM_MedVersion.cxx \
+MEDMEM_MedMeshDriver21.cxx \
+MEDMEM_MedMedDriver21.cxx \
+MEDMEM_medimport_src.cxx \
+MEDMEM_PolyhedronArray.cxx \
+MEDMEM_MedMedDriver22.cxx \
+MEDMEM_MedMeshDriver22.cxx
 
 # Executables targets
 
 # Executables targets
-BIN = med2vtk duplicateMED med_test duplicateMEDMESH 
+BIN = med2_1_To_med2_2 med2vtk duplicateMED med_test duplicateMEDMESH 
 BIN_SRC = 
 BIN_SERVER_IDL = 
 BIN_CLIENT_IDL = 
 
 BIN_SRC = 
 BIN_SERVER_IDL = 
 BIN_CLIENT_IDL = 
 
-TEST_PROGS = test_MEDMEM_ModulusArray test_MEDMEM_Array test_MEDMEM_SkyLineArray test_MEDMEM_CellModel testUPointerOf testUCoordinate testUUnit testUGeoNameMeshEntities testUMedException testUModulusArray testUSkyLineArray testUArray testUCellModel readEntete readCoordinate test_copie_field_ test_copie_fieldT test_copie_coordinate test_copie_medarray test_copie_connectivity test_copie_support test_copie_family test_copie_group test_copie_mesh test_affect_medarray test_MEDMEM_Meshing test_operation_fielddouble test_operation_fieldint test_gibi_driver test_porflow_driver test_grid
+TEST_PROGS = test_MEDMEM_ModulusArray test_MEDMEM_Array test_MEDMEM_SkyLineArray test_MEDMEM_CellModel testUPointerOf testUCoordinate testUUnit testUGeoNameMeshEntities testUMedException testUModulusArray testUSkyLineArray testUArray testUCellModel readEntete readCoordinate test_copie_field_ test_copie_fieldT test_copie_coordinate test_copie_medarray test_copie_connectivity test_copie_support test_copie_family test_copie_group test_copie_mesh test_affect_medarray test_MEDMEM_Meshing test_MEDMEM_MeshingPoly test_operation_fielddouble test_operation_fieldint test_gibi_driver test_porflow_driver test_grid test_MEDMEM_PolyhedronArray test_MEDMEM_PolyConnectivity test_MEDMEM_PolyDriverMedMeshRead test_MEDMEM_PolyDriverMedMeshWrite test_MEDMEM_poly3D
+# test_MEDMEM_Meshing_poly
 
 # testUCellModel -> a revoir car l'API a changee (plus de vector)
 
 
 # testUCellModel -> a revoir car l'API a changee (plus de vector)
 
diff --git a/src/MEDMEM/create_poly2D.c b/src/MEDMEM/create_poly2D.c
new file mode 100644 (file)
index 0000000..3c36cb1
--- /dev/null
@@ -0,0 +1,313 @@
+/*
+  creation d'une geometrie 2d : 
+  maillé en 4 quadrangles reguliers
+            1 triangle et 1 polygone.
+
+*/
+
+#include <med.h>
+#include <string.h>
+
+int main (int argc, char **argv)
+{
+  med_err ret;
+  med_idt fid;
+  char maa[MED_TAILLE_NOM+1] = "poly2D";
+  char maadesc[MED_TAILLE_DESC+1] = "Example de maillage non structure 2D avec 1 polygone";
+  med_int mdim = 2;
+  med_int nnoe = 11;
+  /*
+    les noeuds:
+  */
+  med_float coo[22] = {
+    0.0, 0.0,
+    0.5, 0.0,
+    1.0, 0.0,
+    0.25, 0.5,
+    0.5, 0.5,
+    0.75, 0.5,
+    0.0, 1.0,
+    0.5, 1.0,
+    1.0, 1.0,
+    1.5, 0.0,
+    1.5, 1.0
+  };
+  char nomcoo[2*MED_TAILLE_PNOM+1] = "x               y               ";
+  char unicoo[2*MED_TAILLE_PNOM+1] = "cm              cm              ";
+  /*  char nomnoe[19*MED_TAILLE_PNOM+1] = "nom1    nom2    nom3    nom4";*/
+  char *nomnoe ;
+  med_int numnoe[11] = {1,2,3,4,5,6,7,8,9,10,11};
+  med_int nufano[11] = {0,0,0,0,0,0,0,0,0,0,0};
+  /*
+    les elements:
+  */
+  med_int nquad4 = 4;
+  med_int quad4[16] = {
+    4, 5, 2, 1,
+    5, 6, 3, 2,
+    7, 8, 5, 4,
+    8, 9, 6, 5
+  };
+  char nomquad4[MED_TAILLE_PNOM*4+1] = "quad1           quad2           quad3           quad4           ";
+  med_int numquad4[4] = {1,2,3,4};
+  med_int nufaquad4[4] = {-1,-1,0,0};
+
+  med_int ntria3 = 1;
+  med_int tria3[3] = {
+    7, 4, 1
+  };
+  char nomtria3[MED_TAILLE_PNOM+1] = "tria1           ";
+  med_int numtria3[1] = {1};
+  med_int nufatria3[1] = {-2};
+
+  med_int npoly = 1;
+  med_int nindexpoly = 2;
+  med_int indexpoly [2] = {
+    1,6
+  };
+  med_int poly[5] = {
+    9,11,10,3,6
+  };
+  char nompoly[MED_TAILLE_PNOM+1] = "poly            ";
+  med_int numpoly[1] = {1};
+  med_int nufapoly[1] = {-3};
+
+  char nomfam[MED_TAILLE_NOM+1];
+  med_int numfam;
+  char attdes[MED_TAILLE_DESC+1];
+  med_int natt;
+  med_int attide;
+  med_int attval;
+  med_int ngro;
+  char gro[MED_TAILLE_LNOM+1];
+  int i;
+  int nfame = 2; 
+  int nfamn = 1;
+
+  /*
+    Some fields : 2 on nodes : one int and one double , one on cells : double
+   */
+  char champ1[MED_TAILLE_NOM+1]="fieldnodeint" ;
+  char champ1_comp[MED_TAILLE_PNOM+1]="comp1           " ;
+  char champ1_unit[MED_TAILLE_PNOM+1]="M               " ;
+  med_int     fieldnodeint[9]    = {1,1,3,2,2,3,4,4,5};
+
+  char champ2[MED_TAILLE_NOM+1]="fieldnodedouble" ;
+  char champ2_comp[MED_TAILLE_PNOM+1]="comp1           " ;
+  char champ2_unit[MED_TAILLE_PNOM+1]="J               " ;
+  med_float   fieldnodedouble1[9] = {1.,3.,4.,1.,3.,4.,3.,2.,5.};
+  med_float   fieldnodedouble2[9] = {1.,2.,2.,3.,3.,3.,4.,4.,5.};
+
+  char champ3[MED_TAILLE_NOM+1]="fieldcelldouble" ;
+  char champ3_comp[MED_TAILLE_PNOM*2+1]="comp1           comp2           " ;
+  char champ3_unit[MED_TAILLE_PNOM*2+1]="M/S             m/s             " ;
+  med_float   fieldcelldouble[4*2] = {0.,1.,1.,1.,1.,2.,2.,3.};
+
+  /***************************************************************************/
+  fid = MEDouvrir("poly2D.med",MED_LECTURE_ECRITURE);
+  if (fid < 0)
+    ret = -1;
+  else
+    ret = 0;
+  printf("MEDouvrir : %d\n",ret);
+
+  /***************************************************************************/
+  if (ret == 0)
+    ret = MEDmaaCr(fid,maa,mdim,MED_NON_STRUCTURE,maadesc);
+  printf("MEDmaaCr : %d\n",ret);
+  if (ret == 0)
+    ret = MEDunvCr(fid,maa);
+  printf("MEDunvCr : %d\n",ret);
+
+  /***************************************************************************/
+  if (ret == 0)
+    ret = MEDnoeudsEcr(fid,maa,mdim,coo,MED_FULL_INTERLACE,MED_CART,
+                      nomcoo,unicoo,nomnoe,MED_FAUX,numnoe,MED_VRAI,
+                      nufano,nnoe);
+  printf("MEDnoeudsEcr : %d\n",ret);
+
+  /* ecriture des mailles MED_QUAD4 :
+     - connectivite
+     - noms (optionnel) 
+     - numeros (optionnel)
+     - numeros des familles */
+  if (ret == 0) 
+    ret = MEDelementsEcr(fid,maa,mdim,quad4,MED_FULL_INTERLACE,
+                        nomquad4,MED_FAUX,numquad4,MED_VRAI,nufaquad4,nquad4,
+                        MED_MAILLE,MED_QUAD4,MED_NOD);
+  printf("MEDelementsEcr for quad : %d \n",ret);
+
+  /* ecriture des mailles MED_TRIA3 :
+     - connectivite
+     - noms (optionnel) 
+     - numeros (optionnel)
+     - numeros des familles */
+  if (ret == 0) 
+    ret = MEDelementsEcr(fid,maa,mdim,tria3,MED_FULL_INTERLACE,
+                        nomtria3,MED_FAUX,numtria3,MED_VRAI,nufatria3,ntria3,
+                        MED_MAILLE,MED_TRIA3,MED_NOD);
+  printf("MEDelementsEcr for tria : %d \n",ret);
+
+  /* ecriture des mailles MED_POLYGONE:
+     - connectivite
+     - noms (optionnel) 
+     - numeros (optionnel)
+     - numeros des familles
+     Dans ce cas il n existe pas de routine globale (Warning !!)
+   */
+
+  if (ret == 0)
+    ret = MEDpolygoneConnEcr(fid,maa,indexpoly,nindexpoly,poly,
+                            MED_MAILLE,MED_NOD);
+  printf("MEDpolygoneConnEcr: %d \n",ret);
+
+  if (ret == 0)
+    MEDnomEcr(fid,maa,nompoly,npoly,MED_MAILLE,MED_POLYGONE);
+  printf("MEDnomEcr for poly : %d \n",ret);
+
+  if (ret == 0)
+    MEDnumEcr(fid,maa,numpoly,npoly,MED_MAILLE,MED_POLYGONE);
+  printf("MEDnumEcr for poly : %d \n",ret);
+
+  if (ret == 0)
+    MEDfamEcr(fid,maa,nufapoly,npoly,MED_MAILLE,MED_POLYGONE);
+  printf("MEDfamEcr for poly : %d \n",ret);
+
+
+  /***************************************************************************/
+  /* ecriture des familles */
+  /* Conventions :
+     - toujours creer une famille de numero 0 ne comportant aucun attribut
+       ni groupe (famille de reference pour les noeuds ou les elements
+       qui ne sont rattaches a aucun groupe ni attribut)
+     - les numeros de familles de noeuds sont > 0
+     - les numeros de familles des elements sont < 0
+     - rien d'imposer sur les noms de familles
+   */ 
+
+  /* la famille 0 */
+  if (ret == 0)
+    {
+      strcpy(nomfam,"FAMILLE_0");
+      numfam = 0;
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,0,
+                    gro,0);
+    }
+  printf("MEDfamCr : %d \n",ret);
+
+  /* on cree :
+      - 2 familles d'elements de dimension (d)
+        en fait de face (-10)
+  */
+  if (ret == 0)
+    {
+      numfam = -1;
+      strcpy(nomfam,"FAMILLE_CELL_");
+      sprintf(nomfam,"%s%d",nomfam,-numfam);
+      attide = 1;
+      attval = numfam*100;
+      natt = 1;
+      strcpy(attdes,"description attribut");
+      strcpy(gro,"groupe0");
+      ngro = 1;
+
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
+                    natt,gro,ngro);
+      printf("MEDfamCr : %d\n",ret);
+
+      numfam = -2;
+      strcpy(nomfam,"FAMILLE_CELL_");
+      sprintf(nomfam,"%s%d",nomfam,-numfam);
+      attide = 1;
+      attval = numfam*100;
+      natt = 1;
+      strcpy(attdes,"description attribut");
+      strcpy(gro,"groupe0");
+      ngro = 1;
+
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
+                    natt,gro,ngro);
+      printf("MEDfamCr : %d\n",ret);
+
+      numfam = -3;
+      strcpy(nomfam,"FAMILLE_CELL_");
+      sprintf(nomfam,"%s%d",nomfam,-numfam);
+      attide = 1;
+      attval = numfam*100;
+      natt = 1;
+      strcpy(attdes,"description attribut");
+      strcpy(gro,"groupe0");
+      ngro = 1;
+
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
+                    natt,gro,ngro);
+      printf("MEDfamCr : %d\n",ret);
+    }
+
+  /***************************************************************************/
+  /*
+    Les champs
+  */
+  if (ret == 0)
+    {
+      ret = MEDchampCr(fid,champ1,MED_INT32,champ1_comp,champ1_unit,1);
+      printf("MEDchampCr : %d \n",ret);
+      if (ret == 0) {
+       ret = MEDchampEcr(fid, maa, champ1, (unsigned char *)fieldnodeint,
+                         MED_NO_INTERLACE, nnoe, MED_NOGAUSS, MED_ALL,
+                         MED_NOPFL, MED_NO_PFLMOD, MED_NOEUD, 0,
+                         MED_NOPDT,"        ", 0., MED_NONOR);
+       
+       printf("MEDchampEcr : %d \n",ret);
+      }
+    }
+  
+  if (ret == 0)
+    {
+      ret = MEDchampCr(fid,champ2,MED_FLOAT64,champ2_comp,champ2_unit,1);
+      printf("MEDchampCr : %d \n",ret);
+      if (ret == 0) {
+       ret = MEDchampEcr(fid, maa, champ2, (unsigned char *)fieldnodedouble1,
+                         MED_NO_INTERLACE, nnoe, MED_NOGAUSS, MED_ALL,
+                         MED_NOPFL, MED_NO_PFLMOD, MED_NOEUD, 0,
+                         1,"S       ", 1.1 , MED_NONOR);
+       printf("MEDchampEcr1 : %d \n",ret);
+       ret = MEDchampEcr(fid, maa, champ2, (unsigned char *)fieldnodedouble2,
+                         MED_NO_INTERLACE, nnoe, MED_NOGAUSS, MED_ALL,
+                         MED_NOPFL, MED_NO_PFLMOD, MED_NOEUD, 0,
+                         2,"S       ", 1.2 , MED_NONOR);
+       printf("MEDchampEcr2 : %d \n",ret);
+      }
+    }
+  
+  // on met champ2 sans pas de temps pour pouvoir le lire aussi par defaut !
+  if (ret == 0)
+    {
+      ret = MEDchampEcr(fid, maa, champ2, (unsigned char *)fieldnodedouble1,
+                       MED_NO_INTERLACE, nnoe, MED_NOGAUSS, MED_ALL,
+                       MED_NOPFL, MED_NO_PFLMOD, MED_NOEUD, 0,
+                       MED_NOPDT,"        ", 0. , MED_NONOR);
+      printf("MEDchampEcr : %d \n",ret); 
+    }
+
+  if (ret == 0)
+    {
+      ret = MEDchampCr(fid,champ3,MED_FLOAT64,champ3_comp,champ3_unit,2);
+      printf("MEDchampCr : %d \n",ret);
+      if (ret == 0) {
+       ret = MEDchampEcr(fid, maa, champ3, (unsigned char *)fieldcelldouble,
+                         MED_NO_INTERLACE, nquad4, MED_NOGAUSS, MED_ALL,
+                         MED_NOPFL, MED_NO_PFLMOD, MED_MAILLE, MED_QUAD4,
+                         MED_NOPDT,"        ", 0., MED_NONOR);
+       printf("MEDchampEcr : %d \n",ret);
+      }
+    }
+
+  /***************************************************************************/
+
+  ret = MEDfermer(fid);
+  printf("MEDfermer : %d\n",ret);
+  
+  return 0;
+}
+
diff --git a/src/MEDMEM/create_poly3D.c b/src/MEDMEM/create_poly3D.c
new file mode 100644 (file)
index 0000000..a05847f
--- /dev/null
@@ -0,0 +1,420 @@
+/*
+  creation d'une geometrie 3d : 
+  maillé en :
+  - 2 polyedres
+    ayant pour faces 3 polygones
+                     9 quadrangles
+                    6 triangles
+  - 1 tetra4
+
+*/
+
+#include <med.h>
+#include <string.h>
+
+int main (int argc, char **argv)
+{
+  med_err ret;
+  med_idt fid;
+  char maa[MED_TAILLE_NOM+1] = "poly3D";
+  char maadesc[MED_TAILLE_DESC+1] = "Example de maillage non structure 3D avec 2 polyedres+1tetra4 comme mailles et 3 polygones comme faces";
+  med_int mdim = 3;
+  med_int nnoe = 19;
+  /*
+    les noeuds:
+  */
+  med_float coo[57] = {
+    2.0, 3.0, 2.0,
+    3.0, 2.0, 2.0,
+    4.0, 1.0, 2.0,
+    2.0, 0.0, 2.0,
+    0.0, 1.0, 2.0,
+    1.0, 2.0, 2.0,
+    2.0, 3.0, 1.0,
+    3.0, 2.0, 0.0,
+    4.0, 1.0, 0.0,
+    2.0, 0.0, 0.0,
+    0.0, 1.0, 0.0,
+    1.0, 2.0, 0.0,
+    5.0, 3.0, 2.0,
+    7.0, 2.0, 2.0,
+    6.0, 0.0, 2.0,
+    6.0, 3.0, 0.0,
+    7.0, 2.0, 0.0,
+    6.0, 0.0, -1.0,
+    5.0, 1.0, -3.0 
+  };
+  char nomcoo[3*MED_TAILLE_PNOM+1] = "x               y               z               ";
+  char unicoo[3*MED_TAILLE_PNOM+1] = "cm              cm              cm              ";
+  /*  char nomnoe[18*MED_TAILLE_PNOM+1] = "nom1    nom2    nom3    nom4";*/
+  char *nomnoe ;
+  med_int numnoe[19] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
+  med_int nufano[19] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+  /*
+    les elements:
+  */
+  /* Faces QUAD4 */
+  med_int nquad4 = 8;
+  med_int quad4[32] = {
+    1, 7, 8, 2,
+    2, 8, 9, 3,
+    4, 3, 9, 10,
+    5, 4, 10, 11,
+    6, 5, 11, 12,
+    1, 6, 12, 7,
+    14, 13, 16, 17,
+    8, 9, 17, 16
+  };
+  char nomquad4[MED_TAILLE_PNOM*8+1] = "quad1           quad2           quad3           quad4           quad5           quad6           quad7           quad8           ";
+  med_int numquad4[9] = {2,3,4,5,6,7,12,17};
+  med_int nufaquad4[9] = {-1,-1,-1,-1,-1,-1,-1,-1};
+
+  /* Faces TRIA3 */
+  med_int ntria3 = 6;
+  med_int tria3[18] = {
+    7, 12, 8,
+    15, 14, 17,
+    15, 17, 18,
+    15, 18, 9,
+    3, 15, 9,
+    18, 17, 9
+  };
+  char nomtria3[MED_TAILLE_PNOM*6+1] = "tria1           tria2           tria3           tria4           tria5           tria6           ";
+  med_int numtria3[6] = {8,13,14,15,16,18};
+  med_int nufatria3[6] = {-2,-2,-2,-2,-2,-2};
+
+  /* Faces POLYGONE */
+  med_int npolygon = 3;
+  med_int nindexpolygon = 4;
+  med_int indexpolygon [4] = {
+    1, 7, 12, 17
+  };
+  med_int polygon[16] = {
+    1, 2, 3, 4, 5, 6,
+    10, 9, 8, 12, 11,
+    13, 14, 15, 3, 2
+  };
+  char nompolygon[MED_TAILLE_PNOM*3+1] = "polygon1        polygon2        polygon3        ";
+  med_int numpolygon[3] = {1,9,10};
+  med_int nufapolygon[3] = {-3,-3,-3};
+
+  /* Mailles POLYEDRE */
+  med_int npolyhedron = 2;
+  med_int npolyhedronfaces = 19;
+  med_int npolyhedronnodes = 74;
+  med_int polyhedronconnectivity[74] = {1,2,3,4,5,6,1,7,8,2,2,8,9,3,4,3,9,10,5,4,10,11,6,5,11,12,1,6,12,7,7,12,8,10,9,8,12,11,
+                                       13,14,15,3,2,13,2,8,16,14,13,16,17,15,14,17,15,17,18,15,18,9,3,15,9,2,3,9,8,8,9,17,16,9,18,17};
+  med_int polyhedronfacesindex[20] = {1,7,11,15,19,23,27,31,34,
+                                     39,44,48,52,55,58,61,64,68,72,75};
+  med_int polyhedronindex[3] = {1,10,20};
+  char nompolyhedron[MED_TAILLE_PNOM*2+1] = "polyhedron1     polyhedron2     ";
+  med_int numpolyhedron[2] = {2,3};
+  med_int nufapolyhedron[2] = {-4,-4};
+
+  /* Mailles TETRA4 */
+  med_int ntetra4 = 1;
+  med_int tetra4[4] = {
+    17, 9, 18, 19
+  };
+  char nomtetra4[MED_TAILLE_PNOM*1+1] = "tetra1          ";
+  med_int numtetra4[1] = {1};
+  med_int nufatetra4[1] = {-5};
+
+
+  char nomfam[MED_TAILLE_NOM+1];
+  med_int numfam;
+  char attdes[MED_TAILLE_DESC+1];
+  med_int natt;
+  med_int attide;
+  med_int attval;
+  med_int ngro;
+  char gro[MED_TAILLE_LNOM+1];
+  int i;
+  int nfame = 2;
+  int nfamn = 1;
+
+  /*
+    Some fields : 2 on nodes : one int and one double , one on cells : double
+   */
+  char champ1[MED_TAILLE_NOM+1]="fieldnodeint" ;
+  char champ1_comp[MED_TAILLE_PNOM+1]="comp1           " ;
+  char champ1_unit[MED_TAILLE_PNOM+1]="M               " ;
+  med_int     fieldnodeint[19]    = {1,1,3,2,2,3,4,4,5,6,6,7,8,8,9,9,9,10,5};
+
+  char champ2[MED_TAILLE_NOM+1]="fieldnodedouble" ;
+  char champ2_comp[MED_TAILLE_PNOM+1]="comp1           " ;
+  char champ2_unit[MED_TAILLE_PNOM+1]="J               " ;
+  med_float   fieldnodedouble1[19] = {1.,3.,4.,1.,3.,4.,3.,2.,5.,6.,4.,3.,1.,5.,6.,4.,3.,7.,3.};
+  med_float   fieldnodedouble2[19] = {1.,2.,2.,3.,3.,3.,4.,4.,5.,2.,8.,9.,6.,7.,1.,2.,5.,8.,4.};
+
+  char champ3[MED_TAILLE_NOM+1]="fieldfacedouble" ;
+  char champ3_comp[MED_TAILLE_PNOM*2+1]="comp1           comp2           " ;
+  char champ3_unit[MED_TAILLE_PNOM*2+1]="M/S             m/s             " ;
+  med_float   fieldfacedouble[6*2] = {0.,1.,1.,1.,1.,2.,2.,3.,3.,4.,4.,6.};
+
+  /***************************************************************************/
+  fid = MEDouvrir("poly3D.med",MED_LECTURE_ECRITURE);
+  if (fid < 0)
+    ret = -1;
+  else
+    ret = 0;
+  printf("MEDouvrir : %d\n",ret);
+
+  /***************************************************************************/
+  if (ret == 0)
+    ret = MEDmaaCr(fid,maa,mdim,MED_NON_STRUCTURE,maadesc);
+  printf("MEDmaaCr : %d\n",ret);
+  if (ret == 0)
+    ret = MEDunvCr(fid,maa);
+  printf("MEDunvCr : %d\n",ret);
+
+  /***************************************************************************/
+  if (ret == 0)
+    ret = MEDnoeudsEcr(fid,maa,mdim,coo,MED_FULL_INTERLACE,MED_CART,
+                      nomcoo,unicoo,nomnoe,MED_FAUX,numnoe,MED_VRAI,
+                      nufano,nnoe);
+  printf("MEDnoeudsEcr : %d\n",ret);
+
+  /* ecriture des faces MED_QUAD4 :
+     - connectivite
+     - noms (optionnel) 
+     - numeros (optionnel)
+     - numeros des familles */
+  if (ret == 0) 
+    ret = MEDelementsEcr(fid,maa,mdim,quad4,MED_FULL_INTERLACE,
+                        nomquad4,MED_FAUX,numquad4,MED_VRAI,nufaquad4,nquad4,
+                        MED_MAILLE,MED_QUAD4,MED_NOD);
+  printf("MEDelementsEcr for quad : %d \n",ret);
+
+  /* ecriture des faces MED_TRIA3 :
+     - connectivite
+     - noms (optionnel) 
+     - numeros (optionnel)
+     - numeros des familles */
+  if (ret == 0) 
+    ret = MEDelementsEcr(fid,maa,mdim,tria3,MED_FULL_INTERLACE,
+                        nomtria3,MED_FAUX,numtria3,MED_VRAI,nufatria3,ntria3,
+                        MED_MAILLE,MED_TRIA3,MED_NOD);
+  printf("MEDelementsEcr for tria : %d \n",ret);
+
+  /* ecriture des faces MED_POLYGONE :
+     - connectivite
+     - noms (optionnel) 
+     - numeros (optionnel)
+     - numeros des familles
+     Dans ce cas il n existe pas de routine globale (Warning !!) */
+  if (ret == 0)
+    ret = MEDpolygoneConnEcr(fid,maa,indexpolygon,nindexpolygon,polygon,
+                            MED_MAILLE,MED_NOD);
+  printf("MEDpolygoneConnEcr: %d \n",ret);
+
+  if (ret == 0)
+    MEDnomEcr(fid,maa,nompolygon,npolygon,MED_MAILLE,MED_POLYGONE);
+  printf("MEDnomEcr for polygon : %d \n",ret);
+
+  if (ret == 0)
+    MEDnumEcr(fid,maa,numpolygon,npolygon,MED_MAILLE,MED_POLYGONE);
+  printf("MEDnumEcr for polygon : %d \n",ret);
+
+  if (ret == 0)
+    MEDfamEcr(fid,maa,nufapolygon,npolygon,MED_MAILLE,MED_POLYGONE);
+  printf("MEDfamEcr for polygon : %d \n",ret);
+
+  /* ecriture des mailles MED_POLYEDRE :
+     - connectivite
+     - noms (optionnel) 
+     - numeros (optionnel)
+     - numeros des familles
+     Dans ce cas il n existe pas de routine globale (Warning !!) */
+  if (ret == 0)
+    ret = MEDpolyedreConnEcr(fid,maa,polyhedronindex,npolyhedron+1,polyhedronfacesindex,npolyhedronfaces+1,polyhedronconnectivity,MED_NOD);
+  printf("MEDpolyedreConnEcr: %d \n",ret);
+
+  if (ret == 0)
+    ret = MEDnomEcr(fid,maa,nompolyhedron,npolyhedron,MED_MAILLE,MED_POLYEDRE);
+  printf("MEDnomEcr for polyhedron : %d \n",ret);
+
+  if (ret == 0)
+    ret = MEDnumEcr(fid,maa,numpolyhedron,npolyhedron,MED_MAILLE,MED_POLYEDRE);
+  printf("MEDnumEcr for polyhedron : %d \n",ret);
+
+  if (ret == 0)
+    ret = MEDfamEcr(fid,maa,nufapolyhedron,npolyhedron,MED_MAILLE,MED_POLYEDRE);
+  printf("MEDfamEcr for polyhedron : %d \n",ret);
+
+  /* ecriture des mailles TETRA4 :
+     - connectivite
+     - noms (optionnel) 
+     - numeros (optionnel)
+     - numeros des familles */
+  if (ret == 0)
+    ret = MEDelementsEcr(fid,maa,mdim,tetra4,MED_FULL_INTERLACE,
+                        nomtetra4,MED_FAUX,numtetra4,MED_VRAI,nufatetra4,ntetra4,
+                        MED_MAILLE,MED_TETRA4,MED_NOD);
+  printf("MEDelementsEcr for tetra : %d \n",ret);
+
+  /***************************************************************************/
+  /* ecriture des familles */
+  /* Conventions :
+     - toujours creer une famille de numero 0 ne comportant aucun attribut
+       ni groupe (famille de reference pour les noeuds ou les elements
+       qui ne sont rattaches a aucun groupe ni attribut)
+     - les numeros de familles de noeuds sont > 0
+     - les numeros de familles des elements sont < 0
+     - rien d'imposer sur les noms de familles
+   */ 
+
+  /* la famille 0 */
+  if (ret == 0)
+    {
+      strcpy(nomfam,"FAMILLE_0");
+      numfam = 0;
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,0,
+                    gro,0);
+    }
+  printf("MEDfamCr : %d \n",ret);
+
+  /* on cree :
+      - 2 familles d'elements de dimension (d)
+        en fait de face (-10)
+  */
+  /*
+  if (ret == 0)
+    {
+      numfam = -1;
+      strcpy(nomfam,"FAMILLE_FACE_QUAD4");
+      sprintf(nomfam,"%s%d",nomfam,-numfam);
+      attide = 1;
+      attval = numfam*100;
+      natt = 1;
+      strcpy(attdes,"description attribut");
+      strcpy(gro,"groupe0");
+      ngro = 1;
+
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
+                    natt,gro,ngro);
+      printf("MEDfamCr : %d\n",ret);
+
+      numfam = -2;
+      strcpy(nomfam,"FAMILLE_FACE_TRIA3");
+      sprintf(nomfam,"%s%d",nomfam,-numfam);
+      attide = 1;
+      attval = numfam*100;
+      natt = 1;
+      strcpy(attdes,"description attribut");
+      strcpy(gro,"groupe0");
+      ngro = 1;
+
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
+                    natt,gro,ngro);
+      printf("MEDfamCr : %d\n",ret);
+
+      numfam = -3;
+      strcpy(nomfam,"FAMILLE_FACE_POLYGONS");
+      sprintf(nomfam,"%s%d",nomfam,-numfam);
+      attide = 1;
+      attval = numfam*100;
+      natt = 1;
+      strcpy(attdes,"description attribut");
+      strcpy(gro,"groupe0");
+      ngro = 1;
+
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
+                    natt,gro,ngro);
+      printf("MEDfamCr : %d\n",ret);
+
+      numfam = -4;
+      strcpy(nomfam,"FAMILLE_MAILLE_POLYHEDRON");
+      sprintf(nomfam,"%s%d",nomfam,-numfam);
+      attide = 1;
+      attval = numfam*100;
+      natt = 1;
+      strcpy(attdes,"description attribut");
+      strcpy(gro,"groupe0");
+      ngro = 1;
+
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
+                    natt,gro,ngro);
+      printf("MEDfamCr : %d\n",ret);
+
+      numfam = -5;
+      strcpy(nomfam,"FAMILLE_MAILLE_TETRA4");
+      sprintf(nomfam,"%s%d",nomfam,-numfam);
+      attide = 1;
+      attval = numfam*100;
+      natt = 1;
+      strcpy(attdes,"description attribut");
+      strcpy(gro,"groupe0");
+      ngro = 1;
+
+      ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
+                    natt,gro,ngro);
+      printf("MEDfamCr : %d\n",ret);
+    }
+  */
+  /***************************************************************************/
+  /*
+    Les champs
+  */
+  if (ret == 0)
+    {
+      ret = MEDchampCr(fid,champ1,MED_INT32,champ1_comp,champ1_unit,1);
+      printf("MEDchampCr : %d \n",ret);
+      if (ret == 0) {
+       ret = MEDchampEcr(fid, maa, champ1, (unsigned char *)fieldnodeint,
+                         MED_NO_INTERLACE, nnoe, MED_NOGAUSS, MED_ALL,
+                         MED_NOPFL, MED_NO_PFLMOD, MED_NOEUD, 0,
+                         MED_NOPDT,"        ", 0., MED_NONOR);
+       
+       printf("MEDchampEcr : %d \n",ret);
+      }
+    }
+  
+  if (ret == 0)
+    {
+      ret = MEDchampCr(fid,champ2,MED_FLOAT64,champ2_comp,champ2_unit,1);
+      printf("MEDchampCr : %d \n",ret);
+      if (ret == 0) {
+       ret = MEDchampEcr(fid, maa, champ2, (unsigned char *)fieldnodedouble1,
+                         MED_NO_INTERLACE, nnoe, MED_NOGAUSS, MED_ALL,
+                         MED_NOPFL, MED_NO_PFLMOD, MED_NOEUD, 0,
+                         1,"S       ", 1.1 , MED_NONOR);
+       printf("MEDchampEcr1 : %d \n",ret);
+       ret = MEDchampEcr(fid, maa, champ2, (unsigned char *)fieldnodedouble2,
+                         MED_NO_INTERLACE, nnoe, MED_NOGAUSS, MED_ALL,
+                         MED_NOPFL, MED_NO_PFLMOD, MED_NOEUD, 0,
+                         2,"S       ", 1.2 , MED_NONOR);
+       printf("MEDchampEcr2 : %d \n",ret);
+      }
+    }
+  
+  // on met champ2 sans pas de temps pour pouvoir le lire aussi par defaut !
+  if (ret == 0)
+    {
+      ret = MEDchampEcr(fid, maa, champ2, (unsigned char *)fieldnodedouble1,
+                       MED_NO_INTERLACE, nnoe, MED_NOGAUSS, MED_ALL,
+                       MED_NOPFL, MED_NO_PFLMOD, MED_NOEUD, 0,
+                       MED_NOPDT,"        ", 0. , MED_NONOR);
+      printf("MEDchampEcr : %d \n",ret); 
+    }
+
+  if (ret == 0)
+    {
+      ret = MEDchampCr(fid,champ3,MED_FLOAT64,champ3_comp,champ3_unit,2);
+      printf("MEDchampCr : %d \n",ret);
+      if (ret == 0) {
+       ret = MEDchampEcr(fid, maa, champ3, (unsigned char *)fieldfacedouble,
+                         MED_NO_INTERLACE, ntria3, MED_NOGAUSS, MED_ALL,
+                         MED_NOPFL, MED_NO_PFLMOD, MED_FACE, MED_TRIA3,
+                         MED_NOPDT,"        ", 0., MED_NONOR);
+       printf("MEDchampEcr : %d \n",ret);
+      }
+    }
+  /***************************************************************************/
+
+  ret = MEDfermer(fid);
+  printf("MEDfermer : %d\n",ret);
+  
+  return 0;
+}
+
index f666f547d8a43063f3558bb4f00ff500d4826006..9e0f28ec35c101a5646a5a2637b2a86a21f704f4 100644 (file)
@@ -3,6 +3,10 @@
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_Med.hxx"
 
 #include "MEDMEM_Exception.hxx"
 #include "MEDMEM_Med.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 void usage(char * name)
 using namespace std;
 using namespace MEDMEM;
 void usage(char * name)
@@ -13,7 +17,10 @@ void usage(char * name)
 }
 
 int main (int argc, char ** argv) {
 }
 
 int main (int argc, char ** argv) {
-  
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   if (argc != 3) usage(argv[0]);
   
   string filenameIN = argv[1] ;
   if (argc != 3) usage(argv[0]);
   
   string filenameIN = argv[1] ;
index c3e389c724a5c6fd9dc2aea374f8f5709c07cb3a..6257bc523881dc767e84a172aab60ede8ee0b0e1 100644 (file)
 #include "MEDMEM_MedMedDriver.hxx"
 #include "MEDMEM_MedMeshDriver.hxx"
 
 #include "MEDMEM_MedMedDriver.hxx"
 #include "MEDMEM_MedMeshDriver.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 int main (int argc, char ** argv) {
 using namespace std;
 using namespace MEDMEM;
 int main (int argc, char ** argv) {
-  
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
     string filenameIN = argv[1] ;
     string filenameOUT = argv[2] ;
     
     string filenameIN = argv[1] ;
     string filenameOUT = argv[2] ;
     
diff --git a/src/MEDMEM/med2_1_To_med2_2.cxx b/src/MEDMEM/med2_1_To_med2_2.cxx
new file mode 100644 (file)
index 0000000..d549166
--- /dev/null
@@ -0,0 +1,40 @@
+#include "MEDMEM_Exception.hxx"
+#include "MEDMEM_medimport_src.hxx"
+
+using namespace std;
+using namespace MEDMEM;
+
+int main (int argc, char ** argv)
+{
+  if (argc != 2)
+    {
+      cerr << "Usage : " << argv[0] 
+          << " fileNameIn" << endl ;
+      cerr << "Where - fileNameIn is .med V2.1 file supplied by the user including all the directory path" << endl;
+      cerr << "fileNameOut is .med V2.2 file produced by this command in the directory $HOME/TMP_Med2_2Files/" << endl;
+      cerr << "This command is supposed to be the same as the med File V2.2 medimport utility" << endl << endl;
+      cerr << "It will produce a med V2.2 file fileNameOut which will be in the directory $HOME/TMP_Med2_2Files/" << endl;
+      cerr << "with the same root name as fileNameIn: " << endl;
+      cerr << "If fileNameIn is /aPath/file.med so fileNameOut will be $HOME/TMP_Med2_2Files/file.med" << endl;
+      exit(-1);
+    }
+
+  string fileNameIn = argv[1] ;
+  char * fileNameOut = med2_1_To_med2_2((const_cast <char *>
+                                        (fileNameIn.c_str())));
+
+  if (fileNameOut == ((char *) NULL))
+    {
+      cerr << "A problem has occured in the importation of the file " << fileNameIn.c_str() << " into " << fileNameOut << endl;
+    }
+  else if(fileNameOut != string(fileNameIn).c_str())
+    {
+      cerr << "the convertion has been successfull !! The resulting file is " << string(fileNameOut).c_str() << endl;
+    }
+  else
+    {
+      cerr << "No nedd to converte because the file is al ready a med 2.2 file" << endl;
+    }
+
+  return 0;
+}
index 7f9f53842ab761ac0981934c576a63638a9e522d..57d87ec5f3700c5b98dd280ff1a63cc89626fc52 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_VtkMedDriver.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_VtkMedDriver.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 void usage(char * name)
 using namespace std;
 using namespace MEDMEM;
 void usage(char * name)
@@ -21,7 +25,10 @@ void usage(char * name)
 }
 
 int main (int argc, char ** argv) {
 }
 
 int main (int argc, char ** argv) {
-  
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   if (argc != 3) usage(argv[0]);
   
   string filenameIN = argv[1] ;
   if (argc != 3) usage(argv[0]);
   
   string filenameIN = argv[1] ;
index 73696db52bf313af5b6776c297e5676096656843..0c35fe95ff59ec98b5f6950c7c97f592c2d5344a 100644 (file)
@@ -8,12 +8,16 @@
 #include "MEDMEM_Family.hxx"
 #include "MEDMEM_Group.hxx"
 
 #include "MEDMEM_Family.hxx"
 #include "MEDMEM_Group.hxx"
 
-#include "MEDMEM_MedMeshDriver.hxx"
-#include "MEDMEM_MedFieldDriver.hxx"
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_Field.hxx"
+#include "MEDMEM_MedMeshDriver.hxx"
+#include "MEDMEM_MedFieldDriver.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -81,6 +85,9 @@ void affiche_groupe(MESH *myMesh,medEntityMesh Entity)
 }
 
 int main (int argc, char ** argv) {
 }
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   int read;
 
 
   int read;
 
index 6b03fa96972b7ebc123dbd76b54de16aaa796045..8117c696f815ad436f67cf0b651bfbba8885f7c0 100644 (file)
@@ -1,10 +1,18 @@
 #include "utilities.h"
 #include "MEDMEM_Array.hxx"
 
 #include "utilities.h"
 #include "MEDMEM_Array.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 int main (int argc, char ** argv) {
 
 using namespace std;
 using namespace MEDMEM;
 int main (int argc, char ** argv) {
 
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   int SpaceDimension = 3 ;
   int NumberOfNodes = 4 ; 
   MEDARRAY<int> * myArray = new MEDARRAY<int>(SpaceDimension,NumberOfNodes,MED_EN::MED_FULL_INTERLACE) ;
   int SpaceDimension = 3 ;
   int NumberOfNodes = 4 ; 
   MEDARRAY<int> * myArray = new MEDARRAY<int>(SpaceDimension,NumberOfNodes,MED_EN::MED_FULL_INTERLACE) ;
index 304506283e6ab54d662d067f2a50a8935464dd59..a760d0c0727b1c33dba5d03444f5e502c796ed12 100644 (file)
@@ -2,11 +2,19 @@
 #include "MEDMEM_CellModel.hxx"
 #include "MEDMEM_DriversDef.hxx"
 
 #include "MEDMEM_CellModel.hxx"
 #include "MEDMEM_DriversDef.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 int main (int argc, char ** argv) {
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   list<medGeometryElement> geomList = meshEntities[MED_CELL] ;
   list<medGeometryElement>::iterator itGeomList ;
   for(itGeomList=geomList.begin();itGeomList!=geomList.end();itGeomList++) {
   list<medGeometryElement> geomList = meshEntities[MED_CELL] ;
   list<medGeometryElement>::iterator itGeomList ;
   for(itGeomList=geomList.begin();itGeomList!=geomList.end();itGeomList++) {
index 5326e87239e2ee1c638713bd8663aca861efe5b4..b1ccc387e10837e0d9f583c93ff293e6392b1ed4 100644 (file)
@@ -2,6 +2,10 @@
 #include "MEDMEM_Group.hxx"
 #include "MEDMEM_Field.hxx"
 
 #include "MEDMEM_Group.hxx"
 #include "MEDMEM_Field.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -16,6 +20,10 @@ int main (int argc, char ** argv) {
     exit(-1);
   }
 
     exit(-1);
   }
 
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   // filename to save the generated MESH
   string filenameRoot = argv[1] ;
 
   // filename to save the generated MESH
   string filenameRoot = argv[1] ;
 
diff --git a/src/MEDMEM/test_MEDMEM_MeshingPoly.cxx b/src/MEDMEM/test_MEDMEM_MeshingPoly.cxx
new file mode 100644 (file)
index 0000000..408f741
--- /dev/null
@@ -0,0 +1,178 @@
+#include "MEDMEM_Meshing.hxx"
+#include "MEDMEM_Field.hxx"
+#include "LocalTraceCollector.hxx"
+
+using namespace std;
+using namespace MEDMEM;
+using namespace MED_EN;
+
+int main (int argc, char ** argv) {
+  LocalTraceCollector::instance();
+
+  double Coordinates[57] = {
+    2.0, 3.0, 2.0,
+    3.0, 2.0, 2.0,
+    4.0, 1.0, 2.0,
+    2.0, 0.0, 2.0,
+    0.0, 1.0, 2.0,
+    1.0, 2.0, 2.0,
+    2.0, 3.0, 1.0,
+    3.0, 2.0, 0.0,
+    4.0, 1.0, 0.0,
+    2.0, 0.0, 0.0,
+    0.0, 1.0, 0.0,
+    1.0, 2.0, 0.0,
+    5.0, 3.0, 2.0,
+    7.0, 2.0, 2.0,
+    6.0, 0.0, 2.0,
+    6.0, 3.0, 0.0,
+    7.0, 2.0, 0.0,
+    6.0, 0.0, -1.0,
+    5.0, 1.0, -3.0};
+
+  const int REFnodalConnOfFaces[74] = {
+    1, 2, 3, 4, 5, 6, // Polyhedron 1
+    1, 7, 8, 2, 
+    2, 8, 9, 3, 
+    4, 3, 9, 10, 
+    5, 4, 10, 11, 
+    6, 5, 11, 12, 
+    1, 6, 12, 7, 
+    7, 12, 8, 
+    10, 9, 8, 12, 11,
+                                  
+    13, 14, 15, 3, 2, // Polyhedron 2
+    13, 2, 8, 16, 
+    14, 13, 16, 17, 
+    15, 14, 17, 
+    15, 17, 18, 
+    15, 18, 9, 
+    3, 15, 9, 
+    2, 3, 9, 8, 
+    8, 9, 17, 16, 
+    9, 18, 17};
+
+  const int REFfacesIndex[20] = {
+    1, 7, 11, 15, 19, 23, 27, 31, 34, 
+    39, 44, 48, 52, 55, 58, 61, 64, 68, 72, 75};
+
+  const int REFpolyIndex[3] = {1, 10, 20};
+
+  double PolygonCoordinates[27] = {
+    2.0, 3.0, 12.0,
+    3.0, 2.0, 12.0,
+    4.0, 1.0, 12.0,
+    2.0, 0.0, 12.0,
+    0.0, 1.0, 12.0,
+    1.0, 2.0, 12.0,
+    5.0, 3.0, 12.0,
+    7.0, 2.0, 12.0,
+    6.0, 0.0, 12.0};
+
+  const int REFpolygonFaces[11] = {
+    1, 2, 3, 4, 5, 6, // Polygon 1   
+    7, 8, 9, 3, 2}; // Polygon 2
+
+  const int REFpolygonIndex[3] = {1, 7, 12};
+
+  MESHING myMeshing;
+  myMeshing.setName("meshing");
+
+  int NumberOfNodes = 19;
+  int SpaceDimension = 3;
+  int MeshDimension = 3;
+
+  const int NumberOfTypes = 1;
+  medGeometryElement Types[NumberOfTypes] = {MED_TETRA4};
+  const int NumberOfElements[NumberOfTypes] = {1};
+
+  myMeshing.setNumberOfTypes(NumberOfTypes, MED_CELL);
+
+  myMeshing.setCoordinates(SpaceDimension, NumberOfNodes, Coordinates,
+                          "CARTESIAN", MED_FULL_INTERLACE);
+  myMeshing.setSpaceDimension(SpaceDimension);
+  myMeshing.setMeshDimension(MeshDimension);
+  myMeshing.setTypes(Types, MED_CELL);
+  myMeshing.setNumberOfElements(NumberOfElements, MED_CELL);
+
+  string Names[3] = {"X","Y","Z"};
+  myMeshing.setCoordinatesNames(Names);
+
+  string Units[3] = {"cm","cm","cm"};
+  myMeshing.setCoordinatesUnits(Units);
+
+  const int sizeTetra = 4*1 ;
+  int ConnectivityTetra[sizeTetra]=
+  {
+    17, 9, 18, 19
+  };
+  
+  myMeshing.setConnectivity(ConnectivityTetra, MED_CELL, MED_TETRA4);
+
+  myMeshing.setPolyhedraConnectivity(REFpolyIndex, REFfacesIndex, 
+                                    REFnodalConnOfFaces, 2, MED_CELL);
+
+
+  MESHING myPolygonMeshing;
+  myPolygonMeshing.setName("PolygonMeshing");
+
+  NumberOfNodes = 9;
+  SpaceDimension = 3;
+  MeshDimension = 2;
+  medGeometryElement PolygonTypes[NumberOfTypes] = {MED_TRIA3};
+  const int PolygonNumberOfElements[NumberOfTypes] = {2};
+
+  myPolygonMeshing.setNumberOfTypes(NumberOfTypes, MED_CELL);
+
+  myPolygonMeshing.setCoordinates(SpaceDimension, NumberOfNodes, PolygonCoordinates,
+                          "CARTESIAN", MED_FULL_INTERLACE);
+  myPolygonMeshing.setSpaceDimension(SpaceDimension);
+  myPolygonMeshing.setMeshDimension(MeshDimension);
+  myPolygonMeshing.setTypes(PolygonTypes, MED_CELL);
+  myPolygonMeshing.setNumberOfElements(PolygonNumberOfElements, MED_CELL);
+
+  myPolygonMeshing.setCoordinatesNames(Names);
+  myPolygonMeshing.setCoordinatesUnits(Units);
+
+  const int sizeTri = 3*2 ;
+  int ConnectivityTri[sizeTri]=
+  {
+    1, 7, 2, 3, 9, 4
+  };
+
+  myPolygonMeshing.setConnectivity(ConnectivityTri, MED_CELL, MED_TRIA3);
+  myPolygonMeshing.setPolygonsConnectivity(REFpolygonIndex, REFpolygonFaces, 2, MED_CELL);
+  SUPPORT *sup2 = new SUPPORT(&myPolygonMeshing);
+  FIELD<double> *areas = myPolygonMeshing.getArea(sup2);
+  const double *vals2 = areas->getValue(MED_FULL_INTERLACE);
+  const double REFAreaOfPolyg[4] ={1.5, 2, 6, 6.5};
+  int nbPts=0;
+  int i;
+  for(i=0;i<4;i++)
+    if(fabs(REFAreaOfPolyg[i]-vals2[i])<1e-12)
+      nbPts++;
+  delete sup2;
+  delete areas;
+
+  SUPPORT *sup = new SUPPORT(&myMeshing);
+  FIELD<double> *vols = myMeshing.getVolume(sup);
+  const double *vals = vols->getValue(MED_FULL_INTERLACE);
+  const double REFVolOfPolyHedron[3] = {2.333333333333333, 11.66666666666666, 13.83224131414673};
+  for(i=0;i<3;i++)
+    if(fabs(REFVolOfPolyHedron[i]-vals[i])<1e-12)
+      nbPts++;
+  
+  delete vols;
+  delete sup;
+  if(nbPts==7)
+    {
+      cout << "ALL TESTS OK !!!" << endl;
+      return 0;
+    }
+  else
+    {
+      cout << "TEST FAILS !!!" << endl;
+      return -1;
+    }
+
+}
diff --git a/src/MEDMEM/test_MEDMEM_Meshing_poly.cxx b/src/MEDMEM/test_MEDMEM_Meshing_poly.cxx
new file mode 100644 (file)
index 0000000..eee3052
--- /dev/null
@@ -0,0 +1,148 @@
+#include "MEDMEM_Meshing.hxx"
+
+using namespace std;
+using namespace MEDMEM;
+using namespace MED_EN;
+
+int main (int argc, char ** argv)
+{
+    // Traitement arguments
+    if (argc != 2) 
+    {
+       cerr << "Usage : " << argv[0] 
+       << " medfilename" << endl << endl
+       << "-> cré un maillage et le sauve dans le fichier medfilename." << endl;
+       exit(-1);
+    }
+    string medfilename  = argv[1];
+
+    // Creation maillage
+    //***********************************************************************************
+
+      MESHING myMeshing;
+      myMeshing.setName("myMeshing");
+
+      //   define coordinates
+
+      int SpaceDimension = 2;
+      int MeshDimension = SpaceDimension ;
+      int NumberOfNodes = 11;
+      double Coordinates[2*11] = {
+       0.0, 0.0,
+       0.5, 0.0,
+       1.0, 0.0,
+       0.25, 0.5,
+       0.5, 0.5,
+       0.75, 0.5,
+       0.0, 1.0,
+       0.5, 1.0,
+       1.0, 1.0,
+       1.5, 0.0,
+       1.5, 1.0,
+      };
+
+      myMeshing.setMeshDimension(MeshDimension) ;
+
+      myMeshing.setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,"CARTESIAN",MED_FULL_INTERLACE);
+
+      string Names[3] = { "X","Y","Z" };
+      myMeshing.setCoordinatesNames(Names);
+
+      string Units[3] = { "cm","cm","cm" };
+      myMeshing.setCoordinatesUnits(Units);
+
+      //   define conectivities
+
+      //      cell part
+
+      const int NumberOfTypes = 3;
+      medGeometryElement Types[NumberOfTypes] = {MED_TRIA3,MED_QUAD4,MED_POLYGON};
+      const int NumberOfElements[NumberOfTypes] = {1,4,1};
+
+      myMeshing.setNumberOfTypes(NumberOfTypes,MED_CELL);
+      myMeshing.setTypes(Types,MED_CELL);
+
+      int ConnectivityTria[1*3]=
+       {
+         7,4,1
+       };
+
+
+      int ConnectivityQuad[4*4]=
+       {
+         4,5,2,1,
+         5,6,3,2,
+         7,8,5,4,
+         8,9,6,5
+       };
+  
+      int ConnectivityPolygon[1*5]=
+       {
+         9,11,10,3,6
+       };
+      int ConnectivityPolygonIndex[2]=
+       {
+         1,6
+       };
+
+      myMeshing.setNumberOfElements(NumberOfElements,MED_CELL,ConnectivityPolygonIndex,1);
+      myMeshing.setConnectivity(ConnectivityTria,MED_CELL,MED_TRIA3);
+      myMeshing.setConnectivity(ConnectivityQuad,MED_CELL,MED_QUAD4);
+      myMeshing.setConnectivity(ConnectivityPolygon,MED_CELL,MED_POLYGON,ConnectivityPolygonIndex,1);
+
+      /*
+      //      face part
+
+      const int NumberOfFacesTypes = 2 ;
+      medGeometryElement FacesTypes[NumberOfFacesTypes] = {MED_TRIA3,MED_QUAD4} ;
+      const int NumberOfFacesElements[NumberOfFacesTypes] = {4,4} ;
+
+      myMeshing.setNumberOfTypes(NumberOfFacesTypes,MED_FACE);
+      myMeshing.setTypes(FacesTypes,MED_FACE);
+      myMeshing.setNumberOfElements(NumberOfFacesElements,MED_FACE);
+
+      const int sizeTria = 3*4 ;
+      int ConnectivityTria[sizeTria]=
+      {
+      1,4,3,
+      1,5,4,
+      1,6,5,
+      1,3,6
+      };
+      myMeshing.setConnectivity(ConnectivityTria,MED_FACE,MED_TRIA3);
+
+      int ConnectivityQua[4*4]=
+      {
+      7,8,9,10,
+      11,12,13,14,
+      11,7,8,12,
+      12,8,9,13
+      };
+
+      myMeshing.setConnectivity(ConnectivityQua,MED_FACE,MED_QUAD4);
+      */
+
+      /*
+      //      edge part
+
+      // not yet implemented : if set, results are unpredictable.
+      */
+
+
+  // Ecriture fichier
+
+      int idMed = myMeshing.addDriver(MED_DRIVER,medfilename,myMeshing.getName());
+      myMeshing.write(idMed) ;
+
+      //      int idVtk = myMeshing.addDriver(VTK_DRIVER,"toto.vtk",myMeshing.getName());
+      //      myMeshing.write(idVtk) ;
+
+  //************************************************************************************
+
+  // impression de controle
+  cout << endl;
+  cout << "Impression de MESHING : " << endl;
+  cout << myMeshing;
+
+}
index c35aaf1b0df8e0a461eafeebd67bc5a6f58c1a59..dff3375303ad2f4b0fea9ce28d1f9de16e6200c8 100644 (file)
@@ -2,10 +2,17 @@
 
 #include "MEDMEM_ModulusArray.hxx"
 
 
 #include "MEDMEM_ModulusArray.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 
 int main (int argc, char ** argv) {
 using namespace std;
 using namespace MEDMEM;
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   using namespace std ;
 
 
   using namespace std ;
 
diff --git a/src/MEDMEM/test_MEDMEM_PolyConnectivity.cxx b/src/MEDMEM/test_MEDMEM_PolyConnectivity.cxx
new file mode 100644 (file)
index 0000000..c1c3243
--- /dev/null
@@ -0,0 +1,59 @@
+// This program test the implementation of the class CONNECTIVITY for Polygons and Polyhedron. //
+
+#include "MEDMEM_Connectivity.hxx"
+
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
+using namespace std;
+using namespace MEDMEM;
+using namespace MED_EN;
+
+int main(void)
+{
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
+  CONNECTIVITY myNodalConnectivity;
+  CONNECTIVITY myDescendingConnectivity;
+
+  //POLYGONS
+  const med_int NumberOfPolygons = 2;
+  const med_int ConnectivitySize = 12;
+  med_int PolygonsConnectivityIndex[NumberOfPolygons+1] = {1,7,13};
+
+  //Nodal
+  med_int PolygonsNodalConnectivity[ConnectivitySize] = {1,2,3,4,5,10,10,5,6,7,8,9};
+
+  myNodalConnectivity.setPolygonsConnectivity(MED_NODAL,MED_CELL,PolygonsNodalConnectivity,PolygonsConnectivityIndex,ConnectivitySize,NumberOfPolygons);
+
+  //Descending
+  med_int PolygonsDescendingConnectivity[ConnectivitySize] = {1,2,3,4,11,10,11,5,6,7,8,9};
+
+  myDescendingConnectivity.setPolygonsConnectivity(MED_DESCENDING,MED_CELL,PolygonsDescendingConnectivity,PolygonsConnectivityIndex,ConnectivitySize,NumberOfPolygons);
+
+  //POLYHEDRON
+  const med_int NumberOfPolyhedron = 2;
+  med_int PolyhedronIndex[NumberOfPolyhedron+1] = {1,10,20};
+
+  //Nodal
+  const med_int NumberOfFaces = 19;
+  const med_int NumberOfNodes = 74;
+  med_int PolyhedronFacesIndex[NumberOfFaces+1] = {1,7,11,15,19,23,27,31,34,39,44,48,52,55,58,61,64,68,72,75};
+  med_int PolyhedronNodalConnectivity[NumberOfNodes] = {1,2,3,4,5,6,1,7,8,2,2,8,9,3,4,3,9,10,5,4,10,11,6,5,11,12,1,6,12,7,7,12,8,10,9,8,12,11,13,14,15,3,2,13,2,8,16,14,13,16,17,15,14,17,15,17,18,15,18,9,3,15,9,2,3,9,8,8,9,17,16,9,18,17};
+
+  myNodalConnectivity.setPolyhedronConnectivity(MED_NODAL,PolyhedronNodalConnectivity,PolyhedronIndex,NumberOfNodes,NumberOfPolyhedron,PolyhedronFacesIndex,NumberOfFaces);
+
+  //Descending
+  const med_int DescendingConnectivitySize = 19;
+  med_int PolyhedronDescendingConnectivity[DescendingConnectivitySize] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,3,17,18};
+
+  myDescendingConnectivity.setPolyhedronConnectivity(MED_DESCENDING,PolyhedronDescendingConnectivity,PolyhedronIndex,DescendingConnectivitySize,NumberOfPolyhedron);
+
+  cout << myNodalConnectivity;
+  cout << myDescendingConnectivity;
+
+  return 0;
+}
diff --git a/src/MEDMEM/test_MEDMEM_PolyDriverMedMeshRead.cxx b/src/MEDMEM/test_MEDMEM_PolyDriverMedMeshRead.cxx
new file mode 100644 (file)
index 0000000..be1886b
--- /dev/null
@@ -0,0 +1,43 @@
+// This program test the implementation of the class MED_MESH_RDONLY_DRIVER for Polygons and Polyhedron. //
+
+#include "MEDMEM_define.hxx"
+#include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_MedMeshDriver.hxx"
+
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
+using namespace std;
+using namespace MEDMEM;
+
+
+int main (int argc, char ** argv)
+{
+  if (argc <3) // after 3, ignored !
+    {
+      cerr << "Usage : " << argv[0] 
+          << " filename meshname" << endl << endl;
+      exit(-1);
+    }
+
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
+  string filename = argv[1];
+  string meshname = argv[2];
+
+  MESH * myMesh = new MESH();
+  myMesh->setName(meshname);
+  MED_MESH_RDONLY_DRIVER myMeshReadDriver(filename,myMesh);
+  myMeshReadDriver.setMeshName(meshname);
+  myMeshReadDriver.open();
+  myMeshReadDriver.read();
+  myMeshReadDriver.close();
+
+  cout << * myMesh << endl;
+
+  delete myMesh;
+  return 0;
+}
diff --git a/src/MEDMEM/test_MEDMEM_PolyDriverMedMeshWrite.cxx b/src/MEDMEM/test_MEDMEM_PolyDriverMedMeshWrite.cxx
new file mode 100644 (file)
index 0000000..7f3a74d
--- /dev/null
@@ -0,0 +1,51 @@
+// This program test the implementation of the class MED_MESH_WRONLY_DRIVER for Polygons and Polyhedron. //
+
+#include "MEDMEM_define.hxx"
+#include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_MedMeshDriver.hxx"
+
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
+using namespace std;
+using namespace MEDMEM;
+
+
+int main (int argc, char ** argv)
+{
+  if (argc <3) // after 3, ignored !
+    {
+      cerr << "Usage : " << argv[0] 
+          << " filename meshname" << endl << endl;
+      exit(-1);
+    }
+
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
+  string filename = argv[1];
+  string meshname = argv[2];
+
+  // Lecture d'un fichier MED
+  MESH * myMesh = new MESH();
+  myMesh->setName(meshname);
+  MED_MESH_RDONLY_DRIVER myMeshReadDriver(filename,myMesh);
+  myMeshReadDriver.setMeshName(meshname);
+  myMeshReadDriver.open();
+  myMeshReadDriver.read();
+  myMeshReadDriver.close();
+
+  // Ecriture dans un fichier MED
+  string filename2 = filename + "_copy";
+  MED_MESH_WRONLY_DRIVER myMeshWriteDriver(filename2,myMesh);
+  myMeshWriteDriver.setMeshName(meshname);
+  myMeshWriteDriver.open();
+  myMeshWriteDriver.write();
+  myMeshWriteDriver.close();
+
+
+  delete myMesh;
+  return 0;
+}
diff --git a/src/MEDMEM/test_MEDMEM_PolyhedronArray.cxx b/src/MEDMEM/test_MEDMEM_PolyhedronArray.cxx
new file mode 100644 (file)
index 0000000..83b6239
--- /dev/null
@@ -0,0 +1,45 @@
+// This program test the implementation of the POLYHEDRONARRAY class. //
+
+#include "MEDMEM_PolyhedronArray.hxx"
+
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
+using namespace std;
+using namespace MEDMEM;
+using namespace MED_EN;
+
+int main(void)
+{
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
+  POLYHEDRONARRAY myPArray(2,11,40);
+  med_int polyhedronindex[2] = {1,7};
+  med_int facesindex[11] = {1,5,9,13,17,21,25,28,31,34,37};
+  med_int nodes[40] = {1,2,6,5,2,3,7,6,4,3,7,8,1,4,8,5,1,2,3,4,5,6,7,8,5,6,9,6,7,9,7,8,9,8,5,9,5,6,7,8};
+
+  myPArray.setPolyhedronIndex(polyhedronindex);
+  myPArray.setFacesIndex(facesindex);
+  myPArray.setNodes(nodes);
+
+  POLYHEDRONARRAY myPArray2(myPArray);
+
+  const med_int* __polyhedronindex = myPArray2.getPolyhedronIndex();
+  const med_int* __facesindex = myPArray2.getFacesIndex();
+  const med_int* __nodes = myPArray2.getNodes();
+
+  cout << "__polyhedronindex =" << endl;
+  for (int i=0; i<2; i++)
+    cout << __polyhedronindex[i] << endl;
+  cout << "__facesindex =" << endl;
+  for (int i=0; i<11; i++)
+    cout << __facesindex[i] << endl;
+  cout << "__nodes =" << endl;
+  for (int i=0; i<40; i++)
+    cout << __nodes[i] << endl;
+
+  return 0;
+}
index 1157fb020ae6879aa2944e466c00096d4a8faa9c..ed13f443d50801f2ac93ab0dc1efeb6a07fe50ea 100644 (file)
@@ -1,10 +1,17 @@
 #include "utilities.h"
 #include "MEDMEM_SkyLineArray.hxx"
 
 #include "utilities.h"
 #include "MEDMEM_SkyLineArray.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 
 int main (int argc, char ** argv) {
 using namespace std;
 using namespace MEDMEM;
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   int NumberOfCell = 3 ; // 1 triangle,1 quadrangle,1 triangle
   int Size = 10 ; // 10 nodes
 
   int NumberOfCell = 3 ; // 1 triangle,1 quadrangle,1 triangle
   int Size = 10 ; // 10 nodes
diff --git a/src/MEDMEM/test_MEDMEM_poly3D.cxx b/src/MEDMEM/test_MEDMEM_poly3D.cxx
new file mode 100755 (executable)
index 0000000..7e134ee
--- /dev/null
@@ -0,0 +1,293 @@
+// This program test the implementation of the class MED_MESH_RDONLY_DRIVER for Polygons and Polyhedron. //
+
+#include "MEDMEM_define.hxx"
+#include "MEDMEM_Mesh.hxx"
+#include "MEDMEM_Support.hxx"
+#include "MEDMEM_Family.hxx"
+#include "MEDMEM_Field.hxx"
+#include "MEDMEM_ModulusArray.hxx"
+#include "MEDMEM_MedMeshDriver.hxx"
+#include "LocalTraceCollector.hxx"
+#include <vector>
+
+#define MESHNAME "poly3D"
+
+using namespace std;
+using namespace MEDMEM;
+using namespace MED_EN;
+
+#define DIM_OF_FIELD 3
+
+
+class SupportTester {
+private:
+  const int *_tabOfNodes;
+  vector<int> _eltsActiveYet;
+  vector<int> _lgthOfEltsActiveYet;
+public:
+  SupportTester(const int *tabOfNodes, int nbOfElts, int nbOfNodesPerElt);
+  SupportTester(const int *tabOfNodes, int nbOfElts, const int *nbOfNodesPerElt);
+  bool isIncludedAndNotAlreadyConsumed(const int *tabOfNodesOfTheElementToTest);
+  bool areAllEltsConsumed();
+private:
+  static bool areEquivalent(const int *nodes1, const int *nodes2, int nbOfNodes);
+};
+
+SupportTester::SupportTester(const int *tabOfNodes, int nbOfElts, int nbOfNodesPerElt):_tabOfNodes(tabOfNodes)
+{
+  for(int i=0;i<nbOfElts;i++)
+    {
+      _eltsActiveYet.push_back(i*nbOfNodesPerElt);
+      _lgthOfEltsActiveYet.push_back(nbOfNodesPerElt);
+    }
+}
+
+SupportTester::SupportTester(const int *tabOfNodes, int nbOfElts, const int *nbOfNodesPerElt):_tabOfNodes(tabOfNodes)
+{
+  int offset=0;
+  for(int i=0;i<nbOfElts;i++)
+    {
+      _eltsActiveYet.push_back(offset);
+      _lgthOfEltsActiveYet.push_back(nbOfNodesPerElt[i]);
+    }
+}
+
+bool SupportTester::isIncludedAndNotAlreadyConsumed(const int *tabOfNodesOfTheElementToTest)
+{
+  vector<int>::iterator iter2=_lgthOfEltsActiveYet.begin();
+  for(vector<int>::iterator iter=_eltsActiveYet.begin();iter!=_eltsActiveYet.end();iter++)
+    if(areEquivalent(_tabOfNodes+(*iter),tabOfNodesOfTheElementToTest,*iter2))
+      {
+       _eltsActiveYet.erase(iter);
+       _lgthOfEltsActiveYet.erase(iter2);
+       return true;
+      }
+    else
+      {
+       iter2++;
+      }
+  return false;
+}
+
+bool SupportTester::areAllEltsConsumed()
+{
+  return _eltsActiveYet.size()==0;
+}
+
+bool SupportTester::areEquivalent(const int *nodes1, const int *nodes2, int nbOfNodes)
+{
+  MEDMODULUSARRAY arr1(nbOfNodes,nodes1);
+  MEDMODULUSARRAY arr2(nbOfNodes,nodes2);
+  return arr1.compare(arr2)!=0;
+}
+
+int main (int argc, char ** argv)
+{
+  LocalTraceCollector::instance();
+  if (argc<2) // after 2, ignored !
+    {
+      cerr << "Usage : " << argv[0] << " poly3D.med typically in ../../share/salome/resources" << endl << endl;
+      exit(-1);
+    }
+  int nbOfPtsForTest=0;
+  int i;
+  string filename = argv[1];
+  MESH * myMesh = new MESH;
+  myMesh->setName(MESHNAME);
+  MED_MESH_RDONLY_DRIVER myMeshReadDriver(filename,myMesh);
+  myMeshReadDriver.setMeshName(MESHNAME);
+  myMeshReadDriver.open();
+  myMeshReadDriver.read();
+  myMeshReadDriver.close();
+  //Test 1 : test if connectivity of poly3D mesh is OK
+  if(myMesh->getMeshDimension()==3 && myMesh->getSpaceDimension()==3)
+    nbOfPtsForTest++;
+  if(myMesh->getNumberOfElementsWithPoly(MED_EN::MED_CELL,MED_EN::MED_TETRA4)==1 && myMesh->getNumberOfElementsWithPoly(MED_EN::MED_CELL,MED_EN::MED_POLYHEDRA)==2)
+    nbOfPtsForTest++;
+  const int REFnodalConnForTetra[4]={17, 9, 18, 19};
+  const int *connForTetraToTest=myMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,MED_TETRA4);
+  const int *connIndForTetraToTest=myMesh->getConnectivityIndex(MED_NODAL,MED_CELL);
+  for(i=connIndForTetraToTest[0]-1;i<connIndForTetraToTest[1]-1;i++)
+    if(connForTetraToTest[i]==REFnodalConnForTetra[i])
+      nbOfPtsForTest++;
+  //6
+  const int *globIndex=myMesh->getPolyhedronIndex(MED_NODAL);
+  const int *nodalConnOfFaces=myMesh->getPolyhedronConnectivity(MED_NODAL);
+  const int *facesIndex=myMesh->getPolyhedronFacesIndex();
+  if(globIndex[1]-globIndex[0]==9 && globIndex[2]-globIndex[1]==10)// resp 9 faces and 10 faces are in polyh 1 and 2.
+    nbOfPtsForTest++;
+  //7
+  const int REFfacesIndex[20]={1, 7, 11, 15, 19, 23, 27, 31, 34, 39, 44, 48, 52, 55, 58, 61, 64, 68, 72, 75};
+  const int REFnodalConnOfFaces[74]={1, 2, 3, 4, 5, 6, // Polyhedron 1
+                                    1, 7, 8, 2, 
+                                    2, 8, 9, 3, 
+                                    4, 3, 9, 10, 
+                                    5, 4, 10, 11, 
+                                    6, 5, 11, 12, 
+                                    1, 6, 12, 7, 
+                                    7, 12, 8, 10, 
+                                    9, 8, 12, 11,
+
+                                    13, 14, 15, 3, 2, // Polyhedron 2
+                                    13, 2, 8, 16, 
+                                    14, 13, 16, 17, 
+                                    15, 14, 17, 15, 
+                                    17, 18, 15, 
+                                    18, 9, 3, 
+                                    15, 9, 2, 
+                                    3, 9, 8, 
+                                    8, 9, 17, 16, 
+                                    9, 18, 17 };
+  for(i=0;i<20;i++)
+    if(REFfacesIndex[i]==facesIndex[i])
+      nbOfPtsForTest++;
+  for(i=0;i<74;i++)
+    if(REFnodalConnOfFaces[i]==nodalConnOfFaces[i])
+      nbOfPtsForTest++;
+  if(nbOfPtsForTest!=101)
+    {
+      cout << "TEST1 K0 ! : Invalid Globaldata in memory..." << endl;
+      return 1;
+    }
+  // TEST 2 : FAMILY 
+  nbOfPtsForTest=0;
+  vector<FAMILY*> families=myMesh->getFamilies(MED_FACE);
+  if(families.size()==3)
+    nbOfPtsForTest++;
+  vector<FAMILY *>::iterator iter=families.begin();
+  FAMILY *fam1=*(iter++);
+  FAMILY *fam2=*(iter++);
+  FAMILY *fam3=*(iter);
+  const int *nbs;
+  // family 1
+  if(fam1->getNumberOfTypes()==1 && fam1->getTypes()[0]==MED_POLYGON && fam1->getNumberOfElements(MED_ALL_ELEMENTS)==3)
+    nbOfPtsForTest++;
+  nbs=fam1->getNumber(MED_ALL_ELEMENTS);
+  const int REFTabForPolyg[16]={1, 2, 3, 4, 5, 6, 10, 9, 8, 12, 11, 13, 14, 15, 3, 2};
+  const int REFTabForPolygLgth[3]={6,5,5};
+  SupportTester test1(REFTabForPolyg,3,REFTabForPolygLgth);
+  for(i=0;i<3;i++)
+    {
+      int lgth;
+      const int *conn=((CONNECTIVITY *)myMesh->getConnectivityptr())->getConnectivityOfAnElementWithPoly(MED_NODAL,MED_FACE,nbs[i],lgth);
+      if(test1.isIncludedAndNotAlreadyConsumed(conn))
+       nbOfPtsForTest++;
+    }
+  if(test1.areAllEltsConsumed())
+    nbOfPtsForTest++;
+  // family 2
+  if(fam2->getNumberOfElements(MED_ALL_ELEMENTS)==8)
+    nbOfPtsForTest++;
+  nbs=fam2->getNumber(MED_ALL_ELEMENTS);
+  const int REFTabForQuad[32]={1, 7, 8, 2, 2, 8, 9, 3, 4, 3, 9, 10, 5, 4, 10, 11, 6, 5, 11, 12, 1, 6, 12, 7, 14, 13, 16, 17, 8, 9, 17, 16};
+  SupportTester test2(REFTabForQuad,8,4);
+  for(i=0;i<8;i++)
+    {
+      int lgth;
+      const int *conn=((CONNECTIVITY *)myMesh->getConnectivityptr())->getConnectivityOfAnElementWithPoly(MED_NODAL,MED_FACE,nbs[i],lgth);
+      if(test2.isIncludedAndNotAlreadyConsumed(conn))
+       nbOfPtsForTest++;
+    }
+  if(test2.areAllEltsConsumed())
+    nbOfPtsForTest++;
+  // family 3
+  if(fam3->getNumberOfElements(MED_ALL_ELEMENTS)==6)
+    nbOfPtsForTest++;
+  nbs=fam3->getNumber(MED_ALL_ELEMENTS);
+  const int REFTabForTria[18]={7, 12, 8, 15, 14, 17, 15, 17, 18, 15, 18, 9, 3, 15, 9, 18, 17, 9};
+  SupportTester test3(REFTabForTria,6,3);
+  for(i=0;i<6;i++)
+    {
+      int lgth;
+      const int *conn=((CONNECTIVITY *)myMesh->getConnectivityptr())->getConnectivityOfAnElementWithPoly(MED_NODAL,MED_FACE,nbs[i],lgth);
+      if(test3.isIncludedAndNotAlreadyConsumed(conn))
+       nbOfPtsForTest++;
+    }
+  if(test3.areAllEltsConsumed())
+    nbOfPtsForTest++;
+  if(nbOfPtsForTest!=21)
+    {
+      cout << "TEST2 K0 ! : Invalid data in memory for families !!!" << endl;
+      return 1;
+    }
+  // TEST 3 : volumes, aeras, barycenter
+  nbOfPtsForTest=0;
+  SUPPORT *supOnCell=new SUPPORT(myMesh);
+  FIELD<double>* vol1=myMesh->getVolume(supOnCell);
+  int lgth=vol1->getValueLength(MED_FULL_INTERLACE);
+  const double *vals=vol1->getValue(MED_FULL_INTERLACE);
+  if(lgth==3)
+    nbOfPtsForTest++;
+  const double REFVolOfPolyHedron[3]={2.333333333333333,11.66666666666666,13.83224131414673};
+  for(i=0;i<3;i++)
+    if(fabs(REFVolOfPolyHedron[i]-vals[i])<1e-12)
+      nbOfPtsForTest++;
+  delete vol1;
+  FIELD<double>* bary=myMesh->getBarycenter(supOnCell);
+  lgth=bary->getValueLength(MED_FULL_INTERLACE);
+  vals=bary->getValue(MED_FULL_INTERLACE);
+  if(lgth==9)
+    nbOfPtsForTest++;
+  const double REFBaryOfPolyHedron[9]= {5.5, 1, -1, 2, 1.5, 1.0833333333333333, 5.1, 1.6, 0.9};
+  for(i=0;i<9;i++)
+    if(fabs(REFBaryOfPolyHedron[i]-vals[i])<1e-12)
+      nbOfPtsForTest++;
+  delete bary;
+  delete supOnCell;
+  //area
+  vol1=myMesh->getArea(fam1);
+  lgth=vol1->getValueLength(MED_FULL_INTERLACE);
+  vals=vol1->getValue(MED_FULL_INTERLACE);
+  if(lgth==3)
+    nbOfPtsForTest++;
+  const double REFAreaForPolyg[3]={6,5,6.5};
+  for(i=0;i<3;i++)
+    if(fabs(REFAreaForPolyg[i]-vals[i])<1e-12)
+      nbOfPtsForTest++;
+
+  vol1=myMesh->getArea(fam2);
+  lgth=vol1->getValueLength(MED_FULL_INTERLACE);
+  vals=vol1->getValue(MED_FULL_INTERLACE);
+  if(lgth==8)
+    nbOfPtsForTest++;
+  const double REFAreaForQuad[8]={2.1213203435596424, 2.8284271247461903, 4.4721359549995796, 4.4721359549995796, 
+                                 2.8284271247461903, 2.1213203435596428, 3.6798724963767362, 4};
+  for(i=0;i<8;i++)
+    if(fabs(REFAreaForQuad[i]-vals[i])<1e-12)
+      nbOfPtsForTest++;
+  delete vol1;
+
+  vol1=myMesh->getArea(fam3);
+  lgth=vol1->getValueLength(MED_FULL_INTERLACE);
+  vals=vol1->getValue(MED_FULL_INTERLACE);
+  if(lgth==6)
+    nbOfPtsForTest++;
+  const double REFAreaForTri[6]={2.9580398915498081, 1.4142135623730951, 2.2360679774997898, 
+                                3.3541019662496847, 3.3541019662496847, 2.2360679774997898};
+  for(i=0;i<6;i++)
+    if(fabs(REFAreaForTri[i]-vals[i])<1e-12)
+      nbOfPtsForTest++;
+  delete vol1;
+  if(nbOfPtsForTest!=34)
+    {
+      cout << "TEST3 K0 ! : Error in caluclation of basic properties !!!" << endl;
+      return 1;
+    }
+  // TEST 4 -- CHECK FOR Reverse descending using getBoundaryElements.
+  nbOfPtsForTest=0;
+  SUPPORT *bound=myMesh->getBoundaryElements(MED_NODE);
+  if(bound->getNumberOfElements(MED_ALL_ELEMENTS)==19)
+    nbOfPtsForTest++;
+  if(bound->isOnAllElements())
+      nbOfPtsForTest++;
+  if(nbOfPtsForTest!=2)
+    {
+      cout << "TEST4 K0 ! : Error in getBoundaryElements probably due to Reverse descending !!!" << endl;
+      return 1;
+    }
+  delete bound;
+  ///////////
+  cout << "ALL TESTS OK !!!" << endl;
+  delete myMesh;
+  return 0;
+}
index 4bd9744eb1276468895939ca2e7f017359359587..4ae4262367478a87b0e342d2c651734e1766e44d 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -78,6 +82,9 @@ void affiche_medarray(MEDARRAY<double> & myMedArray)
 
 
 int main (int argc, char ** argv) {
 
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   /*
   if ((argc !=3) && (argc != 4)) {
 
   /*
   if ((argc !=3) && (argc != 4)) {
index 0b1d701820e68f25d4a837aba16e289e29f1580e..87e07fb726046e879df9228202a7d3aa01568e30 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -119,12 +123,16 @@ void affiche_connectivity(const CONNECTIVITY * myConnectivity, MESH * myMesh)
 
 int main (int argc, char ** argv) {
 
 
 int main (int argc, char ** argv) {
 
-
   if (argc <3) { // after 3, ignored !
     cerr << "Usage : " << argv[0] 
         << " filename meshname" << endl << endl;
     exit(-1);
   }
   if (argc <3) { // after 3, ignored !
     cerr << "Usage : " << argv[0] 
         << " filename meshname" << endl << endl;
     exit(-1);
   }
+
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
   string filename = argv[1] ;
   string meshname = argv[2] ;
 
   string filename = argv[1] ;
   string meshname = argv[2] ;
 
index f625420934c7ff03718c607ccca7a15d64c08bde..72d41e69f0a2e24c14943f1d626e031bf9836ae7 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -57,6 +61,9 @@ void affiche_coordinate(COORDINATE & myCoordinate, int _numberofNodes, int _spac
 
 
 int main (int argc, char ** argv) {
 
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   /*
   if ((argc !=3) && (argc != 4)) {
 
   /*
   if ((argc !=3) && (argc != 4)) {
index b5549f8282eaacdbcc3914bd01c87486ab490760..e09d36eeeb11618842698f6b32f8e03f9afc5d43 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -70,6 +74,9 @@ void affiche_groupe(MESH *myMesh,medEntityMesh Entity)
 }
 
 int main (int argc, char ** argv) {
 }
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   int read;
 
 
   int read;
 
index 4418147d78bd735078f95566a03fde6d943233e2..f25e4cd8c660e947ac43e215c9e8d1b60c44be63 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -60,6 +64,9 @@ void affiche_fieldT(FIELD<double> * myField, const SUPPORT * mySupport)
 }
 
 int main (int argc, char ** argv) {
 }
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   // int read; !! UNUSED VARIABLE !!
 
 
   // int read; !! UNUSED VARIABLE !!
 
index 8452e743f5c02904dfcc48a6ae0ae1c91cb90127..1be6744142336f6eb6880902870d5177918297e1 100644 (file)
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 #include "MEDMEM_Support.hxx"
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
+
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
@@ -53,6 +58,9 @@ void affiche_field(FIELD_ * myField, const SUPPORT * mySupport)
 
 
 int main (int argc, char ** argv) {
 
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   // int read; !! UNUSED VARIABLE !!
 
 
   // int read; !! UNUSED VARIABLE !!
 
index 96103825dad052a9f77246019535471bb1daa92f..a2bc356cf2d4bd1ed9da994c2afa1f259c1dc419 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -65,6 +69,9 @@ void affiche_groupe(const GROUP * myGroup)
 }
 
 int main (int argc, char ** argv) {
 }
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   int read;
 
 
   int read;
 
index c3ec5109bf0951b54fc227208ce96bc9539f1277..9cfd93c888a5c0a8bc8641a1e1e514ef3374d054 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -78,6 +82,9 @@ void affiche_medarray(MEDARRAY<double> & myMedArray)
 
 
 int main (int argc, char ** argv) {
 
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   /*
   if ((argc !=3) && (argc != 4)) {
 
   /*
   if ((argc !=3) && (argc != 4)) {
index 655d37220fbf14122b377cc2595456f4b26a1735..d24215b5f643563473905413372d890a4459e919 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 
 using namespace std;
 using namespace MEDMEM;
 
-
 int main (int argc, char ** argv) {
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   int read;
 
 
   int read;
 
index 21cefbdf4c9859c4c6e374af2cc32347db418ad0..f4ad559bdcefd1a5af7756dbf76277a507fdb83c 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -75,6 +79,9 @@ void affiche_groupe(MESH *myMesh,medEntityMesh Entity)
 }
 
 int main (int argc, char ** argv) {
 }
 
 int main (int argc, char ** argv) {
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
 
   int read;
 
 
   int read;
 
index ad7b3f4ead2587983ae4a6e91fdc933fce82a16b..6d877695c0dff2e3312f1a6ba6d5c6439a0a2dfe 100644 (file)
@@ -1,6 +1,10 @@
 #include "MEDMEM_GibiMeshDriver.hxx"
 #include "MEDMEM_Mesh.hxx"
 
 #include "MEDMEM_GibiMeshDriver.hxx"
 #include "MEDMEM_Mesh.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 int main (int argc, char ** argv)
 using namespace std;
 using namespace MEDMEM;
 int main (int argc, char ** argv)
@@ -13,6 +17,11 @@ int main (int argc, char ** argv)
        << "-> lit le fichier gibi filename ,crée 2 fichiers : MED et VTK" << endl;
        exit(-1);
     }
        << "-> lit le fichier gibi filename ,crée 2 fichiers : MED et VTK" << endl;
        exit(-1);
     }
+
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
     string gibifilename  = argv[1];
 
     // Construction des noms de fichier
     string gibifilename  = argv[1];
 
     // Construction des noms de fichier
index 4825b9acbcdeaa7e68d6315d3cd9cc17ab0bdd39..3a33db75c02149128cb4d9f0d7719435b7815f1c 100644 (file)
@@ -1,5 +1,9 @@
 #include "MEDMEM_Grid.hxx"
 
 #include "MEDMEM_Grid.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
@@ -17,6 +21,10 @@ int main (int argc, char ** argv) {
     if (argc != 3)
        usage(argv[0]);
 
     if (argc != 3)
        usage(argv[0]);
 
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
     const int SpaceDimension=atoi(argv[1]);
     const int nbMaille=atoi(argv[2]);
     if(SpaceDimension>3 || SpaceDimension<1 || nbMaille<1)
     const int SpaceDimension=atoi(argv[1]);
     const int nbMaille=atoi(argv[2]);
     if(SpaceDimension>3 || SpaceDimension<1 || nbMaille<1)
index 4d071116636ffb3628d3f239ea04c595146495b4..3120666899e279c3bae0f9067da40b56c0d46fd4 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 double myfunction1(double x)
 {
     return 0.25*(x-1.0);
 double myfunction1(double x)
 {
     return 0.25*(x-1.0);
@@ -190,6 +194,11 @@ int main (int argc, char ** argv)
        << "Use optional option -v to select verbose mode" << endl;
        exit(-1);
     }
        << "Use optional option -v to select verbose mode" << endl;
        exit(-1);
     }
+
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
     string filename  = argv[verbose+1];
     string meshname  = argv[verbose+2];
     string fieldname = argv[verbose+3];
     string filename  = argv[verbose+1];
     string meshname  = argv[verbose+2];
     string fieldname = argv[verbose+3];
index d9098fccead1e9498773fbf5a6de09bceb81057a..59b1a633532b6e1b3f63cb6740ad193dfe222f55 100644 (file)
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
 #include "MEDMEM_Field.hxx"
 #include "MEDMEM_define.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
@@ -101,6 +105,11 @@ int main (int argc, char ** argv)
        << " filename meshname fieldname" << endl << endl;
        exit(-1);
     }
        << " filename meshname fieldname" << endl << endl;
        exit(-1);
     }
+
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
     string filename = argv[1] ;
     string meshname = argv[2] ;
     string fieldname = argv[3];
     string filename = argv[1] ;
     string meshname = argv[2] ;
     string fieldname = argv[3];
index 2edf13edfd584f8c6d5912b7e6a7a515e7808d0c..6371c6aee060d594738be040a519714027a4650e 100644 (file)
@@ -1,6 +1,10 @@
 #include "MEDMEM_PorflowMeshDriver.hxx"
 #include "MEDMEM_Mesh.hxx"
 
 #include "MEDMEM_PorflowMeshDriver.hxx"
 #include "MEDMEM_Mesh.hxx"
 
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
+
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
@@ -15,6 +19,11 @@ int main (int argc, char ** argv)
        << "-> lit le fichier Porflowfilename ,crée 2 fichiers : MED et VTK" << endl;
        exit(-1);
     }
        << "-> lit le fichier Porflowfilename ,crée 2 fichiers : MED et VTK" << endl;
        exit(-1);
     }
+
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+
     string porflowfilename  = argv[1];
 
     // Construction des noms de fichier
     string porflowfilename  = argv[1];
 
     // Construction des noms de fichier
index f861e36834e41913f47a39578275cce95c4e72cd..b97e406f4f48a25d4cfc63f179e7bbdbb26e3109 100755 (executable)
@@ -31,6 +31,8 @@
 using namespace std;
 using namespace MEDMEM;
 
 using namespace std;
 using namespace MEDMEM;
 
+#define MED_TAILLE_PNOM  16
+
 void usage(char * name)
 {
   cout << "    " << name <<" <file name>"<< " <mesh name> " << " <interlace mode>" << endl;
 void usage(char * name)
 {
   cout << "    " << name <<" <file name>"<< " <mesh name> " << " <interlace mode>" << endl;
index 6b5d7d133bcbf2ef2e4a91ac156af0995c98b318..0dc1e47ccf4e271948baa41ffef9fde2ba05a9ca 100755 (executable)
@@ -95,7 +95,7 @@ int main (int argc, char ** argv) {
   cout << "(* INFORMATIONS GENERALES : *)" << endl;
   cout << "(****************************)" << endl;
 
   cout << "(* INFORMATIONS GENERALES : *)" << endl;
   cout << "(****************************)" << endl;
 
-  string chainevide(MED_TAILLE_PNOM+2,' ');
+  //  string chainevide(MED_TAILLE_PNOM+2,' ');
   cout << "- Nom du maillage : <<"    << meshName       << ">>" << endl;
   cout << "- Dimension d'espace : "<< SpaceDimension <<  endl;
   cout << "- Dimension du maillage : "<< MeshDimension <<  endl;
   cout << "- Nom du maillage : <<"    << meshName       << ">>" << endl;
   cout << "- Dimension d'espace : "<< SpaceDimension <<  endl;
   cout << "- Dimension du maillage : "<< MeshDimension <<  endl;
index 8b3e3a9a61dec84e3067ab3d28a7500932f44fb8..a8a695c43d48600fd16989f594ff3f4f84c90297 100755 (executable)
@@ -34,6 +34,8 @@ using namespace std;
 using namespace MEDMEM;
 using namespace MED_EN;
 
 using namespace MEDMEM;
 using namespace MED_EN;
 
+#define MED_NBR_GEOMETRIE_MAILLE 15
+
 void usage(char * name)
 {
   cout << "    " << name << endl;
 void usage(char * name)
 {
   cout << "    " << name << endl;
@@ -48,140 +50,140 @@ int main (int argc, char ** argv)
   cout << "CELLMODEL Test" << endl ;
   cout << "--------------" << endl;
 
   cout << "CELLMODEL Test" << endl ;
   cout << "--------------" << endl;
 
-/*     -----------------------------------------------------
+  /*   -----------------------------------------------------
        Construction de tous les types de cellmodel possibles
        -----------------------------------------------------
        Construction de tous les types de cellmodel possibles
        -----------------------------------------------------
-*/
+  */
 
 
-   CELLMODEL * tous  =new CELLMODEL[MED_NBR_GEOMETRIE_MAILLE ];
-   const medGeometryElement  allCellType[MED_NBR_GEOMETRIE_MAILLE ]=
-            {MED_POINT1, MED_SEG2,    MED_SEG3,   MED_TRIA3,
-              MED_QUAD4,  MED_TRIA6,   MED_QUAD8,  MED_TETRA4,
-              MED_PYRA5,  MED_PENTA6,  MED_HEXA8,  MED_TETRA10,
-              MED_PYRA13, MED_PENTA15, MED_HEXA20 };
+  CELLMODEL * tous  =new CELLMODEL[MED_NBR_GEOMETRIE_MAILLE ];
+  const medGeometryElement  allCellType[MED_NBR_GEOMETRIE_MAILLE ]=
+    {MED_POINT1, MED_SEG2,    MED_SEG3,   MED_TRIA3,
+     MED_QUAD4,  MED_TRIA6,   MED_QUAD8,  MED_TETRA4,
+     MED_PYRA5,  MED_PENTA6,  MED_HEXA8,  MED_TETRA10,
+     MED_PYRA13, MED_PENTA15, MED_HEXA20 };
 
   for (int i=0; i<MED_NBR_GEOMETRIE_MAILLE ; i++)
 
   for (int i=0; i<MED_NBR_GEOMETRIE_MAILLE ; i++)
-  {
-       tous[i]=CELLMODEL(allCellType[i]);
-  }
+    {
+      tous[i]=CELLMODEL(allCellType[i]);
+    }
 
 
-/*     -----------------------------------------------------
+  /*   -----------------------------------------------------
        Boucle sur  tous les types de cellmodel possibles
        - Chaque Méthode de cellmodel est appelee
        -----------------------------------------------------
        Boucle sur  tous les types de cellmodel possibles
        - Chaque Méthode de cellmodel est appelee
        -----------------------------------------------------
-*/
+  */
   for (int i=0; i<MED_NBR_GEOMETRIE_MAILLE ; i++)
   for (int i=0; i<MED_NBR_GEOMETRIE_MAILLE ; i++)
-  {
-       cout << endl;
-       cout << geoNames[tous[i].getType()] << endl;
-        cout << "__________________"  << endl;
+    {
+      cout << endl;
+      cout << geoNames[tous[i].getType()] << endl;
+      cout << "__________________"  << endl;
 
 
-       try 
+      try 
        {
        {
-               cout << "CellModel de Nom : " << tous[i].getName() << endl;
+         cout << "CellModel de Nom : " << tous[i].getName() << endl;
        }
        }
-       catch ( const std::exception &e )
+      catch ( const std::exception &e )
        {
        {
-                       cout << "-------------------------------" << endl;
-               cout << "       Pb au getName()         " << endl;
-               cout << "-------------------------------" << endl;
-               MESSAGE( "catched exception : " << e.what() ) ;
-               return EXIT_FAILURE ;
+         cout << "-------------------------------" << endl;
+         cout << "     Pb au getName()         " << endl;
+         cout << "-------------------------------" << endl;
+         MESSAGE( "catched exception : " << e.what() ) ;
+         return EXIT_FAILURE ;
        }
        }
-       catch (...)
+      catch (...)
        {
        {
-               cout << "-------------------------------" << endl;
-               cout << "       Pb au getName()         " << endl;
-               cout << "-------------------------------" << endl;
-               return EXIT_FAILURE ;
+         cout << "-------------------------------" << endl;
+         cout << "     Pb au getName()         " << endl;
+         cout << "-------------------------------" << endl;
+         return EXIT_FAILURE ;
        };
 
        };
 
-       try 
+      try 
        {
        {
-               cout << "Nb de Vertexes   : " << tous[i].getNumberOfVertexes() << endl;
+         cout << "Nb de Vertexes   : " << tous[i].getNumberOfVertexes() << endl;
        }
        }
-       catch ( const std::exception &e )
+      catch ( const std::exception &e )
        {
        {
-                       cout << "-------------------------------" << endl;
-               cout << "       Pb au getNumberOfVertexes()     " << endl;
-               cout << "-------------------------------" << endl;
-               MESSAGE( "catched exception : " << e.what() ) ;
-               return EXIT_FAILURE ;
+         cout << "-------------------------------" << endl;
+         cout << "     Pb au getNumberOfVertexes()     " << endl;
+         cout << "-------------------------------" << endl;
+         MESSAGE( "catched exception : " << e.what() ) ;
+         return EXIT_FAILURE ;
        }
        }
-       catch (...)
+      catch (...)
        {
        {
-               cout << "---------------------------------------" << endl;
-               cout << "       Pb au getNumberOfVertexes()     " << endl;
-               cout << "---------------------------------------" << endl;
-               return EXIT_FAILURE ;
+         cout << "---------------------------------------" << endl;
+         cout << "     Pb au getNumberOfVertexes()     " << endl;
+         cout << "---------------------------------------" << endl;
+         return EXIT_FAILURE ;
        };
 
        };
 
-       try 
+      try 
        {
        {
-               cout << "Nb de Noeuds     : " << tous[i].getNumberOfNodes() << endl;
+         cout << "Nb de Noeuds     : " << tous[i].getNumberOfNodes() << endl;
        }
        }
-       catch ( const std::exception &e )
+      catch ( const std::exception &e )
        {
        {
-                       cout << "-------------------------------" << endl;
-               cout << "       Pb au getNumberOfNodes()  " << endl;
-               cout << "-------------------------------" << endl;
-               MESSAGE( "catched exception : " << e.what() ) ;
-               return EXIT_FAILURE ;
+         cout << "-------------------------------" << endl;
+         cout << "     Pb au getNumberOfNodes()  " << endl;
+         cout << "-------------------------------" << endl;
+         MESSAGE( "catched exception : " << e.what() ) ;
+         return EXIT_FAILURE ;
        }
        }
-       catch (...)
+      catch (...)
        {
        {
-               cout << "---------------------------------" << endl;
-               cout << "       Pb au getNumberOfNodes()  " << endl;
-               cout << "---------------------------------" << endl;
-               return EXIT_FAILURE ;
+         cout << "---------------------------------" << endl;
+         cout << "     Pb au getNumberOfNodes()  " << endl;
+         cout << "---------------------------------" << endl;
+         return EXIT_FAILURE ;
        };
 
        };
 
-       int dimension;
-       try 
+      int dimension;
+      try 
        {
        {
-               dimension=tous[i].getDimension();
-               cout << "Dimension        : " << dimension << endl;     
+         dimension=tous[i].getDimension();
+         cout << "Dimension        : " << dimension << endl;   
        }
        }
-       catch ( const std::exception &e )
+      catch ( const std::exception &e )
        {
        {
-                       cout << "-------------------------------" << endl;
-               cout << "       Pb au getDimension()    " << endl;
-               cout << "-------------------------------" << endl;
-               MESSAGE( "catched exception : " << e.what() ) ;
-               return EXIT_FAILURE ;
+         cout << "-------------------------------" << endl;
+         cout << "     Pb au getDimension()    " << endl;
+         cout << "-------------------------------" << endl;
+         MESSAGE( "catched exception : " << e.what() ) ;
+         return EXIT_FAILURE ;
        }
        }
-       catch (...)
+      catch (...)
        {
        {
-               cout << "-------------------------------" << endl;
-               cout << "       Pb au getDimension()    " << endl;
-               cout << "-------------------------------" << endl;
-               return EXIT_FAILURE ;
+         cout << "-------------------------------" << endl;
+         cout << "     Pb au getDimension()    " << endl;
+         cout << "-------------------------------" << endl;
+         return EXIT_FAILURE ;
        }
 
        }
 
-       for (int dim=1; dim< dimension; dim++)
+      for (int dim=1; dim< dimension; dim++)
        {
        {
-               int dim2=dimension - dim;
-               cout << "Nb d elements de dimension " << dim << " : ";
+         int dim2=dimension - dim;
+         cout << "Nb d elements de dimension " << dim << " : ";
 
 
-               try
-               {
-                       cout << tous[i].getNumberOfConstituents(dim)<< endl;
-               }
-               catch ( const std::exception &e )
-               {
-                               cout << "------------------------------------" << endl;
-                       cout << "  Pb au getNumberOfConstituents()   " << endl;
-                       cout << "------------------------------------" << endl;
-                       MESSAGE( "catched exception : " << e.what() ) ;
-                       return EXIT_FAILURE ;
-               }
-               catch (...)
-               {
-                       cout << "------------------------------------" << endl;
-                       cout << "  Pb au getNumberOfConstituents()   " << endl;
-                       cout << "------------------------------------" << endl;
-                       return EXIT_FAILURE ;
-               };
+         try
+           {
+             cout << tous[i].getNumberOfConstituents(dim)<< endl;
+           }
+         catch ( const std::exception &e )
+           {
+             cout << "------------------------------------" << endl;
+             cout << "  Pb au getNumberOfConstituents()   " << endl;
+             cout << "------------------------------------" << endl;
+             MESSAGE( "catched exception : " << e.what() ) ;
+             return EXIT_FAILURE ;
+           }
+         catch (...)
+           {
+             cout << "------------------------------------" << endl;
+             cout << "  Pb au getNumberOfConstituents()   " << endl;
+             cout << "------------------------------------" << endl;
+             return EXIT_FAILURE ;
+           };
        }
 /*
 
        }
 /*
 
@@ -325,7 +327,7 @@ int main (int argc, char ** argv)
                }
 */
 
                }
 */
 
-       cout << endl;
+      cout << endl;
 /*
        if ( dimension > 1 )
        {
 /*
        if ( dimension > 1 )
        {
@@ -357,13 +359,13 @@ int main (int argc, char ** argv)
        }
 */
 
        }
 */
 
-  }
+    }
 
   delete[] tous ;
 
   return EXIT_SUCCESS ;
 /*
 
   delete[] tous ;
 
   return EXIT_SUCCESS ;
 /*
-Reste a Tester
+  Reste a Tester
   // Return number of constituents foreach type (which dimension is _dimension-1).
   map <medGeometryElement,int>  getNumberOfConstituentsForeachType() const; 
 */
   // Return number of constituents foreach type (which dimension is _dimension-1).
   map <medGeometryElement,int>  getNumberOfConstituentsForeachType() const; 
 */
index e26271b1b980da8aafc946981d10d25d16a41f26..644d3d20950e3e98d0202eb868707cfa07882907 100644 (file)
@@ -73,8 +73,8 @@ throw (SALOME::SALOME_Exception)
         {
                medModeSwitch modemed=convertIdlModeToMedMode(mode);
 //             ::FIELD<double> *ptrD=dynamic_cast< ::FIELD<double>* >(_fieldTptr);
         {
                medModeSwitch modemed=convertIdlModeToMedMode(mode);
 //             ::FIELD<double> *ptrD=dynamic_cast< ::FIELD<double>* >(_fieldTptr);
-// the alternative is not safe but the previous fails using the python API
-               MEDMEM::FIELD<double> *ptrD = (MEDMEM::FIELD<double> *) _fieldTptr;
+// the alternative is not safe but the dynamic_cast fails using the python API
+               MEDMEM::FIELD<double> *ptrD = static_cast<MEDMEM::FIELD<double>* >(_fieldTptr);
                 const double * values =ptrD->getValue(modemed);
                int nbval=ptrD->getValueLength(modemed);
                 myseq->length(nbval);
                 const double * values =ptrD->getValue(modemed);
                int nbval=ptrD->getValueLength(modemed);
                 myseq->length(nbval);
@@ -96,17 +96,19 @@ throw (SALOME::SALOME_Exception)
 */
 //=============================================================================
 
 */
 //=============================================================================
 
-SALOME::Sender_ptr FIELDDOUBLE_i::getSenderForValue( SALOME_MED::medModeSwitch mode ) 
+SALOME::SenderDouble_ptr FIELDDOUBLE_i::getSenderForValue( SALOME_MED::medModeSwitch mode ) 
 throw (SALOME::SALOME_Exception)
 {
        if (_fieldTptr==NULL)
                 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
                                              SALOME::INTERNAL_ERROR);
 throw (SALOME::SALOME_Exception)
 {
        if (_fieldTptr==NULL)
                 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
                                              SALOME::INTERNAL_ERROR);
-        SALOME::Sender_ptr ret;
+        SALOME::SenderDouble_ptr ret;
         try
         {
                medModeSwitch modemed=convertIdlModeToMedMode(mode);
         try
         {
                medModeSwitch modemed=convertIdlModeToMedMode(mode);
-                ::FIELD<double> *ptrD=dynamic_cast< ::FIELD<double>* >(_fieldTptr);
+                // ::FIELD<double> *ptrD=dynamic_cast< ::FIELD<double>* >(_fieldTptr);
+               // the alternative is not safe but the dynamic_cast fails using the python API
+                MEDMEM::FIELD<double> *ptrD=static_cast< MEDMEM::FIELD<double>* >(_fieldTptr);
                 const double * values =ptrD->getValue(modemed);
                int nbval=ptrD->getValueLength(modemed);
                ret=SenderFactory::buildSender(*this,values,nbval);
                 const double * values =ptrD->getValue(modemed);
                int nbval=ptrD->getValueLength(modemed);
                ret=SenderFactory::buildSender(*this,values,nbval);
index 2f11c39cb7348d520d194561a0fa387a4e2040ef..41f1e099ab639c5efb3a12b67d0b9ff423551f56 100644 (file)
@@ -32,7 +32,7 @@ public:
 
     SALOME_MED::double_array * getValue (SALOME_MED::medModeSwitch mode ) 
                                     throw (SALOME::SALOME_Exception);
 
     SALOME_MED::double_array * getValue (SALOME_MED::medModeSwitch mode ) 
                                     throw (SALOME::SALOME_Exception);
-    SALOME::Sender_ptr getSenderForValue(SALOME_MED::medModeSwitch mode)
+    SALOME::SenderDouble_ptr getSenderForValue(SALOME_MED::medModeSwitch mode)
                                      throw (SALOME::SALOME_Exception);
 };
 }
                                      throw (SALOME::SALOME_Exception);
 };
 }
index c08c37fbb36783ae84881df89fedf3f9488a3fbe..39e4f29015caf063dcff1fea2547fdb1718a53b8 100644 (file)
@@ -71,9 +71,9 @@ throw (SALOME::SALOME_Exception)
         try
          {
            medModeSwitch modemed=convertIdlModeToMedMode(mode);
         try
          {
            medModeSwitch modemed=convertIdlModeToMedMode(mode);
-//         ::FIELD<int> *ptrI=dynamic_cast< ::FIELD<int>* >(_fieldTptr);
-//the alternative is not safe but the previous one fails using the python API
-           MEDMEM::FIELD<int> *ptrI = (MEDMEM::FIELD<int> *) _fieldTptr;
+           //      ::FIELD<int> *ptrI=dynamic_cast< ::FIELD<int>* >(_fieldTptr);
+           //the alternative is not safe but the previous one fails using the python API
+           MEDMEM::FIELD<int> *ptrI = static_cast< MEDMEM::FIELD<int>* >(_fieldTptr);
 
            const int * values =ptrI->getValue(modemed);
            int nbval=ptrI->getValueLength(modemed);
 
            const int * values =ptrI->getValue(modemed);
            int nbval=ptrI->getValueLength(modemed);
@@ -96,17 +96,19 @@ throw (SALOME::SALOME_Exception)
 */
 //=============================================================================
 
 */
 //=============================================================================
 
-SALOME::Sender_ptr FIELDINT_i::getSenderForValue( SALOME_MED::medModeSwitch mode ) 
+SALOME::SenderInt_ptr FIELDINT_i::getSenderForValue( SALOME_MED::medModeSwitch mode ) 
 throw (SALOME::SALOME_Exception)
 {
        if (_fieldTptr==NULL)
                 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
                                              SALOME::INTERNAL_ERROR);
 throw (SALOME::SALOME_Exception)
 {
        if (_fieldTptr==NULL)
                 THROW_SALOME_CORBA_EXCEPTION("No associated Field", \
                                              SALOME::INTERNAL_ERROR);
-        SALOME::Sender_ptr ret;
+        SALOME::SenderInt_ptr ret;
         try
         {
                medModeSwitch modemed=convertIdlModeToMedMode(mode);
         try
         {
                medModeSwitch modemed=convertIdlModeToMedMode(mode);
-               ::FIELD<int> *ptrI=dynamic_cast< ::FIELD<int>* >(_fieldTptr);
+               //::FIELD<int> *ptrI=dynamic_cast< ::FIELD<int>* >(_fieldTptr);
+               //the alternative is not safe but the previous one fails using the python API
+               MEDMEM::FIELD<int> *ptrI=static_cast< MEDMEM::FIELD<int>* >(_fieldTptr);
                 const int * values =ptrI->getValue(modemed);
                int nbval=ptrI->getValueLength(modemed);
                ret=SenderFactory::buildSender(*this,values,nbval);
                 const int * values =ptrI->getValue(modemed);
                int nbval=ptrI->getValueLength(modemed);
                ret=SenderFactory::buildSender(*this,values,nbval);
index cb428c3c3e5fc8a2b6ba1d4ac4933887dd46231c..fb2fd35c6fb010b86fce38b67e1f6f1c2864b942 100644 (file)
@@ -31,7 +31,7 @@ public:
     FIELDINT_i(FIELDINT_i & f);
     SALOME_MED::long_array * getValue (SALOME_MED::medModeSwitch mode ) 
                                   throw (SALOME::SALOME_Exception);
     FIELDINT_i(FIELDINT_i & f);
     SALOME_MED::long_array * getValue (SALOME_MED::medModeSwitch mode ) 
                                   throw (SALOME::SALOME_Exception);
-    SALOME::Sender_ptr getSenderForValue(SALOME_MED::medModeSwitch mode)
+    SALOME::SenderInt_ptr getSenderForValue(SALOME_MED::medModeSwitch mode)
                                      throw (SALOME::SALOME_Exception);
 };
 }
                                      throw (SALOME::SALOME_Exception);
 };
 }
index e8feb02c787373c7019e894bb7d9ffb8aeef366a..41ca4ba119cd1a89b7ce03b38dba7ae0a82db641 100644 (file)
@@ -297,13 +297,13 @@ throw (SALOME::SALOME_Exception)
  * CORBA: 2nd Accessor for Coordinates
  */
 //=============================================================================
  * CORBA: 2nd Accessor for Coordinates
  */
 //=============================================================================
-SALOME::Sender_ptr MESH_i::getSenderForCoordinates(SALOME_MED::medModeSwitch typeSwitch)
+SALOME::SenderDouble_ptr MESH_i::getSenderForCoordinates(SALOME_MED::medModeSwitch typeSwitch)
     throw (SALOME::SALOME_Exception)
 {
   if (_mesh==NULL)
     THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
                                 SALOME::INTERNAL_ERROR);
     throw (SALOME::SALOME_Exception)
 {
   if (_mesh==NULL)
     THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", \
                                 SALOME::INTERNAL_ERROR);
-  SALOME::Sender_ptr ret;
+  SALOME::SenderDouble_ptr ret;
   try
     {
       int spaceDimension=_mesh->getSpaceDimension();
   try
     {
       int spaceDimension=_mesh->getSpaceDimension();
@@ -575,7 +575,7 @@ SCRUTE(nbelements);
  * CORBA: 2nd Accessor for connectivities
  */
 //=============================================================================
  * CORBA: 2nd Accessor for connectivities
  */
 //=============================================================================
-SALOME::Sender_ptr MESH_i::getSenderForConnectivity(SALOME_MED::medModeSwitch typeSwitch,
+SALOME::SenderInt_ptr MESH_i::getSenderForConnectivity(SALOME_MED::medModeSwitch typeSwitch,
                                               SALOME_MED::medConnectivity mode, 
                                               SALOME_MED::medEntityMesh entity, 
                                               SALOME_MED::medGeometryElement geomElement)
                                               SALOME_MED::medConnectivity mode, 
                                               SALOME_MED::medEntityMesh entity, 
                                               SALOME_MED::medGeometryElement geomElement)
@@ -587,7 +587,7 @@ throw (SALOME::SALOME_Exception)
   if (verifieParam(entity,geomElement)==false)
     THROW_SALOME_CORBA_EXCEPTION("parameters don't match",\
                                 SALOME::BAD_PARAM);
   if (verifieParam(entity,geomElement)==false)
     THROW_SALOME_CORBA_EXCEPTION("parameters don't match",\
                                 SALOME::BAD_PARAM);
-  SALOME::Sender_ptr ret;
+  SALOME::SenderInt_ptr ret;
   try
     {
       int nbelements=_mesh->getConnectivityLength(convertIdlModeToMedMode(typeSwitch),
   try
     {
       int nbelements=_mesh->getConnectivityLength(convertIdlModeToMedMode(typeSwitch),
@@ -1512,6 +1512,29 @@ throw (SALOME::SALOME_Exception)
         }
 }
 
         }
 }
 
+//=============================================================================
+/*!
+ * CORBA : Test if this and other aggregate the same MESH using the virtual MESH::operator==
+ */
+//=============================================================================
+CORBA::Boolean MESH_i::areEquals(SALOME_MED::MESH_ptr other)
+{
+  PortableServer::ServantBase *baseServ;
+  try {
+    baseServ=_default_POA()->reference_to_servant(other);
+  }
+  catch(...){
+    baseServ=0;
+  }
+  if(baseServ)
+    {
+     baseServ->_remove_ref();
+     MESH_i *otherServ=dynamic_cast<MESH_i *>(baseServ);
+     return *_mesh==*otherServ->_mesh;
+    }
+  return false;
+}
+
 //=============================================================================
 /*!
  * CORBA : Servant destruction
 //=============================================================================
 /*!
  * CORBA : Servant destruction
index 807b02ec09c245179306694b6bc7983f3fc9dc67..8f1befb86bca930ef684b25ff7534504ebf04b42 100644 (file)
@@ -66,7 +66,7 @@ public:
   SALOME_MED::double_array* getCoordinates(SALOME_MED::medModeSwitch typeSwitch)
                         throw (SALOME::SALOME_Exception);
 
   SALOME_MED::double_array* getCoordinates(SALOME_MED::medModeSwitch typeSwitch)
                         throw (SALOME::SALOME_Exception);
 
-  SALOME::Sender_ptr getSenderForCoordinates(SALOME_MED::medModeSwitch typeSwitch)
+  SALOME::SenderDouble_ptr getSenderForCoordinates(SALOME_MED::medModeSwitch typeSwitch)
     throw (SALOME::SALOME_Exception);
   
   CORBA::Double  getCoordinate(CORBA::Long Number, CORBA::Long Axis)
     throw (SALOME::SALOME_Exception);
   
   CORBA::Double  getCoordinate(CORBA::Long Number, CORBA::Long Axis)
@@ -102,7 +102,7 @@ public:
                                         SALOME_MED::medGeometryElement geomElement)
                          throw (SALOME::SALOME_Exception);
 
                                         SALOME_MED::medGeometryElement geomElement)
                          throw (SALOME::SALOME_Exception);
 
-  SALOME::Sender_ptr getSenderForConnectivity(SALOME_MED::medModeSwitch typeSwitch, 
+  SALOME::SenderInt_ptr getSenderForConnectivity(SALOME_MED::medModeSwitch typeSwitch, 
                                              SALOME_MED::medConnectivity mode, 
                                              SALOME_MED::medEntityMesh entity, 
                                              SALOME_MED::medGeometryElement geomElement)
                                              SALOME_MED::medConnectivity mode, 
                                              SALOME_MED::medEntityMesh entity, 
                                              SALOME_MED::medGeometryElement geomElement)
@@ -188,6 +188,7 @@ public:
     SALOME_MED::MESH::connectivityInfos * getConnectGlobal
                                  (SALOME_MED::medEntityMesh entity)
                                   throw (SALOME::SALOME_Exception);
     SALOME_MED::MESH::connectivityInfos * getConnectGlobal
                                  (SALOME_MED::medEntityMesh entity)
                                   throw (SALOME::SALOME_Exception);
+    CORBA::Boolean areEquals(SALOME_MED::MESH_ptr other);
 
   void release();
 };
 
   void release();
 };
index 070561b44e73afff8347a0d74d1e5f0a52def605..f2d113f449ee17cb301cf0d11e9a6fe665d23eb7 100644 (file)
@@ -392,7 +392,7 @@ SCRUTE(numbers[i]);
  * CORBA: 2nd get Nodes 
  */
 //=============================================================================
  * CORBA: 2nd get Nodes 
  */
 //=============================================================================
-SALOME::Sender_ptr SUPPORT_i::getSenderForNumber(SALOME_MED::medGeometryElement geomElement) 
+SALOME::SenderInt_ptr SUPPORT_i::getSenderForNumber(SALOME_MED::medGeometryElement geomElement) 
                                            throw (SALOME::SALOME_Exception)
 {
   SCRUTE(_support);
                                            throw (SALOME::SALOME_Exception)
 {
   SCRUTE(_support);
@@ -401,7 +401,7 @@ SALOME::Sender_ptr SUPPORT_i::getSenderForNumber(SALOME_MED::medGeometryElement
   if (_support==NULL)
     THROW_SALOME_CORBA_EXCEPTION("No associated Support", \
                                 SALOME::INTERNAL_ERROR);
   if (_support==NULL)
     THROW_SALOME_CORBA_EXCEPTION("No associated Support", \
                                 SALOME::INTERNAL_ERROR);
-  SALOME::Sender_ptr ret;
+  SALOME::SenderInt_ptr ret;
   try
     {
       int nbelements=_support->getNumberOfElements(convertIdlEltToMedElt(geomElement));
   try
     {
       int nbelements=_support->getNumberOfElements(convertIdlEltToMedElt(geomElement));
@@ -456,13 +456,13 @@ throw (SALOME::SALOME_Exception)
  */
 //=============================================================================
 
  */
 //=============================================================================
 
-SALOME::Sender_ptr SUPPORT_i::getSenderForNumberIndex() 
+SALOME::SenderInt_ptr SUPPORT_i::getSenderForNumberIndex() 
   throw (SALOME::SALOME_Exception)
 {
   if (_support==NULL)
     THROW_SALOME_CORBA_EXCEPTION("No associated Support", \
                                 SALOME::INTERNAL_ERROR);
   throw (SALOME::SALOME_Exception)
 {
   if (_support==NULL)
     THROW_SALOME_CORBA_EXCEPTION("No associated Support", \
                                 SALOME::INTERNAL_ERROR);
-  SALOME::Sender_ptr ret;
+  SALOME::SenderInt_ptr ret;
   try
     {
       MESSAGE ("Nombre d'elements  mis de façon stupide a MED_ALL_ELEMENTS");
   try
     {
       MESSAGE ("Nombre d'elements  mis de façon stupide a MED_ALL_ELEMENTS");
index 5a3f7bc7dc948926f69000ae6c0137bd0932ed1a..e7eb339634b28eba4d2d96d4be1ba7b999897bc5 100644 (file)
@@ -58,11 +58,11 @@ public:
                                            throw (SALOME::SALOME_Exception);
     SALOME_MED::long_array* getNumber(SALOME_MED::medGeometryElement geomElement) 
                                           throw (SALOME::SALOME_Exception);
                                            throw (SALOME::SALOME_Exception);
     SALOME_MED::long_array* getNumber(SALOME_MED::medGeometryElement geomElement) 
                                           throw (SALOME::SALOME_Exception);
-    SALOME::Sender_ptr getSenderForNumber(SALOME_MED::medGeometryElement geomElement) 
+    SALOME::SenderInt_ptr getSenderForNumber(SALOME_MED::medGeometryElement geomElement) 
                                            throw (SALOME::SALOME_Exception);
     SALOME_MED::long_array* getNumberIndex() 
                                           throw (SALOME::SALOME_Exception);
                                            throw (SALOME::SALOME_Exception);
     SALOME_MED::long_array* getNumberIndex() 
                                           throw (SALOME::SALOME_Exception);
-    SALOME::Sender_ptr getSenderForNumberIndex() 
+    SALOME::SenderInt_ptr getSenderForNumberIndex() 
                                            throw (SALOME::SALOME_Exception);
     CORBA::Long          getNumberOfGaussPoint(SALOME_MED::medGeometryElement geomElement) 
                                           throw (SALOME::SALOME_Exception);
                                            throw (SALOME::SALOME_Exception);
     CORBA::Long          getNumberOfGaussPoint(SALOME_MED::medGeometryElement geomElement) 
                                           throw (SALOME::SALOME_Exception);
index 7d65b097885b16652eaaa2b63b66c4622a837df3..b3350e4a3fad3a9cfebd751ba4bdb21acc04cd91 100644 (file)
@@ -54,7 +54,7 @@ EXPORT_HEADERS = \
 LIB=libMEDMEMImpl.la
 LIB_SRC = MEDMEM_Med_i.cxx  MEDMEM_Family_i.cxx MEDMEM_FieldDouble_i.cxx MEDMEM_FieldInt_i.cxx MEDMEM_Field_i.cxx MEDMEM_Group_i.cxx MEDMEM_Mesh_i.cxx MEDMEM_Support_i.cxx MEDMEM_convert.cxx   
 LIB_SERVER_IDL = MED.idl 
 LIB=libMEDMEMImpl.la
 LIB_SRC = MEDMEM_Med_i.cxx  MEDMEM_Family_i.cxx MEDMEM_FieldDouble_i.cxx MEDMEM_FieldInt_i.cxx MEDMEM_Field_i.cxx MEDMEM_Group_i.cxx MEDMEM_Mesh_i.cxx MEDMEM_Support_i.cxx MEDMEM_convert.cxx   
 LIB_SERVER_IDL = MED.idl 
-LIB_CLIENT_IDL= SALOME_Component.idl SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_Comm.idl
+LIB_CLIENT_IDL= SALOME_Component.idl SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_Comm.idl SALOME_GenericObj.idl
 
 # Executables targets
 BIN_SRC = 
 
 # Executables targets
 BIN_SRC = 
diff --git a/src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldDoubleDriver.cxx b/src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldDoubleDriver.cxx
new file mode 100644 (file)
index 0000000..6d21c5b
--- /dev/null
@@ -0,0 +1,21 @@
+#include "MEDMEM_SWIG_AsciiFieldDoubleDriver.hxx"
+
+using namespace std;
+using namespace MEDMEM;
+using namespace MED_EN;
+
+ASCII_FIELDDOUBLE_DRIVER::ASCII_FIELDDOUBLE_DRIVER(const string & fileName, FIELDDOUBLE * ptrField, 
+                                              MED_EN::med_sort_direc direction, const char *priority):
+  ASCII_FIELD_DRIVER<double>(fileName,(FIELD<double> *) ptrField,direction,priority)
+{
+  BEGIN_OF("Constructor with arguments (for Python API) ASCII_FIELDDOUBLE_DRIVER");
+
+  END_OF("Constructor with arguments (for Python API) ASCII_FIELDDOUBLE_DRIVER");
+}
+
+ASCII_FIELDDOUBLE_DRIVER::~ASCII_FIELDDOUBLE_DRIVER()
+{
+  BEGIN_OF("Default Destructor (for Python API) ASCII_FIELDDOUBLE_DRIVER");
+
+  END_OF("Default Destructor (for Python API) ASCII_FIELDDOUBLE_DRIVER");
+}
diff --git a/src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldDoubleDriver.hxx b/src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldDoubleDriver.hxx
new file mode 100644 (file)
index 0000000..c307ff7
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef MEDMEM_SWIG_ASCIIFIELDDOUBLEDRIVER_HXX_
+#define MEDMEM_SWIG_ASCIIDFIELDDOUBLEDRIVER_HXX_
+
+#include "MEDMEM_AsciiFieldDriver.hxx"
+#include "MEDMEM_SWIG_FieldDouble.hxx"
+
+class ASCII_FIELDDOUBLE_DRIVER : public MEDMEM::ASCII_FIELD_DRIVER<double>
+{
+public:
+
+  ASCII_FIELDDOUBLE_DRIVER(const string & fileName, FIELDDOUBLE * ptrField, 
+                        MED_EN::med_sort_direc direction, const char *priority);
+
+  ~ASCII_FIELDDOUBLE_DRIVER();
+};
+
+#endif 
diff --git a/src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldIntDriver.cxx b/src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldIntDriver.cxx
new file mode 100644 (file)
index 0000000..3104a92
--- /dev/null
@@ -0,0 +1,21 @@
+#include "MEDMEM_SWIG_AsciiFieldIntDriver.hxx"
+
+using namespace std;
+using namespace MEDMEM;
+using namespace MED_EN;
+
+ASCII_FIELDINT_DRIVER::ASCII_FIELDINT_DRIVER(const string & fileName, FIELDINT * ptrField, 
+                                              MED_EN::med_sort_direc direction, const char *priority):
+  ASCII_FIELD_DRIVER<int>(fileName,(FIELD<int> *) ptrField,direction,priority)
+{
+  BEGIN_OF("Constructor with arguments (for Python API) ASCII_FIELDINT_DRIVER");
+
+  END_OF("Constructor with arguments (for Python API) ASCII_FIELDINT_DRIVER");
+}
+
+ASCII_FIELDINT_DRIVER::~ASCII_FIELDINT_DRIVER()
+{
+  BEGIN_OF("Default Destructor (for Python API) ASCII_FIELDINT_DRIVER");
+
+  END_OF("Default Destructor (for Python API) ASCII_FIELDINT_DRIVER");
+}
diff --git a/src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldIntDriver.hxx b/src/MEDMEM_SWIG/MEDMEM_SWIG_AsciiFieldIntDriver.hxx
new file mode 100644 (file)
index 0000000..5e2fe46
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef MEDMEM_SWIG_ASCIIFIELDINTDRIVER_HXX_
+#define MEDMEM_SWIG_ASCIIFIELDINTDRIVER_HXX_
+
+#include "MEDMEM_AsciiFieldDriver.hxx"
+#include "MEDMEM_SWIG_FieldInt.hxx"
+
+class ASCII_FIELDINT_DRIVER : public MEDMEM::ASCII_FIELD_DRIVER<int>
+{
+public:
+
+  ASCII_FIELDINT_DRIVER(const string & fileName, FIELDINT * ptrField, 
+                        MED_EN::med_sort_direc direction, const char *priority);
+
+  ~ASCII_FIELDINT_DRIVER();
+};
+
+#endif 
index 5192843b41830ff1e75d452afdad6b6fa812f5af..5d87413bf3170259ad40c6fac1c7a536483f3a5a 100644 (file)
@@ -46,7 +46,7 @@ MED_FIELDDOUBLE_DRIVER::~MED_FIELDDOUBLE_DRIVER()
  */
 //=============================================================================
 MED_FIELDDOUBLE_RDONLY_DRIVER::MED_FIELDDOUBLE_RDONLY_DRIVER() :
  */
 //=============================================================================
 MED_FIELDDOUBLE_RDONLY_DRIVER::MED_FIELDDOUBLE_RDONLY_DRIVER() :
-  MED_FIELD_RDONLY_DRIVER<double>()
+  MEDMEM::MED_FIELD_RDONLY_DRIVER<double>()
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDDOUBLE_RDONLY_DRIVER");
 
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDDOUBLE_RDONLY_DRIVER");
 
@@ -59,7 +59,7 @@ MED_FIELDDOUBLE_RDONLY_DRIVER::MED_FIELDDOUBLE_RDONLY_DRIVER() :
 //=============================================================================
 MED_FIELDDOUBLE_RDONLY_DRIVER::MED_FIELDDOUBLE_RDONLY_DRIVER(const string & fileName,
                                                             FIELDDOUBLE * ptrField) : 
 //=============================================================================
 MED_FIELDDOUBLE_RDONLY_DRIVER::MED_FIELDDOUBLE_RDONLY_DRIVER(const string & fileName,
                                                             FIELDDOUBLE * ptrField) : 
-  MED_FIELD_RDONLY_DRIVER<double>(fileName,(FIELD<double> *) ptrField)
+  MEDMEM::MED_FIELD_RDONLY_DRIVER<double>(fileName,(FIELD<double> *) ptrField)
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDDOUBLE_RDONLY_DRIVER");
 
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDDOUBLE_RDONLY_DRIVER");
 
@@ -82,7 +82,7 @@ MED_FIELDDOUBLE_RDONLY_DRIVER::~MED_FIELDDOUBLE_RDONLY_DRIVER()
  */
 //=============================================================================
 MED_FIELDDOUBLE_WRONLY_DRIVER::MED_FIELDDOUBLE_WRONLY_DRIVER() :
  */
 //=============================================================================
 MED_FIELDDOUBLE_WRONLY_DRIVER::MED_FIELDDOUBLE_WRONLY_DRIVER() :
-  MED_FIELD_WRONLY_DRIVER<double>()
+  MEDMEM::MED_FIELD_WRONLY_DRIVER<double>()
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDDOUBLE_WRONLY_DRIVER");
 
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDDOUBLE_WRONLY_DRIVER");
 
@@ -95,7 +95,7 @@ MED_FIELDDOUBLE_WRONLY_DRIVER::MED_FIELDDOUBLE_WRONLY_DRIVER() :
 //=============================================================================
 MED_FIELDDOUBLE_WRONLY_DRIVER::MED_FIELDDOUBLE_WRONLY_DRIVER(const string & fileName,
                                                             FIELDDOUBLE * ptrField) : 
 //=============================================================================
 MED_FIELDDOUBLE_WRONLY_DRIVER::MED_FIELDDOUBLE_WRONLY_DRIVER(const string & fileName,
                                                             FIELDDOUBLE * ptrField) : 
-  MED_FIELD_WRONLY_DRIVER<double>(fileName,(FIELD<double> *) ptrField)
+  MEDMEM::MED_FIELD_WRONLY_DRIVER<double>(fileName,(FIELD<double> *) ptrField)
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDDOUBLE_WRONLY_DRIVER");
 
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDDOUBLE_WRONLY_DRIVER");
 
@@ -118,7 +118,7 @@ MED_FIELDDOUBLE_WRONLY_DRIVER::~MED_FIELDDOUBLE_WRONLY_DRIVER()
  */
 //=============================================================================
 MED_FIELDDOUBLE_RDWR_DRIVER::MED_FIELDDOUBLE_RDWR_DRIVER() :
  */
 //=============================================================================
 MED_FIELDDOUBLE_RDWR_DRIVER::MED_FIELDDOUBLE_RDWR_DRIVER() :
-  MED_FIELD_RDWR_DRIVER<double>()
+  MEDMEM::MED_FIELD_RDWR_DRIVER<double>()
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDDOUBLE_RDWR_DRIVER");
 
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDDOUBLE_RDWR_DRIVER");
 
@@ -131,7 +131,7 @@ MED_FIELDDOUBLE_RDWR_DRIVER::MED_FIELDDOUBLE_RDWR_DRIVER() :
 //=============================================================================
 MED_FIELDDOUBLE_RDWR_DRIVER::MED_FIELDDOUBLE_RDWR_DRIVER(const string & fileName,
                                                         FIELDDOUBLE * ptrField) : 
 //=============================================================================
 MED_FIELDDOUBLE_RDWR_DRIVER::MED_FIELDDOUBLE_RDWR_DRIVER(const string & fileName,
                                                         FIELDDOUBLE * ptrField) : 
-  MED_FIELD_RDWR_DRIVER<double>(fileName,(FIELD<double> *) ptrField)
+  MEDMEM::MED_FIELD_RDWR_DRIVER<double>(fileName,(FIELD<double> *) ptrField)
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDDOUBLE_RDWR_DRIVER");
 
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDDOUBLE_RDWR_DRIVER");
 
index 9a60d2cb00b54c591ec32a9655d2902281abb4cc..5d3e9620f3a0405d2701773ecfabfbf019e7f3d7 100644 (file)
@@ -1,8 +1,10 @@
 #ifndef MEDMEM_SWIG_MEDFIELDDOUBLEDRIVER_HXX_
 #define MEDMEM_SWIG_MEDFIELDDOUBLEDRIVER_HXX_
 
 #ifndef MEDMEM_SWIG_MEDFIELDDOUBLEDRIVER_HXX_
 #define MEDMEM_SWIG_MEDFIELDDOUBLEDRIVER_HXX_
 
-#include "MEDMEM_MedFieldDriver.hxx"
 #include "MEDMEM_SWIG_FieldDouble.hxx"
 #include "MEDMEM_SWIG_FieldDouble.hxx"
+#include "MEDMEM_MedFieldDriver.hxx"
+
+class FIELDDOUBLE;
 
 class MED_FIELDDOUBLE_DRIVER : public MEDMEM::MED_FIELD_DRIVER<double>
 {
 
 class MED_FIELDDOUBLE_DRIVER : public MEDMEM::MED_FIELD_DRIVER<double>
 {
index 7e48fffb9e2d642bb74512b2f5daf198dec7f939..9a080f37a6305f22a5be69d6fdca84caade61038 100644 (file)
@@ -46,7 +46,7 @@ MED_FIELDINT_DRIVER::~MED_FIELDINT_DRIVER()
  */
 //=============================================================================
 MED_FIELDINT_RDONLY_DRIVER::MED_FIELDINT_RDONLY_DRIVER() :
  */
 //=============================================================================
 MED_FIELDINT_RDONLY_DRIVER::MED_FIELDINT_RDONLY_DRIVER() :
-  MED_FIELD_RDONLY_DRIVER<int>()
+  MEDMEM::MED_FIELD_RDONLY_DRIVER<int>()
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDINT_RDONLY_DRIVER");
 
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDINT_RDONLY_DRIVER");
 
@@ -59,7 +59,7 @@ MED_FIELDINT_RDONLY_DRIVER::MED_FIELDINT_RDONLY_DRIVER() :
 //=============================================================================
 MED_FIELDINT_RDONLY_DRIVER::MED_FIELDINT_RDONLY_DRIVER(const string & fileName,
                                                             FIELDINT * ptrField) : 
 //=============================================================================
 MED_FIELDINT_RDONLY_DRIVER::MED_FIELDINT_RDONLY_DRIVER(const string & fileName,
                                                             FIELDINT * ptrField) : 
-  MED_FIELD_RDONLY_DRIVER<int>(fileName,(FIELD<int> *) ptrField)
+  MEDMEM::MED_FIELD_RDONLY_DRIVER<int>(fileName,(FIELD<int> *) ptrField)
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDINT_RDONLY_DRIVER");
 
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDINT_RDONLY_DRIVER");
 
@@ -82,7 +82,7 @@ MED_FIELDINT_RDONLY_DRIVER::~MED_FIELDINT_RDONLY_DRIVER()
  */
 //=============================================================================
 MED_FIELDINT_WRONLY_DRIVER::MED_FIELDINT_WRONLY_DRIVER() :
  */
 //=============================================================================
 MED_FIELDINT_WRONLY_DRIVER::MED_FIELDINT_WRONLY_DRIVER() :
-  MED_FIELD_WRONLY_DRIVER<int>()
+  MEDMEM::MED_FIELD_WRONLY_DRIVER<int>()
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDINT_WRONLY_DRIVER");
 
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDINT_WRONLY_DRIVER");
 
@@ -95,7 +95,7 @@ MED_FIELDINT_WRONLY_DRIVER::MED_FIELDINT_WRONLY_DRIVER() :
 //=============================================================================
 MED_FIELDINT_WRONLY_DRIVER::MED_FIELDINT_WRONLY_DRIVER(const string & fileName,
                                                             FIELDINT * ptrField) : 
 //=============================================================================
 MED_FIELDINT_WRONLY_DRIVER::MED_FIELDINT_WRONLY_DRIVER(const string & fileName,
                                                             FIELDINT * ptrField) : 
-  MED_FIELD_WRONLY_DRIVER<int>(fileName,(FIELD<int> *) ptrField)
+  MEDMEM::MED_FIELD_WRONLY_DRIVER<int>(fileName,(FIELD<int> *) ptrField)
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDINT_WRONLY_DRIVER");
 
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDINT_WRONLY_DRIVER");
 
@@ -118,7 +118,7 @@ MED_FIELDINT_WRONLY_DRIVER::~MED_FIELDINT_WRONLY_DRIVER()
  */
 //=============================================================================
 MED_FIELDINT_RDWR_DRIVER::MED_FIELDINT_RDWR_DRIVER() :
  */
 //=============================================================================
 MED_FIELDINT_RDWR_DRIVER::MED_FIELDINT_RDWR_DRIVER() :
-  MED_FIELD_RDWR_DRIVER<int>()
+  MEDMEM::MED_FIELD_RDWR_DRIVER<int>()
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDINT_RDWR_DRIVER");
 
 {
   BEGIN_OF("Default Constructor (for Python API) MED_FIELDINT_RDWR_DRIVER");
 
@@ -131,7 +131,7 @@ MED_FIELDINT_RDWR_DRIVER::MED_FIELDINT_RDWR_DRIVER() :
 //=============================================================================
 MED_FIELDINT_RDWR_DRIVER::MED_FIELDINT_RDWR_DRIVER(const string & fileName,
                                                         FIELDINT * ptrField) : 
 //=============================================================================
 MED_FIELDINT_RDWR_DRIVER::MED_FIELDINT_RDWR_DRIVER(const string & fileName,
                                                         FIELDINT * ptrField) : 
-  MED_FIELD_RDWR_DRIVER<int>(fileName,(FIELD<int> *) ptrField)
+  MEDMEM::MED_FIELD_RDWR_DRIVER<int>(fileName,(FIELD<int> *) ptrField)
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDINT_RDWR_DRIVER");
 
 {
   BEGIN_OF("Constructor with arguments (for Python API) MED_FIELDINT_RDWR_DRIVER");
 
index 0243baf9b56fea158e9d8d2308c5bae7a8226702..28baced7a42be219569b503eb54def7a743679ca 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef MEDMEM_SWIG_MEDFIELDINTDRIVER_HXX_
 #define MEDMEM_SWIG_MEDFIELDINTDRIVER_HXX_
 
 #ifndef MEDMEM_SWIG_MEDFIELDINTDRIVER_HXX_
 #define MEDMEM_SWIG_MEDFIELDINTDRIVER_HXX_
 
-#include "MEDMEM_MedFieldDriver.hxx"
 #include "MEDMEM_SWIG_FieldInt.hxx"
 #include "MEDMEM_SWIG_FieldInt.hxx"
+#include "MEDMEM_MedFieldDriver.hxx"
 
 class MED_FIELDINT_DRIVER : public MEDMEM::MED_FIELD_DRIVER<int>
 {
 
 class MED_FIELDINT_DRIVER : public MEDMEM::MED_FIELD_DRIVER<int>
 {
diff --git a/src/MEDMEM_SWIG/MEDMEM_SWIG_Templates.hxx b/src/MEDMEM_SWIG/MEDMEM_SWIG_Templates.hxx
new file mode 100644 (file)
index 0000000..79b9a1b
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef MEDMEM_SWIG_TEMPLATES_HXX_
+#define MEDMEM_SWIG_TEMPLATES_HXX_
+
+#include "MEDMEM_Exception.hxx"
+
+template<class T>
+  struct Binding {
+//     static T Checker(PyObject *a);
+//     static T Traducer(PyObject *a);
+  };
+
+template<>
+  struct Binding<double> {
+    //const char *TypeBuild="d";
+    static int Checker(PyObject *a)  { return PyFloat_Check(a); }
+    static double Traducer(PyObject *a) { return PyFloat_AsDouble(a); }
+  };
+
+template<>
+  struct Binding<int> {
+    //static const char *TypeBuild="i";
+    static int Checker(PyObject *a) { return PyInt_Check(a); }
+    static int Traducer(PyObject *a) { return (int) PyInt_AsLong(a); }
+  };
+
+template<class T>
+  class MyFunction {
+  public:
+    static PyObject *_pyFunc;
+    static int _nbOfComponent;
+    static int _spaceDim;
+    static void EvalPy2Cpp(const double *coord, T* outputValues)
+      {
+       int i=0,err;
+       PyObject * tuple=PyTuple_New(_spaceDim);
+         for(i=0;i<_spaceDim;i++)
+           {
+             err=PyTuple_SetItem(tuple,i,Py_BuildValue("d",coord[i]));
+             if (err != 0)
+               throw MEDMEM::MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic");
+           }
+         PyObject * function_ret = PyObject_CallObject(_pyFunc,tuple);
+         err = PyList_Check(function_ret);
+         if (!err)
+             {
+               Py_DECREF(function_ret);
+               throw MEDMEM::MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API list of integer fonct (double, double))");
+             }
+         int size=PyList_Size(function_ret);
+         if (size!=_nbOfComponent)
+           {
+             Py_DECREF(function_ret);
+             throw MEDMEM::MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API list of integer fonct (double, double), especially the size of the returned list)");
+           }
+         for(i=0;i<_spaceDim;i++)
+           {
+             PyObject * tmp=PyList_GetItem(function_ret,i);
+             err = Binding<T>::Checker(tmp);
+             if (!err)
+                 {
+                   Py_DECREF(function_ret);
+                   throw MEDMEM::MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API list of double fonct (double, double), especially the type of the returned list)");
+                 }
+             outputValues[i]=Binding<T>::Traducer(tmp);
+           }
+      }
+  };
+
+template<class T>
+PyObject *MyFunction<T>::_pyFunc=0;
+
+template<class T>
+int MyFunction<T>::_nbOfComponent=0;
+
+template<class T>
+int MyFunction<T>::_spaceDim=0;
+
+#endif
index e0bf76295576b118867b3f118aa2ac76c740ee8e..e09c57c104865b016c3aac5f14cdca4bc296ffbe 100644 (file)
@@ -38,7 +38,10 @@ EXPORT_HEADERS = \
        MEDMEM_SWIG_FieldDouble.hxx \
        MEDMEM_SWIG_FieldInt.hxx \
        MEDMEM_SWIG_MedFieldDoubleDriver.hxx \
        MEDMEM_SWIG_FieldDouble.hxx \
        MEDMEM_SWIG_FieldInt.hxx \
        MEDMEM_SWIG_MedFieldDoubleDriver.hxx \
-       MEDMEM_SWIG_MedFieldIntDriver.hxx
+       MEDMEM_SWIG_MedFieldIntDriver.hxx \
+       MEDMEM_SWIG_AsciiFieldDoubleDriver.hxx \
+       MEDMEM_SWIG_AsciiFieldIntDriver.hxx \
+       MEDMEM_SWIG_Templates.hxx
 
 # Libraries targets
 
 
 # Libraries targets
 
@@ -47,9 +50,22 @@ LIB = libMEDMEM_Swigcmodule.la
 LIB_SRC = MEDMEM_SWIG_FieldDouble.cxx \
          MEDMEM_SWIG_FieldInt.cxx \
          MEDMEM_SWIG_MedFieldDoubleDriver.cxx \
 LIB_SRC = MEDMEM_SWIG_FieldDouble.cxx \
          MEDMEM_SWIG_FieldInt.cxx \
          MEDMEM_SWIG_MedFieldDoubleDriver.cxx \
-         MEDMEM_SWIG_MedFieldIntDriver.cxx
+         MEDMEM_SWIG_MedFieldIntDriver.cxx \
+         MEDMEM_SWIG_AsciiFieldDoubleDriver.cxx \
+         MEDMEM_SWIG_AsciiFieldIntDriver.cxx
 
 
+ifeq (@SWIG_VERSION@, 1.3.21)
+SWIG_DEF = libMEDMEM_Swig.i dummy.i
+
+dummy_wrap.cxx: libMEDMEM_Swig_wrap.cxx
+       sed -e 's/SwigValueWrapper< vector<FAMILY \* > >/vector<FAMILY \* >/g' libMEDMEM_Swig_wrap.cxx > toto
+       mv toto libMEDMEM_Swig_wrap.cxx
+       sed -e 's/SwigValueWrapper< vector<SUPPORT \* > const >/vector<SUPPORT \* >/g' libMEDMEM_Swig_wrap.cxx > toto
+       mv toto libMEDMEM_Swig_wrap.cxx
+       touch dummy_wrap.cxx
+else
 SWIG_DEF = libMEDMEM_Swig.i
 SWIG_DEF = libMEDMEM_Swig.i
+endif
 
 EXPORT_PYSCRIPTS = libMEDMEM_Swig.py \
                   med_test1.py \
 
 EXPORT_PYSCRIPTS = libMEDMEM_Swig.py \
                   med_test1.py \
index f366cf9a1addae17b870e26972ae530047a397c9..6c6c5e542af18d577e2881c997d1c5fbcc033e5b 100644 (file)
 #include "MEDMEM_SWIG_FieldInt.hxx"
 #include "MEDMEM_SWIG_MedFieldDoubleDriver.hxx"
 #include "MEDMEM_SWIG_MedFieldIntDriver.hxx"
 #include "MEDMEM_SWIG_FieldInt.hxx"
 #include "MEDMEM_SWIG_MedFieldDoubleDriver.hxx"
 #include "MEDMEM_SWIG_MedFieldIntDriver.hxx"
+#include "MEDMEM_SWIG_AsciiFieldDoubleDriver.hxx"
+#include "MEDMEM_SWIG_AsciiFieldIntDriver.hxx"
 #include "MEDMEM_Meshing.hxx"
 #include "MEDMEM_Meshing.hxx"
+#include "MEDMEM_DriverFactory.hxx"
+#include "MEDMEM_SWIG_Templates.hxx"
+
+#ifdef _DEBUG_
+#include "LocalTraceCollector.hxx"
+#endif /* ifdef _DEBUG_*/
 
   using namespace MEDMEM;
   using namespace MED_EN;
 
   using namespace MEDMEM;
   using namespace MED_EN;
     }
 }
 
     }
 }
 
+/*
+  Initialisation block in the case of the debug mode (definition of _DEBUG_
+  compilation switch) and due to the LocalTraceCollector mechanism
+*/
+
+%init %{
+#ifdef _DEBUG_
+  LocalTraceCollector::instance();
+#endif /* ifdef _DEBUG_*/
+%}
+
 /*
   managing the use of operator= of any class by renaming it assign()
   because assignment can't be overloaded in python.
 /*
   managing the use of operator= of any class by renaming it assign()
   because assignment can't be overloaded in python.
            PyErr_SetString(PyExc_RuntimeError, message);
            return NULL;
          }
            PyErr_SetString(PyExc_RuntimeError, message);
            return NULL;
          }
-
-       $1[i] = f;
+       // mpv: for compatibility with SWIG 1.3.24 SwigValueWrapper
+       // $1[i] = f;
+       $1.at(i) = f;
       }
   } 
   else
       }
   } 
   else
 
   for (int i=0;i<size;i++)
     {
 
   for (int i=0;i<size;i++)
     {
-      PyObject * tmp = SWIG_NewPointerObj($1[i],$descriptor(FAMILY *),0);
+      // mpv: for compatibility with SWIG 1.3.24 SwigValueWrapper
+      //PyObject * tmp = SWIG_NewPointerObj($1[i],$descriptor(FAMILY *),0);
+      PyObject * tmp = SWIG_NewPointerObj($1.at(i),$descriptor(FAMILY *),0);
 
       PyList_SetItem($result,i,tmp);
     }
 
       PyList_SetItem($result,i,tmp);
     }
            PyErr_SetString(PyExc_RuntimeError, message);
            return NULL;
          }
            PyErr_SetString(PyExc_RuntimeError, message);
            return NULL;
          }
-
-       $1[i] = s;
+       // mpv: for compatibility with SWIG 1.3.24 SwigValueWrapper
+       //$1[i] = s;
+       $1.at(i) = s;
       }
   } 
   else
       }
   } 
   else
 
   for (int i=0;i<size;i++)
     {
 
   for (int i=0;i<size;i++)
     {
-      PyObject * tmp = SWIG_NewPointerObj($1[i],$descriptor(SUPPORT *),0);
+      // mpv: for compatibility with SWIG 1.3.24 SwigValueWrapper
+      //PyObject * tmp = SWIG_NewPointerObj($1[i],$descriptor(SUPPORT *),0);
+      PyObject * tmp = SWIG_NewPointerObj($1.at(i),$descriptor(SUPPORT *),0);
+
+      PyList_SetItem($result,i,tmp);
+    }
+}
+
+%typemap(python,in) vector< FIELD<double> * >, const vector< FIELD<double> * >
+{
+    /* typemap in for vector<FIELD<double> *> */
+  /* Check if is a list */
+
+  if (PyList_Check($input)) { 
+    int size = PyList_Size($input);
+    $1.resize(size);
+
+    for (int i=0; i < size; i++)
+      {
+       PyObject * tmp = PyList_GetItem($input,i);
+       FIELDDOUBLE * s;
+
+       int err = SWIG_ConvertPtr(tmp, (void **) &s, $descriptor(FIELDDOUBLE *),
+                                 SWIG_POINTER_EXCEPTION);
+
+       if (err == -1)
+         {
+           char * message = "Error in typemap(python,in) for vector<FIELD<double> *> each component should be a SUPPORT pointer";
+           PyErr_SetString(PyExc_RuntimeError, message);
+           return NULL;
+         }
+
+       // mpv: for compatibility with SWIG 1.3.24 SwigValueWrapper
+       //$1[i] = s;
+       $1.at(i) = s;
+      }
+  } 
+  else
+    { 
+      PyErr_SetString(PyExc_TypeError,"not a list");
+      return NULL;
+    }
+}
+
+%typemap(python,out) vector<FIELD<double> *>
+{
+  /* typemap out for vector<FIELD<double> *> */
+  int size = $1.size();
+  $result = PyList_New(size);
+
+  for (int i=0;i<size;i++)
+    {
+      // mpv: for compatibility with SWIG 1.3.24 SwigValueWrapper
+      //PyObject * tmp = SWIG_NewPointerObj($1[i],$descriptor(FIELD<double> *),0);
+      PyObject * tmp = SWIG_NewPointerObj($1.at(i),$descriptor(FIELD<double> *),0);
+
+      PyList_SetItem($result,i,tmp);
+    }
+}
+
+%typemap(python,in) vector<FIELD<int> *>, const vector<FIELD<int> *>
+{
+    /* typemap in for vector<FIELD<int> *> */
+  /* Check if is a list */
+
+  if (PyList_Check($input)) { 
+    int size = PyList_Size($input);
+    $1.resize(size);
+
+    for (int i=0; i < size; i++)
+      {
+       PyObject * tmp = PyList_GetItem($input,i);
+       FIELD<int> * s;
+
+       int err = SWIG_ConvertPtr(tmp, (void **) &s, $descriptor(FIELD<int> *),
+                                 SWIG_POINTER_EXCEPTION);
+
+       if (err == -1)
+         {
+           char * message = "Error in typemap(python,in) for vector<FIELD<int> *> each component should be a SUPPORT pointer";
+           PyErr_SetString(PyExc_RuntimeError, message);
+           return NULL;
+         }
+
+       // mpv: for compatibility with SWIG 1.3.24 SwigValueWrapper
+       //$1[i] = s;
+       $1.at(i) = s;
+      }
+  } 
+  else
+    { 
+      PyErr_SetString(PyExc_TypeError,"not a list");
+      return NULL;
+    }
+}
+
+%typemap(python,out) vector<FIELD<int> *>
+{
+  /* typemap out for vector<FIELD<int> *> */
+  int size = $1.size();
+  $result = PyList_New(size);
+
+  for (int i=0;i<size;i++)
+    {
+      // mpv: for compatibility with SWIG 1.3.24 SwigValueWrapper
+      //PyObject * tmp = SWIG_NewPointerObj($1[i],$descriptor(FIELD<int> *),0);
+      PyObject * tmp = SWIG_NewPointerObj($1.at(i),$descriptor(FIELD<int> *),0);
 
       PyList_SetItem($result,i,tmp);
     }
 
       PyList_SetItem($result,i,tmp);
     }
@@ -216,6 +345,8 @@ typedef enum {MED_FULL_INTERLACE, MED_NO_INTERLACE} medModeSwitch;
 
 typedef enum {MED_LECT, MED_ECRI, MED_REMP} med_mode_acces;
 
 
 typedef enum {MED_LECT, MED_ECRI, MED_REMP} med_mode_acces;
 
+typedef enum {ASCENDING=7,DESCENDING=77} med_sort_direc;
+
 typedef enum {MED_CELL, MED_FACE, MED_EDGE, MED_NODE,
              MED_ALL_ENTITIES} medEntityMesh; 
 
 typedef enum {MED_CELL, MED_FACE, MED_EDGE, MED_NODE,
              MED_ALL_ENTITIES} medEntityMesh; 
 
@@ -229,13 +360,30 @@ typedef enum {MED_NONE=0, MED_POINT1=1, MED_SEG2=102, MED_SEG3=103,
 typedef enum {MED_NODAL, MED_DESCENDING} medConnectivity ; 
 
 typedef enum {MED_DRIVER=0, GIBI_DRIVER=1, PORFLOW_DRIVER = 2, VTK_DRIVER=254,
 typedef enum {MED_NODAL, MED_DESCENDING} medConnectivity ; 
 
 typedef enum {MED_DRIVER=0, GIBI_DRIVER=1, PORFLOW_DRIVER = 2, VTK_DRIVER=254,
-             NO_DRIVER=255} driverTypes;
+             NO_DRIVER=255, ASCII_DRIVER = 3} driverTypes;
 
 
-typedef enum {MED_REEL64=6, MED_INT32=24, MED_INT64=26,
-             MED_INT} med_type_champ;
+typedef enum {MED_REEL64=6, MED_INT32=24, MED_INT64=26} med_type_champ;
 
 typedef struct { int dt; int it; } DT_IT_;
 
 
 typedef struct { int dt; int it; } DT_IT_;
 
+typedef enum {V21 = 26, V22 = 75} medFileVersion;
+
+medFileVersion getMedFileVersionForWriting();
+
+void setMedFileVersionForWriting(medFileVersion version);
+
+%{
+  medFileVersion getMedFileVersionForWriting()
+    {
+      return (medFileVersion) DRIVERFACTORY::getMedFileVersionForWriting();
+    }
+
+  void setMedFileVersionForWriting(medFileVersion version)
+    {
+      DRIVERFACTORY::setMedFileVersionForWriting((medFileVersion) version);
+    }
+%}
+
 %extend DT_IT_ {
   int getdt()
     {
 %extend DT_IT_ {
   int getdt()
     {
@@ -337,6 +485,8 @@ class SUPPORT
 
   void setNumber(const int * index, const int* value);
 
 
   void setNumber(const int * index, const int* value);
 
+  bool deepCompare(const SUPPORT &support) const;
+
   %extend {
     SUPPORT(MESH* Mesh, char * Name="", medEntityMesh Entity=MED_CELL)
       {
   %extend {
     SUPPORT(MESH* Mesh, char * Name="", medEntityMesh Entity=MED_CELL)
       {
@@ -460,6 +610,23 @@ class SUPPORT
        Py_DECREF(py_list);
        return result;
       }
        Py_DECREF(py_list);
        return result;
       }
+    %newobject getComplement() const;
+    SUPPORT *getComplement() const
+      {
+       return self->getComplement();
+      }
+
+    %newobject substract(const SUPPORT& other) const;
+    SUPPORT *substract(const SUPPORT& other) const
+      {
+       return self->substract(other);
+      }
+
+    %newobject getBoundaryElements(medEntityMesh Entity) const;
+    SUPPORT *getBoundaryElements(medEntityMesh Entity) const
+      {
+       return self->getBoundaryElements(Entity);
+      }
   }
 };
 
   }
 };
 
@@ -639,7 +806,11 @@ public:
        return self->addDriver(driverType,string(fileName),
                               string(driverName),access);
       }
        return self->addDriver(driverType,string(fileName),
                               string(driverName),access);
       }
-
+    %newobject getSupportAndOwner();
+    SUPPORT * getSupportAndOwner()
+      {
+       return (SUPPORT *)self->getSupport();
+      }
   }
 }; 
 
   }
 }; 
 
@@ -679,6 +850,8 @@ public:
 
   void applyLin(double a, double n);
 
 
   void applyLin(double a, double n);
 
+  void applyPow(double scalar);
+
   double normMax();
   double norm2();
   double normL2(int component, const FIELDDOUBLE * p_field_volume=NULL) const;
   double normMax();
   double norm2();
   double normL2(int component, const FIELDDOUBLE * p_field_volume=NULL) const;
@@ -716,10 +889,6 @@ public:
 
        FIELD<double>* result = FIELD<double>::add( *(FIELD<double>*)self , (FIELD<double>&)m );
        return (FIELDDOUBLE*) result;
 
        FIELD<double>* result = FIELD<double>::add( *(FIELD<double>*)self , (FIELD<double>&)m );
        return (FIELDDOUBLE*) result;
-
-/*     const FIELD<double> result = (*(FIELD<double>*)self) +
-         (FIELD<double>&)m;
-       return new FIELDDOUBLE(result); */
       }
 
     %newobject __sub__(const FIELDDOUBLE & );
       }
 
     %newobject __sub__(const FIELDDOUBLE & );
@@ -746,6 +915,38 @@ public:
        return (FIELDDOUBLE*) result;
       }
 
        return (FIELDDOUBLE*) result;
       }
 
+    %newobject addDeep(const FIELDINT & );
+    FIELDDOUBLE * addDeep(const FIELDDOUBLE & m)
+      {
+       MESSAGE("operator +  : Creation of the addition of two FIELDINTs");
+       FIELD<double>* result = FIELD<double>::addDeep( *(FIELD<double>*)self , (FIELD<double>&)m );
+       return (FIELDDOUBLE*) result;
+      }
+
+    %newobject subDeep(const FIELDDOUBLE & );
+    FIELDDOUBLE * subDeep(const FIELDDOUBLE & m)
+      {
+       MESSAGE("operator -  : Creation of the substraction of two FIELDDOUBLEs");
+       FIELD<double>* result = FIELD<double>::subDeep( *(FIELD<double>*)self , (FIELD<double>&)m );
+       return (FIELDDOUBLE*) result;
+      }
+
+    %newobject mulDeep(const FIELDDOUBLE & );
+    FIELDDOUBLE * mulDeep(const FIELDDOUBLE & m)
+      {
+       MESSAGE("operator *  : Creation of the multiplication of two FIELDDOUBLEs");
+       FIELD<double>* result = FIELD<double>::mulDeep( *(FIELD<double>*)self , (FIELD<double>&)m );
+       return (FIELDDOUBLE*) result;
+      }
+
+    %newobject divDeep(const FIELDDOUBLE & );
+    FIELDDOUBLE * divDeep(const FIELDDOUBLE & m)
+      {
+       MESSAGE("operator /  : Creation of the division of two FIELDDOUBLEs");
+       FIELD<double>* result = FIELD<double>::divDeep( *(FIELD<double>*)self , (FIELD<double>&)m );
+       return (FIELDDOUBLE*) result;
+      }
+
     FIELDDOUBLE (const SUPPORT * Support, driverTypes driverType,
                 char * fileName, char * fieldName,
                 const int iterationNumber,
     FIELDDOUBLE (const SUPPORT * Support, driverTypes driverType,
                 char * fileName, char * fieldName,
                 const int iterationNumber,
@@ -824,6 +1025,13 @@ public:
       {
        self->allocValue(NumberOfComponents, LengthValue);
       }
       {
        self->allocValue(NumberOfComponents, LengthValue);
       }
+
+    %newobject extract(const SUPPORT *subSupport);
+    FIELDDOUBLE *extract(const SUPPORT *subSupport)
+      {
+       FIELD<double>* result=self->extract(subSupport);
+       return (FIELDDOUBLE *)result;
+      }
   }
 };
 
   }
 };
 
@@ -863,6 +1071,8 @@ public:
 
   void applyLin(int a, int n);
 
 
   void applyLin(int a, int n);
 
+  void applyPow(int scalar);
+
   double normMax();
   double norm2();
   double normL2(int component, const FIELDDOUBLE * p_field_volume=NULL) const;
   double normMax();
   double norm2();
   double normL2(int component, const FIELDDOUBLE * p_field_volume=NULL) const;
@@ -921,6 +1131,38 @@ public:
        return (FIELDINT*) result;
       }
 
        return (FIELDINT*) result;
       }
 
+    %newobject addDeep(const FIELDINT & );
+    FIELDINT * addDeep(const FIELDINT & m)
+      {
+       MESSAGE("operator +  : Creation of the addition of two FIELDINTs");
+       FIELD<int>* result = FIELD<int>::addDeep( *(FIELD<int>*)self , (FIELD<int>&)m );
+       return (FIELDINT*) result;
+      }
+
+    %newobject subDeep(const FIELDINT & );
+    FIELDINT * subDeep(const FIELDINT & m)
+      {
+       MESSAGE("operator -  : Creation of the substraction of two FIELDINTs");
+       FIELD<int>* result = FIELD<int>::subDeep( *(FIELD<int>*)self , (FIELD<int>&)m );
+       return (FIELDINT*) result;
+      }
+
+    %newobject mulDeep(const FIELDINT & );
+    FIELDINT * mulDeep(const FIELDINT & m)
+      {
+       MESSAGE("operator *  : Creation of the multiplication of two FIELDINTs");
+       FIELD<int>* result = FIELD<int>::mulDeep( *(FIELD<int>*)self , (FIELD<int>&)m );
+       return (FIELDINT*) result;
+      }
+
+    %newobject divDeep(const FIELDINT & );
+    FIELDINT * divDeep(const FIELDINT & m)
+      {
+       MESSAGE("operator /  : Creation of the division of two FIELDINTs");
+       FIELD<int>* result = FIELD<int>::divDeep( *(FIELD<int>*)self , (FIELD<int>&)m );
+       return (FIELDINT*) result;
+      }
+
     FIELDINT(const SUPPORT * Support, driverTypes driverType,
              char * fileName, char * fieldName,
             const int iterationNumber,
     FIELDINT(const SUPPORT * Support, driverTypes driverType,
              char * fileName, char * fieldName,
             const int iterationNumber,
@@ -998,6 +1240,13 @@ public:
       {
        self->allocValue(NumberOfComponents, LengthValue);
       }
       {
        self->allocValue(NumberOfComponents, LengthValue);
       }
+
+    %newobject extract(const SUPPORT *subSupport);
+    FIELDINT *extract(const SUPPORT *subSupport)
+      {
+       FIELD<int>* result=self->extract(subSupport);
+       return (FIELDINT *)result;
+      }
   }
 };
 
   }
 };
 
@@ -1065,6 +1314,8 @@ public :
 
   medGeometryElement getElementType(medEntityMesh Entity,int Number);
 
 
   medGeometryElement getElementType(medEntityMesh Entity,int Number);
 
+  int getElementContainingPoint(const double *coord);
+
   %extend {
     %newobject getBoundaryElements(medEntityMesh );
     SUPPORT * getBoundaryElements(medEntityMesh Entity)
   %extend {
     %newobject getBoundaryElements(medEntityMesh );
     SUPPORT * getBoundaryElements(medEntityMesh Entity)
@@ -1090,6 +1341,18 @@ public :
        return self->intersectSupports(Supports);
       }
 
        return self->intersectSupports(Supports);
       }
 
+    %newobject mergeFieldsDouble(const vector< FIELD<double>* > others);
+    FIELDDOUBLE * mergeFieldsDouble(const vector< FIELD<double>* > others)
+      {
+       return (FIELDDOUBLE *)self->mergeFields<double>(others);
+      }
+
+    %newobject mergeFieldsInt(const vector< FIELD<int>* > others);
+    FIELDINT * mergeFieldsInt(const vector< FIELD<int>* > others)
+      {
+       return (FIELDINT *)self->mergeFields<int>(others);
+      }
+
     CELLMODEL getCellType(medEntityMesh Entity,int i)
       {
        return self->getCellsTypes(Entity)[i];
     CELLMODEL getCellType(medEntityMesh Entity,int i)
       {
        return self->getCellsTypes(Entity)[i];
@@ -1441,6 +1704,17 @@ public :
 
   void addGroup            (const GROUP & Group) ;
 
 
   void addGroup            (const GROUP & Group) ;
 
+  void setPolygonsConnectivity     (const int * ConnectivityIndex,
+                                   const int * ConnectivityValue,
+                                   int nbOfPolygons,
+                                   const medEntityMesh Entity);
+
+  void setPolyhedraConnectivity     (const int * PolyhedronIndex,
+                                    const int * FacesIndex,
+                                    const int * Nodes,
+                                    int nbOfPolyhedra,
+                                    const MED_EN::medEntityMesh Entity);
+
   %extend {
     void setCoordinates(const int SpaceDimension, const int NumberOfNodes,
                        const double * Coordinates, const char * System,
   %extend {
     void setCoordinates(const int SpaceDimension, const int NumberOfNodes,
                        const double * Coordinates, const char * System,
@@ -1632,6 +1906,11 @@ class MED
        return self->getField(string(fieldName),dt,it);
       }
 
        return self->getField(string(fieldName),dt,it);
       }
 
+    FIELD_ * getField2(char * fieldName,double time, int it=0)
+      {
+       return self->getField2(string(fieldName),time,it);
+      }
+
     SUPPORT * getSupport(char * meshName, medEntityMesh entity)
       {
        return self->getSupport(string(meshName),entity);
     SUPPORT * getSupport(char * meshName, medEntityMesh entity)
       {
        return self->getSupport(string(meshName),entity);
@@ -1873,6 +2152,74 @@ public :
   }
 };
 
   }
 };
 
+class GIBI_MED_RDONLY_DRIVER
+{
+public :
+  GIBI_MED_RDONLY_DRIVER() ;
+
+  GIBI_MED_RDONLY_DRIVER(const GIBI_MED_RDONLY_DRIVER & driver) ;
+
+  ~GIBI_MED_RDONLY_DRIVER() ;
+
+  void open();
+
+  void write( void );
+
+  void read ( void );
+
+  void close();
+
+  %extend {
+    GIBI_MED_RDONLY_DRIVER(char * fileName, MED * ptrMed)
+      {
+       return new GIBI_MED_RDONLY_DRIVER(string(fileName), ptrMed) ;
+      }
+
+    %newobject __str__();
+    const char* __str__()
+      {
+       ostringstream mess;
+       mess << "Python Printing GIBI_MED_RDONLY_DRIVER : " << *self << endl;
+       return strdup(mess.str().c_str());
+      }
+
+  }
+};
+
+class GIBI_MED_WRONLY_DRIVER
+{
+public :
+  GIBI_MED_WRONLY_DRIVER() ;
+
+  GIBI_MED_WRONLY_DRIVER(const GIBI_MED_WRONLY_DRIVER & driver) ;
+
+  ~GIBI_MED_WRONLY_DRIVER() ;
+
+  void open();
+
+  void write( void );
+
+  void read ( void );
+
+  void close();
+
+  %extend {
+    GIBI_MED_WRONLY_DRIVER(char * fileName, MED * ptrMed, MESH * ptrMesh)
+      {
+       return new GIBI_MED_WRONLY_DRIVER(string(fileName), ptrMed, ptrMesh) ;
+      }
+
+    %newobject __str__();
+    const char* __str__()
+      {
+       ostringstream mess;
+       mess << "Python Printing GIBI_MED_WRONLY_DRIVER : " << *self << endl;
+       return strdup(mess.str().c_str());
+      }
+
+  }
+};
+
 /*
   API de PORFLOW_MESH_[RDONLY,WRONLY,RDWR]_DRIVER
 */
 /*
   API de PORFLOW_MESH_[RDONLY,WRONLY,RDWR]_DRIVER
 */
@@ -2427,12 +2774,56 @@ public:
   }
 };
 
   }
 };
 
+class ASCII_FIELDDOUBLE_DRIVER {
+public:
+  ~ASCII_FIELDDOUBLE_DRIVER();
+
+  void open();
+
+  void close();
+
+  void write( void ) const ;
+
+
+  %extend {
+    ASCII_FIELDDOUBLE_DRIVER(const char *fileName, FIELDDOUBLE * ptrField, med_sort_direc direction, const char *priority)
+      {
+       return new ASCII_FIELDDOUBLE_DRIVER(string(fileName), ptrField, (MED_EN::med_sort_direc)direction, priority);
+      }
+  }
+};
+
+class ASCII_FIELDINT_DRIVER {
+public:
+  ~ASCII_FIELDINT_DRIVER();
+
+  void open();
+
+  void close();
+
+  void write( void ) const ;
+
+
+  %extend {
+    ASCII_FIELDINT_DRIVER(const char *fileName, FIELDINT * ptrField, med_sort_direc direction, const char *priority)
+      {
+       return new ASCII_FIELDINT_DRIVER(string(fileName), ptrField, (MED_EN::med_sort_direc)direction, priority);
+      }
+  }
+};
+
 %newobject createFieldDoubleScalarProduct(FIELDDOUBLE * field1, FIELDDOUBLE * field2) ;
 FIELDDOUBLE * createFieldDoubleScalarProduct(FIELDDOUBLE * field1, FIELDDOUBLE * field2) ;
 
 %newobject createFieldIntScalarProduct(FIELDINT * field1, FIELDINT * field2) ;
 FIELDINT * createFieldIntScalarProduct(FIELDINT * field1, FIELDINT * field2) ;
 
 %newobject createFieldDoubleScalarProduct(FIELDDOUBLE * field1, FIELDDOUBLE * field2) ;
 FIELDDOUBLE * createFieldDoubleScalarProduct(FIELDDOUBLE * field1, FIELDDOUBLE * field2) ;
 
 %newobject createFieldIntScalarProduct(FIELDINT * field1, FIELDINT * field2) ;
 FIELDINT * createFieldIntScalarProduct(FIELDINT * field1, FIELDINT * field2) ;
 
+%newobject createFieldDoubleScalarProductDeep(FIELDDOUBLE * field1, FIELDDOUBLE * field2) ;
+FIELDDOUBLE * createFieldDoubleScalarProductDeep(FIELDDOUBLE * field1, FIELDDOUBLE * field2) ;
+
+%newobject createFieldIntScalarProductDeep(FIELDINT * field1, FIELDINT * field2) ;
+FIELDINT * createFieldIntScalarProductDeep(FIELDINT * field1, FIELDINT * field2) ;
+
 FIELDDOUBLE * createFieldDoubleFromField(FIELD_ * field) ;
 
 FIELDINT * createFieldIntFromField(FIELD_ * field) ;
 FIELDDOUBLE * createFieldDoubleFromField(FIELD_ * field) ;
 
 FIELDINT * createFieldIntFromField(FIELD_ * field) ;
@@ -2459,6 +2850,16 @@ GRID * createGridFromMesh( MESH * aMesh );
   {
      return (FIELDINT *) FIELD<int>::scalarProduct( (FIELD<int>)*field1, (FIELD<int>)*field2);
   }
   {
      return (FIELDINT *) FIELD<int>::scalarProduct( (FIELD<int>)*field1, (FIELD<int>)*field2);
   }
+
+  FIELDDOUBLE * createFieldDoubleScalarProductDeep(FIELDDOUBLE * field1, FIELDDOUBLE * field2) 
+  {
+     return (FIELDDOUBLE *) FIELD<double>::scalarProduct( (FIELD<double>)*field1, (FIELD<double>)*field2, true);
+  }
+  
+  FIELDINT * createFieldIntScalarProductDeep(FIELDINT * field1, FIELDINT * field2) 
+  {
+     return (FIELDINT *) FIELD<int>::scalarProduct( (FIELD<int>)*field1, (FIELD<int>)*field2, true);
+  }
   
   FIELDDOUBLE * createFieldDoubleFromField(FIELD_ * field)
     {
   
   FIELDDOUBLE * createFieldDoubleFromField(FIELD_ * field)
     {
@@ -2479,196 +2880,11 @@ GRID * createGridFromMesh( MESH * aMesh );
                                              PyObject * double_function)
     {
       MESSAGE("createFieldDoubleFromAnalytic : Constructor (for Python API) FIELDDOUBLE from an analytic fonction");
                                              PyObject * double_function)
     {
       MESSAGE("createFieldDoubleFromAnalytic : Constructor (for Python API) FIELDDOUBLE from an analytic fonction");
-
       FIELDDOUBLE * fieldDouble  = new FIELDDOUBLE(Support,NumberOfComponents);
       FIELDDOUBLE * fieldDouble  = new FIELDDOUBLE(Support,NumberOfComponents);
-
-      int NumberOfValues = fieldDouble->getNumberOfValues();
-      double * values = new double[NumberOfValues*NumberOfComponents];
-
-      const double * x = (const double *) NULL;
-      const double * y = (const double *) NULL;
-      const double * z = (const double *) NULL;
-
-      FIELD<double> * barycenterField = (FIELD<double> *) NULL;
-
-      medEntityMesh entity = Support->getEntity();
-      bool onAll = Support->isOnAllElements();
-
-      MESH * mesh = Support->getMesh();
-      int spaceDim = mesh->getSpaceDimension();
-
-      if (entity == MED_NODE)
-       {
-         if (onAll)
-           {
-             const double * coord = mesh->getCoordinates(MED_NO_INTERLACE);
-
-             x = coord;
-             y = coord+NumberOfValues;
-             if (spaceDim == 3) z = y+NumberOfValues;
-           }
-         else
-           {
-             const int * nodesNumber = Support->getNumber(MED_ALL_ELEMENTS);
-             const double * coord = mesh->getCoordinates(MED_FULL_INTERLACE);
-
-             double * x_tmp = new double [NumberOfValues];
-             double * y_tmp = new double [NumberOfValues];
-
-             for (int i=0; i<NumberOfValues; i++)
-               {
-                 int j = nodesNumber[i]*spaceDim;
-                 x_tmp[i] = coord[j];
-                 y_tmp[i] = coord[j+1];
-               }
-
-             x = x_tmp;
-             y = y_tmp;
-
-             if (spaceDim == 3)
-               {
-                 double * z_tmp = new double [NumberOfValues];
-
-                 for (int i=0; i<NumberOfValues; i++)
-                   {
-                     int j = nodesNumber[i]*spaceDim + 2;
-                     z_tmp[i] = coord[j];
-                   }
-
-                 z = z_tmp;
-               }
-           }
-       }
-      else
-       {
-         barycenterField = mesh->getBarycenter(Support);
-         const double * barycenter =
-           barycenterField->getValue(MED_NO_INTERLACE);
-
-         x = barycenter;
-         y = barycenter+NumberOfValues;
-         if (spaceDim == 3) z = y+NumberOfValues;
-       }
-
-      for (int i=0; i<NumberOfValues; i++)
-       {
-         double x_val = x[i];
-         double y_val = y[i];
-         double z_val = 0.0;
-
-         if (spaceDim == 2)
-           {
-           MESSAGE("debug ...... x = " << x_val << " y = " << y_val);
-           }
-         else if (spaceDim == 3)
-           {
-             z_val = z[i];
-             MESSAGE("debug ...... x = " << x_val << " y = " << y_val << " z = " << z_val);
-           }
-
-         PyObject * tuple;
-
-         if (spaceDim == 2) tuple = PyTuple_New(2);
-         else if (spaceDim == 3) tuple = PyTuple_New(3);
-
-         int index = 0;
-         int err = PyTuple_SetItem(tuple,index,Py_BuildValue("d",x_val));
-
-         if (err != 0)
-           throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic");
-
-         index = 1;
-         err = PyTuple_SetItem(tuple,index,Py_BuildValue("d",y_val));
-
-         if (err != 0)
-           throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic");
-
-         if (spaceDim == 3)
-           {
-             index = 2;
-             err = PyTuple_SetItem(tuple,index,Py_BuildValue("d",z_val));
-
-             if (err != 0)
-               throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic");
-           }
-
-         PyObject * function_ret = PyObject_CallObject(double_function,
-                                                       tuple);
-
-         SCRUTE(function_ret);
-
-         if ((function_ret == (PyObject *) NULL) && (spaceDim == 2))
-           throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API (double, double))");
-         else if ((function_ret == (PyObject *) NULL) && (spaceDim == 3))
-           throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API (double, double, double))");
-
-         err = PyList_Check(function_ret);
-
-         if (!err)
-           if (spaceDim == 2)
-             {
-               Py_DECREF(function_ret);
-               throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API list of double fonct (double, double))");
-             }
-           else if (spaceDim == 3)
-             {
-               Py_DECREF(function_ret);
-               throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API list of double fonct (double, double, double))");
-             }
-
-         int size = PyList_Size(function_ret);
-
-         if (size != NumberOfComponents)
-           if (spaceDim == 2)
-             {
-               Py_DECREF(function_ret);
-               throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API list of double fonct (double, double), especially the size of the returned list)");
-             }
-           else if (spaceDim == 3)
-             {
-               Py_DECREF(function_ret);
-               throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API list of double fonct (double, double, double), especially the size of the returned list)");
-             }
-
-         for (int j=0; j<NumberOfComponents; j++)
-           {
-             PyObject * tmp = PyList_GetItem(function_ret,j);
-
-             err = PyFloat_Check(tmp);
-
-             if (!err)
-               if (spaceDim == 2)
-                 {
-                   Py_DECREF(function_ret);
-                   throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API list of double fonct (double, double), especially the type of the returned list)");
-                 }
-               else if (spaceDim == 3)
-                 {
-                   Py_DECREF(function_ret);
-                   throw MEDEXCEPTION("Internal Error in createFieldDoubleFromAnalytic : the call to the user callable fonction has failed (check its API list of double fonct (double, double, double), especially the type of the returned list)");
-                 }
-
-             values[i*NumberOfComponents+j] = PyFloat_AsDouble(tmp);
-           }
-
-         Py_DECREF(function_ret);
-         Py_DECREF(tuple);
-       }
-
-      fieldDouble->setValue(MED_FULL_INTERLACE,values);
-
-      delete [] values;
-
-      if ((entity == MED_NODE) && (!onAll))
-       {
-         delete [] x;
-         delete [] y;
-
-         if (Support->getMesh()->getSpaceDimension() == 3)
-           delete [] z;
-       }
-      else if (entity != MED_NODE) delete barycenterField ;
-
+      MyFunction<double>::_pyFunc=double_function;
+      MyFunction<double>::_nbOfComponent=NumberOfComponents;
+      MyFunction<double>::_spaceDim=Support->getMesh()->getSpaceDimension();
+      fieldDouble->fillFromAnalytic< MyFunction<double>::EvalPy2Cpp >();
       return fieldDouble;
     }
 
       return fieldDouble;
     }
 
@@ -2677,194 +2893,11 @@ GRID * createGridFromMesh( MESH * aMesh );
                                        PyObject * integer_function)
     {
       MESSAGE("createFieldIntFromAnalytic : Constructor (for Python API) FIELDINT from an analytic fonction");
                                        PyObject * integer_function)
     {
       MESSAGE("createFieldIntFromAnalytic : Constructor (for Python API) FIELDINT from an analytic fonction");
-
-      FIELDINT * fieldInt = new FIELDINT(Support,NumberOfComponents);
-
-      int NumberOfValues = fieldInt->getNumberOfValues();
-      int * values = new int[NumberOfValues*NumberOfComponents];
-
-      const double * x = (const double *) NULL;
-      const double * y = (const double *) NULL;
-      const double * z = (const double *) NULL;
-
-      FIELD<double> * barycenterField = (FIELD<double> *) NULL;
-
-      medEntityMesh entity = Support->getEntity();
-      bool onAll = Support->isOnAllElements();
-
-      MESH * mesh = Support->getMesh();
-      int spaceDim = mesh->getSpaceDimension();
-
-      if (entity == MED_NODE)
-       {
-         if (onAll)
-           {
-             const double * coord = mesh->getCoordinates(MED_NO_INTERLACE);
-
-             x = coord;
-             y = coord+NumberOfValues;
-             if (spaceDim == 3) z = y+NumberOfValues;
-           }
-         else
-           {
-             const int * nodesNumber = Support->getNumber(MED_ALL_ELEMENTS);
-             const double * coord = mesh->getCoordinates(MED_FULL_INTERLACE);
-
-             double * x_tmp = new double [NumberOfValues];
-             double * y_tmp = new double [NumberOfValues];
-
-             for (int i=0; i<NumberOfValues; i++)
-               {
-                 int j = nodesNumber[i]*spaceDim;
-                 x_tmp[i] = coord[j];
-                 y_tmp[i] = coord[j+1];
-               }
-
-             x = x_tmp;
-             y = y_tmp;
-
-             if (spaceDim == 3)
-               {
-                 double * z_tmp = new double [NumberOfValues];
-
-                 for (int i=0; i<NumberOfValues; i++)
-                   {
-                     int j = nodesNumber[i]*spaceDim + 2;
-                     z_tmp[i] = coord[j];
-                   }
-
-                 z = z_tmp;
-               }
-           }
-       }
-      else
-       {
-         barycenterField = mesh->getBarycenter(Support);
-         const double * barycenter =
-           barycenterField->getValue(MED_NO_INTERLACE);
-
-         x = barycenter;
-         y = barycenter+NumberOfValues;
-         if (spaceDim == 3) z = y+NumberOfValues;
-       }
-
-      for (int i=0; i<NumberOfValues; i++)
-       {
-         double x_val = x[i];
-         double y_val = y[i];
-         double z_val = 0.0;
-
-         if (spaceDim == 2)
-           {
-           MESSAGE("debug ...... x = " << x_val << " y = " << y_val);
-           }
-         else if (spaceDim == 3)
-           {
-             z_val = z[i];
-             MESSAGE("debug ...... x = " << x_val << " y = " << y_val << " z = " << z_val);
-           }
-
-         PyObject * tuple;
-
-         if (spaceDim == 2) tuple = PyTuple_New(2);
-         else if (spaceDim == 3) tuple = PyTuple_New(3);
-
-         int index = 0;
-         int err = PyTuple_SetItem(tuple,index,Py_BuildValue("d",x_val));
-
-         if (err != 0)
-           throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic");
-
-         index = 1;
-         err = PyTuple_SetItem(tuple,index,Py_BuildValue("d",y_val));
-
-         if (err != 0)
-           throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic");
-
-         if (spaceDim == 3)
-           {
-             index = 2;
-             err = PyTuple_SetItem(tuple,index,Py_BuildValue("d",z_val));
-
-             if (err != 0)
-               throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic");
-           }
-
-         PyObject * function_ret = PyObject_CallObject(integer_function,
-                                                       tuple);
-
-         if ((function_ret == (PyObject *) NULL) && (spaceDim == 2))
-           throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API (double, double))");
-         else if ((function_ret == (PyObject *) NULL) && (spaceDim == 3))
-           throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API (double, double, double))");
-
-         err = PyList_Check(function_ret);
-
-         if (!err)
-           if (spaceDim == 2)
-             {
-               Py_DECREF(function_ret);
-               throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API list of integer fonct (double, double))");
-             }
-           else if (spaceDim == 3)
-             {
-               Py_DECREF(function_ret);
-               throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API list of integer fonct (double, double, double))");
-             }
-
-         int size = PyList_Size(function_ret);
-
-         if (size != NumberOfComponents)
-           if (spaceDim == 2)
-             {
-               Py_DECREF(function_ret);
-               throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API list of integer fonct (double, double), especially the size of the returned list)");
-             }
-           else if (spaceDim == 3)
-             {
-               Py_DECREF(function_ret);
-               throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API list of integer fonct (double, double, double), especially the size of the returned list)");
-             }
-
-         for (int j=0; j<NumberOfComponents; j++)
-           {
-             PyObject * tmp = PyList_GetItem(function_ret,j);
-
-             err = PyInt_Check(tmp);
-
-             if (!err)
-               if (spaceDim == 2)
-                 {
-                   Py_DECREF(function_ret);
-                   throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API list of integer fonct (double, double), especially the type of the returned list)");
-                 }
-               else if (spaceDim == 3)
-                 {
-                   Py_DECREF(function_ret);
-                   throw MEDEXCEPTION("Internal Error in createFieldIntFromAnalytic : the call to the user callable fonction has failed (check its API list of integer fonct (double, double, double), especially the type of the returned list)");
-                 }
-
-             values[i*NumberOfComponents+j] = (int) PyInt_AsLong(tmp);
-           }
-
-         Py_DECREF(function_ret);
-         Py_DECREF(tuple);
-       }
-
-      fieldInt->setValue(MED_FULL_INTERLACE,values);
-
-      delete [] values;
-
-      if ((entity == MED_NODE) && (!onAll))
-       {
-         delete [] x;
-         delete [] y;
-
-         if (Support->getMesh()->getSpaceDimension() == 3)
-           delete [] z;
-       }
-      else if (entity != MED_NODE) delete barycenterField ;
-
+      FIELDINT * fieldInt  = new FIELDINT(Support,NumberOfComponents);
+      MyFunction<int>::_pyFunc=integer_function;
+      MyFunction<int>::_nbOfComponent=NumberOfComponents;
+      MyFunction<int>::_spaceDim=Support->getMesh()->getSpaceDimension();
+      fieldInt->fillFromAnalytic< MyFunction<int>::EvalPy2Cpp >();
       return fieldInt;
     }
 
       return fieldInt;
     }
 
index 8183d07cfb934903fe5ebafc495c4ac53dd36a4f..1e00bd5f677f2df71a1f57f64024bcce983e9a8e 100755 (executable)
@@ -286,7 +286,7 @@ support1 = SUPPORT(mesh,"Partial_Support_1",MED_CELL)
 support1Description = "Partial Support 1"
 support1NbOfTypes = 3
 support1TotNbElm = 8
 support1Description = "Partial Support 1"
 support1NbOfTypes = 3
 support1TotNbElm = 8
-support1GeoType = [MED_TRIA3,MED_HEXA8,MED_PYRA5]
+support1GeoType = [MED_TETRA4,MED_HEXA8,MED_PYRA5]
 support1NbOfElm = [4,2,2]
 support1NbValue = [1,2,3,4,15,16,13,14]
 
 support1NbOfElm = [4,2,2]
 support1NbValue = [1,2,3,4,15,16,13,14]
 
@@ -319,7 +319,7 @@ support2 = SUPPORT(mesh,"Partial_Support_2",MED_CELL)
 support2Description = "Partial Support 2"
 support2NbOfTypes = 3
 support2TotNbElm = 8
 support2Description = "Partial Support 2"
 support2NbOfTypes = 3
 support2TotNbElm = 8
-support2GeoType = [MED_TRIA3,MED_HEXA8,MED_PYRA5]
+support2GeoType = [MED_TETRA4,MED_HEXA8,MED_PYRA5]
 support2NbOfElm = [6,1,1]
 support2NbValue = [3,4,9,10,11,12,16,14]
 
 support2NbOfElm = [6,1,1]
 support2NbValue = [3,4,9,10,11,12,16,14]
 
diff --git a/src/MEDMEM_SWIG/testMedMemCxxTests.py b/src/MEDMEM_SWIG/testMedMemCxxTests.py
new file mode 100644 (file)
index 0000000..2496229
--- /dev/null
@@ -0,0 +1,605 @@
+from libMEDMEM_Swig import *
+
+import os,string
+
+filesPath=os.environ["MED_ROOT_DIR"]
+filesPath=filesPath+"/share/salome/resources/"
+
+testExecfiles = []
+argListTest = []
+rootFileTest = []
+meshTest = []
+fieldTest = []
+
+# executables list to test functionalities
+
+testExecfiles.append("testUArray")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("testUCellModel")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("testUCoordinate")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("testUGeoNameMeshEntities")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("testUMedException")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("testUModulusArray")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("testUPointerOf")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("testUSkyLineArray")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("testUUnit")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_MEDMEM_PolyConnectivity")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_affect_medarray")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_copie_coordinate")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_copie_medarray")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_MEDMEM_Array")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_MEDMEM_CellModel")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_MEDMEM_ModulusArray")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_MEDMEM_PolyhedronArray")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_MEDMEM_SkyLineArray")
+argListTest.append("")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_MEDMEM_Meshing")
+argListTest.append("toto")
+rootFileTest.append("")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("Darcy3_3D_H_10x10x10")
+argListTest.append(filesPath+"Darcy3_3D_H_10x10x10.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("dx200_dy1_avec_2couches")
+argListTest.append(filesPath+"dx200_dy1_avec_2couches.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("elle_2D_QT_10x10")
+argListTest.append(filesPath+"elle_2D_QT_10x10.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("elle_2D_QT_2x2")
+argListTest.append(filesPath+"elle_2D_QT_2x2.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("elle_2D_QT_40x40")
+argListTest.append(filesPath+"elle_2D_QT_40x40.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("elle_2D_QT_4x4")
+argListTest.append(filesPath+"elle_2D_QT_4x4.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("elle_3D_HPr_10x10x10")
+argListTest.append(filesPath+"elle_3D_HPr_10x10x10.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("elle_3D_HPr_2x2x2")
+argListTest.append(filesPath+"elle_3D_HPr_2x2x2.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("elle_3D_HPr_4x4x4")
+argListTest.append(filesPath+"elle_3D_HPr_4x4x4.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("inclusion_2d_raf")
+argListTest.append(filesPath+"inclusion_2d_raf.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("inclusion_2d")
+argListTest.append(filesPath+"inclusion_2d.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail_ktest1-3-hexa")
+argListTest.append(filesPath+"mail_ktest1-3-hexa.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail_ktest1-3-tetra")
+argListTest.append(filesPath+"mail_ktest1-3-tetra.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail_ktest3-1")
+argListTest.append(filesPath+"mail_ktest3-1.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail_ktest3-2")
+argListTest.append(filesPath+"mail_ktest3-2.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("maillage_andra2_100elts")
+argListTest.append(filesPath+"maillage_andra2_100elts.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("maillage_cas2_2d")
+argListTest.append(filesPath+"maillage_cas2_2d.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("maillage_cas4_234elts")
+argListTest.append(filesPath+"maillage_cas4_234elts.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("maillage_CHEMVAL_100elts")
+argListTest.append(filesPath+"maillage_CHEMVAL_100elts.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("maillage_CHEMVAL_40elts")
+argListTest.append(filesPath+"maillage_CHEMVAL_40elts.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("maillage_chemvalIV_cas1_100elts")
+argListTest.append(filesPath+"maillage_chemvalIV_cas1_100elts.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("maillage_chemvalIV_cas1_40elts")
+argListTest.append(filesPath+"maillage_chemvalIV_cas1_40elts.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("maill_mistra_elim")
+argListTest.append(filesPath+"maill_mistra_elim.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail_test1-1-qua")
+argListTest.append(filesPath+"mail_test1-1-qua.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail_test1-1-tri")
+argListTest.append(filesPath+"mail_test1-1-tri.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail_test1-2-qua")
+argListTest.append(filesPath+"mail_test1-2-qua.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail_test1-2-tri")
+argListTest.append(filesPath+"mail_test1-2-tri.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail-test1-4-1")
+argListTest.append(filesPath+"mail-test1-4-1.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_gibi_driver")
+rootFileTest.append("mail-test1-4-2")
+argListTest.append(filesPath+"mail-test1-4-2.sauve")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_porflow_driver")
+rootFileTest.append("boitenew")
+argListTest.append(filesPath+"boitenew.inp")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_porflow_driver")
+rootFileTest.append("Case1")
+argListTest.append(filesPath+"Case1.inp")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_porflow_driver")
+rootFileTest.append("cube")
+argListTest.append(filesPath+"cube.inp")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_porflow_driver")
+rootFileTest.append("test3")
+argListTest.append(filesPath+"test3.inp")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_porflow_driver")
+rootFileTest.append("titi")
+argListTest.append(filesPath+"titi.inp")
+meshTest.append("")
+fieldTest.append("")
+
+testExecfiles.append("test_copie_connectivity")
+rootFileTest.append("mesh")
+meshTest.append("Mesh 1")
+fieldTest.append("")
+argListTest.append(filesPath+"mesh.med" + " " + "'Mesh 1'")
+
+testExecfiles.append("test_copie_connectivity")
+rootFileTest.append("maillage_UniSegFam")
+meshTest.append("maillage_CHEMVAL_100elts")
+fieldTest.append("")
+argListTest.append(filesPath+"maillage_UniSegFam.med" + " " + "maillage_CHEMVAL_100elts")
+                   
+testExecfiles.append("test_copie_connectivity")
+rootFileTest.append("carre_en_quad4")
+meshTest.append("carre_en_quad4")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4.med" + " " + "carre_en_quad4")
+
+testExecfiles.append("test_copie_connectivity")
+rootFileTest.append("cube_hexa8")
+meshTest.append("CUBE_EN_HEXA8")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8.med" + " " + "CUBE_EN_HEXA8")
+
+testExecfiles.append("test_copie_connectivity")
+rootFileTest.append("test19")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"test19.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_connectivity")
+rootFileTest.append("carre_en_quad4_seg2")
+meshTest.append("carre_en_quad4_seg2")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4_seg2.med" + " " + "carre_en_quad4_seg2")
+
+testExecfiles.append("test_copie_connectivity")
+rootFileTest.append("cube_hexa8_quad4")
+meshTest.append("CUBE_EN_HEXA8_QUAD4")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8_quad4.med" + " " + "CUBE_EN_HEXA8_QUAD4")
+
+testExecfiles.append("test_copie_connectivity")
+rootFileTest.append("pointe")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"pointe.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_family")
+rootFileTest.append("mesh")
+meshTest.append("Mesh 1")
+fieldTest.append("")
+argListTest.append(filesPath+"mesh.med" + " " + "'Mesh 1'")
+
+testExecfiles.append("test_copie_family")
+rootFileTest.append("maillage_UniSegFam")
+meshTest.append("maillage_CHEMVAL_100elts")
+fieldTest.append("")
+argListTest.append(filesPath+"maillage_UniSegFam.med" + " " + "maillage_CHEMVAL_100elts")
+                   
+testExecfiles.append("test_copie_family")
+rootFileTest.append("carre_en_quad4")
+meshTest.append("carre_en_quad4")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4.med" + " " + "carre_en_quad4")
+
+testExecfiles.append("test_copie_family")
+rootFileTest.append("cube_hexa8")
+meshTest.append("CUBE_EN_HEXA8")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8.med" + " " + "CUBE_EN_HEXA8")
+
+testExecfiles.append("test_copie_family")
+rootFileTest.append("test19")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"test19.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_family")
+rootFileTest.append("carre_en_quad4_seg2")
+meshTest.append("carre_en_quad4_seg2")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4_seg2.med" + " " + "carre_en_quad4_seg2")
+
+testExecfiles.append("test_copie_family")
+rootFileTest.append("cube_hexa8_quad4")
+meshTest.append("CUBE_EN_HEXA8_QUAD4")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8_quad4.med" + " " + "CUBE_EN_HEXA8_QUAD4")
+
+testExecfiles.append("test_copie_family")
+rootFileTest.append("pointe")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"pointe.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_group")
+rootFileTest.append("mesh")
+meshTest.append("Mesh 1")
+fieldTest.append("")
+argListTest.append(filesPath+"mesh.med" + " " + "'Mesh 1'")
+
+testExecfiles.append("test_copie_group")
+rootFileTest.append("maillage_UniSegFam")
+meshTest.append("maillage_CHEMVAL_100elts")
+fieldTest.append("")
+argListTest.append(filesPath+"maillage_UniSegFam.med" + " " + "maillage_CHEMVAL_100elts")
+                   
+testExecfiles.append("test_copie_group")
+rootFileTest.append("carre_en_quad4")
+meshTest.append("carre_en_quad4")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4.med" + " " + "carre_en_quad4")
+
+testExecfiles.append("test_copie_group")
+rootFileTest.append("cube_hexa8")
+meshTest.append("CUBE_EN_HEXA8")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8.med" + " " + "CUBE_EN_HEXA8")
+
+testExecfiles.append("test_copie_group")
+rootFileTest.append("test19")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"test19.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_group")
+rootFileTest.append("carre_en_quad4_seg2")
+meshTest.append("carre_en_quad4_seg2")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4_seg2.med" + " " + "carre_en_quad4_seg2")
+
+testExecfiles.append("test_copie_group")
+rootFileTest.append("cube_hexa8_quad4")
+meshTest.append("CUBE_EN_HEXA8_QUAD4")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8_quad4.med" + " " + "CUBE_EN_HEXA8_QUAD4")
+
+testExecfiles.append("test_copie_group")
+rootFileTest.append("pointe")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"pointe.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_mesh")
+rootFileTest.append("mesh")
+meshTest.append("Mesh 1")
+fieldTest.append("")
+argListTest.append(filesPath+"mesh.med" + " " + "'Mesh 1'")
+
+testExecfiles.append("test_copie_mesh")
+rootFileTest.append("maillage_UniSegFam")
+meshTest.append("maillage_CHEMVAL_100elts")
+fieldTest.append("")
+argListTest.append(filesPath+"maillage_UniSegFam.med" + " " + "maillage_CHEMVAL_100elts")
+                   
+testExecfiles.append("test_copie_mesh")
+rootFileTest.append("carre_en_quad4")
+meshTest.append("carre_en_quad4")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4.med" + " " + "carre_en_quad4")
+
+testExecfiles.append("test_copie_mesh")
+rootFileTest.append("cube_hexa8")
+meshTest.append("CUBE_EN_HEXA8")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8.med" + " " + "CUBE_EN_HEXA8")
+
+testExecfiles.append("test_copie_mesh")
+rootFileTest.append("test19")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"test19.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_mesh")
+rootFileTest.append("carre_en_quad4_seg2")
+meshTest.append("carre_en_quad4_seg2")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4_seg2.med" + " " + "carre_en_quad4_seg2")
+
+testExecfiles.append("test_copie_mesh")
+rootFileTest.append("cube_hexa8_quad4")
+meshTest.append("CUBE_EN_HEXA8_QUAD4")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8_quad4.med" + " " + "CUBE_EN_HEXA8_QUAD4")
+
+testExecfiles.append("test_copie_mesh")
+rootFileTest.append("pointe")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"pointe.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_support")
+rootFileTest.append("mesh")
+meshTest.append("Mesh 1")
+fieldTest.append("")
+argListTest.append(filesPath+"mesh.med" + " " + "'Mesh 1'")
+
+testExecfiles.append("test_copie_support")
+rootFileTest.append("maillage_UniSegFam")
+meshTest.append("maillage_CHEMVAL_100elts")
+fieldTest.append("")
+argListTest.append(filesPath+"maillage_UniSegFam.med" + " " + "maillage_CHEMVAL_100elts")
+                   
+testExecfiles.append("test_copie_support")
+rootFileTest.append("carre_en_quad4")
+meshTest.append("carre_en_quad4")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4.med" + " " + "carre_en_quad4")
+
+testExecfiles.append("test_copie_support")
+rootFileTest.append("cube_hexa8")
+meshTest.append("CUBE_EN_HEXA8")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8.med" + " " + "CUBE_EN_HEXA8")
+
+testExecfiles.append("test_copie_support")
+rootFileTest.append("test19")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"test19.med" + " " + "maa1")
+
+testExecfiles.append("test_copie_support")
+rootFileTest.append("carre_en_quad4_seg2")
+meshTest.append("carre_en_quad4_seg2")
+fieldTest.append("")
+argListTest.append(filesPath+"carre_en_quad4_seg2.med" + " " + "carre_en_quad4_seg2")
+
+testExecfiles.append("test_copie_support")
+rootFileTest.append("cube_hexa8_quad4")
+meshTest.append("CUBE_EN_HEXA8_QUAD4")
+fieldTest.append("")
+argListTest.append(filesPath+"cube_hexa8_quad4.med" + " " + "CUBE_EN_HEXA8_QUAD4")
+
+testExecfiles.append("test_copie_support")
+rootFileTest.append("pointe")
+meshTest.append("maa1")
+fieldTest.append("")
+argListTest.append(filesPath+"pointe.med" + " " + "maa1")
+
+###############################################################################
+
+nbOfTests = len(testExecfiles)
+
+print "Running all test programs with several arguments ... total = ",nbOfTests
+
+testOutfiles = []
+testErrfiles = []
+
+for i in range(nbOfTests):
+    if (rootFileTest[i] == ""):
+        testOutfiles.append(testExecfiles[i] + ".out")
+    else:
+        if (meshTest[i] == ""):
+            testOutfiles.append(testExecfiles[i]+ "_" + rootFileTest[i] + ".out")
+        else:
+            if (fieldTest[i] == ""):
+                meshName = string.replace(meshTest[i]," ","_")
+                testOutfiles.append(testExecfiles[i]+ "_" + rootFileTest[i] + "_" + meshName + ".out")
+            else:
+                meshName = string.replace(meshTest[i]," ","_")
+                fieldName = string.replace(fieldTest[i]," ","_")
+                testOutfiles.append(testExecfiles[i]+ "_" + rootFileTest[i] + "_" + meshName + "_" + fieldName + ".out")
+    testErrfiles.append(testExecfiles[i] + ".err")
+
+for i in range(nbOfTests):
+    aCommand = testExecfiles[i] + " " + argListTest[i] + " > " + testOutfiles[i] + " 2> " + testErrfiles[i]
+    status = os.system(aCommand)
+    if (status != 0):
+        print "problem with the command ", aCommand
+
+print "END of the Pyhton script ..... Ctrl D to exit"
index 2347dfdf11d004bc5ff09e1734def7047ed866b8..bf477ff8625e4e101ccc10b51c908c83a3ff4e8f 100755 (executable)
@@ -16,6 +16,8 @@ import sys,os,string
 filesPath=os.environ["MED_ROOT_DIR"]
 filesPath=filesPath+"/share/salome/resources/"
 
 filesPath=os.environ["MED_ROOT_DIR"]
 filesPath=filesPath+"/share/salome/resources/"
 
+os.system("rm -rf "+filesPath+"*_test.*")
+
 files = []
 meshNameFiles = []
 
 files = []
 meshNameFiles = []
 
@@ -56,6 +58,9 @@ def add_one(i):
 files.append("mesh.med")
 meshNameFiles.append("Mesh 1")
 
 files.append("mesh.med")
 meshNameFiles.append("Mesh 1")
 
+files.append("mesh_import22.med")
+meshNameFiles.append("Mesh 1")
+
 #
 # from other source including LGLS ones
 #
 #
 # from other source including LGLS ones
 #
@@ -63,35 +68,56 @@ meshNameFiles.append("Mesh 1")
 files.append("maillage_UniSegFam.med")
 meshNameFiles.append("maillage_CHEMVAL_100elts")
 
 files.append("maillage_UniSegFam.med")
 meshNameFiles.append("maillage_CHEMVAL_100elts")
 
+files.append("maillage_UniSegFam_import22.med")
+meshNameFiles.append("maillage_CHEMVAL_100elts")
+
 files.append("carre_en_quad4.med")
 meshNameFiles.append("carre_en_quad4")
 
 files.append("carre_en_quad4.med")
 meshNameFiles.append("carre_en_quad4")
 
+files.append("carre_en_quad4_import22.med")
+meshNameFiles.append("carre_en_quad4")
+
 files.append("cube_hexa8.med")
 meshNameFiles.append("CUBE_EN_HEXA8")
 
 files.append("cube_hexa8.med")
 meshNameFiles.append("CUBE_EN_HEXA8")
 
+files.append("cube_hexa8_import22.med")
+meshNameFiles.append("CUBE_EN_HEXA8")
+
 files.append("test19.med")
 meshNameFiles.append("CartGrid")
 
 files.append("test19.med")
 meshNameFiles.append("bodyfitted")
 
 files.append("test19.med")
 meshNameFiles.append("CartGrid")
 
 files.append("test19.med")
 meshNameFiles.append("bodyfitted")
 
-files.append("test19.med")
-meshNameFiles.append("maa1")
+##files.append("test19.med")
+##meshNameFiles.append("maa1")
 
 files.append("carre_en_quad4_seg2.med")
 meshNameFiles.append("carre_en_quad4_seg2")
 
 
 files.append("carre_en_quad4_seg2.med")
 meshNameFiles.append("carre_en_quad4_seg2")
 
+files.append("carre_en_quad4_seg2_import22.med")
+meshNameFiles.append("carre_en_quad4_seg2")
+
 files.append("cube_hexa8_quad4.med")
 meshNameFiles.append("CUBE_EN_HEXA8_QUAD4")
 
 files.append("cube_hexa8_quad4.med")
 meshNameFiles.append("CUBE_EN_HEXA8_QUAD4")
 
+files.append("cube_hexa8_quad4_import22.med")
+meshNameFiles.append("CUBE_EN_HEXA8_QUAD4")
+
 files.append("pointe.med")
 meshNameFiles.append("maa1")
 
 files.append("pointe.med")
 meshNameFiles.append("maa1")
 
+files.append("pointe_import22.med")
+meshNameFiles.append("maa1")
+
 files.append("Mistrat.med")
 meshNameFiles.append("Mistrat_Hexa")
 
 files.append("Mistrat.med")
 meshNameFiles.append("Mistrat_Hexa")
 
-## files.append("TimeStamps.med")
-## meshNameFiles.append("dom")
+files.append("Mistrat_import22.med")
+meshNameFiles.append("Mistrat_Hexa")
+
+##files.append("TimeStamps.med")
+##meshNameFiles.append("dom")
 
 #
 # Castem or Gibi file list
 
 #
 # Castem or Gibi file list
@@ -228,7 +254,8 @@ for i in range(nbOfFiles):
     for k in range(1,lenDecompFileM1):
         rootFile = rootFile + "." + decompFile[k]
 
     for k in range(1,lenDecompFileM1):
         rootFile = rootFile + "." + decompFile[k]
 
-    medFileName = rootFile + "_test.med"
+    medV21FileName = rootFile + "V21_test.med"
+    medV22FileName = rootFile + "V22_test.med"
     vtkFileName = rootFile + "_test.vtk"
 
     try:
     vtkFileName = rootFile + "_test.vtk"
 
     try:
@@ -524,10 +551,23 @@ for i in range(nbOfFiles):
 
 
     print "Saving in file the mesh under the med and vtk format"
 
 
     print "Saving in file the mesh under the med and vtk format"
-    print "Med file = ",medFileName
+    medFileVersion = getMedFileVersionForWriting()
+    print "Med File Version For Writing ",medFileVersion
+    print "Med V21 file = ",medV21FileName
+    print "Med V22 file = ",medV22FileName
     print "vtk file = ",vtkFileName
     print "vtk file = ",vtkFileName
-    idMed = mesh.addDriver(MED_DRIVER,medFileName,mesh.getName(),MED_REMP)
-    mesh.write(idMed)
+
+    if (medFileVersion == V22):
+        setMedFileVersionForWriting(V21)
+
+    idMedV21 = mesh.addDriver(MED_DRIVER,medV21FileName,mesh.getName(),MED_REMP)
+    mesh.write(idMedV21)
+
+    if (medFileVersion == V21):
+        setMedFileVersionForWriting(V22)
+
+    idMedV22 = mesh.addDriver(MED_DRIVER,medV22FileName,mesh.getName(),MED_REMP)
+    mesh.write(idMedV22)
 
     idVtk = mesh.addDriver(VTK_DRIVER,vtkFileName,mesh.getName())
     mesh.write(idVtk)
 
     idVtk = mesh.addDriver(VTK_DRIVER,vtkFileName,mesh.getName())
     mesh.write(idVtk)
@@ -545,10 +585,24 @@ for i in range(nbOfFiles):
     print ""
 
     print "Saving in file the cell barycenter field under the med and vtk format"
     print ""
 
     print "Saving in file the cell barycenter field under the med and vtk format"
-    print "Med file = ",medFileName
+    medFileVersion = getMedFileVersionForWriting()
+    print "Med File Version For Writing ",medFileVersion
+
+    print "Med V21 file = ",medV21FileName
+    print "Med V22 file = ",medV22FileName
     print "vtk file = ",vtkFileName
     print "vtk file = ",vtkFileName
-    idMed = barycenter.addDriver(MED_DRIVER,medFileName,barycenter.getName())
-    barycenter.write(idMed)
+
+    if (medFileVersion == V22):
+        setMedFileVersionForWriting(V21)
+
+    idMedV21 = barycenter.addDriver(MED_DRIVER,medV21FileName,barycenter.getName())
+    barycenter.write(idMedV21)
+
+    if (medFileVersion == V21):
+        setMedFileVersionForWriting(V22)
+
+    idMedV22 = barycenter.addDriver(MED_DRIVER,medV22FileName,barycenter.getName())
+    barycenter.write(idMedV22)
 
     idVtk = barycenter.addDriver(VTK_DRIVER,vtkFileName,barycenter.getName())
     barycenter.write(idVtk)
 
     idVtk = barycenter.addDriver(VTK_DRIVER,vtkFileName,barycenter.getName())
     barycenter.write(idVtk)
@@ -566,10 +620,23 @@ for i in range(nbOfFiles):
         print ""
 
         print "Saving in file the cell volume field under the med and vtk format"
         print ""
 
         print "Saving in file the cell volume field under the med and vtk format"
-        print "Med file = ",medFileName
+        medFileVersion = getMedFileVersionForWriting()
+        print "Med File Version For Writing ",medFileVersion
+        print "Med V21 file = ",medV21FileName
+        print "Med V22 file = ",medV22FileName
         print "vtk file = ",vtkFileName
         print "vtk file = ",vtkFileName
-        idMed = volume.addDriver(MED_DRIVER,medFileName,volume.getName())
-        volume.write(idMed)
+
+        if (medFileVersion == V22):
+            setMedFileVersionForWriting(V21)
+
+        idMedV21 = volume.addDriver(MED_DRIVER,medV21FileName,volume.getName())
+        volume.write(idMedV21)
+
+        if (medFileVersion == V21):
+            setMedFileVersionForWriting(V22)
+
+        idMedV22 = volume.addDriver(MED_DRIVER,medV22FileName,volume.getName())
+        volume.write(idMedV22)
 
         idVtk = volume.addDriver(VTK_DRIVER,vtkFileName,volume.getName())
         volume.write(idVtk)
 
         idVtk = volume.addDriver(VTK_DRIVER,vtkFileName,volume.getName())
         volume.write(idVtk)
@@ -596,9 +663,23 @@ for i in range(nbOfFiles):
         print ""
 
         print "Saving in file the face normal field under the med format"
         print ""
 
         print "Saving in file the face normal field under the med format"
-        print "Med file = ",medFileName
-        idMed = normal.addDriver(MED_DRIVER,medFileName,normal.getName())
-        normal.write(idMed)
+        medFileVersion = getMedFileVersionForWriting()
+        print "Med File Version For Writing ",medFileVersion
+        print "Med V21 file = ",medV21FileName
+        print "Med V22 file = ",medV22FileName
+
+        if (medFileVersion == V22):
+            setMedFileVersionForWriting(V21)
+
+        idMedV21 = normal.addDriver(MED_DRIVER,medV21FileName,normal.getName())
+        normal.write(idMedV21)
+
+        if (medFileVersion == V21):
+            setMedFileVersionForWriting(V22)
+
+        idMedV22 = normal.addDriver(MED_DRIVER,medV22FileName,normal.getName())
+        normal.write(idMedV22)
+        
         print "but not in vtk format because vtk does not offer the possibility to view a field on edges or faces"
         print ""
 
         print "but not in vtk format because vtk does not offer the possibility to view a field on edges or faces"
         print ""
 
@@ -614,10 +695,25 @@ for i in range(nbOfFiles):
         print ""            
 
         print "Saving in file the cell area field under the med and vtk format"
         print ""            
 
         print "Saving in file the cell area field under the med and vtk format"
-        print "Med file = ",medFileName
+        medFileVersion = getMedFileVersionForWriting()
+        print "Med File Version For Writing ",medFileVersion
+        print "Med V21 file = ",medV21FileName
+        print "Med V22 file = ",medV22FileName
         print "vtk file = ",vtkFileName
         print "vtk file = ",vtkFileName
-        idMed = area.addDriver(MED_DRIVER,medFileName,area.getName())
-        area.write(idMed)
+
+
+        if (medFileVersion == V22):
+            setMedFileVersionForWriting(V21)
+
+        idMedV21 = area.addDriver(MED_DRIVER,medV21FileName,area.getName())
+        area.write(idMedV21)
+
+
+        if (medFileVersion == V21):
+            setMedFileVersionForWriting(V22)
+
+        idMedV22 = area.addDriver(MED_DRIVER,medV22FileName,area.getName())
+        area.write(idMedV22)
 
         idVtk = area.addDriver(VTK_DRIVER,vtkFileName,area.getName())
         area.write(idVtk)
 
         idVtk = area.addDriver(VTK_DRIVER,vtkFileName,area.getName())
         area.write(idVtk)
@@ -643,9 +739,24 @@ for i in range(nbOfFiles):
         print ""
 
         print "Saving in file the face normal field under the med format"
         print ""
 
         print "Saving in file the face normal field under the med format"
-        print "Med file = ",medFileName
-        idMed = normal.addDriver(MED_DRIVER,medFileName,normal.getName())
-        normal.write(idMed)
+        medFileVersion = getMedFileVersionForWriting()
+        print "Med File Version For Writing ",medFileVersion
+        print "Med V21 file = ",medV21FileName
+        print "Med V22 file = ",medV22FileName
+
+        if (medFileVersion == V22):
+            setMedFileVersionForWriting(V21)
+
+        idMedV21 = normal.addDriver(MED_DRIVER,medV21FileName,normal.getName())
+        normal.write(idMedV21)
+
+
+        if (medFileVersion == V21):
+            setMedFileVersionForWriting(V22)
+
+        idMedV22 = normal.addDriver(MED_DRIVER,medV22FileName,normal.getName())
+        normal.write(idMedV22)
+        
         print "but no in vtk format because vtk does not offer the possibility to view a field on edges or faces"
 
     print ""
         print "but no in vtk format because vtk does not offer the possibility to view a field on edges or faces"
 
     print ""
@@ -704,7 +815,8 @@ for i in range(nbOfFiles):
 
         print ""
 
 
         print ""
 
-        mesh_name = md.getMeshName(0)
+#        mesh_name = md.getMeshName(0)
+        mesh_name = meshNameFiles[i]
         mesh = md.getMesh(mesh_name)
         mesh.read()
         spaceDim = mesh.getSpaceDimension()
         mesh = md.getMesh(mesh_name)
         mesh.read()
         spaceDim = mesh.getSpaceDimension()
index fd603c4b539c2975216e09f772d247c60cb90744..10bdaf6bfb5c0d377e38ae87e5b1ced6fea3b2d0 100644 (file)
@@ -13,7 +13,7 @@ import os
 filePath=os.environ["MED_ROOT_DIR"]
 filePath=filePath+"/share/salome/resources/"
 porflowFile = "boitenew.inp"
 filePath=os.environ["MED_ROOT_DIR"]
 filePath=filePath+"/share/salome/resources/"
 porflowFile = "boitenew.inp"
-mesh1Name = string.split(gibiFile,".")[0]+"_fromPorflowDriver"
+mesh1Name = string.split(porflowFile,".")[0]+"_fromPorflowDriver"
 
 porflowFile = filePath + porflowFile
 medFile = string.split(porflowFile,".")[0]+"_fromPorflowDriver.med"
 
 porflowFile = filePath + porflowFile
 medFile = string.split(porflowFile,".")[0]+"_fromPorflowDriver.med"
index ca1cc170eb4c30f373fe86f569528a7486773aeb..29077823c0d86ea5ddeb1eae3e424253e658d86b 100644 (file)
@@ -32,11 +32,11 @@ VPATH=.:@srcdir@
 @COMMENCE@
 
 ifeq (@WITHIHM@,yes)
 @COMMENCE@
 
 ifeq (@WITHIHM@,yes)
-SUBDIRS = MEDMEM MEDMEM_SWIG MEDMEM_I MED MEDGUI MedCorba_Swig MED_SWIG MedClient INTERPOLATION
+SUBDIRS = INTERPOLATION MEDMEM MEDMEM_SWIG MEDMEM_I MED MEDGUI MedCorba_Swig MED_SWIG MedClient
 endif
 
 ifeq (@WITHIHM@,no)
 endif
 
 ifeq (@WITHIHM@,no)
-SUBDIRS = MEDMEM MEDMEM_SWIG MEDMEM_I MED MedCorba_Swig MED_SWIG MedClient INTERPOLATION
+SUBDIRS = INTERPOLATION MEDMEM MEDMEM_SWIG MEDMEM_I MED MedCorba_Swig MED_SWIG MedClient
 
 endif
 
 
 endif
 
index d771344b7a6b6231f4f204e96ac2ee10a007479c..280de14c928bb8bffc823a9e87346d651f062501 100644 (file)
@@ -131,7 +131,8 @@ void CONNECTIVITYClient::fillCopy()
       int kT = Count[iT+1]-Count[iT];
       SCRUTE(kT);
       
       int kT = Count[iT+1]-Count[iT];
       SCRUTE(kT);
       
-      pC=(int *)ReceiverFactory::getValue(IOR_Mesh->getSenderForConnectivity(MED_FULL_INTERLACE, MED_NODAL, Entity, T[iT]),nC);
+      SALOME::SenderInt_var senderForConnectivity=IOR_Mesh->getSenderForConnectivity(MED_FULL_INTERLACE, MED_NODAL, Entity, T[iT]);
+      pC=ReceiverFactory::getValue(senderForConnectivity,nC);
       SCRUTE(nC);
       ASSERT(nC == (T[iT]%100) * kT);
       
       SCRUTE(nC);
       ASSERT(nC == (T[iT]%100) * kT);
       
index a07c73c1073b128111adbbd65c798772afee9f5a..90e6f8ddb0ebab86e494886138ac67409ac2eee1 100644 (file)
@@ -82,7 +82,10 @@ void COORDINATEClient::fillCopy()
   long nN = IOR_Mesh->getNumberOfNodes();
   double *tC;
   long nC;
   long nN = IOR_Mesh->getNumberOfNodes();
   double *tC;
   long nC;
-  tC=(double *)ReceiverFactory::getValue(IOR_Mesh->getSenderForCoordinates(MED_FULL_INTERLACE),nC);
+
+  SALOME::SenderDouble_var senderForCoords=IOR_Mesh->getSenderForCoordinates(MED_FULL_INTERLACE);
+  tC=ReceiverFactory::getValue(senderForCoords,nC);
+
   ASSERT(nC == (getSpaceDimension() * nN));
   
   MEDARRAY<double> mC(tC, getSpaceDimension(), nN,MED_FULL_INTERLACE,true);
   ASSERT(nC == (getSpaceDimension() * nN));
   
   MEDARRAY<double> mC(tC, getSpaceDimension(), nN,MED_FULL_INTERLACE,true);
index 1d49cd83042a9b38b25723fe816fbf43fd0e0039..d7e1f293ad786e1971e14e0d024444af7c48339f 100644 (file)
@@ -1,20 +1,18 @@
-template<class T1,class T2>
-FIELDClient<T1,T2>::FIELDClient(typename T2::_ptr_type ptrCorba,MEDMEM::SUPPORT * S):_fieldPtr(T2::_duplicate(ptrCorba)),_ownSupport(false)
+template<class T>
+FIELDClient<T>::FIELDClient(typename MapCppFieldServ<T>::FieldPtrType ptrCorba,MEDMEM::SUPPORT * S):_fieldPtr(MapCppFieldServ<T>::FieldGlobalType::_duplicate(ptrCorba)),_refCounter(1)
 {
   if (!S) 
 {
   if (!S) 
-    {
-      _ownSupport=true;
-      S=new MEDMEM::SUPPORTClient(_fieldPtr->getSupport());
-    }
-  MEDMEM::FIELD<T1>::setSupport(S);
-
+    MEDMEM::FIELD<T>::_support=new MEDMEM::SUPPORTClient(_fieldPtr->getSupport());
+  else
+    MEDMEM::FIELD<T>::setSupport(S);
+  
   setName(_fieldPtr->getName());
 
   setName(_fieldPtr->getName());
 
-  MEDMEM::FIELD<T1>::setDescription(_fieldPtr->getDescription());
+  MEDMEM::FIELD<T>::setDescription(_fieldPtr->getDescription());
   int nc = _fieldPtr->getNumberOfComponents();
   int nc = _fieldPtr->getNumberOfComponents();
-  MEDMEM::FIELD<T1>::setNumberOfComponents(nc);
+  MEDMEM::FIELD<T>::setNumberOfComponents(nc);
 
 
-  MEDMEM::FIELD<T1>::setNumberOfValues( S->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS));
+  MEDMEM::FIELD<T>::setNumberOfValues( MEDMEM::FIELD<T>::_support->getNumberOfElements(MED_EN::MED_ALL_ELEMENTS));
 
   string * _s = new string[nc];
 
 
   string * _s = new string[nc];
 
@@ -22,17 +20,17 @@ FIELDClient<T1,T2>::FIELDClient(typename T2::_ptr_type ptrCorba,MEDMEM::SUPPORT
   s = _fieldPtr->getComponentsNames();
   for (int i=0; i<nc; i++)
     _s[i] = s[i];
   s = _fieldPtr->getComponentsNames();
   for (int i=0; i<nc; i++)
     _s[i] = s[i];
-  MEDMEM::FIELD<T1>::setComponentsNames(_s);
+  MEDMEM::FIELD<T>::setComponentsNames(_s);
 
   s = _fieldPtr->getComponentsDescriptions();
   for (int i=0; i<nc; i++)
     _s[i] = s[i];
 
   s = _fieldPtr->getComponentsDescriptions();
   for (int i=0; i<nc; i++)
     _s[i] = s[i];
-  MEDMEM::FIELD<T1>::setComponentsDescriptions(_s);
+  MEDMEM::FIELD<T>::setComponentsDescriptions(_s);
 
   s = _fieldPtr->getComponentsUnits();
   for (int i=0; i<nc; i++)
     _s[i] = s[i];
 
   s = _fieldPtr->getComponentsUnits();
   for (int i=0; i<nc; i++)
     _s[i] = s[i];
-  MEDMEM::FIELD<T1>::setMEDComponentsUnits(_s);
+  MEDMEM::FIELD<T>::setMEDComponentsUnits(_s);
 
   delete [] _s;
 
 
   delete [] _s;
 
@@ -46,23 +44,24 @@ FIELDClient<T1,T2>::FIELDClient(typename T2::_ptr_type ptrCorba,MEDMEM::SUPPORT
   fillCopy();
 }
 
   fillCopy();
 }
 
-template<class T1,class T2>
-void FIELDClient<T1,T2>::fillCopy()
+template<class T>
+void FIELDClient<T>::fillCopy()
 {
   //setValueType(typeChamps); WARNING TO DO.....
   //setValueType(_fieldPtr->getValueType());
   long n;
 {
   //setValueType(typeChamps); WARNING TO DO.....
   //setValueType(_fieldPtr->getValueType());
   long n;
-  T1 *v = (T1 *)ReceiverFactory::getValue(_fieldPtr->getSenderForValue(MED_EN::MED_FULL_INTERLACE),n);
-  MEDMEM::MEDARRAY<T1> * M = new MEDMEM::MEDARRAY<T1>(v, MEDMEM::FIELD<T1>::getNumberOfComponents(),MEDMEM::FIELD<T1>::getNumberOfValues(),MED_EN::MED_FULL_INTERLACE,true,true);
+  typename mapCppSender<T>::SenderVarType sender=_fieldPtr->getSenderForValue(MED_EN::MED_FULL_INTERLACE);
+  T *v = (T *)ReceiverFactory::getValue(sender,n);
+  MEDMEM::MEDARRAY<T> * M = new MEDMEM::MEDARRAY<T>(v, MEDMEM::FIELD<T>::getNumberOfComponents(),MEDMEM::FIELD<T>::getNumberOfValues(),MED_EN::MED_FULL_INTERLACE,true,true);
   setValue(M);
 }
 
   setValue(M);
 }
 
-template<class T1,class T2>
-FIELDClient<T1,T2>::~FIELDClient()
+template<class T>
+FIELDClient<T>::~FIELDClient()
 {
   _fieldPtr->release();
   CORBA::release(_fieldPtr);
 {
   _fieldPtr->release();
   CORBA::release(_fieldPtr);
-  if(_ownSupport)
-    delete MEDMEM::FIELD<T1>::_support;
+  if(FIELD<T>::_support)
+    FIELD<T>::_support->removeReference();
 }
 
 }
 
index b17def5fb6a7f40eafcc1d681add734028e17562..49d8b8da0dc69754a64ed9d4b013f6c173d83490 100644 (file)
@@ -6,18 +6,37 @@
 #include "MEDMEM_Field.hxx"
 #include "SUPPORTClient.hxx"
 #include "ReceiverFactory.hxx"
 #include "MEDMEM_Field.hxx"
 #include "SUPPORTClient.hxx"
 #include "ReceiverFactory.hxx"
+#include "SenderFactory.hxx"
 #include CORBA_CLIENT_HEADER(MED)
 
 #include CORBA_CLIENT_HEADER(MED)
 
-//exemple _FIELDClient<double,FIELDDOUBLE_ptr>
-//_FIELDClient<int,FIELDINT_ptr>
-template<class T1,class T2>
-class FIELDClient : public MEDMEM::FIELD<T1>
+template<class T>
+struct MapCppFieldServ {
+  typedef T FieldPtrType;
+  typedef T FieldGlobalType;
+};
+
+template<>
+struct MapCppFieldServ<int> {
+  typedef SALOME_MED::FIELDINT_ptr FieldPtrType;
+  typedef SALOME_MED::FIELDINT FieldGlobalType;
+};
+
+template<>
+struct MapCppFieldServ<double> {
+  typedef SALOME_MED::FIELDDOUBLE_ptr FieldPtrType;
+  typedef SALOME_MED::FIELDDOUBLE FieldGlobalType;
+};
+
+namespace MEDMEM{
+
+template<class T>
+class FIELDClient : public MEDMEM::FIELD<T>
 {
 private:
 {
 private:
-  typename T2::_ptr_type _fieldPtr;
-  bool _ownSupport;
+  typename MapCppFieldServ<T>::FieldPtrType _fieldPtr;
+  int _refCounter;
 public:
 public:
-  FIELDClient(typename T2::_ptr_type ptrCorba,MEDMEM::SUPPORT * S = NULL);
+  FIELDClient(typename MapCppFieldServ<T>::FieldPtrType ptrCorba,MEDMEM::SUPPORT * S = NULL);
   ~FIELDClient();
 private:
   void fillCopy();
   ~FIELDClient();
 private:
   void fillCopy();
@@ -25,4 +44,5 @@ private:
 
 #include "FIELDClient.cxx"
 
 
 #include "FIELDClient.cxx"
 
+}
 #endif
 #endif
index b60eb352c2a14b9629078734b82f225bb0d6fd42..78ddee9522b25faf82478f534cd9578945b3ca26 100644 (file)
@@ -1,4 +1,5 @@
 #include "FIELDDOUBLEClient.hxx"
 #include "FIELDDOUBLEClient.hxx"
+namespace MEDMEM{
 
 //=============================================================================
 /*!
 
 //=============================================================================
 /*!
@@ -7,7 +8,7 @@
 //=============================================================================
 FIELDDOUBLEClient::FIELDDOUBLEClient(SALOME_MED::FIELDDOUBLE_ptr ptrCorba,
                                     MEDMEM::SUPPORT * S) :
 //=============================================================================
 FIELDDOUBLEClient::FIELDDOUBLEClient(SALOME_MED::FIELDDOUBLE_ptr ptrCorba,
                                     MEDMEM::SUPPORT * S) :
-  FIELDClient<double,SALOME_MED::FIELDDOUBLE>(ptrCorba,S)
+  FIELDClient<double>(ptrCorba,S)
 {
   BEGIN_OF("Constructor with arguments (for Python API) FIELDDOUBLEClient");
 
 {
   BEGIN_OF("Constructor with arguments (for Python API) FIELDDOUBLEClient");
 
@@ -24,3 +25,5 @@ FIELDDOUBLEClient::~FIELDDOUBLEClient()
 
   END_OF("Default Destructor (for Python API) FIELDDOUBLEClient");
 }
 
   END_OF("Default Destructor (for Python API) FIELDDOUBLEClient");
 }
+
+}
index 0e8b38883e5734885c8b3a310ba7a36775531af1..c2d4fae9169a05dae58b88ccfc24bda3f99a8046 100644 (file)
@@ -3,8 +3,10 @@
 
 #include "FIELDClient.hxx"
 
 
 #include "FIELDClient.hxx"
 
+namespace MEDMEM{
+    
 class FIELDDOUBLEClient :
 class FIELDDOUBLEClient :
-  public FIELDClient<double,SALOME_MED::FIELDDOUBLE>
+  public FIELDClient<double>
 {
 public:
   FIELDDOUBLEClient(SALOME_MED::FIELDDOUBLE_ptr ptrCorba,
 {
 public:
   FIELDDOUBLEClient(SALOME_MED::FIELDDOUBLE_ptr ptrCorba,
@@ -12,4 +14,5 @@ public:
   ~FIELDDOUBLEClient();
 };
 
   ~FIELDDOUBLEClient();
 };
 
+}
 #endif
 #endif
index 7668ff74e449dd87bb5c2c55fd9a80e4d14adb62..b40a5a183c71039ed75b42d69864e3d7c23431ee 100644 (file)
@@ -1,5 +1,6 @@
 #include "FIELDINTClient.hxx"
 #include "FIELDINTClient.hxx"
-
+namespace MEDMEM{
+    
 //=============================================================================
 /*!
  * Constructor with arguments
 //=============================================================================
 /*!
  * Constructor with arguments
@@ -7,7 +8,7 @@
 //=============================================================================
 FIELDINTClient::FIELDINTClient(SALOME_MED::FIELDINT_ptr ptrCorba,
                                     MEDMEM::SUPPORT * S) :
 //=============================================================================
 FIELDINTClient::FIELDINTClient(SALOME_MED::FIELDINT_ptr ptrCorba,
                                     MEDMEM::SUPPORT * S) :
-  FIELDClient<int,SALOME_MED::FIELDINT>(ptrCorba,S)
+  FIELDClient<int>(ptrCorba,S)
 {
   BEGIN_OF("Constructor with arguments (for Python API) FIELDINTClient");
 
 {
   BEGIN_OF("Constructor with arguments (for Python API) FIELDINTClient");
 
@@ -24,3 +25,5 @@ FIELDINTClient::~FIELDINTClient()
 
   END_OF("Default Destructor (for Python API) FIELDINTClient");
 }
 
   END_OF("Default Destructor (for Python API) FIELDINTClient");
 }
+
+}
index 9b5236980dfc53c87357e55979e77c0a08a5186f..07885b812b46b9576c18bfb085dc63050769c913 100644 (file)
@@ -3,13 +3,14 @@
 
 #include "FIELDClient.hxx"
 
 
 #include "FIELDClient.hxx"
 
+namespace MEDMEM{
 class FIELDINTClient :
 class FIELDINTClient :
-  public FIELDClient<int,SALOME_MED::FIELDINT>
+  public FIELDClient<int>
 {
 public:
   FIELDINTClient(SALOME_MED::FIELDINT_ptr ptrCorba,
                 MEDMEM::SUPPORT * S = NULL);
   ~FIELDINTClient();
 };
 {
 public:
   FIELDINTClient(SALOME_MED::FIELDINT_ptr ptrCorba,
                 MEDMEM::SUPPORT * S = NULL);
   ~FIELDINTClient();
 };
-
+}
 #endif
 #endif
index 70b5a1dd725f97a83d5683531af4dfe06e725e76..68d383e4239600bacd0b1d9e2265c202aaf907da 100644 (file)
@@ -16,7 +16,7 @@ using namespace MED_EN;
 //=============================================================================
 
 MESHClient::MESHClient(const SALOME_MED::MESH_ptr m) : 
 //=============================================================================
 
 MESHClient::MESHClient(const SALOME_MED::MESH_ptr m) : 
-  MESH(), 
+  MESH(), _refCounter(1),
   IOR_Mesh(SALOME_MED::MESH::_duplicate(m)),
   _complete(false)
 
   IOR_Mesh(SALOME_MED::MESH::_duplicate(m)),
   _complete(false)
 
@@ -159,6 +159,26 @@ void MESHClient::fillCopy()
   END_OF("MESHClient::fillCopy()");
 }
 
   END_OF("MESHClient::fillCopy()");
 }
 
+//=============================================================================
+/*!
+ *  Test equality between 2 MESHClients.
+ */
+//=============================================================================
+bool MESHClient::operator==(const MESH& other) const
+{
+  BEGIN_OF("MESHClient::operator==");
+  const MESHClient* otherClt=dynamic_cast<const MESHClient *>(&other);
+  if(otherClt)
+    {
+      if(this==otherClt)
+       {
+         return true;
+       }
+      return IOR_Mesh->areEquals(otherClt->IOR_Mesh);
+    }
+  return false;
+}
+
 //=============================================================================
 /*!
  * Destructeur
 //=============================================================================
 /*!
  * Destructeur
@@ -172,3 +192,27 @@ MESHClient::~MESHClient()
   END_OF("MESHClient::~MESHClient()");
 }
 
   END_OF("MESHClient::~MESHClient()");
 }
 
+//=============================================================================
+/*!
+ * For refCounter
+ */
+//=============================================================================
+
+void MESHClient::addReference() const
+{
+  _refCounter++;
+}
+
+//=============================================================================
+/*!
+ * For refCounter
+ */
+//=============================================================================
+
+void MESHClient::removeReference() const
+{
+  if (--_refCounter <= 0)
+    {
+      delete this;
+    }
+}
index ffaf903b185563d01a46bdcb9a6a5f725aab9228..0dacad30272208e327e8e5a44a662a7acb1c0ab7 100644 (file)
@@ -15,16 +15,20 @@ private :
 
   mutable bool _complete;
   
 
   mutable bool _complete;
   
+  mutable int _refCounter;
 
 public :
 
   MESHClient(const SALOME_MED::MESH_ptr m);
 
 public :
 
   MESHClient(const SALOME_MED::MESH_ptr m);
-
-  virtual ~MESHClient();
+  virtual bool operator==(const MESH& other) const;
 
   void blankCopy();
   void fillCopy();
 
   void blankCopy();
   void fillCopy();
+  virtual void addReference() const;
+  virtual void removeReference() const;
 
 
+private:
+  virtual ~MESHClient();
 };
 }
 
 };
 }
 
index 944b2cc23732e1b62dc1e4b489bb35b7952110a3..0c567262d0557892717c84c9f93e66febd62622e 100644 (file)
@@ -48,7 +48,18 @@ EXPORT_HEADERS = \
        FIELDINTClient.hxx \
        libMEDClient.i
 
        FIELDINTClient.hxx \
        libMEDClient.i
 
+ifeq (@SWIG_VERSION@, 1.3.21)
+SWIG_DEF = libMEDClient.i dummy.i
+
+dummy_wrap.cxx: libMEDClient_wrap.cxx
+       sed -e 's/SwigValueWrapper< vector<FAMILY \* > >/vector<FAMILY \* >/g' libMEDClient_wrap.cxx > toto
+       mv toto libMEDClient_wrap.cxx
+       sed -e 's/SwigValueWrapper< vector<SUPPORT \* > const >/vector<SUPPORT \* >/g' libMEDClient_wrap.cxx > toto
+       mv toto libMEDClient_wrap.cxx
+       touch dummy_wrap.cxx
+else
 SWIG_DEF = libMEDClient.i
 SWIG_DEF = libMEDClient.i
+endif
 
 EXPORT_PYSCRIPTS = libMEDClient.py
 
 
 EXPORT_PYSCRIPTS = libMEDClient.py
 
@@ -71,7 +82,8 @@ LIB_CLIENT_IDL= \
        SALOMEDS_Attributes.idl \
        SALOME_Exception.idl \
        SALOME_Comm.idl \
        SALOMEDS_Attributes.idl \
        SALOME_Exception.idl \
        SALOME_Comm.idl \
-       MED.idl
+       MED.idl \
+       SALOME_GenericObj.idl
 
 # Executables targets
 BIN_SRC = 
 
 # Executables targets
 BIN_SRC = 
index 3d60a29544e9cc8aaa03bf74965c0523d899e6d6..c2c95f02b32b5d0707e9f7f5930b11344ff4fd29 100644 (file)
@@ -16,8 +16,7 @@ using namespace MED_EN;
 SUPPORTClient::SUPPORTClient(const SALOME_MED::SUPPORT_ptr S,
                             MESH * M) : 
   SUPPORT(), 
 SUPPORTClient::SUPPORTClient(const SALOME_MED::SUPPORT_ptr S,
                             MESH * M) : 
   SUPPORT(), 
-  IOR_Support(SALOME_MED::SUPPORT::_duplicate(S)),
-  _ownMesh(false)
+  IOR_Support(SALOME_MED::SUPPORT::_duplicate(S)),_refCounter(1)
 {
   BEGIN_OF("SUPPORTClient::SUPPORTClient(SALOME_MED::SUPPORT_ptr m)");
 
 {
   BEGIN_OF("SUPPORTClient::SUPPORTClient(SALOME_MED::SUPPORT_ptr m)");
 
@@ -28,7 +27,6 @@ SUPPORTClient::SUPPORTClient(const SALOME_MED::SUPPORT_ptr S,
   else
     {
       _mesh=new MESHClient(IOR_Support->getMesh());
   else
     {
       _mesh=new MESHClient(IOR_Support->getMesh());
-      _ownMesh=true;
     }
   blankCopy();
 
     }
   blankCopy();
 
@@ -78,6 +76,10 @@ void SUPPORTClient::blankCopy()
 
        SCRUTE(_totalNumberOfElements);
        _complete_support = false;
 
        SCRUTE(_totalNumberOfElements);
        _complete_support = false;
+       //Gauss points settings
+       _numberOfGaussPoint = new int[_numberOfGeometricType];
+       for (int i=0;i<_numberOfGeometricType;i++)
+         _numberOfGaussPoint[i] = 1 ;
   }
   catch( const CORBA::Exception &ex )
   {
   }
   catch( const CORBA::Exception &ex )
   {
@@ -102,9 +104,11 @@ void SUPPORTClient::fillCopy()
 
     const int * index, * value;
     long n_index, n_value;
 
     const int * index, * value;
     long n_index, n_value;
-
-    value=(const int *)ReceiverFactory::getValue(IOR_Support->getSenderForNumber(MED_ALL_ELEMENTS),n_value);
-    index=(const int *)ReceiverFactory::getValue(IOR_Support->getSenderForNumberIndex(),n_index);
+    
+    SALOME::SenderInt_var senderForValue=IOR_Support->getSenderForNumber(MED_ALL_ELEMENTS);
+    value=(const int *)ReceiverFactory::getValue(senderForValue,n_value);
+    SALOME::SenderInt_var senderForIndex=IOR_Support->getSenderForNumberIndex();
+    index=(const int *)ReceiverFactory::getValue(senderForIndex,n_index);
     
     SCRUTE(n_index);
     SCRUTE(n_value);
     
     SCRUTE(n_index);
     SCRUTE(n_value);
@@ -124,8 +128,8 @@ SUPPORTClient::~SUPPORTClient()
 {
   BEGIN_OF("SUPPORTClient::~SUPPORTClient");
   IOR_Support->release();
 {
   BEGIN_OF("SUPPORTClient::~SUPPORTClient");
   IOR_Support->release();
-  if(_ownMesh)
-     delete _mesh;
+  if(_mesh)
+    _mesh->removeReference();
   END_OF("SUPPORTClient::~SUPPORTClient");
 }
 
   END_OF("SUPPORTClient::~SUPPORTClient");
 }
 
@@ -178,3 +182,25 @@ const int *  SUPPORTClient::getNumberIndex() const throw (MEDEXCEPTION)
   return n;
 }
 
   return n;
 }
 
+//=============================================================================
+/*!
+ * 
+ */
+//=============================================================================
+void SUPPORTClient::addReference() const
+{
+  _refCounter++;
+}
+
+//=============================================================================
+/*!
+ * 
+ */
+//=============================================================================
+void SUPPORTClient::removeReference() const
+{
+  if (--_refCounter <= 0)
+    {
+      delete this;
+    }
+}
index ea490ef218fa9be635eb41d5883914ec0be636e9..7813cbb30981518c5b3478b2681ddbaf5117c99d 100644 (file)
@@ -14,15 +14,18 @@ private :
 
   const SALOME_MED::SUPPORT_var IOR_Support;
 
 
   const SALOME_MED::SUPPORT_var IOR_Support;
 
-  bool _ownMesh;
-
   mutable bool _complete_support;
 
   mutable bool _complete_support;
 
+  mutable int _refCounter;
+
+protected:
+
+  virtual ~SUPPORTClient();
+
 public :
 
   SUPPORTClient(const SALOME_MED::SUPPORT_ptr S, 
                MESH * M = NULL);
 public :
 
   SUPPORTClient(const SALOME_MED::SUPPORT_ptr S, 
                MESH * M = NULL);
-  virtual ~SUPPORTClient();
 
   void blankCopy();
   void fillCopy();
 
   void blankCopy();
   void fillCopy();
@@ -33,9 +36,11 @@ public :
     const throw (MEDEXCEPTION);
   const int *  getNumberIndex()
     const throw (MEDEXCEPTION);
     const throw (MEDEXCEPTION);
   const int *  getNumberIndex()
     const throw (MEDEXCEPTION);
-
+  void addReference() const;
+  void removeReference() const;
 };
 }
 
 
 #endif
 };
 }
 
 
 #endif
+
index df63110be35c6783d7178952c39ce69b2127458f..8be804bcf8d632e373b4bf99a86763d9b0d1b964 100644 (file)
@@ -21,11 +21,14 @@ class MESHClient : public MESH {
  public:
   
   MESHClient(const SALOME_MED::MESH_ptr m);
  public:
   
   MESHClient(const SALOME_MED::MESH_ptr m);
-  virtual ~MESHClient();
 
   void blankCopy();
   void fillCopy();
 
   void blankCopy();
   void fillCopy();
-
+  %extend {
+    ~MESHClient(){
+      self->removeReference();
+    }
+  }
 };
 
 class SUPPORTClient : public SUPPORT {
 };
 
 class SUPPORTClient : public SUPPORT {
@@ -34,10 +37,14 @@ class SUPPORTClient : public SUPPORT {
 
   SUPPORTClient(const SALOME_MED::SUPPORT_ptr S, 
                MESH * M = NULL);
 
   SUPPORTClient(const SALOME_MED::SUPPORT_ptr S, 
                MESH * M = NULL);
-  virtual ~SUPPORTClient();
 
   void blankCopy();
   void fillCopy();
 
   void blankCopy();
   void fillCopy();
+  %extend {
+    ~SUPPORTClient() {
+      self->removeReference();
+    }
+  }
 
 };
 
 
 };
 
index 55e46f1a22c7e63f7edaf1071793e5f8c9efa86e..07e1a2199d178f5f4e912c39dc6546e1628d854f 100644 (file)
@@ -40,7 +40,7 @@ EXPORT_PYSCRIPTS = \
 
 LIB = libCompo2cmodule.la
 LIB_SRC = Compo2.cxx
 
 LIB = libCompo2cmodule.la
 LIB_SRC = Compo2.cxx
-LIB_CLIENT_IDL= SALOME_Component.idl SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_Comm.idl MED.idl
+LIB_CLIENT_IDL= SALOME_Component.idl SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_Comm.idl MED.idl SALOME_GenericObj.idl
 
 LDFLAGS= -L$(top_builddir)/lib/salome 
 LDFLAGSFORBIN= -L$(top_builddir)/lib/salome
 
 LDFLAGS= -L$(top_builddir)/lib/salome 
 LDFLAGSFORBIN= -L$(top_builddir)/lib/salome
@@ -50,7 +50,18 @@ LIBS = -L${KERNEL_ROOT_DIR}/lib/salome -lMEDClientcmodule -lMEDMEM_Swigcmodule -
 
 # Executables targets
 
 
 # Executables targets
 
+ifeq (@SWIG_VERSION@, 1.3.21)
+SWIG_DEF = libCompo2.i dummy.i
+
+dummy_wrap.cxx: libCompo2_wrap.cxx
+       sed -e 's/SwigValueWrapper< vector<FAMILY \* > >/vector<FAMILY \* >/g' libCompo2_wrap.cxx > toto
+       mv toto libCompo2_wrap.cxx
+       sed -e 's/SwigValueWrapper< vector<SUPPORT \* > const >/vector<SUPPORT \* >/g' libCompo2_wrap.cxx > toto
+       mv toto libCompo2_wrap.cxx
+       touch dummy_wrap.cxx
+else
 SWIG_DEF = libCompo2.i
 SWIG_DEF = libCompo2.i
+endif
 
 MED.hh MEDSK.cc: MED.idl
        omniidl -bcxx -Wbtp -I$(top_builddir)/idl -I${KERNEL_ROOT_DIR}/idl/salome $^
 
 MED.hh MEDSK.cc: MED.idl
        omniidl -bcxx -Wbtp -I$(top_builddir)/idl -I${KERNEL_ROOT_DIR}/idl/salome $^
index 71ab27776979620740de1f36d93fbe3bde7306d9..55207d6fad1885139c85fc3f5c8a894f84b6739f 100644 (file)
@@ -38,11 +38,22 @@ LIB = libMedCorba_Swigcmodule.la
 
 LIB_SRC = 
 
 
 LIB_SRC = 
 
+ifeq (@SWIG_VERSION@, 1.3.21)
+SWIG_DEF = libMedCorba_Swig.i dummy.i
+
+dummy_wrap.cxx: libMedCorba_Swig_wrap.cxx
+       sed -e 's/SwigValueWrapper< vector<FAMILY \* > >/vector<FAMILY \* >/g' libMedCorba_Swig_wrap.cxx > toto
+       mv toto libMedCorba_Swig_wrap.cxx
+       sed -e 's/SwigValueWrapper< vector<SUPPORT \* > const >/vector<SUPPORT \* >/g' libMedCorba_Swig_wrap.cxx > toto
+       mv toto libMedCorba_Swig_wrap.cxx
+       touch dummy_wrap.cxx
+else
 SWIG_DEF = libMedCorba_Swig.i
 SWIG_DEF = libMedCorba_Swig.i
+endif
 
 LIB_SERVER_IDL = MED.idl
 
 
 LIB_SERVER_IDL = MED.idl
 
-LIB_CLIENT_IDL= SALOME_Component.idl SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_Comm.idl
+LIB_CLIENT_IDL= SALOME_Component.idl SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_Comm.idl SALOME_GenericObj.idl
 
 EXPORT_PYSCRIPTS = libMedCorba_Swig.py medcorba_test.py batchmode_medcorba_test.py batchmode_medcorba_test1.py
 
 
 EXPORT_PYSCRIPTS = libMedCorba_Swig.py medcorba_test.py batchmode_medcorba_test.py batchmode_medcorba_test1.py