/*============================================================================ * * 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_BASE_H__ #define __CS_BASE_H__ /*============================================================================ * Définitions, variables globales, et fonctions de base *============================================================================*/ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #if defined(_CS_HAVE_MPI) #include #if defined(_CS_HAVE_MPE) #include #endif #endif /*============================================================================= * Définitions de macros *============================================================================*/ /* Nom du système */ #if defined(__sgi__) || defined(__sgi) || defined(sgi) #define _CS_ARCH_IRIX_64 #elif defined(__hpux__) || defined(__hpux) || defined(hpux) #define _CS_ARCH_HP_UX #elif defined(__linux__) || defined(__linux) || defined(linux) #define _CS_ARCH_Linux #elif defined(__sun__) || defined(__sun) || defined(sun) #define _CS_ARCH_SunOS #elif defined(__uxpv__) || defined(__uxpv) || defined(uxpv) #define _CS_ARCH_UNIX_System_V #endif /* * Macro utile pour gérér les differences de noms de symboles (underscore ou * non, miniscules ou majuscules entre C et FORTRAN) pour l'édition de liens */ #if !defined (__hpux) #define CS_PROCF(x, y) x##_ #else #define CS_PROCF(x, y) x #endif /* * Macro utile pour gérér arguments 'longueur de chaîne de caractères Fortran, * inutilisés lors des appel mais placés par de nombreux compilateurs) * Le compilateur Fujitsu VPP 5000 ne supporte pas ces listes de longueur * variables dans les appels entre C et FORTRAN (mais ca marche pour les * appels C-C et FORTRAN-FORTRAN) */ #if defined (__uxpv__) /* Cas Fujitsu VPP 5000 */ #define CS_ARGF_SUPP_CHAINE #else #define CS_ARGF_SUPP_CHAINE , ... #endif #define CS_DIM_3 3 /* Dimension de l'espace */ /* Macros "classiques" */ #define CS_ABS(a) ((a) < 0 ? -(a) : (a)) /* Valeur absolue de a */ #define CS_MIN(a,b) ((a) > (b) ? (b) : (a)) /* Minimum de a et b */ #define CS_MAX(a,b) ((a) < (b) ? (b) : (a)) /* Maximum de a et b */ /* * Macros pour internationalisation éventuelle via gettext() ou une fonction * semblable (pour encadrer les chaînes de caractères imprimables) */ #undef _ #define _(String) String #undef N_ #define N_(String) String /*============================================================================ * Définitions de types *============================================================================*/ typedef int cs_int_t; /* Entier */ typedef double cs_real_t; /* Réel (virgule flottante) */ typedef char cs_byte_t; /* Octet (unité de mémoire non typée) */ typedef cs_real_t cs_point_t[3]; typedef enum { /* Booléen */ CS_FALSE , CS_TRUE } cs_bool_t; /* Définitions pour opérations collectives (min, max, somme) sous MPI */ #if defined(_CS_HAVE_MPI) typedef struct { cs_real_t val; cs_int_t rang; } cs_mpi_real_int_t; #define CS_MPI_INT MPI_INT /* Si cs_real_t est un double ; sinon redéfinir en MPI_xxx */ #define CS_MPI_REAL MPI_DOUBLE /* Si cs_real_t est un double ; sinon redéfinir en MPI_REAL */ #define CS_MPI_REAL_INT MPI_DOUBLE_INT /* Si cs_real_t est un double ; sinon redéfinir en MPI_REAL_INT */ #endif /* defined(_CS_HAVE_MPI) */ /* Énumération de type ("type de type") pour transmettre le type d'une donnée */ typedef enum { CS_TYPE_char, CS_TYPE_cs_int_t, CS_TYPE_cs_real_t, CS_TYPE_cs_bool_t, CS_TYPE_cs_point_t, CS_TYPE_void } cs_type_t; /* Qualificateurs de types restrict (existe en standard en C99) */ #if defined(__GNUC__) #define restrict __restrict #else #define restrict #endif /*============================================================================= * Définitions de variables globales *============================================================================*/ extern cs_int_t cs_glob_base_rang; /* Rang du processus dans le groupe */ extern cs_int_t cs_glob_base_nbr; /* Nombre de processus dans le groupe */ #if defined(_CS_HAVE_MPI) extern MPI_Comm cs_glob_base_mpi_comm; /* Intra-communicateur */ #endif /* Variables globales associées à l'instrumentation */ #if defined(_CS_HAVE_MPI) && defined(_CS_HAVE_MPE) extern int cs_glob_mpe_broadcast_a; extern int cs_glob_mpe_broadcast_b; extern int cs_glob_mpe_synchro_a; extern int cs_glob_mpe_synchro_b; extern int cs_glob_mpe_send_a; extern int cs_glob_mpe_send_b; extern int cs_glob_mpe_rcv_a; extern int cs_glob_mpe_rcv_b; extern int cs_glob_mpe_reduce_a; extern int cs_glob_mpe_reduce_b; extern int cs_glob_mpe_compute_a; extern int cs_glob_mpe_compute_b; #endif /*============================================================================ * Prototypes de fonctions publiques pour API Fortran *============================================================================*/ /*---------------------------------------------------------------------------- * Fonction d'arret depuis du code Fortran * * Interface Fortran : * * SUBROUTINE CSEXIT (STATUT) * ***************** * * INTEGER STATUT : --> : 0 pour succès, 1 ou + pour erreur *----------------------------------------------------------------------------*/ void CS_PROCF (csexit, CSEXIT) ( const cs_int_t *const statut ); /*---------------------------------------------------------------------------- * Temps CPU écoulé depuis le début de l'exécution * * Interface Fortran : * * SUBROUTINE DMTMPS (TCPU) * ***************** * * DOUBLE PRECISION TCPU : --> : temps CPU (utilisateur + système) *----------------------------------------------------------------------------*/ void CS_PROCF (dmtmps, DMTMPS) ( cs_real_t *const tcpu ); /*============================================================================= * Prototypes de fonctions *============================================================================*/ #if defined(_CS_HAVE_MPI) /*---------------------------------------------------------------------------- * Initialisation MPI ; les variables globales `cs_glob_base_nbr' indiquant * le nombre de processus Code_Saturne et `cs_glob_base_rang' indiquant le * rang du processus courant parmi les processus Code_Saturne sont * (re)positionnées par cette fonction. *----------------------------------------------------------------------------*/ void cs_base_mpi_init ( int *argc, /* --> Nombre d'arguments ligne de commandes */ char ***argv, /* --> Tableau des arguments ligne de commandes */ cs_int_t rang_deb /* --> Rang du premier processus du groupe * dans MPI_COMM_WORLD */ ); /*---------------------------------------------------------------------------- * Finalisation MPI *----------------------------------------------------------------------------*/ void cs_base_mpi_fin ( void ); #endif /* defined(_CS_HAVE_MPI) */ /*---------------------------------------------------------------------------- * Fonction d'arret *----------------------------------------------------------------------------*/ void cs_exit ( const cs_int_t statut ); /*---------------------------------------------------------------------------- * Fonction initialisant la gestion des erreurs et des signaux *----------------------------------------------------------------------------*/ void cs_base_erreur_init ( void ); /*---------------------------------------------------------------------------- * Fonction initialisant la gestion de contrôle de la mémoire allouée *----------------------------------------------------------------------------*/ void cs_base_mem_init ( void ); /*---------------------------------------------------------------------------- * Fonction terminant la gestion de contrôle de la mémoire allouée * et affichant le bilan de la mémoire consommée. *----------------------------------------------------------------------------*/ void cs_base_mem_fin ( void ); /*---------------------------------------------------------------------------- * Fonction affichant le bilan du temps de calcul et temps écoulé. *----------------------------------------------------------------------------*/ void cs_base_bilan_temps ( void ); /*---------------------------------------------------------------------------- * Fonction affichant le bilan du temps de calcul et temps écoulé. *----------------------------------------------------------------------------*/ void cs_base_info_systeme ( void ); /*---------------------------------------------------------------------------- * Modification du comportement des fonctions bft_printf() par défaut *----------------------------------------------------------------------------*/ void cs_base_bft_printf_set ( void ); /*---------------------------------------------------------------------------- * Fonction d'impression d'un message "avertissement" *----------------------------------------------------------------------------*/ void cs_base_warn ( const char *file_name, const int line_num ); /*---------------------------------------------------------------------------- * Conversion d'une chaîne de l'API Fortran vers l'API C, * (avec suppression des blancs en début ou fin de chaîne). *----------------------------------------------------------------------------*/ char * cs_base_chaine_f_vers_c_cree ( const char *const chaine, /* --> Chaîne Fortran */ const cs_int_t longueur /* --> Longueur de la chaîne */ ); /*---------------------------------------------------------------------------- * Libération d'une chaîne convertie de l'API Fortran vers l'API C *----------------------------------------------------------------------------*/ char * cs_base_chaine_f_vers_c_detruit ( char * chaine /* --> Chaîne C */ ); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __CS_BASE_H__ */