//  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
//
//  Copyright (C) 2003-2007  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.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File: MED.idl
// Project: SALOME
// $Header$
//
/*!
This file contains the main IDL definitions of the %MED component in %SALOME application.
*/

#ifndef MED_IDL
#define MED_IDL

/*!
 \defgroup MED SALOME MED component

 This component is dedicated to the mounting in memory of a .med file. some
 services of that component store CORBA objects (MED, MESH, FIELD) in the
 study and/or give a direct access to those objects.
*/

#include "SALOME_GenericObj.idl"
#include "SALOME_Exception.idl"
#include "SALOME_Component.idl"
#include "SALOMEDS.idl"
#include "SALOME_Comm.idl"

module SALOME_MED {
  /*!
    An array of long
  */
  typedef sequence<long> long_array;
  /*!
    An array of double
  */
  typedef sequence<double> double_array;
  /*!
    An array of string
  */
  typedef sequence<string> string_array;
  /*!
    An array of boolean
  */
  typedef sequence<boolean> boolean_array;

/*! \ingroup MED
This package contains a set of interfaces used for %SALOME %MED component.
*/


  interface FIELD;
  interface FAMILY;
  interface GROUP;
  interface MESH;
  interface SUPPORT;

/*!
This enumeration contains a set of elements defining the type of geometrical elements which constitue
a %Mesh.
*/
  typedef long medGeometryElement;
  const medGeometryElement MED_NONE = 0;
  const medGeometryElement MED_POINT1 = 1;
  const medGeometryElement MED_SEG2 = 102;
  const medGeometryElement MED_SEG3 = 103;
  const medGeometryElement MED_TRIA3 = 203;
  const medGeometryElement MED_QUAD4 = 204;
  const medGeometryElement MED_TRIA6 = 206;
  const medGeometryElement MED_QUAD8 = 208;
  const medGeometryElement MED_TETRA4 = 304;
  const medGeometryElement MED_PYRA5 = 305;
  const medGeometryElement MED_PENTA6 = 306;
  const medGeometryElement MED_HEXA8 = 308;
  const medGeometryElement MED_TETRA10 = 310;
  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;


/*!
This enumeration contains a set of elements defining the structural elements (entities) which constitue
a %Mesh.
*/
  typedef long medEntityMesh;
  const medEntityMesh MED_CELL = 0;
  const medEntityMesh MED_FACE = 1;
  const medEntityMesh MED_EDGE = 2;
  const medEntityMesh MED_NODE = 3;
  const medEntityMesh MED_ALL_ENTITIES = 4;

/*!
This enumeration contains a set of modes to store data in an array.
For example an array of coordinates in 3D; tow storage may be considered:

 - X1,Y1,Z1,X2,Y2,Z2,...,Xn,Yn,Zn if MED_FULL_INTERLACE
 - X1,X2,...,Xn,Y1,Y2,...,Yn,Z1,Z2,...,Zn if MED_NO_INTERLACE
*/
  typedef long medModeSwitch;
  const medModeSwitch MED_FULL_INTERLACE = 0;
  const medModeSwitch MED_NO_INTERLACE = 1;
  const medModeSwitch MED_NO_INTERLACE_BY_TYPE = 2;

/*!
This enumeration contains a set of elements defining the type of connectivity.
*/
  typedef long medConnectivity;
  const medConnectivity MED_NODAL = 0;
  const medConnectivity MED_DESCENDING = 1;


/*!
   enumeration contains a set of elements defining the type of driver.
*/
    typedef long medDriverTypes;
    /*!<This driver is used for reading into memory of the mesh from %MED file.*/
    const medDriverTypes MED_DRIVER  = 0;
    const medDriverTypes VTK_DRIVER = 1;
    const medDriverTypes NO_DRIVER = 2;

  /*!
    An array of %medGeometryElement
  */
  typedef sequence<medGeometryElement> medGeometryElement_array;

  /*!
    An array of %FAMILY
  */
  typedef sequence<FAMILY> Family_array;

  /*!
    An array of %GROUP
  */
  typedef sequence<GROUP> Group_array;

  // ----------------------
  // mesh interface
  // ----------------------

  interface MESH : SALOME::MultiCommClass, SALOME::GenericObj {
    // Index range begins from 1

    // General Informations
    //---------------------

    /*!
      Returns the name of the mesh .
    */
    string getName() raises (SALOME::SALOME_Exception);

    /*!
      Returns space dimension.
    */
    long getSpaceDimension() raises (SALOME::SALOME_Exception);

    /*!
      Returns mesh dimension.

      Example :
      - we have only MED_TETRA4 in MED_CELL : MeshDimension = 3D
      - we have only MED_QUAD4 in MED_CELL : MeshDimension = 2D
      - we have both MED_SEG2 and MED_TRIA3 in MED_CELL : MeshDimension = 2D
    */
    long getMeshDimension() raises (SALOME::SALOME_Exception);

    /*!
	Pour Alliances
    */
    boolean getIsAGrid() raises (SALOME::SALOME_Exception);

    /*!
	Pour Alliances
    */
    boolean existConnectivity (in medConnectivity mode,
			       in medEntityMesh entity)
			       raises (SALOME::SALOME_Exception);

    // Coordinates
    //------------

    /*!
      Returns coordinate system :
      - "CARTESIAN"
      - "CYLINDRICAL"
      - "SPHERICAL"
    */
    string getCoordinatesSystem() raises (SALOME::SALOME_Exception);

    /*!
      Returns the number of nodes defined in the mesh.
    */
    long getNumberOfNodes() raises (SALOME::SALOME_Exception);

    /*!
      Returns an array of coordinates stored in any type
    */
    SALOME_MED::double_array getCoordinates(in medModeSwitch typeSwitch)
      raises (SALOME::SALOME_Exception);

    /*!
      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::SenderDouble getSenderForCoordinates(in medModeSwitch typeSwitch)
      raises (SALOME::SALOME_Exception);
    /*!
     Returns coordinate  n° Number on axis n° Axis
    */
    double getCoordinate(in long Number, in long Axis)
      raises (SALOME::SALOME_Exception);


    /*!
      Returns an array containing the names of coordinates.

      Example :
      - x,y,z
      - r,teta,phi
      - ...

      It could be empty.
    */
    SALOME_MED::string_array getCoordinatesNames()
      raises (SALOME::SALOME_Exception);

    /*!
      Returns an array containing the units of coordinates (cm, m, mm, ...)

      It could be empty. By defult IS is used (meter).
    */
    SALOME_MED::string_array getCoordinatesUnits()
      raises (SALOME::SALOME_Exception);

    /*!
      Returns the %SUPPORT containing the boundary elements
      of the mesh.
    */

    SUPPORT getBoundaryElements(in medEntityMesh Entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns the %SUPPORT defined on all the element of an Entity.
    */
    SUPPORT getSupportOnAll(in medEntityMesh Entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns the %SUPPORT containing the boundary elements
      of the support mySupport3D.
    */
    SUPPORT getSkin(in SUPPORT mySupport3D ) raises (SALOME::SALOME_Exception);

    SALOME_MED::long_array getGlobalNumberingIndex(in medEntityMesh entity) ;

    struct coordinateInfos
    {
    	string 			coordSystem;
    	SALOME_MED::string_array   coordNames;
    	SALOME_MED::string_array   coordUnits;
    };
    coordinateInfos getCoordGlobal()	raises (SALOME::SALOME_Exception);



    // Connectivity
    // ------------

    /*!
      Returns the number of defferent %medGeometryElement types existing
      in the specified entity.

      \note
      Not implemented for MED_ALL_ENTITIES.
    */
    long getNumberOfTypes(in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns an array of all %medGeometryElement types existing
      in the mesh.

      \note
       Not implemented for MED_ALL_ENTITIES.
    */
    medGeometryElement_array getTypes(in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns the number of elements of type %medGeometryElement.

      Note :
      - Implemented for MED_ALL_ELEMENTS
      - Not implemented for MED_ALL_ENTITIES
    */
    long getNumberOfElements(in medEntityMesh entity,
			     in medGeometryElement geomElement)
      raises (SALOME::SALOME_Exception);

    /*!
      Give, in full or no interlace mode (for nodal connectivity),
      descending or nodal connectivity.

      You must give a %medEntityMesh (ie:MED_EDGE) and a
      %medGeometryElement (ie:MED_SEG3).
    */
    SALOME_MED::long_array getConnectivity(in medModeSwitch typeSwitch,
					in medConnectivity mode,
					in medEntityMesh entity,
					in medGeometryElement geomElement)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem getConnectivity but return a Sender.\n
      It could be used in a Client code using the MED Client classes.
     */
    SALOME::SenderInt getSenderForConnectivity(in medModeSwitch typeSwitch,
					in medConnectivity mode,
					in medEntityMesh entity,
					in medGeometryElement geomElement)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem getConnectivity but return a Sender.\n
      It could be used in a Client code using the MED Client classes.
     */
    SALOME::SenderInt getSenderForPolygonsConnectivity(in medConnectivity mode,
                                                       in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem getConnectivityIndex but return a Sender.\n
      It could be used in a Client code using the MED Client classes.
     */
    SALOME::SenderInt getSenderForPolygonsConnectivityIndex(in medConnectivity mode,
                                                            in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem getConnectivity but return a Sender.\n
      It could be used in a Client code using the MED Client classes.
     */
    SALOME::SenderInt getSenderForPolyhedronConnectivity(in medConnectivity mode)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem getConnectivityIndex but return a Sender.\n
      It could be used in a Client code using the MED Client classes.
     */
    SALOME::SenderInt getSenderForPolyhedronIndex(in medConnectivity mode)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem getConnectivityIndex but return a Sender.\n
      It could be used in a Client code using the MED Client classes.
     */
    SALOME::SenderInt getSenderForPolyhedronFacesIndex()
      raises (SALOME::SALOME_Exception);

    /*!
      Give morse index array to use with
      getConnectivity(MED_FULL_INTERLACE,mode,entity,MED_ALL_ELEMENTS).

      Each value give start index for corresponding entity in
      connectivity array.

      Example : i-th element, j-th node of it :
      - In C mode : Connectivity[ConnectivityIndex[i]-1+j-1]
      - In fortran mode : Connectivity[ConnectivityIndex[i]+j]
    */
    SALOME_MED::long_array getConnectivityIndex(in medConnectivity mode,
					     in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Gets a global number of the element which have the same connectivity as the
      connectivity argument.
    */
    long getElementNumber(in medConnectivity mode,
			  in medEntityMesh entity,
			  in medGeometryElement type,
			  in SALOME_MED::long_array connectivity)
      raises (SALOME::SALOME_Exception);

    medGeometryElement   getElementType (in  medEntityMesh entity,
				       in long number)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns a reverse connectivity to MED_CELL.

      If mode=MED_NODAL, the array contains, for each node, all cells
      arround it.

      If mode=MED_DESCENDING, the array contains, for each face (or edge),
      the 2 cells of each side. First is cell which face normal is outgoing.
    */
    SALOME_MED::long_array getReverseConnectivity(in medConnectivity mode)
      raises (SALOME::SALOME_Exception);

    /*!
      Give index array to use with getReverseConnectivity(MED_NODAL).

      This method is not used with MED_DESCENDING mode,
      because we have allways two cells.

      See getConnectivityIndex for details.
    */
    SALOME_MED::long_array getReverseConnectivityIndex(in medConnectivity mode)
      raises (SALOME::SALOME_Exception);

    struct connectivityInfos
    {
    	long                     numberOfNodes;
        medGeometryElement_array meshTypes;
    	SALOME_MED::long_array   numberOfElements;
    	SALOME_MED::long_array   nodalConnectivityLength;
        long                     entityDimension;
    };
    connectivityInfos getConnectGlobal(in medEntityMesh entity)
    raises (SALOME::SALOME_Exception);

    // Families and Groups
    // -------------------

    /*!
      Returns the number of all families.
    */
    long getNumberOfFamilies(in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns the number of all groups.
    */
    long getNumberOfGroups(in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns an array of all families.
    */
    Family_array getFamilies(in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns the reference to i-th family.

      \note
      i is bounded by 1 and NumberOfFamilies.
    */
    FAMILY getFamily(in medEntityMesh entity,in long familyNumber)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns an array of all groups.
    */
    Group_array getGroups(in medEntityMesh entity)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns the reference to i-th group.

      \note
     i is bounded by 1 and NumberOfGroups.
    */
    GROUP getGroup(in medEntityMesh entity,in long groupNumber)
      raises (SALOME::SALOME_Exception);

    // Others
    // ------

    /*!
      Returns a field on mySupport containing volume.

      \note
      mySupport must be on MED_CELL entity and MeshDimension must be 3D.
    */
    FIELD getVolume(in SUPPORT mySupport)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns a field on mySupport containing area.

      \note
      mySupport must be on MED_FACE entity.
    */
    FIELD getArea(in SUPPORT mySupport)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns a field on mySupport containing length.

    \note
     mySupport must be on MED_EDGE entity.
    */
    FIELD getLength(in SUPPORT mySupport)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns a field on mySupport containing normal.

      \note
      mySupport must be on MED_FACE entity if MeshDimension and
      SpaceDimension=3D and on MED_EDGE if MeshDimension and SpaceDimension=2D.
    */
    FIELD getNormal(in SUPPORT mySupport)
      raises (SALOME::SALOME_Exception);

    /*!
      Returns a field on mySupport containing barycenter.
    */
    FIELD getBarycenter(in SUPPORT mySupport)
      raises (SALOME::SALOME_Exception);

    /*
      Returns a field on mySupport containing neighbourhood.
    */
    // FIELD getNeighbourhood(in SUPPORT mySupport)
    // raises (SALOME::SALOME_Exception);

    // Read & Write
    // -----------

    /*!
      Adds the Mesh in the StudyManager.
    */
    void addInStudy(in SALOMEDS::Study myStudy, in MESH myIor )
      raises (SALOME::SALOME_Exception, SALOMEDS::StudyBuilder::LockProtection);

    // 		                Add a MED/VTK/... driver
    //                          Multiple drivers can be added whatever the type
    long addDriver     (in medDriverTypes driverType, in string  fileName, in string meshName)
                                        raises (SALOME::SALOME_Exception);
    //                          Remove a driver
    void rmDriver      (in long i)  raises (SALOME::SALOME_Exception);

   //
    void read          (in long i)  raises (SALOME::SALOME_Exception);
    void write         (in long i, in string driverMeshName)
                                    raises (SALOME::SALOME_Exception);

/*!
Internal Corba method.
*/
    long getCorbaIndex() 	raises (SALOME::SALOME_Exception);
    struct meshInfos
    {
           string name ;
           long spaceDimension ;
  	   long meshDimension;
  	   long numberOfNodes ;
           boolean isAGrid;
           Family_array famNode;
           Family_array famEdge;
           Family_array famFace;
           Family_array famCell;
    	   Group_array  groupNode;
    	   Group_array  groupEdge;
    	   Group_array  groupFace;
    	   Group_array  groupCell;
    };
    meshInfos getMeshGlobal()		raises (SALOME::SALOME_Exception);
    boolean areEquals(in MESH other);
  };


  // ----------------------
  // Support interface
  // ----------------------

  interface SUPPORT : SALOME::MultiCommClass, SALOME::GenericObj {

    /*!
      Returns the name of the support.
    */
    string getName() raises (SALOME::SALOME_Exception);

    /*!
      Returns the description of the support.
    */
    string getDescription() raises (SALOME::SALOME_Exception);

    /*!
      Returns a reference to the mesh.
    */
    MESH getMesh() raises (SALOME::SALOME_Exception);

    /*!
      Returns the type of %medEntityMesh used by the support.

      \note
      A support deals only with one entity's type
      (for example : MED_FACE or MED_NODE)
    */
    medEntityMesh getEntity() raises (SALOME::SALOME_Exception);

    /*!
      Returns True if all elements of this entity are
      engaged, False otherwise.

      If True, you must use mesh reference (getMesh) to get more information.
    */
    boolean isOnAllElements() raises (SALOME::SALOME_Exception);

    /*!
      If the method %isOnAllElements() returns False, this method
     returns the number of elements in the support.

      Example : number of MED_TRIA3 or MED_ALL_ELEMETNS elements
      in entity of support.

      \note
      If %SUPPORT is defined on MED_NODE, use MED_NONE %medGeometryElement
      type.
    */
    long getNumberOfElements(in medGeometryElement geomElement)
      raises (SALOME::SALOME_Exception);

     long  getNumberOfTypes() raises (SALOME::SALOME_Exception);
    /*!
      If isOnAllElements is False, returns an array of %medGeometryElement
      types used by the support.

      %medEntityMesh is given by getEntity.
    */
    medGeometryElement_array getTypes() raises (SALOME::SALOME_Exception);


    /*!
      If the method %isOnAllElements() returns False, this method returns an array which
     contains all numbers of given %medGeometryElement.

      Numbering is global, ie numbers are bounded by 1 and
      MESH::getNumberOfElement(entity,MED_ALL_ELEMENTS) and not by 1 and
      MESH::getNumberOfElement(entity,geomElement).

      \note
      If %SUPPORT is defined on MED_NODE, use MED_NONE %medGeometryElement type.
    */
    SALOME_MED::long_array getNumber(in medGeometryElement geomElement)
      raises (SALOME::SALOME_Exception);

    /*!
      If the method %isOnAllElements() returns False, this method returns an array which
     contains all numbers of given %medGeometryElement.

      Numbering is from file, ie numbers are bounded by 1 and
      MESH::getNumberOfElement(entity,MED_ALL_ELEMENTS) and not by 1 and
      MESH::getNumberOfElement(entity,geomElement).

      \note
      If %SUPPORT is defined on MED_NODE, use MED_NONE %medGeometryElement type.
    */
    SALOME_MED::long_array getNumberFromFile(in medGeometryElement geomElement)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem SALOME::Sender getNumber(in medGeometryElement geomElement) but returning Sender.\n
      It could be used in a Client code using the MED Client classes.
     */

    SALOME::SenderInt getSenderForNumber(in medGeometryElement geomElement)
      raises (SALOME::SALOME_Exception);

    /*!
      If the method %isOnAllElements() returns False, this method returns the index
      of element number.

      Use it with getNumber(MED_ALL_ELEMENTS).

      \note
       See the method %getConnectivityIndex for more details.
    */
    SALOME_MED::long_array getNumberIndex()
      raises (SALOME::SALOME_Exception);

    /*!
      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::SenderInt getSenderForNumberIndex()
      raises (SALOME::SALOME_Exception);

    void getBoundaryElements()
      					raises (SALOME::SALOME_Exception);
/*!
Internal Corba method.
*/
    long getCorbaIndex() 	        raises (SALOME::SALOME_Exception);
    struct supportInfos
    {
           string  	 name;
	   string  	 description;
	   boolean       isOnAllElements;
    	   medEntityMesh entity;
           long          numberOfGeometricType;
           medGeometryElement_array types;
           SALOME_MED::long_array   nbEltTypes;
           SALOME_MED::long_array   nodalConnectivityLength;
    };
    supportInfos getSupportGlobal()		raises (SALOME::SALOME_Exception);

  };


  //-----------------
  // Family interface
  //-----------------

  interface FAMILY : SUPPORT
    {

      /*!
	Returns Family identifier (Identifier
	of the family in the mesh).

	\note
      There is precisely only one indentifier for each family.
      */
      long getIdentifier() raises (SALOME::SALOME_Exception);

      /*!
	Returns number of attributes.
      */
      long getNumberOfAttributes() raises (SALOME::SALOME_Exception);

      /*!
	Returns an array of all attributes' identifiers.
	There is one for each attribute.
      */
      SALOME_MED::long_array getAttributesIdentifiers()
	raises (SALOME::SALOME_Exception);

      /*!
	Returns identifier of i-th attribute.

	\note
      i is bounded by 1 and NumberOfAttributes.
      */
      long getAttributeIdentifier(in long i) raises (SALOME::SALOME_Exception);

      /*!
	Returns an array of all values of the attributes .
	There is one value for each attribute.
      */
      SALOME_MED::long_array getAttributesValues()
	raises (SALOME::SALOME_Exception);

      /*!
	Returns the value of i-th attribute.

	\note
      i is bounded by 1 and NumberOfAttributes.
      */
      long getAttributeValue(in long i) raises (SALOME::SALOME_Exception);

      /*!
	Returns an array of all descriptions of the attributes .
	There is one description for each attribute.
      */
      SALOME_MED::string_array getAttributesDescriptions()
	raises (SALOME::SALOME_Exception);

      /*!
	Returns the description of i-th attribute.

	\note
      i is bounded by 1 and NumberOfAttributes.
      */
      string getAttributeDescription(in long i)
	raises (SALOME::SALOME_Exception);

     /*!
	Returns the number of groups the family belongs to.
      */
      long getNumberOfGroups()
	raises (SALOME::SALOME_Exception);

      /*!
	Returns an array of names of groups the family belongs to .
	There is one name for each group.
      */
      SALOME_MED::string_array getGroupsNames()
	raises (SALOME::SALOME_Exception);

      /*!
	Returns the name of i-th group.

	\note
      i is bounded by 1 and NumberOfAttributes.
      */
      string getGroupName(in long i)
	raises (SALOME::SALOME_Exception);


    };


  //----------------
  // Group interface
  //----------------
  interface GROUP : SUPPORT
    {

      /*!
	Returns the number of families in this group.
      */
      long getNumberOfFamilies() raises (SALOME::SALOME_Exception);

      /*!
	Returns an array of all families.
      */
      Family_array getFamilies() raises (SALOME::SALOME_Exception);

      /*!
	Returns a reference to the i-th family.

	\note
      i is bounded by 1 and NumberOfFamilies.
      */
      FAMILY getFamily(in long i) raises (SALOME::SALOME_Exception);

    };


  //----------------
  // Field interface
  //----------------

  interface FIELD : SALOME::GenericObj
    {

      /*!
       *  Returns the field name.
       */
      string getName() raises (SALOME::SALOME_Exception);

      /*!
       *  Changes the field name.
       *
       *  \param theName The new name for this field.
       */
      void setName (in string theName) raises (SALOME::SALOME_Exception);

      /*!
	Returns the field description.
      */
      string getDescription() raises (SALOME::SALOME_Exception);

      /*!
	Returns a reference to the support
	on which the field is defined.
      */
      SUPPORT getSupport() raises (SALOME::SALOME_Exception);

      /*!
	Returns the number of field's components.
      */
      long getNumberOfComponents() raises (SALOME::SALOME_Exception);

      /*!
	Returns an array containing components names.
      */
      SALOME_MED::string_array getComponentsNames()
	raises (SALOME::SALOME_Exception);

      /*!
	Returns the name of i-th component.

	\note
	- i is bounded by 1 and NumberOfComponents.
	- Name is mandatory for each field's component.
      */
      string getComponentName(in long i) raises (SALOME::SALOME_Exception);

      /*!
	Returns an array containing components units.
      */
      SALOME_MED::string_array getComponentsUnits()
	raises (SALOME::SALOME_Exception);

      /*!
       *  Returns the unit of i-th component.
       *
       *  \note i is bounded by 1 and NumberOfComponents.
       */
      string getComponentUnit(in long i) raises (SALOME::SALOME_Exception);

      /*!
	Returns an array containing components descriptions.
      */
      SALOME_MED::string_array getComponentsDescriptions()
	raises (SALOME::SALOME_Exception);

      /*!
	Returns the description of i-th component.

	\note
	- i is bounded by 1 and NumberOfComponents.
	- Name is mandatory for each field's component.
      */
      string getComponentDescription(in long i) raises (SALOME::SALOME_Exception);

      /*!
	Returns the iteration number.
      */
      long getIterationNumber() raises (SALOME::SALOME_Exception);

      /*!
	Returns time for this iteration.
      */
      double getTime() raises (SALOME::SALOME_Exception);

      /*!
	Returns order number use for
	internal step in this iteration.
      */
      long getOrderNumber() raises (SALOME::SALOME_Exception);

      /*!
	Returns if gauss points are present.
      */
      boolean getGaussPresence();

      // Read & Write
      // -----------

      long addDriver (in medDriverTypes driverType, in string  fileName, in string fieldName)
	raises (SALOME::SALOME_Exception);

      /*!
     Removes a driver
     */
      void rmDriver (in long i)
	raises (SALOME::SALOME_Exception);

      //
      void read (in long i)
	raises (SALOME::SALOME_Exception);

      /*!
	Writes a field.
      */
      void write (in long i, in string driverFieldName)
	raises (SALOME::SALOME_Exception);

      /*!
	Adds the Field in the StudyManager.
      */
      void addInStudy(in SALOMEDS::Study myStudy, in FIELD myIor)
	raises (SALOME::SALOME_Exception, SALOMEDS::StudyBuilder::LockProtection);
      void addInStudyToComponent(in SALOMEDS::SComponent myComponent, in FIELD myIor)
	raises (SALOME::SALOME_Exception, SALOMEDS::StudyBuilder::LockProtection);

/*!
Internal Corba method.
*/
      long getCorbaIndex()
	raises (SALOME::SALOME_Exception);

    };


  interface FIELDDOUBLE : FIELD , SALOME::MultiCommClass {

    /*!
      Returns an array of values of the field
    */
    SALOME_MED::double_array getValue(in medModeSwitch mode)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem as getValue but it could be used in a Client code using the
      MED Client classes.
    */
    SALOME::SenderDouble getSenderForValue(in medModeSwitch mode)
      raises (SALOME::SALOME_Exception);
  };

  interface FIELDDOUBLENO : FIELDDOUBLE {
  };

  interface FIELDDOUBLENOBYTYPE : FIELDDOUBLE {
  };

  interface FIELDDOUBLEFULL : FIELDDOUBLE {
  };

  interface FIELDINT : FIELD , SALOME::MultiCommClass {

    /*!
      Returns an array of values of the field
    */
    SALOME_MED::long_array getValue(in medModeSwitch mode)
      raises (SALOME::SALOME_Exception);

    /*!
      Idem as getValue but it could be used in a Client code using the
      MED Client classes.
    */
    SALOME::SenderInt getSenderForValue(in medModeSwitch mode)
      raises (SALOME::SALOME_Exception);
  };

  interface FIELDINTNO : FIELDINT {
  };

  interface FIELDINTNOBYTYPE : FIELDINT {
  };

  interface FIELDINTFULL : FIELDINT {
  };

  // MED interface

  interface MED : SALOME::GenericObj {
    /*!
      returns the number of meshes in the %MED object.
     */
    long                   getNumberOfMeshes () raises (SALOME::SALOME_Exception);
    /*!
      returns the number of fields in the %MED object.
     */
    long                   getNumberOfFields () raises (SALOME::SALOME_Exception);
    /*!
      returns an array which contains the name of each meshes in the %MED object.
     */
    SALOME_MED::string_array  getMeshNames      () raises (SALOME::SALOME_Exception);
    /*!
      returns an array which contains the name of each fields in the %MED object.
     */
    SALOME_MED::string_array  getFieldNames     () raises (SALOME::SALOME_Exception);
    /*!
      giving a mesh name, it returns the corresponding %MESH pointer.
     */
    MESH                   getMeshByName     ( in string  meshName)  raises (SALOME::SALOME_Exception);
    /*!
      giving a %FIELD pointer, it returns the corresponding %MESH pointer of the mesh
      on which the field lies.
     */
    MESH                   getMesh           ( in FIELD  fieldPtr)   raises (SALOME::SALOME_Exception);
    /*!
      giving a field name, it returns the number of iteration in the corresponding %FIELD object.
     */
    long getFieldNumberOfIteration(in string fieldName) raises (SALOME::SALOME_Exception);
    /*!
      giving a field name and an integer %i, it returns a couple of integers: the time iteration and
      the order number of the %i^th iteration of the corresponding %FIELD object.
     */
    SALOME_MED::long_array  getFieldIteration(in string fieldName, in long i) raises (SALOME::SALOME_Exception);
    /*!
      giving a field name, it returns an array of integers: the list of the time iteration and
      the order number couple of all iterations of the corresponding %FIELD object.

      (DT1, IT1, DT2, IT2, ... , DTn, ITn) when n is the number of the %FIELD iterations.
     */
    SALOME_MED::long_array  getFieldIterations(in string fieldName) raises (SALOME::SALOME_Exception);
    /*!
      giving a field name, a time iteration and an order number, it returns the corresponding %FIELD oject.
     */
    FIELD                  getField          ( in string fieldName,
					       in long pasTemps,
					       in long numOrdre )    raises (SALOME::SALOME_Exception);


    // Add a MED/VTK/... driver to a MED'GEN' object to
    // be able to read/write files preserving  meshes<-->fields association
    // Multiple drivers can be added whatever the type.
    // The access point in the <long> returned
    long addDriver     (in medDriverTypes driverType, in string  fileName)
                                        raises (SALOME::SALOME_Exception);
    /*!
   Removes the driver
    */
    void rmDriver      (in long i)  raises (SALOME::SALOME_Exception);
    /*!
    Reads the structure of the %MED file
    */
    void readFileStruct(in long i)  raises (SALOME::SALOME_Exception);
    void writeFrom     (in long i)  raises (SALOME::SALOME_Exception);
    void write         (in long i)  raises (SALOME::SALOME_Exception);

    void addMesh  (in MESH   ptrMesh   ) raises (SALOME::SALOME_Exception);
    void addField (in FIELD  ptrField  ) raises (SALOME::SALOME_Exception);

    void addInStudy (in SALOMEDS::Study myStudy, in MED medPtr) raises (SALOME::SALOME_Exception, SALOMEDS::StudyBuilder::LockProtection);
  };
  
  /*! \brief A structure containing information about MED file
  */
  struct MedFileInfo
  {
    string fileName; //!< name of file
    long   fileSize; //!< size of file
    long   major, minor, release; //!< MED file version
  };
};

#endif /* MED_IDL */
