LMDZ
suleg_mod.F90
Go to the documentation of this file.
1 MODULE suleg_mod
2 CONTAINS
3 SUBROUTINE suleg
4 
5 USE parkind1 ,ONLY : jpim ,jprb
6 USE parkind2 ,ONLY : jprh
7 
8 USE tpm_gen
9 USE tpm_dim
10 USE tpm_constants
11 USE tpm_distr
12 USE tpm_fields
13 
14 !USE SUGAW_MOD
15 USE supol_mod
16 USE sutrle_mod
17 
18 #ifdef DOC
19 
20 !**** *SULEG * - initialize the Legendre polynomials
21 
22 ! Purpose.
23 ! --------
24 ! Initialize COMMON YOMLEG
25 
26 !** Interface.
27 ! ----------
28 ! *CALL* *SULEG*
29 
30 ! Explicit arguments :
31 ! --------------------
32 
33 ! Implicit arguments :
34 ! --------------------
35 ! COMMON YOMLEG
36 
37 ! Method.
38 ! -------
39 ! See documentation
40 
41 ! Externals.
42 ! ----------
43 ! SUGAW (Gaussian latitudes)
44 ! SUPOLM (polynomials)
45 ! LFI routines for external IO's
46 ! Called by SUGEM.
47 
48 ! Reference.
49 ! ----------
50 ! ECMWF Research Department documentation of the IFS
51 
52 ! Author.
53 ! -------
54 ! Mats Hamrud and Philippe Courtier *ECMWF*
55 
56 ! Modifications.
57 ! --------------
58 ! Original : 87-10-15
59 ! MODIFICATION : 91-04 J.M. Piriou:
60 ! - Read gaussian latitudes and PNM on LFI
61 ! - If file missing, computes
62 ! 91-04 M.Hamrud:
63 ! - IO Scheme introduced
64 ! MODIFICATION : 91-07-03 P.Courtier suppress derivatives
65 ! MODIFICATION : 91-07-03 P.Courtier computes RATATH and RACTHE
66 ! MODIFICATION : 91-07-03 P.Courtier change upper limit (NSMAX+1)
67 ! MODIFICATION : 91-07-03 P.Courtier change ordering
68 ! Order of the PNM in the file, as in the model :
69 ! - increasing wave numbers m
70 ! - for a given m, from n=NSMAX+1 to m
71 ! MODIFICATION : 92-07-02 R. Bubnova: shift RATATH calculation
72 ! to SUGEM1
73 ! MODIFICATION : 92-12-17 P.Courtier multitask computations
74 ! Modified by R. EL Khatib : 93-04-02 Set-up defaults controled by LECMWF
75 ! MODIFICATION : 93-03-19 D.Giard : n <= NTMAX
76 ! K. YESSAD : 93-05-11 : DLMU --> global array DRMU(NDGSA:NDGEN).
77 ! (not stored currently on LFI files).
78 ! MODIFICATION : 94-02-03 R. El Khatib : subroutine SULEG2 to write out
79 ! the Leg. polynomials on workfile or LFI file
80 ! Modification : 94-08-31 M. Tolstykh: Setup for CUD interpolation
81 ! Modified by K. YESSAD (MARCH 1995): Extra-latitudes computations
82 ! according to value of NDGSUR and LRPOLE only.
83 ! + change fancy loop numbering.
84 ! Modified 98-08-10 by K. YESSAD: removal of LRPOLE option.
85 ! - removal of LRPOLE in YOMCT0.
86 ! - removal of code under LRPOLE.
87 ! ------------------------------------------------------------------
88 
89 #endif
90 
91 
92 IMPLICIT NONE
93 
94 
95 ! ------------------------------------------------------------------
96 REAL(KIND=JPRB),ALLOCATABLE :: ZPNMG(:,:)
97 
98 REAL(KIND=JPRH) :: DLRMU(r%ndgl)
99 REAL(KIND=JPRH) :: DLC(0:r%ntmax+1,0:r%ntmax+1)
100 REAL(KIND=JPRH) :: DLD(0:r%ntmax+1,0:r%ntmax+1)
101 REAL(KIND=JPRH) :: DLE(0:r%ntmax+1,0:r%ntmax+1)
102 REAL(KIND=JPRH) :: DLA(0:r%ntmax+1),DLB(0:r%ntmax+1),DLF(0:r%ntmax+1)
103 REAL(KIND=JPRH) :: DLG(0:r%ntmax+1),DLH(0:r%ntmax+1),DLI(0:r%ntmax+1)
104 REAL(KIND=JPRH) :: DLPOL(0:r%ntmax+1,0:r%ntmax+1)
105 ! ------------------------------------------------------------------
106 
107 INTEGER(KIND=JPIM), PARAMETER :: JPKS=kind(zpnmg)
108 INTEGER(KIND=JPIM), PARAMETER :: JPKD=kind(dlg)
109 
110 ! ------------------------------------------------------------------
111 REAL(KIND=JPRH) :: DA,DC,DD,DE
112 INTEGER(KIND=JPIM) :: KKN, KKM
113 
114 ! LOCAL
115 INTEGER(KIND=JPIM) :: IGLLOC, INM, IM , ICOUNT,&
116  &JGL, JM, JMLOC, JN, JNM
117 
118 
119 LOGICAL :: LLP1,LLP2
120 
121 
122 dc(kkn,kkm)=sqrt( (REAL(2*kkn+1,jpkd)*REAL(kkn+kkm-1,jpkd)&
123  &*REAL(KKN+KKM-3,JPKD))&
124  &/ (REAL(2*KKN-3,JPKD)*REAL(KKN+KKM,JPKD)&
125  &*REAL(KKN+KKM-2,JPKD)) )
126 DD(kkn,kkm)=sqrt( (REAL(2*kkn+1,jpkd)*REAL(kkn+kkm-1,jpkd)&
127  &*REAL(KKN-KKM+1,JPKD))&
128  &/ (REAL(2*KKN-1,JPKD)*REAL(KKN+KKM,JPKD)&
129  &*REAL(KKN+KKM-2,JPKD)) )
130 DE(kkn,kkm)=sqrt( (REAL(2*kkn+1,jpkd)*REAL(kkn-kkm,jpkd))&
131  &/ (REAL(2*KKN-1,JPKD)*REAL(KKN+KKM,JPKD)) )
132 DA(kkn,kkm)=sqrt( (REAL(2*kkn+1,jpkd)*REAL(kkn-kkm,jpkd)&
133  &*REAL(KKN+KKM,JPKD))&
134  &/ REAL(2*KKN-1,JPKD) )
135 
136 ! ------------------------------------------------------------------
137 ALLOCATE(zpnmg(r%NSPOLEG,d%NLEI3D))
138 
139 !* 0. Some initializations.
140 ! ---------------------
141 
142 llp1 = nprintlev>0
143 llp2 = nprintlev>1
144 IF(llp1) WRITE(nout,*) '=== ENTER ROUTINE SULEG ==='
145 
146 !CALL GSTATS(140,0) !MPL 4.12.08
147 ALLOCATE(f%RPNM(r%NLEI3,d%NSPOLEGL))
148 IF (llp2) WRITE(nout,9) 'F%RPNM ',SIZE(f%RPNM),shape(f%RPNM)
149 ALLOCATE(f%RMU(r%NDGL))
150 IF (llp2) WRITE(nout,9) 'F%RMU ',SIZE(f%RMU ),shape(f%RMU )
151 ALLOCATE(f%RW(r%NDGL))
152 IF (llp2) WRITE(nout,9) 'F%RW ',SIZE(f%RW ),shape(f%RW )
153 ALLOCATE(f%R1MU2(r%NDGL))
154 IF (llp2) WRITE(nout,9) 'F%R1MU2 ',SIZE(f%R1MU2),shape(f%R1MU2 )
155 ALLOCATE(f%RACTHE(r%NDGL))
156 IF (llp2) WRITE(nout,9) 'F%RACTHE ',SIZE(f%RACTHE),shape(f%RACTHE )
157 
158 !CALL GSTATS(1801,0) ! MPL 4.12.08
159 DO jnm=1,d%NSPOLEGL
160  f%RPNM(r%NLEI3,jnm) = 0.0_jprb
161 ENDDO
162 !CALL GSTATS(1801,1) ! MPL 4.12.08
163 
164 ! ------------------------------------------------------------------
165 
166 !* 3.1 Gaussian latitudes and weights
167 !CALL SUGAW(R%NDGL,F%RMU,DLRMU,F%RW)
168 
169 !* 3.2 Computes related arrays
170 
171 DO jgl=1,r%NDGL
172  f%R1MU2(jgl) = REAL(1.0_JPRB-DLRMU(JGL)*DLRMU(JGL),JPKS)
173  f%RACTHE(jgl) = REAL(1.0_jprb/sqrt(1.0_jprb-dlrmu(jgl)*dlrmu(jgl))/&
174  &REAL(RA,JPKD),JPKS)
175 ENDDO
176 
177 !* 3.3 Working arrays
178 DO jn=3,r%NTMAX+1
179  DO jm=2,jn-1
180  dlc(jm,jn) = dc(jn,jm)
181  dld(jm,jn) = dd(jn,jm)
182  dle(jm,jn) = de(jn,jm)
183  ENDDO
184 ENDDO
185 
186 DO jn=1,r%NTMAX+1
187  dla(jn) = sqrt(REAL(2*jn+1,jpkd))
188  dlb(jn) = sqrt(REAL(2*jn+1,jpkd)/REAL(JN*(JN+1),JPKD))
189  dlf(jn) = REAL(2*jn-1,jpkd)/REAL(jn,jpkd)
190  dlg(jn) = REAL(jn-1,jpkd)/REAL(jn,jpkd)
191  dlh(jn) = sqrt(REAL(2*jn+1,jpkd)/REAL(2*jn,jpkd))
192  dli(jn) = REAL(jn,jpkd)
193 ENDDO
194 
195 !CALL GSTATS(1801,0) ! MPL 4.12.08
196 DO jgl=d%NLATLS(mysetw),d%NLATLE(mysetw)
197  dlpol(:,:) = 0.0_jprb
198  CALL supol(r%NTMAX+1,dlrmu(jgl),dlpol,dla,dlb,dlc,dld,dle,dlf,dlg,dlh,dli)
199  inm = 0
200  iglloc = jgl - d%NLATLS(mysetw) + 1
201  DO jm=0,r%NSMAX
202  DO jn=r%NTMAX+1,jm,-1
203  inm = inm+1
204  zpnmg(inm,iglloc) = REAL(DLPOL(JM,JN),JPKS)
205  ENDDO
206  ENDDO
207 ENDDO
208 !CALL GSTATS(1801,1) ! MPL 4.12.08
209 !CALL GSTATS(140,1) ! MPL 4.12.08
210 
211 !CALL GSTATS(190,0) ! MPL 4.12.08
212 CALL sutrle(zpnmg)
213 !CALL GSTATS(190,1) ! MPL 4.12.08
214 
215 icount = 0
216 DO jmloc=1,d%NUMP
217  im = d%MYMS(jmloc)
218  DO jn=im,r%NTMAX+2
219  icount = icount+1
220  ENDDO
221 ENDDO
222 
223 ALLOCATE(f%REPSNM(icount))
224 IF (llp2) WRITE(nout,9) 'F%REPSNM ',SIZE(f%REPSNM ),shape(f%REPSNM )
225 
226 icount = 0
227 DO jmloc=1,d%NUMP
228  im = d%MYMS(jmloc)
229  DO jn=im,r%NTMAX+2
230  icount = icount+1
231  f%REPSNM(icount) = REAL(SQRT(REAL(JN*JN-IM*IM,JPKD)/& &REAL(4*JN*JN-1,JPKD)),JPKS)
232  ENDDO
233 ENDDO
234 
235 ALLOCATE(f%RN(-1:r%NTMAX+3))
236 IF (llp2) WRITE(nout,9) 'F%RN ',SIZE(f%RN ),shape(f%RN )
237 ALLOCATE(f%RLAPIN(-1:r%NSMAX+2))
238 IF (llp2) WRITE(nout,9) 'F%RLAPIN ',SIZE(f%RLAPIN ),shape(f%RLAPIN )
239 ALLOCATE(f%NLTN(-1:r%NTMAX+3))
240 IF (llp2) WRITE(nout,9) 'F%NLTN ',SIZE(f%NLTN ),shape(f%NLTN )
241 
242 DO jn=-1,r%NTMAX+3
243  f%RN(jn) = REAL(jn,jprb)
244  f%NLTN(jn) = r%NTMAX+2-jn
245 ENDDO
246 f%RLAPIN(:) = 0.0_jprb
247 f%RLAPIN(0) = 0._jprb
248 f%RLAPIN(-1) = 0.0_jprb
249 DO jn=1,r%NSMAX+2
250  f%RLAPIN(jn)=REAL(-(REAL(RA,JPKD)*REAL(RA,JPKD))/REAL(JN*(JN+1),JPKD),JPKS)
251 ENDDO
252 
253 DEALLOCATE(zpnmg)
254 
255 ! ------------------------------------------------------------------
256 9 FORMAT(1x,'ARRAY ',a10,' ALLOCATED ',8i8)
257 
258 END SUBROUTINE suleg
259 END MODULE suleg_mod
260 
!$Id mode_top_bound COMMON comconstr r
Definition: comconst.h:7
type(fields_type), pointer f
Definition: tpm_fields.F90:23
!$Id jm
Definition: comconst.h:7
type(distr_type), pointer d
Definition: tpm_distr.F90:152
subroutine supol(KNSMAX, DDMU, DDPOL, DDA, DDB, DDC, DDD, DDE, DDF, DDG, DDH, DDI)
Definition: supol_mod.F90:4
subroutine suleg
Definition: suleg_mod.F90:4
subroutine sutrle(PNM)
Definition: sutrle_mod.F90:4
integer, parameter jprb
Definition: parkind1.F90:31
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
integer(kind=jpim) mysetw
Definition: tpm_distr.F90:21
integer, parameter jprh
Definition: parkind2.F90:19
integer, parameter jpim
Definition: parkind1.F90:13
integer(kind=jpim) nout
Definition: tpm_gen.F90:9
integer(kind=jpim) nprintlev
Definition: tpm_gen.F90:11