SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/FA/mt/facoch_mt.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Thread-safe FA
00002       SUBROUTINE FACOCH_MT (FA,  KREP, KNUME1, KNUME2, 
00003      S                      CDPREF, KNIVAU, CDSUFF )
00004       USE FA_MOD, ONLY : FA_COM
00005       USE PARKIND1, ONLY : JPRB
00006       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00007 C****
00008 C      Sous-programme de reCOpie d'un Champ Horizontal d'un fichier
00009 C     ARPEGE sur un autre.
00010 C**
00011 C    Arguments : KREP   (Sortie) ==> Code-reponse du sous-programme;
00012 C                KNUME1 (Entree) ==> Numero d'unite logique en entree;
00013 C                KNUME2 (Entree) ==> Numero d'unite logique en sortie;
00014 C                CDPREF (Entree) ==> Prefixe eventuel du nom d'article;
00015 C                KNIVAU (Entree) ==> Niveau vertical eventuel;
00016 C                CDSUFF (Entree) ==> Suffixe eventuel du nom d'article.
00017 C
00018 C     Modifications
00019 C     -------------
00020 C
00021 C  Avril 2004, D. Paradis, DSI/DEV:
00022 C    -Declaration IVALCO en ALLOCATABLE (gain memoire)
00023 C  Juin  2004, D. Paradis, DSI/DEV:
00024 C    -Prise en compte des codages type -1 et 3
00025 C
00026 #include "precision.h"
00027 C
00028 C
00029       TYPE(FA_COM) :: FA
00030       INTEGER KREP, KNUME1, KNUME2, KNIVAU
00031 C
00032       INTEGER IREP, ILPRFU, ILSUFU, ILNOMU, ILONGA, IRANC1, IRANC2
00033       INTEGER INIMES, J, INUMFI, IPOSEX, INPAHE, INPAHEL, JLAT, IZPAHEL
00034       INTEGER ISPAHEL, JNIV, ILPREF, ILSUFF, INUMRO, IRANG2, IGRIB
00035 C
00036       INTEGER (KIND=JPDBLE), ALLOCATABLE :: IVALCO(:)
00037       INTEGER IRANG (2), INUMER (2), IB1PAR (3)
00038 C
00039       LOGICAL LLVERF (2), LLRLFI, LLCOSP, LLMESS, LLNOMU
00040       LOGICAL LLMLAM1, LLMLAM2
00041 C
00042       CHARACTER CDPREF*(*), CDSUFF*(*)
00043       CHARACTER CLAUXI*(FA%JPXNOM), CLPREF*(FA%JPXNOM), 
00044      S          CLSUFF*(FA%JPXSUF)
00045 C
00046 #include "facom2.h"
00047 #include "facom_mt.h"
00048 C**
00049 C     1.  -  CONTROLES ET INITIALISATIONS.
00050 C-----------------------------------------------------------------------
00051 C
00052       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00053       IF (LHOOK) CALL DR_HOOK('FACOCH_MT',0,ZHOOK_HANDLE)
00054       LLRLFI=.FALSE.
00055       LLMESS=.FALSE.
00056       LLNOMU=.FALSE.
00057       ILPRFU=LEN (CDPREF)
00058       ILSUFU=LEN (CDSUFF)
00059       IRANC1=0
00060       IRANC2=0
00061       INUMER(1)=KNUME1
00062       INUMER(2)=KNUME2
00063       LLVERF(1)=.FALSE.
00064       LLVERF(2)=.FALSE.
00065       IRANG(2)=0
00066 C
00067       DO 101 J=1,2
00068       INUMFI=J
00069       CALL FANUMU_MT (FA, INUMER(J),IRANG(J))
00070 C
00071       IF (IRANG(J).EQ.0) THEN
00072         IREP=-51
00073         GOTO 1001
00074       ENDIF
00075 C
00076 C         Verrouillage eventuel du fichier.
00077 C
00078       IF (FA%LFAMUL) CALL LFIVER_MT (FA%LFI, FA%VRFICH(IRANG(J)),'ON')
00079       LLVERF(J)=FA%LFAMUL
00080 C
00081       IF (FA%LCREAF(IRANG(J))) THEN
00082         IREP=-85
00083         GOTO 1001
00084       ENDIF
00085 C*
00086 C       FABRICATION DU NOM D'ARTICLE VIA LE SOUS-PROGRAMME "FANFAR"
00087 C            ( controles de CDPREF, KNIVAU, CDSUFF inclus )
00088 C
00089       CALL FANFAR_MT (FA, IREP,IRANG(J),CDPREF,KNIVAU,
00090      S             CDSUFF,CLNOMA,IB1PAR,
00091      S             ILPRFU,ILSUFU,ILNOMU)
00092       IF (IREP.NE.0) GOTO 1001
00093   101 CONTINUE
00094 C
00095       LLNOMU=.TRUE.
00096 C**
00097 C     2.  -  LECTURE DE L'ARTICLE SUR LE FICHIER, CONTROLES.
00098 C-----------------------------------------------------------------------
00099 C
00100       CALL LFINFO_MT (FA%LFI, IREP,KNUME1,CLNOMA(1:ILNOMU),
00101      S             ILONGA,IPOSEX)
00102 C
00103       IF (IREP.NE.0) THEN
00104         LLRLFI=.TRUE.
00105         GOTO 1001
00106       ELSEIF (ILONGA.EQ.0) THEN
00107         IREP=-89
00108         GOTO 1001
00109       ELSEIF (ILONGA.GT.FA%JPXCHA+2) THEN
00110         IREP=-90
00111         GOTO 1001
00112       ENDIF
00113 C
00114       ALLOCATE (IVALCO (ILONGA))
00115       CALL LFILEC_MT (FA%LFI, IREP,KNUME1,
00116      S             CLNOMA(1:ILNOMU),IVALCO,ILONGA)
00117       LLRLFI=IREP.NE.0
00118       IF (LLRLFI) GOTO 1001
00119 C
00120       IF (IVALCO(1).LT.-1.OR.IVALCO(1).GT.3.OR.
00121      S    IVALCO(2).LT.0 .OR.IVALCO(2).GT.1.OR.
00122      S    (IVALCO(1).GT.0.AND.IVALCO(2).EQ.1.AND.IVALCO(4).LT.0)) THEN
00123         IREP=-91
00124         GOTO 1001
00125       ELSE
00126         LLCOSP=IVALCO(2).EQ.1
00127       ENDIF
00128 C**
00129 C     3.  -  CONTROLE DE COHERENCE ENTRE LES FICHIERS, VIS-A-VIS DU TYPE
00130 C            DE DONNEES LUES (points de grille/coefficients spectraux).
00131 C-----------------------------------------------------------------------
00132 C
00133       IRANC1=FA%NUCADR(IRANG(1))
00134       IRANC2=FA%NUCADR(IRANG(2))
00135       INPAHE=(1+FA%NLATIT(IRANC1))/2
00136       LLMLAM1=FA%NTYPTR(IRANC1).LE. -1
00137       LLMLAM2=FA%NTYPTR(IRANC2).LE. -1
00138 C
00139       IF (IRANC1.NE.IRANC2) THEN
00140 C
00141 C         On a pris ici une optique souple: n'est fatale qu'une erreur
00142 C     vraiment grossiere. Toute autre discordance est signalee par un
00143 C     message global de niveau 1.
00144 C
00145         IF ( (LLMLAM1.AND..NOT.LLMLAM2).OR.
00146      S       (LLMLAM2.AND..NOT.LLMLAM1).OR.
00147      S       (LLCOSP.AND.((.NOT.LLMLAM1.AND..NOT.LLMLAM2.AND.
00148      S                     FA%MTRONC(IRANC1).NE.FA%MTRONC(IRANC2)) .OR.
00149      S                    (LLMLAM1.AND.LLMLAM2.AND.
00150      S                     FA%MTRONC(IRANC1).NE.FA%MTRONC(IRANC2).AND.
00151      S                     FA%NTYPTR(IRANC1).NE.FA%NTYPTR(IRANC2) ))   
00152      S                    ).OR.
00153      S       (.NOT.LLCOSP.AND.(FA%NLATIT(IRANC1).NE.
00154      S                         FA%NLATIT(IRANC2).OR.
00155      S                         FA%NVAPDG(IRANC1).NE.FA%NVAPDG(IRANC2)))
00156      S     ) THEN
00157           IREP=-112
00158           GOTO 1001
00159 C
00160         ELSEIF (.NOT.LLCOSP) THEN
00161 C
00162           IF (.NOT.LLMLAM1.AND..NOT.LLMLAM2) THEN
00163              INPAHEL=INPAHE
00164           ELSE
00165              INPAHEL=8
00166           ENDIF
00167           DO 301 JLAT=1,INPAHEL
00168           LLMESS=LLMESS.OR.FA%NLOPAR(JLAT,IRANC1).NE.
00169      S           FA%NLOPAR(JLAT,IRANC2)
00170   301     CONTINUE
00171 C
00172           IF (LLMESS) THEN
00173             IREP=-112
00174             GOTO 1001
00175           ENDIF
00176 C
00177         ENDIF
00178 C
00179         LLMESS=FA%MTRONC(IRANC1).NE.FA%MTRONC(IRANC2).OR.
00180      S         FA%NTYPTR(IRANC1).NE.FA%NTYPTR(IRANC2).OR.
00181      S       (KNIVAU.GT.0.AND.(FA%NNIVER(IRANC1).NE.
00182      S                         FA%NNIVER(IRANC2)).OR.
00183      S                        (FA%SPREFE(IRANC1).NE.
00184      S                         FA%SPREFE(IRANC2))).OR.
00185      S         FA%NLATIT(IRANC1).NE.FA%NLATIT(IRANC2).OR.
00186      S         FA%SSLAPO(IRANC1).NE.FA%SSLAPO(IRANC2).OR.
00187      S         FA%SCLOPO(IRANC1).NE.FA%SCLOPO(IRANC2).OR.
00188      S         FA%SSLOPO(IRANC1).NE.FA%SSLOPO(IRANC2).OR.
00189      S         FA%SCODIL(IRANC1).NE.FA%SCODIL(IRANC2)
00190 C
00191         IF (.NOT.LLMESS) THEN
00192 C
00193           IF (.NOT.LLMLAM1.AND..NOT.LLMLAM2) THEN
00194              INPAHEL=INPAHE
00195              IZPAHEL=INPAHE
00196              ISPAHEL=INPAHE
00197           ELSE
00198              INPAHEL=8
00199              IZPAHEL=0
00200              ISPAHEL=18
00201           ENDIF
00202           DO 302 JLAT=1,INPAHEL
00203           LLMESS=FA%NLOPAR(JLAT,IRANC1).NE.FA%NLOPAR(JLAT,IRANC2)
00204      S           .OR.LLMESS
00205   302     CONTINUE
00206           DO 312 JLAT=1,IZPAHEL
00207           LLMESS=FA%NOZPAR(JLAT,IRANC1).NE.FA%NOZPAR(JLAT,IRANC2)
00208      S           .OR.LLMESS
00209   312     CONTINUE
00210           DO 322 JLAT=1,ISPAHEL
00211           LLMESS=FA%SINLAT(JLAT,IRANC1).NE.FA%SINLAT(JLAT,IRANC2)
00212      S           .OR.LLMESS
00213   322     CONTINUE
00214 C
00215           IF (.NOT.LLMESS.AND.KNIVAU.GT.0) THEN
00216 C
00217             DO 303 JNIV=0,FA%NNIVER(IRANC1)
00218             LLMESS=FA%SFOHYB(1,JNIV,IRANC1).NE.
00219      S             FA%SFOHYB(1,JNIV,IRANC2).OR.
00220      S      LLMESS.OR.FA%SFOHYB(2,JNIV,IRANC1).NE.
00221      S             FA%SFOHYB(2,JNIV,IRANC2)
00222   303       CONTINUE
00223 C
00224           ENDIF
00225 C
00226         ENDIF
00227 C
00228       ENDIF
00229 C**
00230 C     4.  -  ECRITURE DE L'ARTICLE "CHAMP" SUR LE FICHIER.
00231 C-----------------------------------------------------------------------
00232 C
00233 C        Deverrouillage eventuel de l'unite logique d'entree.
00234 C
00235       IF (LLVERF(1)) CALL LFIVER_MT (FA%LFI, FA%VRFICH(IRANG(1)),'OFF')
00236       LLVERF(1)=.FALSE.
00237 C
00238       CALL LFIECR_MT (FA%LFI, IREP,KNUME2,CLNOMA(1:ILNOMU),
00239      S             IVALCO,ILONGA)
00240       INUMFI=2
00241       LLRLFI=IREP.NE.0
00242       IF (LLRLFI) GOTO 1001
00243 C
00244 C  Controle de l'homogeneite du type de rangement de coeff. spectraux
00245 C  parmi les champs lus/ecrits: ces champs compactes avec
00246 C  IGRIB=-1 ou 3 doivent etre ranges comme dans le modele ("verticalement"
00247 C  soit selon des colonnes JM=cst consecutives) et contrairement si compactes
00248 C  avec IGRIB= 0,1 ou 2.
00249 C
00250       IRANG2 = IRANG(2)
00251       IGRIB = IVALCO(1)
00252       IF (LLCOSP) THEN
00253         IF (IGRIB.EQ.-1 .OR. IGRIB.EQ.3) THEN
00254           FA%NRASVE(IRANG2)=FA%NRASVE(IRANG2)+1
00255           IF (FA%NRASVE(IRANG2).EQ.1 .AND. FA%NRASHO(IRANG2).GT.0) THEN
00256             WRITE(FA%NULOUT,*)
00257      S      '------------------------------------------------'
00258             WRITE(FA%NULOUT,*)' FACOCH : WARNING !!!!!           '
00259             WRITE(FA%NULOUT,*)
00260      S      ' Un champ de coef. spect. avec rangt type modele'
00261             WRITE(FA%NULOUT,*)' va etre ecrit sur l''unite ',KNUME2,
00262      S                ' alors que'
00263             WRITE(FA%NULOUT,*)
00264      S      ' d''autres champs y ont un rangement different.'
00265             WRITE(FA%NULOUT,*)
00266      S      '------------------------------------------------'
00267           ENDIF
00268         ELSEIF (IGRIB.GE.0 .AND. IGRIB.LE.2) THEN
00269           FA%NRASHO(IRANG2)=FA%NRASHO(IRANG2)+1
00270           IF (FA%NRASHO(IRANG2).EQ.1 .AND. FA%NRASVE(IRANG2).GT.0) THEN
00271             WRITE(FA%NULOUT,*)
00272      S      '------------------------------------------------'
00273             WRITE(FA%NULOUT,*)' FACOCH : WARNING !!!!!           '
00274             WRITE(FA%NULOUT,*)
00275      S      ' Un champ de coef. spect. avec rangt autre que'
00276             WRITE(FA%NULOUT,*)
00277      S      ' celui du modele va etre ecrit sur l''unite ', KNUME2
00278             WRITE(FA%NULOUT,*)
00279      S      ' alors que d''autres champs y ont le rangt modele'
00280             WRITE(FA%NULOUT,*)
00281      S      '------------------------------------------------'
00282           ENDIF
00283         ENDIF
00284       ENDIF
00285 C
00286 C**
00287 C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
00288 C            VIA LE SOUS-PROGRAMME "FAIPAR" .
00289 C-----------------------------------------------------------------------
00290 C
00291  1001 CONTINUE
00292       IF (ALLOCATED( IVALCO )) DEALLOCATE ( IVALCO )
00293       KREP=IREP
00294       LLFATA=LLMOER (IREP,IRANG(INUMFI))
00295 C
00296 C        Deverrouillage eventuel des fichiers.
00297 C
00298       IF (LLVERF(1)) CALL LFIVER_MT (FA%LFI, FA%VRFICH(IRANG(1)),'OFF')
00299       IF (LLVERF(2)) CALL LFIVER_MT (FA%LFI, FA%VRFICH(IRANG(2)),'OFF')
00300 C
00301       CLNSPR='FACOCH'
00302 C
00303 C        Messages d'avertissement eventuels.
00304 C
00305       IF (FA%NIMSGA.NE.0.AND.IREP.EQ.0) THEN
00306 C
00307         IF (LLMESS) THEN
00308           INIMES=1
00309           WRITE (UNIT=CLMESS,FMT='(''*ATTENTION* - LES UNITES'
00310 ',I3,     S   '' ET'',I3,'' ONT DES CARACTERISTIQUES "CADRE" DIFFERENTES'')')
00311      S    KNUME1,KNUME2
00312           CALL FAIPAR_MT (FA, FA%JPNIIL,INIMES,IREP,.FALSE.,CLMESS,
00313      S                 CLNSPR,CLACTI,.FALSE.)
00314         ELSEIF (IRANC1.NE.IRANC2) THEN
00315           INIMES=1
00316           WRITE (UNIT=CLMESS,FMT='(''REMARQUE: CADRES '''''
00317 ',A,     S           '''''' ET '''''
00318 ',A,     S           '''''' DISTINCTS MAIS DE CONTENU IDENTIQUE (UNITES'
00319 ',     S           I3,'' ET'',I3,'' )'')')
00320      S      FA%CNOMCA(IRANC1)(1:FA%NLCCAD(IRANC1)),
00321      S      FA%CNOMCA(IRANC2)(1:FA%NLCCAD(IRANC2)),KNUME1,KNUME2
00322           CALL FAIPAR_MT (FA, FA%JPNIIL,INIMES,IREP,.FALSE.,CLMESS,
00323      S                 CLNSPR,CLACTI,.FALSE.)
00324         ENDIF
00325 C
00326       ENDIF
00327 C
00328       IF (LLFATA) THEN
00329         INIMES=2
00330       ELSE
00331         INIMES=IXNVMS(IRANG(INUMFI))
00332       ENDIF
00333 C
00334       IF (.NOT.LLFATA.AND.INIMES.NE.2)  THEN 
00335         IF (LHOOK) CALL DR_HOOK('FACOCH_MT',1,ZHOOK_HANDLE)
00336         RETURN
00337       ENDIF
00338 C
00339       IF (ILPRFU.GE.1) THEN
00340         ILPREF=MIN (ILPRFU,LEN (CLPREF))
00341         CLPREF(1:ILPREF)=CDPREF(1:ILPREF)
00342       ELSE
00343         ILPREF=8
00344         CLPREF(1:ILPREF)=FA%CHAINC(:ILPREF)
00345       ENDIF
00346 C
00347       IF (ILSUFU.GE.1) THEN
00348         ILSUFF=MIN (ILSUFU,LEN (CLSUFF))
00349         CLSUFF(1:ILSUFF)=CDSUFF(1:ILSUFF)
00350       ELSE
00351         ILSUFF=8
00352         CLSUFF(1:ILSUFF)=FA%CHAINC(:ILSUFF)
00353       ENDIF
00354 C
00355       IF (.NOT.LLNOMU) THEN
00356         ILNOMU=MIN (ILPREF,FA%NCPCAD)
00357         CLNOMA(1:ILNOMU)=CLPREF(1:ILPREF)
00358       ENDIF
00359 C
00360       WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KNUME1='
00361 ',I3,     S       '', KNUME2='',I3,'', CDPREF='''''',A,'''''', KNIVAU='
00362 ',I6,     S       '', CDSUFF='''''',A,'''''''')') KREP,KNUME1,KNUME2,
00363      S   CLPREF(1:ILPREF),KNIVAU,CLSUFF(1:ILSUFF)
00364 C
00365       IF (IREP.EQ.-112) THEN
00366         INUMRO=1000*KNUME1+KNUME2
00367       ELSE
00368         INUMRO=INUMER(INUMFI)
00369       ENDIF
00370 C
00371       CALL FAIPAR_MT (FA, INUMRO,INIMES,IREP,LLFATA,CLMESS,
00372      S                CLNSPR, CLNOMA(1:ILNOMU),LLRLFI)
00373 C
00374       IF (LHOOK) CALL DR_HOOK('FACOCH_MT',1,ZHOOK_HANDLE)
00375       END
00376