SURFEX v8.1
General documentation of Surfex
fatran.F90
Go to the documentation of this file.
1 ! Nov-2012 P. Marguinaud Use local INDIRECT array
2 ! Oct-2012 P. Marguinaud 64b LFI
3 ! Jan-2011 P. Marguinaud Thread-safe FA
4 SUBROUTINE fatran_fort &
5 & (fa, krep, knumer, pchame, pchams, ldopt )
6 USE fa_mod, ONLY : fa_com
7 USE parkind1, ONLY : jprb
8 USE yomhook , ONLY : lhook, dr_hook
10 IMPLICIT NONE
11 !****
12 ! Sous-programme du logiciel de Fichiers ARPEGE permettant la
13 ! TRANsposition d'un champ spectral ARPEGE ou ALADIN,
14 ! d'un rangement des coeff selon le MODELE vers un rangement
15 ! des coeff selon FA+GRIB_version0 et inversement.
16 !
17 !**
18 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
19 ! KNUMER (Entree) ==> Rang de l'unite logique;
20 ! ( Tableau ) PCHAME (Entree) ==> Valeurs du champ a transposer;
21 ! ( Tableau ) PCHAMS (Sortie) ==> Valeurs du champ transpose;
22 ! LDOPT (Entree) ==> Option de transposition;
23 ! si .TRUE. alors PCHAME range comme MODELE
24 ! (soit "verticalement")
25 ! PCHAMS range comme FA-GRIB0
26 ! (soit "horizontalement")
27 ! si .FALSE. alors PCHAME range comme FA-GRIB0
28 ! PCHAMS range comme MODELE
29 !*
30 !
31 !
32 !
33 TYPE(fa_com) :: FA
34 INTEGER (KIND=JPLIKB) KREP, KNUMER
35 !
36 LOGICAL LDOPT
37 !
38 REAL (KIND=JPDBLR) PCHAME(*), PCHAMS(*)
39 !
40 INTEGER (KIND=JPLIKB) JN, JM, J, INDEX, ILOW, IHIGH
41 INTEGER (KIND=JPLIKB) IRANGC, IRANG
42 INTEGER (KIND=JPLIKB) INIMES, ITRONC, IMSMAX
43 INTEGER (KIND=JPLIKB), ALLOCATABLE :: IND(:,:)
44 INTEGER (KIND=JPLIKB), ALLOCATABLE :: INDIRECT(:)
45 !
46 LOGICAL LLMLAM
47 !
48 CHARACTER(LEN=FA%JPLMES) CLMESS
49 CHARACTER(LEN=FA%JPLSPX) CLNSPR
50 LOGICAL LLFATA
51 
52 !
53 !
54 !
55 !**
56 ! 1. - CONTROLES ET INITIALISATIONS.
57 !-----------------------------------------------------------------------
58 !
59 REAL(KIND=JPRB) :: ZHOOK_HANDLE
60 IF (lhook) CALL dr_hook('FATRAN_MT',0,zhook_handle)
61 krep=0
62 CALL fanumu_fort &
63 & (fa, knumer,irang)
64 !
65 IF (irang.EQ.0) THEN
66  krep=-51
67  GOTO 1001
68 ENDIF
69 irangc=fa%FICHIER(irang)%NUCADR
70 llmlam=fa%CADRE(irangc)%LIMLAM
71 itronc=fa%CADRE(irangc)%MTRONC
72 IF (llmlam) THEN
73  imsmax = fa%CADRE(irangc)%NOMPAR(2)
74 ENDIF
75 
76 !
77 ! Initialisation de l'indirection pour IRANGC, si ce n'est pas deja fait.
78 ! Si ARPEGE, INDIRECT(J,IRANGC)=INDEX signifie que les indices J dans
79 ! le tableau "FA+GRIB0" et INDEX dans le tableau "modele ARPEGE"
80 ! designent un meme coeff spectral.
81 ! Si Aladin, INDIRECT(JM*(ITRONC+1)+JN+1,IRANGC)=J signifie que l'indice
82 ! J dans le tableau "FA+GRIB0" est le premier coeff associe au couple (JM,JN)
83 ! ou JM est le nombre d'onde zonal et JN le nombre d'onde meridien.
84 ! 4 coeff spectraux sont associes a chaque couple (JM,JN) car JM varie
85 ! de 0 a IMSMAX et JN varie de 0 a ITRONC (soit 1/4 de l'ellipse).
86 !
87 ! CAS ARPEGE
88 !
89 IF (.NOT.llmlam) THEN
90  ALLOCATE (ind(0:itronc,-itronc:itronc))
91  ALLOCATE (indirect((itronc+1)**2))
92  DO jn=0,itronc
93  ilow=jn**2+1
94  ihigh=(jn+1)**2
95  jm=-jn-1
96  DO j=ilow,ihigh
97  jm=jm+1
98  ind(jn,jm)=j
99  ENDDO
100  ENDDO
101 !
102  index=-1
103  DO jm=0,itronc
104  DO jn=jm,itronc
105  index=index+2
106  indirect(ind(jn, jm))=index
107  IF (jm.NE.0) THEN
108  indirect(ind(jn,-jm))=index+1
109  ENDIF
110  ENDDO
111  ENDDO
112  DEALLOCATE (ind)
113 ENDIF
114 !
115 ! CAS ALADIN
116 !
117 IF (llmlam) THEN
118  ALLOCATE (indirect((itronc+1)**2))
119  DO jn=0,itronc
120  DO j=fa%CADRE(irangc)%NOZPAR(2*jn+3), fa%CADRE(irangc)%NOZPAR(2*jn+4), 4
121  jm=(j-fa%CADRE(irangc)%NOZPAR(2*jn+3)) / 4
122  indirect(jm*(itronc+1)+jn+1) = j
123  ENDDO
124  ENDDO
125 ENDIF
126 !**
127 ! 2. - TRANSPOSITION DES DONNEES
128 !-----------------------------------------------------------------------
129 !
130 ! CAS ALADIN
131 !
132 IF (llmlam) THEN
133  IF (ldopt) THEN
134 ! PCHAME range comme MODELE (soit "verticalement")
135 !
136  DO jm=0,imsmax
137  DO index=fa%CADRE(irangc)%NOMPAR(2*jm+3), fa%CADRE(irangc)%NOMPAR(2*jm+4), 4
138  jn = (index-fa%CADRE(irangc)%NOMPAR(2*jm+3)) / 4
139  j = indirect(jm*(itronc+1)+jn+1)
140  pchams(j )=pchame(index )
141  pchams(j+1)=pchame(index+1)
142  pchams(j+2)=pchame(index+2)
143  pchams(j+3)=pchame(index+3)
144  ENDDO
145  ENDDO
146  ELSE
147 ! PCHAME range comme FA+GRIB0 (soit "horizontalement")
148 !
149  DO jm=0,imsmax
150  DO index=fa%CADRE(irangc)%NOMPAR(2*jm+3), fa%CADRE(irangc)%NOMPAR(2*jm+4), 4
151  jn = (index-fa%CADRE(irangc)%NOMPAR(2*jm+3)) / 4
152  j = indirect(jm*(itronc+1)+jn+1)
153  pchams(index )=pchame(j )
154  pchams(index+1)=pchame(j+1)
155  pchams(index+2)=pchame(j+2)
156  pchams(index+3)=pchame(j+3)
157  ENDDO
158  ENDDO
159  ENDIF
160 ELSE
161 !
162 ! CAS ARPEGE
163 !
164 ! 1/ Passage du rangement des coeff. spectraux du type modele ARPEGE
165 ! a celui de FA associe a GRIB version0 (et pas associe a GRIBEX qui
166 ! reprend la structure de tableau de ARPEGE).
167 !
168  IF (ldopt) THEN
169  DO jn=0,itronc
170  ilow=jn**2+1
171  ihigh=(jn+1)**2
172  DO j=ilow,ihigh
173  pchams(j)=pchame(indirect(j))
174  ENDDO
175  ENDDO
176 !
177 ! 2/ Passage du rangement des coeff. spectraux du type FA associe
178 ! a GRIB version0 (et pas associe a GRIBEX qui reprend la structure de
179 ! tableau de ARPEGE) a celui du type modele ARPEGE.
180 !
181  ELSE
182 ! Initialisation de la partie "JM=0" a zero, pour y introduire
183 ! ensuite uniquement les coeff reels correspondant dans PCHAME
184 ! (les coeff imaginaires etant donc crees et mis a zero).
185  pchams(1:2*(itronc+1))=0._jpdblr
186 !
187  DO jn=0,itronc
188  ilow=jn**2+1
189  ihigh=(jn+1)**2
190  DO j=ilow,ihigh
191  pchams(indirect(j))=pchame(j)
192  ENDDO
193  ENDDO
194  ENDIF
195 ENDIF
196 !
197 !**
198 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
199 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
200 !-----------------------------------------------------------------------
201 !
202 1001 CONTINUE
203 
204 IF (ALLOCATED (indirect)) DEALLOCATE (indirect)
205 
206 llfata=llmoer(krep,irang)
207 !
208 IF (llfata) THEN
209  inimes=2
210 ELSE
211  inimes=ixnvms(irang)
212 ENDIF
213 !
214 IF (inimes.EQ.0) THEN
215  IF (lhook) CALL dr_hook('FATRAN_MT',1,zhook_handle)
216  RETURN
217 ENDIF
218 !
219 clnspr='FATRAN'
220 !
221 WRITE (unit=clmess,fmt='(''KREP='',I4,'', IRANG='',I4, &
222 & '', LDOPT='',L2)') krep, irang, ldopt
223 CALL faipar_fort &
224 & (fa, knumer,inimes,krep,llfata,clmess, &
225 & clnspr,clnspr,.false.)
226 !
227 IF (lhook) CALL dr_hook('FATRAN_MT',1,zhook_handle)
228 
229 CONTAINS
230 
231 #include "facom2.llmoer.h"
232 #include "facom2.ixnvms.h"
233 
234 END SUBROUTINE fatran_fort
235 
236 
237 
238 ! Oct-2012 P. Marguinaud 64b LFI
239 SUBROUTINE fatran64 &
240 & (krep, knumer, pchame, pchams, ldopt)
241 USE fa_mod, ONLY : fa => fa_com_default, &
244 USE lfi_precision
245 IMPLICIT NONE
246 ! Arguments
247 INTEGER (KIND=JPLIKB) KREP ! OUT
248 INTEGER (KIND=JPLIKB) KNUMER ! IN
249 REAL (KIND=JPDBLR) PCHAME (*) ! IN
250 REAL (KIND=JPDBLR) PCHAMS (*) ! OUT
251 LOGICAL LDOPT ! IN
252 
253 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
254 
255 CALL fatran_fort &
256 & (fa, krep, knumer, pchame, pchams, ldopt)
257 
258 END SUBROUTINE fatran64
259 
260 SUBROUTINE fatran &
261 & (krep, knumer, pchame, pchams, ldopt)
262 USE fa_mod, ONLY : fa => fa_com_default, &
265 USE lfi_precision
266 IMPLICIT NONE
267 ! Arguments
268 INTEGER (KIND=JPLIKM) KREP ! OUT
269 INTEGER (KIND=JPLIKM) KNUMER ! IN
270 REAL (KIND=JPDBLR) PCHAME (*) ! IN
271 REAL (KIND=JPDBLR) PCHAMS (*) ! OUT
272 LOGICAL LDOPT ! IN
273 
274 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
275 
276 CALL fatran_mt &
277 & (fa, krep, knumer, pchame, pchams, ldopt)
278 
279 END SUBROUTINE fatran
280 
281 SUBROUTINE fatran_mt &
282 & (fa, krep, knumer, pchame, pchams, ldopt)
283 USE fa_mod, ONLY : fa_com
284 USE lfi_precision
285 IMPLICIT NONE
286 ! Arguments
287 type(fa_com) fa ! INOUT
288 INTEGER (KIND=JPLIKM) KREP ! OUT
289 INTEGER (KIND=JPLIKM) KNUMER ! IN
290 REAL (KIND=JPDBLR) PCHAME (*) ! IN
291 REAL (KIND=JPDBLR) PCHAMS (*) ! OUT
292 LOGICAL LDOPT ! IN
293 ! Local integers
294 INTEGER (KIND=JPLIKB) IREP ! OUT
295 INTEGER (KIND=JPLIKB) INUMER ! IN
296 ! Convert arguments
297 
298 inumer = int( knumer, jplikb)
299 
300 CALL fatran_fort &
301 & (fa, irep, inumer, pchame, pchams, ldopt)
302 
303 krep = int( irep, jplikm)
304 
305 END SUBROUTINE fatran_mt
306 
307 !INTF KREP OUT
308 !INTF KNUMER IN
309 !INTF PCHAME IN DIMS=*
310 !INTF PCHAMS OUT DIMS=*
311 !INTF LDOPT IN
integer, parameter jplikb
logical, save fa_com_default_init
Definition: fa_mod.F90:477
subroutine new_fa_default()
Definition: fa_mod.F90:649
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
subroutine fatran_fort(FA, KREP, KNUMER, PCHAME, PCHAMS, LDOPT)
Definition: fatran.F90:6
subroutine fatran(KREP, KNUMER, PCHAME, PCHAMS, LDOPT)
Definition: fatran.F90:262
logical lhook
Definition: yomhook.F90:15
integer, parameter jplikm
type(fa_com), target, save fa_com_default
Definition: fa_mod.F90:476
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
subroutine fatran_mt(FA, KREP, KNUMER, PCHAME, PCHAMS, LDOPT)
Definition: fatran.F90:283
subroutine fatran64(KREP, KNUMER, PCHAME, PCHAMS, LDOPT)
Definition: fatran.F90:241
subroutine fanumu_fort(FA, KNUMER, KRANG)
Definition: fanumu.F90:5