/*============================================================================
*
* 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_MAILLAGE_H__
#define __CS_MAILLAGE_H__
/*============================================================================
* Structure principale associée à un maillage
*============================================================================*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*----------------------------------------------------------------------------
* Fichiers `include' BFT ou FVM
*----------------------------------------------------------------------------*/
#include "fvm_defs.h"
/*----------------------------------------------------------------------------
* Fichiers `include' locaux
*----------------------------------------------------------------------------*/
#include "cs_base.h"
#include "cs_perio.h"
/*=============================================================================
* Définitions de macros
*============================================================================*/
/* Type de voisinage étendu, recu de l'Enveloppe */
#define CS_MAILLAGE_TYPE_VOISET_SANS 0 /* Pas de voisinage étendu */
#define CS_MAILLAGE_TYPE_VOISET_DANS_HALO 1 /* Voisinage étendu traité
dans le halo standard */
#define CS_MAILLAGE_TYPE_VOISET_SEPARE 2 /* Voisinage étendu séparé */
/*============================================================================
* Définitions de types
*============================================================================*/
/* Structure associée à un maillage */
typedef struct {
/* Indicateurs globaux */
cs_int_t dim; /* Dimension de l'espace */
cs_int_t num_dom; /* Numéro du domaine local */
cs_int_t nbr_dom; /* Nombre global de domaines */
cs_int_t nbr_per; /* Nombre de périodicités */
cs_int_t ind_type_voiset; /* Type de voisinage étendu :
= CS_VOISET_TYPE_SANS
: pas de voisinage étendu
= CS_VOISET_TYPE_DANS_HALO
: voisinage étendu dans le halo std
= CS_VOISET_TYPE_SEPARE
: voisinage étendu séparé */
/* Dimensions locales */
cs_int_t nbr_cel; /* Nombre de cellules du maillage */
cs_int_t nbr_fac; /* Nombre de faces internes du maillage */
cs_int_t nbr_fbr; /* Nombre de faces de bord du maillage */
cs_int_t nbr_som; /* Nombre de sommets du maillage */
cs_int_t lng_fac_som; /* Taille connectivité faces -> sommets */
cs_int_t lng_fbr_som; /* Taille de la connectivité
faces de bord -> sommets */
cs_int_t nbr_cel_etendu; /* Nombre de cellules étendu
(nbr_cel + nbr_cel_fac_par) */
cs_int_t nbr_cel_fac_par; /* Nombre de cellules "fantômes" */
cs_int_t nbr_dom_fac_par; /* Nombre de domaines sur frontière
parallèle */
cs_int_t nbr_cel_fac_par_voiset;
/* Nombre de cellules "fantômes" pour le
voisinage étendu séparé */
cs_int_t nbr_dom_fac_par_voiset;
/* Nombre de domaines sur frontière
parallèle pour le
voisinage étendu séparé */
cs_int_t nbr_val_connect_voiset_cel_cel_dom;
/* Longueur lelvse du tableau
val_connect_voiset_cel_cel_dom des valeurs
de la connectivité du voisinage étendu
On pourrait s'affranchir de cette variable
(dont la valeur est égale à
pos_connect_voiset_cel_cel_dom[nbr_cel]-1)
dans la mesure où, actuellement,
- le tableau des positions
pos_connect_voiset_cel_cel_dom
est envoyé par l'enveloppe avant
le tableau des valeurs
val_connect_voiset_cel_cel_dom
- le tableau des valeurs est alloué
en C uniquement et pas en FORTRAN */
/* Dimensions globales */
cs_int_t nbr_cel_glob; /* Nombre de cellules global */
cs_int_t nbr_fac_glob; /* Nombre de faces internes global */
cs_int_t nbr_fbr_glob; /* Nombre de faces de bord global */
cs_int_t nbr_som_glob; /* Nombre de sommets global */
/* Structures locales */
cs_real_t *coo_som; /* Coordonnées des sommets */
cs_int_t *fac_cel; /* Connectivité faces internes -> cellules */
cs_int_t *fbr_cel; /* Connectivité faces de bord -> cellules */
cs_int_t *pos_fac_som; /* Positions de départ dans la
connectivité faces internes -> sommets */
cs_int_t *val_fac_som; /* Connectivité faces internes -> sommets */
cs_int_t *pos_fbr_som; /* Positions de départ dans la
connectivité faces de bord -> sommets */
cs_int_t *val_fbr_som; /* Connectivité faces de bord -> sommets */
/* Numérotations globales */
fvm_gnum_t *num_cel; /* Numéros globaux des cellules */
fvm_gnum_t *num_fac; /* Numéros globaux des faces internes
(restent en numérot. locale initiale) */
fvm_gnum_t *num_fbr; /* Numéros globaux des faces de bord
(restent en numérot. locale initiale) */
fvm_gnum_t *num_som; /* Numéros globaux des sommets */
/* Structures auxiliaires pour parallélisme et périodicité */
cs_int_t *pos_dom_fac_par; /* Pointeurs sur blocs de cellules "fantômes"
associés à une frontière parallèle */
cs_int_t *pos_per_fac_par; /* Pointeurs sur blocs de cellules "fantômes"
associés à une frontière parallèle dans
le cas d'une périodicité */
cs_int_t *num_cel_fac_par; /* Numéros locaux des cellules "fantômes" */
cs_int_t *num_dom_fac_par; /* Numéros de domaines sur frontière
parallèle */
cs_param_perio_t *liste_param_per; /* Paramètres de périodicité */
/* Structures associées aux voisinages étendus */
cs_int_t *pos_dom_fac_par_voiset; /* Pointeurs sur blocs de cellules
"fantômes" associés à une frontière
parallèle pour le voisinage
étendu séparé */
cs_int_t *pos_per_fac_par_voiset; /* Pointeurs sur blocs de cellules
"fantômes" associés à une frontière
parallèle dans le cas d'une périodicité
pour le voisinage étendu séparé */
cs_int_t *num_cel_fac_par_voiset; /* Numéros locaux des cellules "fantômes"
pour le voisinage étendu séparé */
cs_int_t *num_dom_fac_par_voiset; /* Numéros de domaines sur frontière
parallèle pour le voisinage
étendu séparé */
cs_real_t *coord_cel_avec_voiset; /* Coordonnées du centre des cellules
réelles et "fantômes"
pour le voisinage étendu séparé */
cs_int_t *pos_connect_voiset_cel_cel_dom;
/* Position de la première cellule dans la
connectivité voisinage étendu : ipcvse */
cs_int_t *val_connect_voiset_cel_cel_dom;
/* Numéro local des cellules dans la
connectivité voisinage étendu : ielvse */
/* Historique des numérotations (pour échanges et suites) */
cs_int_t *num_fac_ini; /* Numérotation ini. des faces internes
(si ces faces sont renumérotées) */
cs_int_t *num_fbr_ini; /* Numérotation ini. des faces de bord
(si ces faces sont renumérotées) */
/* Références des faces (groupes et familles) */
cs_int_t nbr_grp; /* Nombre de groupes associés */
cs_int_t *pos_grp; /* Position de départ de chaque groupe
dans le tableau des noms de groupe */
char *nom_grp; /* Tableau des noms des groupes */
cs_int_t nbr_prop_fam_max; /* Nombre de propriétés maximal pour
une famille */
cs_int_t nbr_fam; /* Nombre de familles */
cs_int_t *prop_fam; /* Propriétés des familles */
cs_int_t *fam_cel; /* Familles des cellules */
cs_int_t *fam_fbr; /* Familles des faces de bord */
} cs_maillage_t ;
/* Structures de type "tampon" associées à un maillage */
#if defined(_CS_HAVE_MPI)
typedef struct {
cs_int_t nbr_dom_var_assembl;
/* Nombre de domaines auxquels le processeur
courant envoie de l'information */
cs_int_t nbr_dom_var_assembl_voiset;
/* Nombre de domaines auxquels le processeur
courant envoie de l'information du
voisinage étendu, s'il est traité
séparément */
MPI_Request *mpi_request; /* Tableau de requêtes MPI */
MPI_Status *mpi_status; /* Tableau de codes de retour MPI */
cs_int_t *num_cel_loc_par; /* Numéro local des cellules à envoyer */
cs_int_t *pos_dom_var_assembl;
/* Repérage des cases destinées aux
différents voisins dans var_assembl */
cs_int_t *num_dom_var_assembl;
/* Numéro des domaines auxquels le processeur
courant envoie de l'information */
cs_int_t *num_cel_loc_par_voiset;
/* Numéro local des cellules à envoyer
pour le voisinage étendu s'il est traité
séparément */
cs_int_t *pos_dom_var_assembl_voiset;
/* Repérage des cases destinées aux
différents voisins dans var_assembl
pour le voisinage étendu s'il est traité
séparément */
cs_int_t *num_dom_var_assembl_voiset;
/* Numéro des domaines auxquels le processeur
courant envoie de l'information du
voisinage étendu s'il est traité
séparément */
cs_real_t *var_assembl; /* Tableau d'assemblage temporaire */
cs_real_t *var_assembl_voiset;
/* Tableau d'assemblage temporaire
pour le voisinage étendu s'il est traité
séparément */
cs_real_t *var_cel_avec_voiset;
/* Tableau de réception pour
le voisinage étendu s'il est traité
séparément : longueur ncelet+voiset*/
} cs_maillage_tmp_t ;
#endif
/*=============================================================================
* Variables globales_statiques
*============================================================================*/
extern cs_maillage_t *cs_glob_maillage; /* Pointeur sur le maillage principal */
#if defined(_CS_HAVE_MPI)
extern cs_maillage_tmp_t *cs_glob_maillage_tmp ; /* Pointeur sur la structure
de tampons associée au
maillage principal */
#endif
/*============================================================================
* Fonctions publiques pour API Fortran
*============================================================================*/
/*----------------------------------------------------------------------------
* Recherche du numéro de groupe correspondant à un nom donné. Si le groupe
* existe, le numéro renvoyé correspond au rang du groupe (commençant à 1)
* dans la liste des groupes du maillage, et multiplié par -1. Cette
* numérotation est celle utilisée dans le tableau IPRFML(NFML, NPRFML)
* de description des familles.
*
* Si le groupe de nom indiqué n'existe pas, on renvoie 9999.
*
* Interface Fortran :
*
* FUNCTION NUMGRP (NOMGRP, LNGNOM)
* ***************
*
* CHARACTER* NOMGRP : --> : Nom du groupe recherché
* INTEGER LNGNOM : --> : Longueur du nom du groupe
*----------------------------------------------------------------------------*/
cs_int_t CS_PROCF (numgrp, NUMGRP)
(
const char *const nomgrp, /* --> Nom du groupe */
const cs_int_t *const lngnom /* --> Longueur du nom */
CS_ARGF_SUPP_CHAINE /* (arguments 'longueur' éventuels F77, */
/* inutilisés lors de l'appel mais */
/* placés par de nombreux compilateurs) */
);
/*----------------------------------------------------------------------------
* Sauvegarde des numérotations initiales des faces
*
* Remarque : lorsque des faces sont renumérotées, les connectivités et
* variables basées sur les faces sont toutes mises à jour, sauf
* les numéros globaux associés à ces faces (en cas de parallélisme)
* et conservés dans la structure maillage ('num_fac'et num_fbr') ;
* en effet, cette numérotation est destinée à se ramener à la
* numérotation initiale, notamment pour l'écriture et la lecture de
* fichiers suite indépendants du nombre de domaines en parallélisme
* ou d'une renumérotation vectorielle, et il est plus aisé de la
* manipuler si elle n'est pas modifiée.
*
* Interface Fortran :
*
* SUBROUTINE SAVNUM (IVECTV, IVECTB, INUMFI, INUMFB)
* *****************
*
* INTEGER IVECTV : --> : Indicateur renum. faces internes
* INTEGER IVECTB : --> : Indicateur renum. faces de bord
* INTEGER INUMFI : --> : Table de renum. des faces internes
* INTEGER INUMFB : --> : Table de renum. des faces de bord
*----------------------------------------------------------------------------*/
void CS_PROCF (savnum, SAVNUM)
(
const cs_int_t *const ivectv, /* --> Indicateur renum. faces internes */
const cs_int_t *const ivectb, /* --> Indicateur renum. faces de bord */
const cs_int_t *const inumfi, /* --> Table de renum. des faces internes */
const cs_int_t *const inumfb /* --> Table de renum. des faces de bord */
);
/*=============================================================================
* Prototypes de fonctions
*============================================================================*/
/*----------------------------------------------------------------------------
* Création d'une structure maillage
*----------------------------------------------------------------------------*/
cs_maillage_t * cs_maillage_cree
(
void
);
/*----------------------------------------------------------------------------
* Destruction d'une structure maillage
*----------------------------------------------------------------------------*/
cs_maillage_t * cs_maillage_detruit
(
cs_maillage_t * maillage
);
/*----------------------------------------------------------------------------
* Renumérotation des sommets de manière à assurer que :
* si i < j, maillage->num_som[i] < maillage->num_som[j]
* (ce qui n'est pas assuré par la numérotation initialement
* fournie par l'Enveloppe).
*----------------------------------------------------------------------------*/
void cs_maillage_ordonne_sommets
(
cs_maillage_t *const maillage /* <-> Structure maillage associée */
);
/*----------------------------------------------------------------------------
* Affichage d'informations relatives à un maillage
*----------------------------------------------------------------------------*/
void cs_maillage_info
(
const cs_maillage_t *maillage
);
#if defined(_CS_HAVE_MPI)
/*----------------------------------------------------------------------------
* Création d'une structure de tampons associée à un maillage
*----------------------------------------------------------------------------*/
cs_maillage_tmp_t * cs_maillage_tmp_cree
(
cs_maillage_t * maillage
);
/*----------------------------------------------------------------------------
* Desctruction d'une structure de tampons associée à un maillage
*----------------------------------------------------------------------------*/
cs_maillage_tmp_t * cs_maillage_tmp_detruit
(
cs_maillage_tmp_t * maillage_tmp
);
/*----------------------------------------------------------------------------
* Tableaux supplémentaires d'un maillage pour le parallélisme
*----------------------------------------------------------------------------*/
void cs_maillage_init_parallel
(
cs_maillage_t *maillage,
cs_maillage_tmp_t *maillage_tmp
);
#endif /* _CS_HAVE_MPI */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __CS_MAILLAGE_H__ */
syntax highlighted by Code2HTML, v. 0.9.1