LMDZ
supol_mod.F90
Go to the documentation of this file.
1 MODULE supol_mod
2 CONTAINS
3 SUBROUTINE supol(KNSMAX,DDMU,DDPOL,DDA,DDB,DDC,DDD,DDE,DDF,DDG,DDH,DDI)
4 
5 !**** *SUPOL * - Routine to compute the Legendre polynomials
6 
7 ! Purpose.
8 ! --------
9 ! For a given value of mu, computes the Legendre
10 ! polynomials.
11 
12 !** Interface.
13 ! ----------
14 ! *CALL* *SUPOL(KNSMAX,DDMU,DDPOL,DDA,DDB,DDC,DDD,DDE
15 ! ,DDF,DDG,DDH,DDI)
16 
17 ! Explicit arguments :
18 ! --------------------
19 ! KNSMAX : Truncation (triangular)
20 ! DDMU : Abscissa at which the polynomials are computed (mu)
21 ! DDPOL : Polynomials (the first index is m and the second n)
22 
23 
24 ! Implicit arguments : None
25 ! --------------------
26 
27 ! Method.
28 ! -------
29 ! See documentation
30 
31 ! Externals.
32 ! ----------
33 
34 ! Reference.
35 ! ----------
36 ! ECMWF Research Department documentation of the IFS
37 
38 ! Author.
39 ! -------
40 ! Mats Hamrud and Philippe Courtier *ECMWF*
41 
42 ! Modifications.
43 ! --------------
44 ! Original : 87-10-15
45 ! K. YESSAD (MAY 1998): modification to avoid underflow.
46 ! ------------------------------------------------------------------
47 
48 USE parkind1 ,ONLY : jpim ,jprb
49 USE parkind2 ,ONLY : jprh
50 
51 IMPLICIT NONE
52 
53 INTEGER(KIND=JPIM),INTENT(IN) :: KNSMAX
54 REAL(KIND=JPRH) ,INTENT(IN) :: DDMU
55 REAL(KIND=JPRH) ,INTENT(IN) :: DDC(0:knsmax,0:knsmax)
56 REAL(KIND=JPRH) ,INTENT(IN) :: DDD(0:knsmax,0:knsmax)
57 REAL(KIND=JPRH) ,INTENT(IN) :: DDE(0:knsmax,0:knsmax)
58 REAL(KIND=JPRH) ,INTENT(IN) :: DDA(0:knsmax),DDB(0:knsmax),DDF(0:knsmax)
59 REAL(KIND=JPRH) ,INTENT(IN) :: DDG(0:knsmax),DDH(0:knsmax),DDI(0:knsmax)
60 REAL(KIND=JPRH) ,INTENT(OUT) :: DDPOL(0:knsmax,0:knsmax)
61 
62 REAL(KIND=JPRH) :: DLX,DLSITA,DL1SITA,DLKM2,DLKM1,DLK,DL1,DLS
63 
64 INTEGER(KIND=JPIM) :: JM, JN
65 REAL(KIND=JPRB) :: Z
66 
67 ! ------------------------------------------------------------------
68 
69 !* 1. First two columns.
70 ! ------------------
71 
72 dlx=ddmu
73 dlsita=sqrt(1.0_jprb-dlx*dlx)
74 
75 ! IF WE ARE LESS THAN 1Meter FROM THE POLE,
76 IF(abs(REAL(dlsita,kind(z))) <= sqrt(epsilon(z)))THEN
77  dlx=1._jprb
78  dlsita=0._jprb
79  dl1sita=0._jprb
80 ELSE
81  dl1sita=1.0_jprb/dlsita
82 ENDIF
83 dlkm2=1._jprb
84 dlkm1=dlx
85 ddpol(0,0)=dlkm2
86 ddpol(0,1)=dlkm1*dda(1)
87 ddpol(1,1)=dlsita*ddb(1)
88 DO jn=2,knsmax
89  dlk=ddf(jn)*dlx*dlkm1-ddg(jn)*dlkm2
90  dl1=ddi(jn)*(dlkm1-dlx*dlk)*dl1sita
91  ddpol(0,jn)=dlk*dda(jn)
92  ddpol(1,jn)=dl1*ddb(jn)
93  dlkm2=dlkm1
94  dlkm1=dlk
95 ENDDO
96 
97 ! ------------------------------------------------------------------
98 
99 !* 2. Diagonal (the terms 0,0 and 1,1 have already been computed)
100 ! -----------------------------------------------------------
101 
102 dls=dl1sita*tiny(dls)
103 
104 !OCL SCALAR
105 DO jn=2,knsmax
106  ddpol(jn,jn)=ddpol(jn-1,jn-1)*dlsita*ddh(jn)
107  IF ( abs(ddpol(jn,jn)) < dls ) ddpol(jn,jn)=0.0_jprb
108 ENDDO
109 
110 ! ------------------------------------------------------------------
111 
112 !* 3. General recurrence.
113 ! -------------------
114 
115 DO jn=3,knsmax
116 !DIR$ IVDEP
117 !OCL NOVREC
118  DO jm=2,jn-1
119  ddpol(jm,jn)=ddc(jm,jn)*ddpol(jm-2,jn-2)&
120  &-ddd(jm,jn)*ddpol(jm-2,jn-1)*dlx &
121  &+dde(jm,jn)*ddpol(jm ,jn-1)*dlx
122  ENDDO
123 ENDDO
124 
125 ! ------------------------------------------------------------------
126 
127 END SUBROUTINE supol
128 END MODULE supol_mod
129 
130 
subroutine supol(KNSMAX, DDMU, DDPOL, DDA, DDB, DDC, DDD, DDE, DDF, DDG, DDH, DDI)
Definition: supol_mod.F90:4
integer, parameter jprb
Definition: parkind1.F90:31
integer, parameter jprh
Definition: parkind2.F90:19
integer, parameter jpim
Definition: parkind1.F90:13