LMDZ
cpledn_mod.F90
Go to the documentation of this file.
1 MODULE cpledn_mod
2 CONTAINS
3 SUBROUTINE cpledn(KN,KDBLE,PX,DDX,KFLAG,PW,PXN,DDXN,PXMOD)
4 
5 !**** *CPLEDN* - Routine to compute the Legendre polynomial of degree N
6 
7 ! Purpose.
8 ! --------
9 ! Computes Legendre polynomial of degree N
10 
11 !** Interface.
12 ! ----------
13 ! *CALL* *CPLEDN(KN,KDBLE,PX,DDX,KFLAG,PW,PXN,DDXN,PXMOD)*
14 
15 ! Explicit arguments :
16 ! --------------------
17 ! KN : Degree of the Legendre polynomial
18 ! KDBLE : 0, single precision
19 ! 1, double precision
20 ! PX : abcissa where the computations are performed
21 ! DDX : id in double precision
22 ! KFLAG : When KFLAG.EQ.1 computes the weights
23 ! PW : Weight of the quadrature at PXN
24 ! PXN : new abscissa (Newton iteration)
25 ! DDXN : id in double precision
26 ! PXMOD : PXN-PX
27 
28 ! Implicit arguments :
29 ! --------------------
30 ! None
31 
32 ! Method.
33 ! -------
34 ! See documentation
35 
36 ! Externals.
37 ! ----------
38 ! None
39 
40 ! Reference.
41 ! ----------
42 ! ECMWF Research Department documentation of the IFS
43 
44 ! Author.
45 ! -------
46 ! Mats Hamrud and Philippe Courtier *ECMWF*
47 
48 ! Modifications.
49 ! --------------
50 ! Original : 87-10-15
51 ! Michel Rochas, 90-08-30 (Lobatto+cleaning)
52 ! ------------------------------------------------------------------
53 
54 
55 
56 USE parkind1 ,ONLY : jpim ,jprb
57 USE parkind2 ,ONLY : jprh
58 
59 IMPLICIT NONE
60 
61 
62 ! DUMMY INTEGER SCALARS
63 INTEGER(KIND=JPIM) :: KDBLE
64 INTEGER(KIND=JPIM) :: KFLAG
65 INTEGER(KIND=JPIM) :: KN
66 
67 ! DUMMY REAL SCALARS
68 REAL(KIND=JPRB) :: PW
69 REAL(KIND=JPRB) :: PX
70 REAL(KIND=JPRB) :: PXMOD
71 REAL(KIND=JPRB) :: PXN
72 
73 
74 REAL(KIND=JPRH) :: DDX,DDXN,DLX,DLK,DLKM1,DLKM2,DLLDN,DLXN,DLMOD
75 REAL(KIND=JPRH) :: DLG,DLGDN
76 
77 INTEGER(KIND=JPIM), PARAMETER :: JPKS=kind(px)
78 INTEGER(KIND=JPIM), PARAMETER :: JPKD=kind(ddx)
79 
80 ! LOCAL INTEGER SCALARS
81 INTEGER(KIND=JPIM) :: IZN, JN
82 
83 ! LOCAL REAL SCALARS
84 REAL(KIND=JPRB) :: ZG, ZGDN, ZK, ZKM1, ZKM2, ZLDN, ZMOD, ZX, ZXN
85 
86 
87 ! -----------------------------------------------------------------
88 
89 !* 1. Single precision computations.
90 ! ------------------------------
91 
92 izn = kn
93 
94 zk = 0.0_jprb
95 dlk = 0.0_jprb
96 dlxn = 0.0_jprb
97 IF(kdble == 0)THEN
98 
99 !* 1.1 NEWTON ITERATION STEP.
100 
101  zkm2 = 1
102  zkm1 = px
103  zx = px
104  DO jn=2,izn
105  zk = (REAL(2*jn-1,jprb)*ZX*ZKM1-REAL(jn-1,jprb)*ZKM2)/REAL(JN,JPRB)
106  zkm2 = zkm1
107  zkm1 = zk
108  ENDDO
109  zkm1 = zkm2
110  zldn = (REAL(kn,jprb)*(zkm1-zx*zk))/(1.0_JPRB-ZX*ZX)
111  zmod = -zk/zldn
112  zxn = zx+zmod
113  pxn = zxn
114  ddxn = REAL(zxn,jpkd)
115  pxmod = zmod
116 
117 ! ------------------------------------------------------------------
118 
119 !* 2. Double precision computations.
120 ! ------------------------------
121 
122 ELSE
123 
124 !* 2.1 NEWTON ITERATION STEP.
125 
126  dlkm2 = 1.0_jprb
127  dlkm1 = ddx
128  dlx = ddx
129  DO jn=2,izn
130  dlk = (REAL(2*jn-1,jpkd)*DLX*DLKM1-REAL(jn-1,jpkd)*DLKM2)/REAL(JN,JPKD)
131  dlkm2 = dlkm1
132  dlkm1 = dlk
133  ENDDO
134  dlkm1 = dlkm2
135  dlldn = (REAL(kn,jpkd)*(dlkm1-dlx*dlk))/(1.0_JPRB-DLX*DLX)
136  dlmod = -dlk/dlldn
137  dlxn = dlx+dlmod
138  pxn = REAL(dlxn,jpks)
139  ddxn = dlxn
140  pxmod = REAL(dlmod,jpks)
141 ENDIF
142 ! ------------------------------------------------------------------
143 
144 !* 3. Computes weight.
145 ! ----------------
146 
147 
148 IF(kflag == 1)THEN
149  dlkm2 = 1.0_jprb
150  dlkm1 = dlxn
151  dlx = dlxn
152  DO jn=2,izn
153  dlk = (REAL(2*jn-1,jpkd)*DLX*DLKM1-REAL(jn-1,jpkd)*DLKM2)/REAL(JN,JPKD)
154  dlkm2 = dlkm1
155  dlkm1 = dlk
156  ENDDO
157  dlkm1 = dlkm2
158  pw = REAL((1.0_JPRB-DLX*DLX)/(REAL(KN*KN,JPKD)*DLKM1*DLKM1),JPKS)
159 ENDIF
160 
161 ! ------------------------------------------------------------------
162 
163 END SUBROUTINE cpledn
164 END MODULE cpledn_mod
subroutine cpledn(KN, KDBLE, PX, DDX, KFLAG, PW, PXN, DDXN, PXMOD)
Definition: cpledn_mod.F90:4
integer, parameter jprb
Definition: parkind1.F90:31
integer, parameter jprh
Definition: parkind2.F90:19
integer, parameter jpim
Definition: parkind1.F90:13