SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/FA/mt/fatran_mt.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Thread-safe FA
00002       SUBROUTINE FATRAN_MT (FA,  KREP,  KNUMER,  PCHAME, PCHAMS, LDOPT )
00003       USE FA_MOD, ONLY : FA_COM
00004       USE PARKIND1, ONLY : JPRB
00005       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00006 C****
00007 C      Sous-programme du logiciel de Fichiers ARPEGE permettant la
00008 C      TRANsposition d'un champ spectral ARPEGE ou ALADIN,
00009 C      d'un rangement des coeff selon le MODELE vers un rangement
00010 C      des coeff selon FA+GRIB_version0 et inversement.
00011 C
00012 C**
00013 C    Arguments : KREP   (Sortie) ==> Code-reponse du sous-programme;
00014 C                KNUMER (Entree) ==> Rang de l'unite logique;
00015 C    ( Tableau ) PCHAME (Entree) ==> Valeurs du champ a transposer;
00016 C    ( Tableau ) PCHAMS (Sortie) ==> Valeurs du champ transpose;
00017 C                LDOPT   (Entree) ==> Option de transposition;
00018 C                                    si .TRUE.  alors PCHAME range comme MODELE
00019 C                                                     (soit "verticalement")
00020 C                                                     PCHAMS range comme FA-GRIB0
00021 C                                                     (soit "horizontalement")
00022 C                                    si .FALSE. alors PCHAME range comme FA-GRIB0
00023 C                                                     PCHAMS range comme MODELE
00024 C*
00025 C
00026 #include "precision.h"
00027 C
00028 C
00029       TYPE(FA_COM) :: FA
00030       INTEGER KREP, KNUMER
00031 C
00032       LOGICAL LDOPT
00033 C
00034       REAL (KIND=JPDBLR) PCHAME(*), PCHAMS(*)
00035 C
00036       INTEGER JN, JM, J, INDEX, ILOW, IHIGH, IRANGC, IRANG
00037       INTEGER INIMES, ITRONC, IMSMAX
00038       INTEGER, ALLOCATABLE :: IND(:,:)
00039 C
00040       LOGICAL LLMLAM
00041 C
00042 #include "facom2.h"
00043 #include "facom_mt.h"
00044 C
00045 C
00046 C
00047 C**
00048 C     1.  -  CONTROLES ET INITIALISATIONS.
00049 C-----------------------------------------------------------------------
00050 C
00051       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00052       IF (LHOOK) CALL DR_HOOK('FATRAN_MT',0,ZHOOK_HANDLE)
00053       KREP=0
00054       CALL FANUMU_MT (FA, KNUMER,IRANG)
00055 C
00056       IF (IRANG.EQ.0) THEN
00057         KREP=-51
00058         GOTO 1001
00059       ENDIF
00060       IRANGC=FA%NUCADR(IRANG)
00061       LLMLAM=FA%LIMLAM(IRANGC)
00062       ITRONC=FA%MTRONC(IRANGC)
00063       IF (LLMLAM) THEN
00064         IMSMAX = FA%NOMPAR(2,IRANGC)
00065       ENDIF
00066 C
00067 C Initialisation de l'indirection pour IRANGC, si ce n'est pas deja fait.
00068 C Si ARPEGE, FA%FATRAN_INDIRECT(J,IRANGC)=INDEX signifie que les indices J dans
00069 C   le tableau "FA+GRIB0" et INDEX dans le tableau "modele ARPEGE"
00070 C    designent un meme coeff spectral.
00071 C Si Aladin, FA%FATRAN_INDIRECT(JM*(ITRONC+1)+JN+1,IRANGC)=J signifie que l'indice
00072 C   J dans le tableau "FA+GRIB0" est le premier coeff associe au couple (JM,JN)
00073 C   ou JM est le nombre d'onde zonal et JN le nombre d'onde meridien.
00074 C   4 coeff spectraux sont associes a chaque couple (JM,JN) car JM varie
00075 C   de 0 a IMSMAX et JN varie de 0 a ITRONC (soit 1/4 de l'ellipse).
00076 C
00077 C  CAS ARPEGE
00078 C
00079       IF (FA%FATRAN_LLINDIR(IRANGC).AND..NOT.LLMLAM) THEN
00080         ALLOCATE (IND(0:FA%JPXTRO,-FA%JPXTRO:FA%JPXTRO))
00081         DO JN=0,ITRONC
00082           ILOW=JN**2+1
00083           IHIGH=(JN+1)**2
00084           JM=-JN-1
00085           DO J=ILOW,IHIGH
00086             JM=JM+1
00087             IND(JN,JM)=J
00088           ENDDO
00089         ENDDO
00090 C
00091         INDEX=-1
00092         DO JM=0,ITRONC
00093         DO JN=JM,ITRONC
00094           INDEX=INDEX+2
00095           FA%FATRAN_INDIRECT  (IND(JN, JM),IRANGC)=INDEX
00096           IF (JM.NE.0) THEN
00097             FA%FATRAN_INDIRECT(IND(JN,-JM),IRANGC)=INDEX+1
00098           ENDIF
00099         ENDDO
00100         ENDDO
00101         FA%FATRAN_LLINDIR(IRANGC)=.FALSE.
00102         DEALLOCATE (IND)
00103       ENDIF
00104 C
00105 C  CAS ALADIN
00106 C
00107       IF (FA%FATRAN_LLINDIR(IRANGC).AND.LLMLAM) THEN
00108         DO JN=0,ITRONC
00109         DO J=FA%NOZPAR(2*JN+3,IRANGC), FA%NOZPAR(2*JN+4,IRANGC), 4
00110           JM=(J-FA%NOZPAR(2*JN+3,IRANGC)) / 4
00111           FA%FATRAN_INDIRECT(JM*(ITRONC+1)+JN+1,IRANGC) = J
00112         ENDDO
00113         ENDDO
00114         FA%FATRAN_LLINDIR(IRANGC)=.FALSE.
00115       ENDIF
00116 C**
00117 C     2.  -  TRANSPOSITION DES DONNEES
00118 C-----------------------------------------------------------------------
00119 C
00120 C  CAS ALADIN
00121 C
00122       IF (LLMLAM) THEN
00123           IF (LDOPT) THEN
00124 C PCHAME range comme MODELE (soit "verticalement")
00125 C
00126           DO JM=0,IMSMAX
00127           DO INDEX=FA%NOMPAR(2*JM+3,IRANGC), FA%NOMPAR(2*JM+4,IRANGC), 4
00128             JN = (INDEX-FA%NOMPAR(2*JM+3,IRANGC)) / 4
00129             J  = FA%FATRAN_INDIRECT(JM*(ITRONC+1)+JN+1,IRANGC)
00130             PCHAMS(J  )=PCHAME(INDEX  )  
00131             PCHAMS(J+1)=PCHAME(INDEX+1)
00132             PCHAMS(J+2)=PCHAME(INDEX+2)
00133             PCHAMS(J+3)=PCHAME(INDEX+3)
00134           ENDDO
00135           ENDDO
00136         ELSE
00137 C PCHAME range comme FA+GRIB0 (soit "horizontalement")
00138 C
00139           DO JM=0,IMSMAX
00140           DO INDEX=FA%NOMPAR(2*JM+3,IRANGC), FA%NOMPAR(2*JM+4,IRANGC), 4
00141             JN = (INDEX-FA%NOMPAR(2*JM+3,IRANGC)) / 4
00142             J  = FA%FATRAN_INDIRECT(JM*(ITRONC+1)+JN+1,IRANGC)
00143             PCHAMS(INDEX  )=PCHAME(J  )  
00144             PCHAMS(INDEX+1)=PCHAME(J+1)
00145             PCHAMS(INDEX+2)=PCHAME(J+2)
00146             PCHAMS(INDEX+3)=PCHAME(J+3)
00147           ENDDO
00148           ENDDO
00149         ENDIF
00150       ELSE
00151 C
00152 C  CAS ARPEGE
00153 C
00154 C  1/ Passage du rangement des coeff. spectraux du type modele ARPEGE
00155 C  a celui de FA associe a GRIB version0 (et pas associe a GRIBEX qui
00156 C  reprend la structure de tableau de ARPEGE).
00157 C
00158         IF (LDOPT) THEN
00159           DO JN=0,ITRONC
00160             ILOW=JN**2+1
00161             IHIGH=(JN+1)**2
00162             DO J=ILOW,IHIGH
00163               PCHAMS(J)=PCHAME(FA%FATRAN_INDIRECT(J,IRANGC))
00164             ENDDO
00165           ENDDO
00166 C
00167 C  2/ Passage du rangement des coeff. spectraux du type FA associe
00168 C  a GRIB version0 (et pas associe a GRIBEX qui reprend la structure de
00169 C  tableau de ARPEGE) a celui du type modele ARPEGE.
00170 C
00171         ELSE
00172 C  Initialisation de la partie "JM=0" a zero, pour y introduire
00173 C  ensuite uniquement les coeff reels correspondant dans PCHAME
00174 C  (les coeff imaginaires etant donc crees et mis a zero).
00175           PCHAMS(1:2*(ITRONC+1))=0.
00176 C
00177           DO JN=0,ITRONC
00178             ILOW=JN**2+1
00179             IHIGH=(JN+1)**2
00180             DO J=ILOW,IHIGH
00181               PCHAMS(FA%FATRAN_INDIRECT(J,IRANGC))=PCHAME(J)
00182             ENDDO
00183           ENDDO
00184         ENDIF
00185       ENDIF
00186 C
00187 C**
00188 C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
00189 C            VIA LE SOUS-PROGRAMME "FAIPAR" .
00190 C-----------------------------------------------------------------------
00191 C
00192  1001 CONTINUE
00193       LLFATA=LLMOER (KREP,IRANG)
00194 C
00195       IF (LLFATA) THEN
00196         INIMES=2
00197       ELSE
00198         INIMES=IXNVMS(IRANG)
00199       ENDIF
00200 C
00201       IF (INIMES.EQ.0)  THEN 
00202         IF (LHOOK) CALL DR_HOOK('FATRAN_MT',1,ZHOOK_HANDLE)
00203         RETURN
00204       ENDIF
00205 C
00206       CLNSPR='FATRAN'
00207 C
00208       WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', IRANG='
00209 ',I4,     S         '', LDOPT='',L)')  KREP, IRANG, LDOPT
00210       CALL FAIPAR_MT (FA, KNUMER,INIMES,KREP,LLFATA,CLMESS,
00211      S               CLNSPR,CLNSPR,.FALSE.)
00212 C
00213       IF (LHOOK) CALL DR_HOOK('FATRAN_MT',1,ZHOOK_HANDLE)
00214       END
00215