/[lmdze]/trunk/dyn3d/fxhyp.f
ViewVC logotype

Annotation of /trunk/dyn3d/fxhyp.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 122 - (hide annotations)
Tue Feb 3 19:30:48 2015 UTC (9 years, 3 months ago) by guez
File size: 5328 byte(s)
In procedure fxhyp_loop_ik, when testing whether xvrai is between -pi
and pi, changed back the boundaries from -pi - 1d-5 to - pi_d - 0.1
and from pi + 1d-5 to pi_d + 0.1. Fixed the logic: for ik = 1, we
rearrange longitudes between -pi and pi, if necessary. For other
values of ik, we apply the same rearrangement.

In module serre, change the default values of dzoomx and dzoomy to
0.2, because dzoomx must be > 0 when grossismx > 1.

With this revision, we recover the results of revision 120 and we
remove the bug that appeared with clon = 20.

1 guez 78 module fxhyp_m
2 guez 3
3 guez 78 IMPLICIT NONE
4 guez 3
5 guez 78 contains
6 guez 3
7 guez 119 SUBROUTINE fxhyp(xprimm025, rlonv, xprimv, rlonu, xprimu, xprimp025)
8 guez 3
9 guez 91 ! From LMDZ4/libf/dyn3d/fxhyp.F, version 1.2, 2005/06/03 09:11:32
10 guez 119 ! Author: P. Le Van, from formulas by R. Sadourny
11 guez 3
12 guez 78 ! Calcule les longitudes et dérivées dans la grille du GCM pour
13 guez 119 ! une fonction f(x) à dérivée tangente hyperbolique.
14 guez 3
15 guez 121 ! Il vaut mieux avoir : grossismx \times dzoom < pi
16 guez 3
17 guez 120 ! Le premier point scalaire pour une grille regulière (grossismx =
18     ! 1., taux=0., clon=0.) est à - 180 degrés.
19    
20 guez 78 USE dimens_m, ONLY: iim
21 guez 121 use fxhyp_loop_ik_m, only: fxhyp_loop_ik, nmax
22 guez 120 use nr_util, only: pi_d, twopi_d, arth
23 guez 119 use serre, only: clon, grossismx, dzoomx, taux
24 guez 3
25 guez 119 REAL, intent(out):: xprimm025(:), rlonv(:), xprimv(:) ! (iim + 1)
26     real, intent(out):: rlonu(:), xprimu(:), xprimp025(:) ! (iim + 1)
27 guez 3
28 guez 91 ! Local:
29 guez 3
30 guez 119 real rlonm025(iim + 1), rlonp025(iim + 1)
31 guez 78 REAL dzoom
32 guez 121 DOUBLE PRECISION xlon(iim)
33     DOUBLE PRECISION xtild(0:2 * nmax)
34     DOUBLE PRECISION fhyp(nmax:2 * nmax), ffdx, beta, Xprimt(0:2 * nmax)
35     DOUBLE PRECISION Xf(0:2 * nmax), xxpr(2 * nmax)
36     DOUBLE PRECISION xzoom, fa, fb
37     INTEGER i
38     DOUBLE PRECISION xmoy, fxm
39 guez 91 DOUBLE PRECISION decalx
40 guez 3
41 guez 91 !----------------------------------------------------------------------
42    
43 guez 120 print *, "Call sequence information: fxhyp"
44    
45 guez 121 xzoom = clon * pi_d / 180d0
46 guez 3
47 guez 120 IF (grossismx == 1.) THEN
48 guez 121 decalx = 1d0
49 guez 119 else
50 guez 121 decalx = 0.75d0
51 guez 119 END IF
52 guez 3
53 guez 121 dzoom = dzoomx * twopi_d
54     xtild = arth(- pi_d, pi_d / nmax, 2 * nmax + 1)
55 guez 3
56 guez 121 ! Compute fhyp:
57     DO i = nmax, 2 * nmax
58 guez 120 fa = taux * (dzoom / 2. - xtild(i))
59 guez 119 fb = xtild(i) * (pi_d - xtild(i))
60 guez 78
61 guez 120 IF (200. * fb < - fa) THEN
62 guez 119 fhyp(i) = - 1.
63     ELSE IF (200. * fb < fa) THEN
64     fhyp(i) = 1.
65 guez 3 ELSE
66 guez 121 IF (ABS(fa) < 1e-13 .AND. ABS(fb) < 1e-13) THEN
67 guez 120 IF (200. * fb + fa < 1e-10) THEN
68 guez 119 fhyp(i) = - 1.
69 guez 120 ELSE IF (200. * fb - fa < 1e-10) THEN
70 guez 119 fhyp(i) = 1.
71     END IF
72 guez 78 ELSE
73 guez 119 fhyp(i) = TANH(fa / fb)
74     END IF
75 guez 112 END IF
76 guez 3
77 guez 91 IF (xtild(i) == 0.) fhyp(i) = 1.
78 guez 119 IF (xtild(i) == pi_d) fhyp(i) = -1.
79 guez 112 END DO
80 guez 3
81 guez 91 ! Calcul de beta
82 guez 3
83 guez 78 ffdx = 0.
84 guez 3
85 guez 121 DO i = nmax + 1, 2 * nmax
86 guez 78 xmoy = 0.5 * (xtild(i-1) + xtild(i))
87 guez 120 fa = taux * (dzoom / 2. - xmoy)
88 guez 119 fb = xmoy * (pi_d - xmoy)
89 guez 78
90 guez 120 IF (200. * fb < - fa) THEN
91 guez 78 fxm = - 1.
92 guez 119 ELSE IF (200. * fb < fa) THEN
93 guez 78 fxm = 1.
94     ELSE
95 guez 121 IF (ABS(fa) < 1e-13 .AND. ABS(fb) < 1e-13) THEN
96 guez 120 IF (200. * fb + fa < 1e-10) THEN
97 guez 78 fxm = - 1.
98 guez 120 ELSE IF (200. * fb - fa < 1e-10) THEN
99 guez 78 fxm = 1.
100 guez 119 END IF
101 guez 78 ELSE
102 guez 119 fxm = TANH(fa / fb)
103     END IF
104     END IF
105 guez 3
106 guez 91 IF (xmoy == 0.) fxm = 1.
107 guez 119 IF (xmoy == pi_d) fxm = -1.
108 guez 3
109 guez 78 ffdx = ffdx + fxm * (xtild(i) - xtild(i-1))
110 guez 119 END DO
111 guez 3
112 guez 121 print *, "ffdx = ", ffdx
113 guez 119 beta = (grossismx * ffdx - pi_d) / (ffdx - pi_d)
114 guez 121 print *, "beta = ", beta
115 guez 3
116 guez 119 IF (2. * beta - grossismx <= 0.) THEN
117 guez 122 print *, 'Bad choice of grossismx, taux, dzoomx.'
118     print *, 'Decrease dzoomx or grossismx.'
119 guez 78 STOP 1
120 guez 112 END IF
121 guez 78
122 guez 91 ! calcul de Xprimt
123 guez 121 Xprimt(nmax:2 * nmax) = beta + (grossismx - beta) * fhyp
124     xprimt(:nmax - 1) = xprimt(2 * nmax:nmax + 1:- 1)
125 guez 78
126 guez 121 ! Calcul de Xf
127 guez 78
128 guez 121 DO i = nmax + 1, 2 * nmax
129 guez 78 xmoy = 0.5 * (xtild(i-1) + xtild(i))
130 guez 120 fa = taux * (dzoom / 2. - xmoy)
131 guez 119 fb = xmoy * (pi_d - xmoy)
132 guez 78
133 guez 120 IF (200. * fb < - fa) THEN
134 guez 78 fxm = - 1.
135 guez 119 ELSE IF (200. * fb < fa) THEN
136 guez 78 fxm = 1.
137 guez 3 ELSE
138 guez 119 fxm = TANH(fa / fb)
139     END IF
140 guez 3
141 guez 91 IF (xmoy == 0.) fxm = 1.
142 guez 119 IF (xmoy == pi_d) fxm = -1.
143     xxpr(i) = beta + (grossismx - beta) * fxm
144     END DO
145 guez 3
146 guez 121 xxpr(:nmax) = xxpr(2 * nmax:nmax + 1:- 1)
147 guez 3
148 guez 121 Xf(0) = - pi_d
149    
150     DO i=1, 2 * nmax - 1
151 guez 78 Xf(i) = Xf(i-1) + xxpr(i) * (xtild(i) - xtild(i-1))
152 guez 119 END DO
153 guez 3
154 guez 121 Xf(2 * nmax) = pi_d
155 guez 3
156 guez 121 call fxhyp_loop_ik(1, decalx, xf, xtild, Xprimt, xzoom, rlonm025, &
157     xprimm025, xuv = - 0.25d0)
158     call fxhyp_loop_ik(2, decalx, xf, xtild, Xprimt, xzoom, rlonv, xprimv, &
159     xuv = 0d0)
160     call fxhyp_loop_ik(3, decalx, xf, xtild, Xprimt, xzoom, rlonu, xprimu, &
161     xuv = 0.5d0)
162     call fxhyp_loop_ik(4, decalx, xf, xtild, Xprimt, xzoom, rlonp025, &
163     xprimp025, xuv = 0.25d0)
164 guez 120
165 guez 91 print *
166 guez 3
167 guez 121 forall (i = 1: iim) xlon(i) = rlonv(i + 1) - rlonv(i)
168 guez 122 print *, "Minimum longitude step:", MINval(xlon) * 180. / pi_d, "degrees"
169     print *, "Maximum longitude step:", MAXval(xlon) * 180. / pi_d, "degrees"
170 guez 3
171 guez 119 DO i = 1, iim + 1
172     IF (rlonp025(i) < rlonv(i)) THEN
173 guez 121 print *, 'rlonp025(', i, ') = ', rlonp025(i)
174     print *, "< rlonv(", i, ") = ", rlonv(i)
175 guez 119 STOP 1
176     END IF
177    
178     IF (rlonv(i) < rlonm025(i)) THEN
179 guez 121 print *, 'rlonv(', i, ') = ', rlonv(i)
180     print *, "< rlonm025(", i, ") = ", rlonm025(i)
181 guez 119 STOP 1
182     END IF
183    
184     IF (rlonp025(i) > rlonu(i)) THEN
185 guez 120 print *, 'rlonp025(', i, ') = ', rlonp025(i)
186     print *, "> rlonu(", i, ") = ", rlonu(i)
187 guez 119 STOP 1
188     END IF
189     END DO
190    
191 guez 78 END SUBROUTINE fxhyp
192    
193     end module fxhyp_m

  ViewVC Help
Powered by ViewVC 1.1.21