SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/FA/mt/fanouv_mt.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Thread-safe FA
00002       SUBROUTINE FANOUV_MT (FA,  KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, 
00003      S                      LDERFA,
00004      S                     LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC )
00005       USE FA_MOD, ONLY : FA_COM
00006       USE PARKIND1, ONLY : JPRB
00007       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00008 C****
00009 C        Sous-programme d'initialisation SANS OUVERTURE d'une unite logique 
00010 C        "Fichier ARPEGE". Il s'agit d'un fichier indexe, 
00011 C        traite par le logiciel LFI.
00012 C
00013 C      FANOUV est derive de FAITOU, mais ne fait pas l'appel a la couche LFI
00014 C             pour l'ouverture reelle.
00015 C
00016 C      utilise pour la seule compression des donnees par des processeurs
00017 C      qui ne font pas d'ecriture effective sur disque
00018 C
00019 C**
00020 C     ARGUMENTS : Ce sont les memes que pour "LFIOUV", avec CDNOMC comme
00021 C                 argument supplementaire.
00022 C
00023 C                 KREP   (Sortie) ==> Code-reponse du sous-programme;
00024 C                 KNUMER (Entree) ==> Numero de l'unite logique;
00025 C                 LDNOMM (Entree) ==> Vrai si l'unite logique doit etre
00026 C                                     associee a un NOM de Fichier EXP-
00027 C                                     LICITE lors de l'"OPEN" FORTRAN;
00028 C                 CDNOMF (Entree) ==> Nom de fichier explicite, si
00029 C                                     *LDNOMM* est VRAI - Meme si ce
00030 C                                     n'est pas le cas, ce *DOIT* ETRE
00031 C                                     UN OBJET DE TYPE "CHARACTER" .
00032 C                 CDSTTU (Entree) ==> "STATUS" pour l'"OPEN" FORTRAN
00033 C                                     ('OLD','NEW','UNKNOWN','SCRATCH')
00034 C                                     par defaut, mettre 'UNKNOWN';
00035 C                 LDERFA (Entree) ==> Option d'erreur fatale;
00036 C                 LDIMST (Entree) ==> Option impression de Statistiques
00037 C                                     au moment de la fermeture;
00038 C                 KNIMES (Entree) ==> Niveau de la Messagerie (0,1 ou 2)
00039 C                                     ( 0==>Rien, 2==>Tout )
00040 C                 KNBARP (Entree) ==> Nombre d'articles logiques prevus,
00041 C                                     ce qui n'est utilise que lors de
00042 C                                     la Creation du fichier,
00043 C                                     et qui n'empeche quand meme pas
00044 C                                     d'avoir plus d'articles logiques;
00045 C                 KNBARI (Sortie) ==> Nombre d'articles logiques de don-
00046 C                                     nees sur le fichier, initialement.
00047 C                                     (zero si creation)
00048 C                 CDNOMC (Entree) ==> Nom du CADRE associe au fichier.
00049 C*
00050 C     N.B. :  Pour un fichier en mode creation, ce cadre doit avoir ete
00051 C          defini au prealable (via le sous-programme FACADE, ou par
00052 C          l'ouverture d'un fichier preexistant).
00053 C             Pour un fichier ARPEGE preexistant, le cadre est lu sur le
00054 C          fichier; s'il etait deja defini auparavant, il y a controle
00055 C          de coherence entre les deux versions du cadre.
00056 C
00057 #include "precision.h"
00058 C
00059 C
00060       TYPE(FA_COM) :: FA
00061       INTEGER KREP, KNUMER, KNIMES, KNBARP, KNBARI
00062 C
00063       CHARACTER CPNOMD*(*)
00064       PARAMETER ( CPNOMD='%%%%% FICHIER SANS NOM %%%%%' )
00065 C
00066       INTEGER IRANG, INUMER, IRANMS, IREPOU, ILNOMC, ILOMIN, IREP, J
00067       INTEGER INBARP, IRANER, IRANGC
00068       INTEGER ILONGA, ITRONC, ILACTI, INIMES, INXLON
00069       INTEGER ITYPTR, IPHASE, IGARDE, IPOSEX, IPUILA
00070 C
00071       INTEGER IDATEF (FA%JPLDAT)
00072       INTEGER (KIND=JPDBLE) ILDIMEN(FA%JPCADI),
00073      S                      ILRDPOL(FA%JPXPAH+FA%JPXIND)
00074       INTEGER (KIND=JPDBLE) ILPNVER, ILDATEF(FA%JPLDAT)
00075 C
00076       LOGICAL LDNOMM, LDERFA, LDIMST, LLNOUF, LLNOUC, LLRLFI
00077       LOGICAL LLMODC, LLREDF, LLMODA
00078 C
00079       CHARACTER CDNOMF*(*), CDSTTU*(*), CDNOMC*(*)
00080 C
00081 #include "facom2.h"
00082 #include "facom_mt.h"
00083 C**
00084 C     1.  -  CONTROLES DIVERS
00085 C-----------------------------------------------------------------------
00086 C
00087 C     Controle sommaire sur les arguments...
00088 C
00089       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00090       IF (LHOOK) CALL DR_HOOK('FANOUV_MT',0,ZHOOK_HANDLE)
00091       IRANG=0
00092       IRANER=0
00093       IRANMS=0
00094       IREPOU=FA%JPNIIL
00095       LLRLFI=.FALSE.
00096       ILNOMC=LEN (CDNOMC)
00097       ILOMIN=MIN ( LEN (CDNOMF), LEN (CDSTTU), ILNOMC)
00098 C
00099 C        L'appel ci-dessous est legerement anticipe, de maniere a
00100 C     initialiser les variables globales du logiciel s'il s'agit
00101 C     du premier appel a un sous-programme de ce logiciel.
00102 C
00103       CALL FANUMU_MT (FA, KNUMER,IRANG)
00104 C
00105       IF (ILOMIN.LE.0) THEN
00106         IREP=-65
00107         GOTO 1001
00108       ELSEIF (IRANG.NE.0) THEN
00109 C
00110 C            Controle de non-ouverture prealable (au sens du logiciel)
00111 C
00112         IREP=-55
00113         IRANMS=IRANG
00114         GOTO 1001
00115       ENDIF
00116 C
00117 C             Verrouillage global, si necessaire.
00118 C
00119 C        A-t-on deja atteint le nombre limite de fichiers ARPEGE
00120 C     ouverts simultanement ? Si non, on cherche un emplacement libre
00121 C     dans la table FA%NULOGI (logiquement, il devrait en exister un)
00122 C
00123       IF (FA%NFIOUV.GE.FA%JPNXFA) THEN
00124         IREP=-56
00125         GOTO 1001
00126       ELSE
00127 C
00128         DO 101 J=1,FA%JPNXFA
00129 C
00130         IF (FA%NULOGI(J).EQ.FA%JPNIIL) THEN
00131           IRANG=J
00132           GOTO 102
00133         ENDIF
00134 C
00135   101   CONTINUE
00136 C
00137         IREP=-66
00138         GOTO 1001
00139 C
00140   102   CONTINUE
00141 C
00142       ENDIF
00143 C
00144 C**
00145 C     2.  -  CONTROLES SPECIFIQUES AU LOGICIEL DE FICHIERS ARPEGE.
00146 C-----------------------------------------------------------------------
00147 C
00148       LLNOUF=KNBARI.EQ.0
00149       CALL FANUCA_MT (FA, CDNOMC,IRANGC,.FALSE.)
00150       LLNOUC=IRANGC.EQ.0
00151 C
00152       IF (LLNOUF) THEN
00153 C
00154         IF (LLNOUC) THEN
00155           IREP=-57
00156           GOTO 1001
00157         ELSE
00158 C
00159 C         Fichier en mode creation et cadre predefini... OK a ce niveau.
00160 C
00161 C       On ecrit les articles definissant le cadre sur le fichier,
00162 C     ainsi qu'un article ayant pour nom l'identificateur "par defaut",
00163 C     (en fait, le nom du cadre) de maniere a ce que cet article soit
00164 C     sequentiellement celui qui suit le dernier article du cadre.
00165 C
00166           ILNOMC=FA%NLCCAD(IRANGC)
00167 C
00168         ENDIF
00169 C
00170       ENDIF
00171 C*
00172 C        Controle de la Date fichier, et stockage dans FA%MADATE.
00173 C
00174 !  IDATEF arbitraire pour contenter FACOND
00175       IDATEF(1) = 1993
00176       IDATEF(2) = 9
00177       IDATEF(3) = 2
00178       IDATEF(4) = 0
00179       IDATEF(5) = 0
00180       IDATEF(6) = 1
00181       IDATEF(7) = 0
00182       IDATEF(8) = 0
00183       IDATEF(9) = 1
00184       IDATEF(10) = 0
00185       IDATEF(11) = 0
00186 
00187       DO J=1,FA%JPLDAT
00188         FA%MADATE(J,IRANG)=IDATEF(J)
00189       ENDDO
00190 
00191 C**
00192 C     3.  -  ON MET A JOUR LES TABLES RELATIVES AUX FICHIERS.
00193 C-----------------------------------------------------------------------
00194 C
00195   300 CONTINUE
00196 !
00197       IREPOU=0
00198 !
00199 C
00200       FA%NFIOUV=FA%NFIOUV+1
00201       FA%NULIND(FA%NFIOUV)=IRANG
00202       FA%NULOGI(IRANG)=KNUMER
00203       FA%NUCADR(IRANG)=IRANGC
00204 C
00205       FA%LNOMME(IRANG)=LDNOMM
00206       FA%NIVOMS(IRANG)=KNIMES
00207       FA%LERRFA(IRANG)=LDERFA
00208       FA%LCREAF(IRANG)=.FALSE.
00209       FA%NBFPDG(IRANG)=FA%NBIPDG
00210       FA%NBFCSP(IRANG)=FA%NBICSP
00211       FA%NPUFLA(IRANG)=FA%NPUILA
00212       FA%NMFDPL(IRANG)=FA%NMIDPL
00213       FA%NFGRIB(IRANG)=FA%NIGRIB
00214       FA%CIDENT(IRANG)=CDNOMC
00215       ITRONC=FA%MTRONC(IRANGC)
00216       ITYPTR=FA%NTYPTR(IRANGC)
00217 C
00218       IF (ITYPTR.LT.0) THEN
00219         FA%NSTROF(IRANG)=MIN (FA%NSTROI,ITRONC-1,-ITYPTR-1)
00220       ELSE
00221         FA%NSTROF(IRANG)=MIN (FA%NSTROI,ITRONC-1)
00222       ENDIF
00223 C
00224 C Appel a FAINOC pour interpreter les eventuels defauts
00225 C de -1 pris par FA%NBFPDG, FA%NBFCSP, FA%NSTROF et FA%NPUFLA en
00226 C IRANG-ieme position.
00227 C
00228       CALL FAINOC_MT (FA,  IRANG )
00229 C
00230       IRANER=IRANG
00231       IRANMS=IRANG
00232       IPUILA=FA%NPUFLA(IRANG)
00233 C
00234       FA%NCOGRIF(:,IRANG)=FA%NCODGRI(:)
00235       FA%NRASHO(IRANG) = 0
00236       FA%NRASVE(IRANG) = 0
00237 C
00238 C   L'initialisation de FLAP1Dx sera faite dans FACSIM
00239 C
00240       FA%LIFLAP(IRANG)=.TRUE.
00241 C
00242 C        On incremente le nombre de fichiers attaches au cadre specifie.
00243 C
00244       FA%NULCAD(IRANGC)=FA%NULCAD(IRANGC)+1
00245       IREP=IREPOU
00246       GOTO 1001
00247 C**
00248 C     9.  - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
00249 C-----------------------------------------------------------------------
00250 C
00251   901 CONTINUE
00252       CLACTI='INQUIRE'
00253 C
00254 C      AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
00255 C
00256       IREP=IABS (IREP)
00257 C**
00258 C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
00259 C            VIA LE SOUS-PROGRAMME "LFIEMS" .
00260 C-----------------------------------------------------------------------
00261 C
00262  1001 CONTINUE
00263       KREP=IREP
00264       LLFATA=LLMOER (IREP,IRANER)
00265 C
00266       IF (LLFATA) THEN
00267         INIMES=2
00268       ELSE
00269         INIMES=IXNVMS (IRANMS)
00270       ENDIF
00271 C
00272       IF (.NOT.LLFATA.AND.INIMES.EQ.0)  THEN 
00273         IF (LHOOK) CALL DR_HOOK('FANOUV_MT',1,ZHOOK_HANDLE)
00274         RETURN
00275       ENDIF
00276 C
00277       CLNSPR='FANOUV'
00278 C
00279       IF (INIMES.EQ.2) THEN
00280 C
00281         IF (ILNOMC.GT.0) THEN
00282           ILACTI=MIN (LEN (CLACTI),ILNOMC)
00283           CLACTI(1:ILACTI)=CDNOMC(1:ILNOMC)
00284         ELSE
00285           ILACTI=8
00286           CLACTI=FA%CHAINC(:ILACTI)
00287         ENDIF
00288 C
00289         WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KNUMER='
00290 ',I3,     S     '', LDNOMM= '',L1,'', CDSTTU='''''',A7,'''''', LDERFA= '
00291 ',L1,     S     '',  LDIMST= '
00292 ',L1,     S         '', KNIMES='',I2,'', KNBARP='',I6,'' KNBARI='',I6)')
00293      S   KREP,KNUMER,LDNOMM,CDSTTU,LDERFA,LDIMST,KNIMES,KNBARP,KNBARI
00294         CALL FAIPAR_MT (FA, KNUMER,INIMES,IREP,.FALSE.,CLMESS,
00295      S                  CLNSPR,CLACTI(1:ILACTI),LLRLFI)
00296         CLMESS='CDNOMC='''//CLACTI(1:ILACTI)//''''
00297         CALL FAIPAR_MT (FA, KNUMER,INIMES,IREP,LLFATA,CLMESS,
00298      S               CLNSPR,
00299      S               CLACTI(1:ILACTI),LLRLFI)
00300       ENDIF
00301 C
00302       IF (LHOOK) CALL DR_HOOK('FANOUV_MT',1,ZHOOK_HANDLE)
00303       END
00304