/*============================================================================
*
* Code_Saturne version 1.3
* ------------------------
*
*
* This file is part of the Code_Saturne Kernel, element of the
* Code_Saturne CFD tool.
*
* Copyright (C) 1998-2007 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_COMM_H__
#define __CS_COMM_H__
/*============================================================================
* Communications en série avec le module Enveloppe ou d'autres codes
*============================================================================*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*----------------------------------------------------------------------------
* Fichiers `include' librairie standard C
*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
* Fichiers `include' locaux
*----------------------------------------------------------------------------*/
#include "cs_base.h"
/*============================================================================
* Définitions d'énumerations
*============================================================================*/
/*----------------------------------------------------------------------------
* Type de message
*----------------------------------------------------------------------------*/
typedef enum {
CS_COMM_TYPE_ASCII, /* Messages par fichiers ASCII */
CS_COMM_TYPE_BINAIRE, /* Messages par fichiers binaires */
CS_COMM_TYPE_BINAIRE_FORTRAN, /* Messages par fichiers binaires Fortran */
CS_COMM_TYPE_MPI, /* Messages MPI */
CS_COMM_TYPE_SOCKET /* Messages par sockets IP */
} cs_comm_type_t;
/*----------------------------------------------------------------------------
* Emission ou réception de message
*----------------------------------------------------------------------------*/
typedef enum {
CS_COMM_MODE_RECEPTION, /* Communication en réception */
CS_COMM_MODE_EMISSION /* Communication en émission */
} cs_comm_mode_t;
/*============================================================================
* Définition de macros
*============================================================================*/
#define CS_COMM_FIN_FICHIER "EOF"
#define CS_COMM_CMD_ARRET "cmd:stop"
#define CS_COMM_CMD_ITER_DEB "cmd:iter:deb"
#define CS_COMM_CMD_ITER_DEB_FIN "cmd:iter:deb:fin"
#define CS_COMM_LNG_NOM_RUB 32 /* Longueur du nom d'une rubrique */
/*
* Communications par socket : on prévoit pour l'instant 64 noyaux
et 1 Syrthes au maximum ; cette valeur
peut être modifiée par la variable
d'environnement SYR_COMM_SOCKET_NBR_MAX
*/
/*============================================================================
* Déclaration de structures
*============================================================================*/
/*
Pointeur associé à un communicateur. La structure elle-même est déclarée
dans le fichier "cs_comm.c", car elle n'est pas nécessaire ailleurs.
*/
typedef struct _cs_comm_t cs_comm_t;
/*
Structure de sauvegarde des données d'une entête de message, permettant de
simplifier le passage de ces données à différentes fonctions de traitement.
*/
typedef struct {
cs_int_t num_rub; /* Numéro de rubrique associée */
char nom_rub[CS_COMM_LNG_NOM_RUB + 1]; /* Nom si num_rub = 0 */
cs_int_t nbr_elt; /* Nombre d'éléments */
cs_type_t typ_elt; /* Type si nbr_elt > 0 */
} cs_comm_msg_entete_t;
/*=============================================================================
* Définitions de variables globales
*============================================================================*/
/* Pointeurs globaux sur communicateurs avec le module Enveloppe */
extern cs_comm_t *cs_glob_comm_ecs_vers_cs;
/*============================================================================
* Prototypes de fonctions publiques
*============================================================================*/
/*----------------------------------------------------------------------------
* Fonction qui initialise une communication
*----------------------------------------------------------------------------*/
cs_comm_t * cs_comm_initialise
(
const char *const nom_emetteur, /* --> partie "émetteur" du nom */
const char *const nom_recepteur, /* --> partie "recepteur du nom */
const char *const chaine_magique, /* --> Chaîne de vérif. de type */
const cs_int_t numero, /* --> Complète le nom si non nul */
#if defined(_CS_HAVE_MPI)
const cs_int_t rang_proc, /* --> Rang processus en comm
(< 0 si comm par fichier) */
#endif
const cs_comm_mode_t mode, /* --> Émission ou réception */
const cs_comm_type_t type, /* --> Type de communication */
const cs_int_t echo /* --> Écho sur sortie principale
(< 0 si aucun, entête si 0,
n premiers et derniers
éléments si n) */
);
/*----------------------------------------------------------------------------
* Fonction qui termine une communication
*----------------------------------------------------------------------------*/
cs_comm_t * cs_comm_termine
(
cs_comm_t *comm
);
/*----------------------------------------------------------------------------
* Fonction qui renvoie un pointeur sur le nom d'une communication
*----------------------------------------------------------------------------*/
const char * cs_comm_ret_nom
(
const cs_comm_t *const comm
);
/*----------------------------------------------------------------------------
* Envoi d'un message
*----------------------------------------------------------------------------*/
void cs_comm_envoie_message
(
const cs_int_t num_rub, /* --> Num. rubrique associée */
const char nom_rub[CS_COMM_LNG_NOM_RUB], /* --> Si num_rub = 0 */
const cs_int_t nbr_elt, /* --> Nombre d'éléments */
const cs_type_t typ_elt, /* --> Type si nbr_elt > 0 */
void *const elt, /* --> Éléments si nbr_elt > 0 */
const cs_comm_t *const comm
);
/*----------------------------------------------------------------------------
* Réception de l'entete d'un message ; renvoie le nombre d'éléments du
* corps du message.
*----------------------------------------------------------------------------*/
cs_int_t cs_comm_recoit_entete
(
cs_comm_msg_entete_t *const entete, /* <-- entête du message */
const cs_comm_t *const comm
);
/*----------------------------------------------------------------------------
* Réception du corps d'un message.
*
* Si la zone mémoire destinée à recevoir les données existe deja, on
* fournit un pointeur "elt" sur cette zone ; la fonction renvoie alors
* ce même pointeur. Sinon (si "elt" est à NULL), la mémoire est allouée
* ici, et la fonction renvoie un pointeur sur cette zone.
*----------------------------------------------------------------------------*/
void * cs_comm_recoit_corps
(
const cs_comm_msg_entete_t *const entete, /* --> entête du message */
void *const elt, /* --> Pointeur sur les éléments */
const cs_comm_t *const comm
);
#if defined(_CS_HAVE_SOCKET)
/*----------------------------------------------------------------------------
* Fonction qui ouvre un "socket" IP pour préparer ce mode de communication
*----------------------------------------------------------------------------*/
void cs_comm_init_socket
(
void
);
/*----------------------------------------------------------------------------
* Fonction qui ferme le "socket" IP avec ce mode de communication
*----------------------------------------------------------------------------*/
void cs_comm_termine_socket
(
void
);
#endif /* _CS_HAVE_SOCKET */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __CS_COMM_H__ */
syntax highlighted by Code2HTML, v. 0.9.1