/*============================================================================
 *
 *                    Code_Saturne version 1.3
 *                    ------------------------
 *
 *
 *     This file is part of the Code_Saturne Kernel, element of the
 *     Code_Saturne CFD tool.
 *
 *     Copyright (C) 1998-2008 EDF S.A., France
 *
 *     contact: saturne-support@edf.fr
 *
 *     The Code_Saturne Kernel is free software; you can redistribute it
 *     and/or modify it under the terms of the GNU General Public License
 *     as published by the Free Software Foundation; either version 2 of
 *     the License, or (at your option) any later version.
 *
 *     The Code_Saturne Kernel 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 General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License
 *     along with the Code_Saturne Kernel; if not, write to the
 *     Free Software Foundation, Inc.,
 *     51 Franklin St, Fifth Floor,
 *     Boston, MA  02110-1301  USA
 *
 *============================================================================*/

#ifndef __CS_SUITE_H__
#define __CS_SUITE_H__

/*============================================================================
 *  Gestion des fichiers suite
 *============================================================================*/

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


/*----------------------------------------------------------------------------
 *  Fichiers `include' librairie standard C
 *----------------------------------------------------------------------------*/


/*----------------------------------------------------------------------------
 *  Fichiers `include' locaux
 *----------------------------------------------------------------------------*/

#include "cs_base.h"


/*============================================================================
 *  Définitions d'énumerations
 *============================================================================*/

/*----------------------------------------------------------------------------
 *  Type de fichier suite
 *----------------------------------------------------------------------------*/

typedef enum {

  CS_SUITE_TYPE_ASCII,           /* Fichier suite ASCII                       */
  CS_SUITE_TYPE_BINAIRE          /* Fichier suite binaire                     */

} cs_suite_type_t;


/*----------------------------------------------------------------------------
 *  Fichier en lecture ou écriture
 *----------------------------------------------------------------------------*/

typedef enum {

  CS_SUITE_MODE_LECTURE,         /* Communication en réception                */
  CS_SUITE_MODE_ECRITURE         /* Communication en émission                 */

} cs_suite_mode_t;


/*----------------------------------------------------------------------------
 *  Type de support de maillage associé à une rubrique
 *----------------------------------------------------------------------------*/

typedef enum {

  CS_SUITE_SUPPORT_SCAL,         /* Scalaire (sans support)                   */
  CS_SUITE_SUPPORT_CEL,          /* Valeurs associées aux cellules            */
  CS_SUITE_SUPPORT_FAC_INT,      /* Valeurs associées aux faces internes      */
  CS_SUITE_SUPPORT_FAC_BRD,      /* Valeurs associées aux faces de bord       */
  CS_SUITE_SUPPORT_SOM           /* Valeurs associées aux sommets             */

} cs_suite_support_t;


/*============================================================================
 *  Définition de macros
 *============================================================================*/

/* Codes d'erreur */

#define CS_SUITE_SUCCES          0 /* Réussite */
#define CS_SUITE_ERR_NUM_FIC    -1 /* Pas de suite du numéro indiqué */
#define CS_SUITE_ERR_TYPE_FIC   -2 /* Type de fichier incorrect */
#define CS_SUITE_ERR_SUPPORT    -3 /* Support indéfini/de dimension différente */
#define CS_SUITE_ERR_TYPE_VAL   -4 /* Type de valeur inconnu ou imprévu */
#define CS_SUITE_ERR_NBR_VAL    -5 /* Nombre de valeurs ne correspond pas */
#define CS_SUITE_ERR_MODE       -6 /* Mode d'ouverure du fichier incompatible */
#define CS_SUITE_ERR_EXISTE     -7 /* Enregistrement non disponible */


/*============================================================================
 *  Déclaration de structures
 *============================================================================*/

/*
  Pointeur associé à un fichier suite. La structure elle-même est déclarée
  dans le fichier "cs_suite.c", car elle n'est pas nécessaire ailleurs.
*/

typedef struct _cs_suite_t cs_suite_t;


/*=============================================================================
 * Définitions de variables globales
 *============================================================================*/


/*============================================================================
 *  Fonctions publiques pour API Fortran
 *============================================================================*/

/*----------------------------------------------------------------------------
 * Ouverture d'un fichier suite
 *
 * Interface Fortran :
 *
 * SUBROUTINE OPNSUI (NOMSUI, LNGNOM, IREAWR, IFORMA, NUMSUI)
 * *****************
 *
 * CHARACTER*       NOMSUI      : --> : Nom du fichier suite
 * INTEGER          LNGNOM      : --> : Longueur du nom du fichier suite
 * INTEGER          IREAWR      : --> : 1 pour lecture, 2 pour écriture
 * INTEGER          IFORMA      : --> : 0 pour binaire, 1 pour formaté
 * INTEGER          NUMSUI      : <-- : Numéro du fichier suite ouvert
 * INTEGER          IERROR      : <-- : 0 pour succès, < 0 pour erreur
 *----------------------------------------------------------------------------*/

void CS_PROCF (opnsui, OPNSUI)
(
 const char       *const nomsui,  /* --> Nom du fichier                       */
 const cs_int_t   *const lngnom,  /* --> Longueur du nom                      */
 const cs_int_t   *const ireawr,  /* --> 1 pour lecture, 2 pour écriture      */
 const cs_int_t   *const iforma,  /* --> 0 pour binaire, 1 pour formaté       */
       cs_int_t   *const numsui,  /* <-- Numéro du ficher suite ouvert        */
       cs_int_t   *const ierror   /* <-- 0 pour succès, < 0 pour erreur       */
 CS_ARGF_SUPP_CHAINE              /*     (arguments 'longueur' éventuels F77, */
                                  /*     inutilisés lors de l'appel mais      */
                                  /*     placés par de nombreux compilateurs) */
);


/*----------------------------------------------------------------------------
 * Fermeture d'un fichier suite
 *
 * Interface Fortran :
 *
 * SUBROUTINE CLSSUI (NUMSUI)
 * *****************
 *
 * INTEGER          NUMSUI      : --> : numéro du fichier suite à fermer
 * INTEGER          IERROR      : <-- : 0 pour succès, < 0 pour erreur
 *----------------------------------------------------------------------------*/

void CS_PROCF (clssui, CLSSUI)
(
 const cs_int_t   *const numsui,  /* --> Numéro du ficher suite à fermer      */
       cs_int_t   *const ierror   /* <-- Numéro du ficher suite ouvert        */
);


/*----------------------------------------------------------------------------
 *  Vérification du support associé à un fichier suite ;
 *  On renvoie pour chaque type d'entité 1 si le nombre d'entités associées
 *  au fichier suite correspond au nombre d'entités en cours (et donc que
 *  l'on considère que le support est bien le même), 0 sinon.
 *
 * Interface Fortran :
 *
 * SUBROUTINE TSTSUI (NUMSUI, INDCEL, INDFAC, INDFBR, INDSOM)
 * *****************
 *
 * INTEGER          NUMSUI      : --> : Numéro du fichier suite
 * INTEGER          INDCEL      : <-- : Indicateur corresp. cellules
 * INTEGER          INDFAC      : <-- : Indicateur corresp. faces internes
 * INTEGER          INDFBR      : <-- : Indicateur corresp. faces de bord
 * INTEGER          INDSOM      : <-- : Indicateur corresp. sommets
 *----------------------------------------------------------------------------*/

void CS_PROCF (tstsui, TSTSUI)
(
 const cs_int_t  *const numsui,   /* --> Numéro du fichier suite              */
       cs_int_t  *const indcel,   /* <-- Indicateur corresp. cellules         */
       cs_int_t  *const indfac,   /* <-- Indicateur corresp. faces internes   */
       cs_int_t  *const indfbr,   /* <-- Indicateur corresp. faces de bord    */
       cs_int_t  *const indsom    /* <-- Indicateur corresp. sommets          */
);


/*----------------------------------------------------------------------------
 *  Affichage de l'index associé à un fichier suite
 *
 * Interface Fortran :
 *
 * SUBROUTINE INFSUI (NUMSUI)
 * *****************
 *
 * INTEGER          NUMSUI      : --> : Numéro du fichier suite
 *----------------------------------------------------------------------------*/

void CS_PROCF (infsui, INFSUI)
(
 const cs_int_t  *const numsui    /* --> Numéro du fichier suite              */
);


/*----------------------------------------------------------------------------
 * Lecture d'une rubrique sur fichier suite
 *
 * Interface Fortran :
 *
 * SUBROUTINE LECSUI (NUMSUI, NOMRUB, LNGNOM, ITYSUP, NBVENT, IRTYPE, TABVAR)
 * *****************
 *
 * INTEGER          NUMSUI      : --> : Numéro du fichier suite
 * CHARACTER*       NOMRUB      : --> : Nom de la rubrique
 * INTEGER          LNGNOM      : --> : Longueur du nom de la rubrique
 * INTEGER          ITYSUP      : --> : Type de support :
 *                              :     :  0 : scalaire (pas de support)
 *                              :     :  1 : cellules
 *                              :     :  2 : faces internes
 *                              :     :  3 : faces de bord
 *                              :     :  4 : sommets (si disponibles)
 * INTEGER          NBVENT      : --> : Nb. valeurs par entité de support
 * INTEGER          IRTYPE      : --> : 1 pour entiers, 2 pour double précision
 * (?)              TABVAR      : <-> : Tableau des valeurs à lire
 * INTEGER          IERROR      : <-- : 0 pour succès, < 0 pour erreur
 *----------------------------------------------------------------------------*/

void CS_PROCF (lecsui, LECSUI)
(
 const cs_int_t   *const numsui,  /* --> Numéro du fichier suite              */
 const char       *const nomrub,  /* --> Nom de la rubrique                   */
 const cs_int_t   *const lngnom,  /* --> Longueur du nom de la rubrique       */
 const cs_int_t   *const itysup,  /* --> Type de support (voir ci-dessus)     */
 const cs_int_t   *const nbvent,  /* --> Nb. valeurs par entité du support    */
 const cs_int_t   *const irtype,  /* --> 1 pour entiers, 2 pour double préc.  */
       void       *const tabvar,  /* <-- Tableur des valeurs à lire           */
       cs_int_t   *const ierror   /* <-- 0 pour succès, < 0 pour erreur       */
 CS_ARGF_SUPP_CHAINE              /*     (arguments 'longueur' éventuels F77, */
                                  /*     inutilisés lors de l'appel mais      */
                                  /*     placés par de nombreux compilateurs) */
);


/*----------------------------------------------------------------------------
 * Écriture d'une rubrique sur fichier suite
 *
 * Interface Fortran :
 *
 * SUBROUTINE ECRSUI (NUMSUI, NOMRUB, LNGNOM, ITYSUP, NBVENT, IRTYPE, TABVAR)
 * *****************
 *
 * INTEGER          NUMSUI      : --> : Numéro du fichier suite
 * CHARACTER*       NOMRUB      : --> : Nom de la rubrique
 * INTEGER          LNGNOM      : --> : Longueur du nom de la rubrique
 * INTEGER          ITYSUP      : --> : Type de support :
 *                              :     :  0 : scalaire (pas de support)
 *                              :     :  1 : cellules
 *                              :     :  2 : faces internes
 *                              :     :  3 : faces de bord
 *                              :     :  4 : sommets (si disponibles)
 * INTEGER          NBVENT      : --> : Nb. valeurs par entité de support
 * INTEGER          IRTYPE      : --> : 1 pour entiers, 2 pour double précision
 * (?)              TABVAR      : --> : Tableau des valeurs fournies
 * INTEGER          IERROR      : <-- : 0 pour succès, < 0 pour erreur
 *----------------------------------------------------------------------------*/

void CS_PROCF (ecrsui, ECRSUI)
(
 const cs_int_t   *const numsui,  /* --> Numéro du fichier suite              */
 const char       *const nomrub,  /* --> Nom de la rubrique                   */
 const cs_int_t   *const lngnom,  /* --> Longueur du nom de la rubrique       */
 const cs_int_t   *const itysup,  /* --> Type de support (voir ci-dessus)     */
 const cs_int_t   *const nbvent,  /* --> Nb. valeurs par entité du support    */
 const cs_int_t   *const irtype,  /* --> 1 pour entiers, 2 pour double préc.  */
 const void       *const tabvar,  /* --> Tableur des valeurs fournies         */
       cs_int_t   *const ierror   /* <-- 0 pour succès, < 0 pour erreur       */
 CS_ARGF_SUPP_CHAINE              /*     (arguments 'longueur' éventuels F77, */
                                  /*     inutilisés lors de l'appel mais      */
                                  /*     placés par de nombreux compilateurs) */
);


/*============================================================================
 *  Prototypes de fonctions publiques
 *============================================================================*/

/*----------------------------------------------------------------------------
 *  Fonction qui initialise un fichier suite
 *----------------------------------------------------------------------------*/

cs_suite_t * cs_suite_cree
(
 const char             *const nom,         /* --> nom de base du fichier     */
 const cs_suite_mode_t         mode,        /* --> Lecture ou écriture        */
 const cs_suite_type_t         type         /* --> ASCII ou binaire           */
);


/*----------------------------------------------------------------------------
 *  Fonction qui détruit la structure associée à un fichier suite (et ferme
 *  le fichier associé) ; elle renvoie un pointeur NULL.
 *----------------------------------------------------------------------------*/

cs_suite_t * cs_suite_detruit
(
 cs_suite_t * suite                         /* --> Fichier suite              */
);


/*----------------------------------------------------------------------------
 *  Fonction qui vérifie le support associé à un fichier suite ;
 *  On renvoie pour chaque type d'entité CS_TRUE si le nombre d'entités
 *  associées au fichier suite correspond au nombre d'entités en cours (et
 *  donc que l'on considère que le support est bien le même), CS_FALSE sinon.
 *----------------------------------------------------------------------------*/

void cs_suite_verif_support
(
 const cs_suite_t  *const suite,            /* --> Fichier suite              */
       cs_bool_t   *const corresp_cel,      /* <-- Corresp. cellules          */
       cs_bool_t   *const corresp_fac,      /* <-- Corresp. faces internes    */
       cs_bool_t   *const corresp_fbr,      /* <-- Corresp. faces de bord     */
       cs_bool_t   *const corresp_som       /* <-- Corresp. sommets           */
);


/*----------------------------------------------------------------------------
 *  Fonction qui affiche l'index généré lors de l'analyse du fichier
 *----------------------------------------------------------------------------*/

void cs_suite_affiche_index
(
 const cs_suite_t  *const  suite          /* --> Structure suite              */
);


/*----------------------------------------------------------------------------
 *  Fonction qui lit un enregistrement sur fichier suite ; On renvoie 0
 *  (CS_SUITE_SUCCES) en cas de succès, une valeur négative (de type
 *  CS_SUITE_ERR_xxx) en cas d'échec.
 *----------------------------------------------------------------------------*/

cs_int_t cs_suite_lit_rub
(
 const cs_suite_t          *const suite,       /* --> Ptr. structure suite    */
 const char                *const nom_rub,     /* --> Nom de la rubrique      */
 const cs_suite_support_t         support,     /* --> Support de la variable  */
 const cs_int_t                   nbr_val_ent, /* --> Nb. val/point support   */
 const cs_type_t                  typ_val,     /* --> Type de valeurs         */
       void                *const val          /* <-- Valeurs à lire          */
);


/*----------------------------------------------------------------------------
 *  Fonction qui écrit un enregistrement sur fichier suite
 *----------------------------------------------------------------------------*/

void cs_suite_ecr_rub
(
       cs_suite_t          *const suite,       /* --> Ptr. structure suite    */
 const char                *const nom_rub,     /* --> Nom de la rubrique      */
 const cs_suite_support_t         support,     /* --> Support de la variable  */
 const cs_int_t                   nbr_val_ent, /* --> Nb. val/point support   */
 const cs_type_t                  typ_val,     /* --> Type de valeurs         */
 const void                *const val          /* --> Valeurs à écrire        */
);


/*----------------------------------------------------------------------------
 *  Fonction qui initialise l'API Fortran
 *----------------------------------------------------------------------------*/

void cs_suite_f77_api_init
(
 void
);


/*----------------------------------------------------------------------------
 *  Fonction qui termine l'API Fortran
 *----------------------------------------------------------------------------*/

void cs_suite_f77_api_finalize
(
 void
);


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __CS_SUITE_H__ */
