SURFEX v7.3
General documentation of Surfex
|
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