/*============================================================================
*
*                    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_VOISET_H__
#define __CS_VOISET_H__

/*============================================================================
 * Interfaces fortran pour le calcul des gradients par moindres carres sur
 *   support etendu.
 *============================================================================*/

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


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

#include "cs_base.h"


/*============================================================================
 * Définitions de macros
 *============================================================================*/

/*============================================================================
 * Définitions de types
 *============================================================================*/

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

/*----------------------------------------------------------------------------
 * Definition du voisinage étendu pour le calcul des gradients par moindres
 *   carrés : au premier passage, on choisit les cellules et on modifie la
 *   structure maillage qui stocke le voisinage étendu.
 *            ensuite, on se contente de retourner les pointeurs
 *
 * Attention :  le voisinage étendu permet de toucher toutes les cellules
 *              qui partagent un noeud avec une cellule donnée, mais il ne
 *              comporte pas les cellules visibles d'une cellule au travers
 *              des faces (elles sont accessibles par IFACEL)
 *
 * Interface Fortran :
 *
 * SUBROUTINE DEFVSE
 * *****************
 *    & ( NDIM   , NCEL   , NFAC   , NNOD   ,
 *    &   IMRGRA , ANOMAX ,
 *    &   IFACEL , IPNFAC , NODFAC , XYZCEN , SURFAC )
 *
 *----------------------------------------------------------------------------*/

void CS_PROCF (defvse, DEFVSE)
(
 const cs_int_t   *const ndim,    /* --> Dimension = 3                        */
 const cs_int_t   *const ncel,    /* --> Nombre de cellules                   */
 const cs_int_t   *const nfac,    /* --> Nombre de faces internes             */
 const cs_int_t   *const nnod,    /* --> Nombre de sommets                    */
 const cs_int_t   *const imrgra,  /* --> Mode de reconstruction               */
 const cs_real_t  *const anomax,  /* --> Angle de non orthogonalité en radian
                                         au-delà duquel on retient dans le
                                         voisinage étendu de chaque cellule
                                         voisine les cellules dont un sommet
                                         est sur la face                      */
 const cs_int_t   *const ifacel,  /* --> Connectivité face interne -> cellules*/
 const cs_int_t   *const ipnfac,  /* --> Position du premier noeud d'une face
                                         dans nodfac                          */
 const cs_int_t   *const nodfac,  /* --> Numéro des noeuds des faces internes */
 const cs_real_t  *const xyzcen,  /* --> Coord. du centre des cellules        */
 const cs_real_t  *const surfac   /* --> Vecteur surface des faces internes   */
) ;


/*----------------------------------------------------------------------------
 * Appel de la routine FORTRAN GRADMC pour le calcul des gradients par moindres
 *   carrés. On ajoute aux arguments le voisinage étendu de la structure
 *   maillage.
 *
 * Interface Fortran :
 *
 * SUBROUTINE CGRDMC
 * *****************
 *
 *    & ( IDBIA0 , IDBRA0 ,
 *    &   NCELET , NCEL   , NFAC   , NFABOR , NCELBR , NITUSE , NRTUSE ,
 *    &   INC    , ICCOCG , NSWRGP , IDIMTE , ITENSO , IPHYDP , IMRGRA ,
 *    &   IWARNP , NFECRA , EPSRGP , EXTRAP ,
 *    &   IFACEL , IFABOR , ICELBR , ITUSER , IA     ,
 *    &   VOLUME , SURFAC , SURFBO , SURFBN , POND   ,
 *    &   DIST   , DISTBR , DIJPF  , DIIPB  ,
 *    &   FEXTX  , FEXTY  , FEXTZ  ,
 *    &   XYZCEN , CDGFAC , CDGFBO , COEFAP , COEFBP , PVAR   ,
 *    &   COCGB  , COCG   , RTUSER ,
 *    &   DPDX   , DPDY   , DPDZ   ,
 *    &   BX     , BY     , BZ     , RA     )
 *
 *----------------------------------------------------------------------------*/

void CS_PROCF (cgrdmc, CGRDMC)
(
 const cs_int_t   *const idbia0,      /* --> numéro 1ère case libre dans IA   */
 const cs_int_t   *const idbra0,      /* --> numéro 1ère case libre dans RA   */
 const cs_int_t   *const ncelet,      /* --> nombre de cellules étendu        */
 const cs_int_t   *const ncel,        /* --> nombre de cellules               */
 const cs_int_t   *const nfac,        /* --> nombre de faces internes         */
 const cs_int_t   *const nfabor,      /* --> nombre de faces de bord          */
 const cs_int_t   *const ncelbr,      /* --> nombre de cellules de bord       */
 const cs_int_t   *const nituse,      /* --> longueur du tableau ituser[]     */
 const cs_int_t   *const nrtuse,      /* --> longueur du tableau rtuser[]     */
 const cs_int_t   *const inc,         /* --> 0 ou 1 : incrément ou non        */
 const cs_int_t   *const iccocg,      /* --> 1 ou 0 : recalcul de COCG ou non */
 const cs_int_t   *const nswrgp,      /* --> >1 : avec reconstruction         */
 const cs_int_t   *const idimte,      /* --> 0, 1, 2 : variable
                                             scalaire, vecteur, tenseur       */
 const cs_int_t   *const itenso,      /* --> pour la périodicité de rotation  */
 const cs_int_t   *const iphydr,      /* --> prise en compte de P hydrostatiqu*/
 const cs_int_t   *const imrgra,      /* --> mode de calcul du gradient       */
 const cs_int_t   *const iwarnp,      /* --> niveau d'impression              */
 const cs_int_t   *const nfecra,      /* --> unité sortie standard            */
 const cs_real_t  *const epsrgp,      /* --> précision pour calcul du gradient
                                             itératif                         */
 const cs_real_t  *const extrap,      /* --> extrapolation des grad. au bord  */
 const cs_int_t          ifacel[],    /* --> liste des faces internes         */
 const cs_int_t          ifabor[],    /* --> liste des faces de bord          */
 const cs_int_t          icelbr[],    /* --> numéro des cellules ayant au
                                             moins une face de bord           */
       cs_int_t          ituser[],    /* <-> tab. complémentaire utilisateur  */
       cs_int_t          ia[],        /* <-> macro-tableau entier             */
 const cs_real_t         volume[],    /* --> volumes des cellules             */
 const cs_real_t         surfac[],    /* --> surfaces des faces internes      */
 const cs_real_t         surfbo[],    /* --> surfaces des faces de bord       */
 const cs_real_t         surfbn[],    /* --> norme de surfbo                  */
 const cs_real_t         pond[],      /* --> pondération géométrique faces int*/
 const cs_real_t         dist[],      /* --> distance entre I' et J' faces int*/
 const cs_real_t         distbr[],    /* --> distance du cdgfbo à I' fac. brd */
 const cs_real_t         dijpf[],     /* --> vecteur I'J' aux faces internes  */
 const cs_real_t         diipb[],     /* --> vecteur II' aux faces de bord    */
 const cs_real_t         fextx[],     /* --> composantes de la force          */
 const cs_real_t         fexty[],     /*     extérieure générant la pression  */
 const cs_real_t         fextz[],     /*     hydrostatique                    */
 const cs_real_t         xyzcen[],    /* --> c.d.g. des cellules              */
 const cs_real_t         cdgfac[],    /* --> c.d.g. des faces internes        */
 const cs_real_t         cdgfbo[],    /* --> c.d.g. des faces de bord         */
 const cs_real_t         coefap[],    /* --> cond. limites aux faces de bord  */
 const cs_real_t         coefbp[],    /* --> cond. limites aux faces de bord  */
 const cs_real_t         pvar[],      /* --> variable dont on calcule le grad */
       cs_real_t         cocgb[],     /* <-> contribution à COCG des faces
                                             internes des cellules de bord    */
       cs_real_t         cocg[],      /* <->  contribution à COCG des faces
                                             internes des cellules de bord    */
       cs_real_t         rtuser[],    /* <-> tab. complémentaire utilisateur  */
       cs_real_t         dpdx[],      /* <-- composante x du gradient         */
       cs_real_t         dpdy[],      /* <-- composante y du gradient         */
       cs_real_t         dpdz[],      /* <-- composante z du gradient         */
       cs_real_t         bx[],        /*  -  tab. de travail local            */
       cs_real_t         by[],        /*  -  tab. de travail local            */
       cs_real_t         bz[],        /*  -  tab. de travail local            */
       cs_real_t         ra[]         /* <-> macro-tableau réel               */
) ;


/*----------------------------------------------------------------------------
 * Appel de la routine FORTRAN LIMGRD pour la limitation éventuelle des
 *   gradients. On ajoute aux arguments le voisinage étendu de la structure
 *   maillage.
 *
 * Interface Fortran :
 *
 * SUBROUTINE CLMGRD
 * *****************
 *
 *    & ( NDIM   , NCELET , NCEL   , NFAC   ,
 *    &   IMRGRA , IMLIGP , IDIMTE , ITENSO , IWARNP , NFECRA , CLIMGP ,
 *    &   IFACEL ,
 *    &   XYZCEN , PVAR   ,
 *    &   DPDX   , DPDY   , DPDZ   ,
 *    &   FACLIM , DENOM  , DENUM  )
 *
 *----------------------------------------------------------------------------*/

void CS_PROCF (clmgrd, CLMGRD)
(
 const cs_int_t   *const ndim,        /* --> dimension de l'espace            */
 const cs_int_t   *const ncelet,      /* --> nombre de cellules étendu        */
 const cs_int_t   *const ncel,        /* --> nombre de cellules               */
 const cs_int_t   *const nfac,        /* --> nombre de faces internes         */
 const cs_int_t   *const imrgra,      /* --> mode de calcul du gradient       */
 const cs_int_t   *const imligp,      /* --> mode de limitation du gradient   */
 const cs_int_t   *const idimte,      /* --> 0, 1, 2 : variable
                                             scalaire, vecteur, tenseur       */
 const cs_int_t   *const itenso,      /* --> pour la périodicité de rotation  */
 const cs_int_t   *const iwarnp,      /* --> niveau d'impression              */
 const cs_int_t   *const nfecra,      /* --> unité sortie standard            */
 const cs_real_t  *const climgp,      /* --> coefficient de limitation du grad*/
 const cs_int_t          ifacel[],    /* --> liste des faces internes         */
 const cs_real_t         xyzcen[],    /* --> c.d.g. des cellules              */
 const cs_real_t         pvar[],      /* --> variable dont on calcule le grad */
       cs_real_t         dpdx[],      /* <-> composante x du gradient         */
       cs_real_t         dpdy[],      /* <-> composante y du gradient         */
       cs_real_t         dpdz[],      /* <-> composante z du gradient         */
       cs_real_t         faclim[],    /*  -  tab. de travail local            */
       cs_real_t         denom[],     /*  -  tab. de travail local            */
       cs_real_t         denum[]      /*  -  tab. de travail local            */
);

void CS_PROCF (cfiltr, CFILTR)
(
 const cs_int_t   *const ncelet,      /* --> nombre de cellules étendu        */
 const cs_int_t   *const ncel,        /* --> nombre de cellules               */
 const cs_int_t   *const nfac,        /* --> nombre de faces internes         */
 const cs_int_t   *const nfabor,      /* --> nombre de faces de bord          */
 const cs_int_t          ifacel[],    /* --> liste des faces internes         */
 const cs_int_t          ifabor[],    /* --> liste des faces de bord          */
 const cs_real_t         volume[],    /* --> volumes des cellules             */
 const cs_real_t         pvar[],      /* --> variable a filtrer               */
       cs_real_t         varfil[],    /* --> resultat de la variable filtree  */
       cs_real_t         w1[],        /*  -  tab. de travail local            */
       cs_real_t         w2[]         /*  -  tab. de travail local            */
);


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __CS_MAILLAGE_H__ */
