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

Contents of /trunk/dyn3d/tau2alpha.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 113 - (show annotations)
Thu Sep 18 19:56:46 2014 UTC (9 years, 7 months ago) by guez
File size: 3848 byte(s)
Moved the call to read_serre out of conf_gcm so that it can be called
only in the program ce0l, not in gcm. In gcm, variables of module
serre are read from start file. Added reading of dzoomx, dzoomy, taux,
tauy from start file, in dynetat0. Those variables were written by
dynredem0 but not read.

Removed possibility fxyhypb = false, because the geometric part of the
program is such a mess. Could then remove variables transx, transy,
alphax, alphay, pxo, pyo of module serre.

Bug fix in tau2alpha: missing save attributes. The first call to
tau2alpha needs to compute dxdyu and dxdyv regardless of value of
argument type, because they will be needed for subsequent calls to
tau2alpha with various values of argument type.

1 module tau2alpha_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE tau2alpha(type, factt, taumin, taumax, alpha)
8
9 USE comgeom, ONLY: cu_2d, cv_2d, rlatu, rlatv
10 use conf_guide_m, only: lat_min_guide, lat_max_guide
11 USE dimens_m, ONLY: iim, jjm
12 USE nr_util, ONLY: pi
13 USE paramet_m, ONLY: iip1, jjp1
14 USE serre, ONLY: clat, clon, grossismx, grossismy
15 use writefield_m, only: writefield
16
17 INTEGER, intent(in):: type
18 REAL, intent(in):: factt, taumin, taumax
19 real, intent(out):: alpha(:, :)
20
21 ! Local:
22 REAL dxdy
23 REAL, save:: dxdy_min, dxdy_max
24 REAL alphamin, alphamax, xi
25 REAL, SAVE:: gamma
26 INTEGER i, j, ilon, ilat
27 LOGICAL:: first = .TRUE.
28 REAL dx(iip1, jjp1), dy(iip1, jjp1)
29 REAL zlat
30 REAL, save:: dxdys(iip1, jjp1), dxdyu(iip1, jjp1), dxdyv(iip1, jjm)
31
32 !------------------------------------------------------------
33
34 IF (first) THEN
35 DO j = 2, jjm
36 DO i = 2, iip1
37 dx(i, j) = 0.5 * (cu_2d(i - 1, j) + cu_2d(i, j)) / cos(rlatu(j))
38 END DO
39 dx(1, j) = dx(iip1, j)
40 END DO
41 DO j = 2, jjm
42 DO i = 1, iip1
43 dy(i, j) = 0.5 * (cv_2d(i, j - 1) + cv_2d(i, j))
44 END DO
45 END DO
46 DO i = 1, iip1
47 dx(i, 1) = dx(i, 2)
48 dx(i, jjp1) = dx(i, jjm)
49 dy(i, 1) = dy(i, 2)
50 dy(i, jjp1) = dy(i, jjm)
51 END DO
52
53 DO j = 1, jjp1
54 DO i = 1, iip1
55 dxdys(i, j) = sqrt(dx(i, j)**2 + dy(i, j)**2)
56 END DO
57 END DO
58 CALL writefield("dxdys", dxdys)
59
60 DO j = 1, jjp1
61 DO i = 1, iim
62 dxdyu(i, j) = 0.5 * (dxdys(i, j) + dxdys(i + 1, j))
63 END DO
64 dxdyu(iip1, j) = dxdyu(1, j)
65 END DO
66
67 DO j = 1, jjm
68 DO i = 1, iip1
69 dxdyv(i, j) = 0.5 * (dxdys(i, j) + dxdys(i, j + 1))
70 END DO
71 END DO
72
73 ! coordonnees du centre du zoom
74 CALL coordij(clon, clat, ilon, ilat)
75 ! aire de la maille au centre du zoom
76 dxdy_min = dxdys(ilon, ilat)
77
78 ! dxdy maximal de la maille :
79 dxdy_max = 0.
80 DO j = 1, jjp1
81 DO i = 1, iip1
82 dxdy_max = max(dxdy_max, dxdys(i, j))
83 END DO
84 END DO
85
86 IF (abs(grossismx - 1.) < 0.1 .OR. abs(grossismy - 1.) < 0.1) THEN
87 PRINT *, 'Attention : modèle peu zoomé.'
88 PRINT *, 'On prend une constante de guidage constante.'
89 ELSE
90 gamma = (dxdy_max - 2. * dxdy_min) / (dxdy_max - dxdy_min)
91 IF (gamma < 1E-5) THEN
92 PRINT *, '(dxdy_max - 2. * dxdy_min) / (dxdy_max - dxdy_min) ' &
93 // '< 1e-5'
94 STOP 1
95 END IF
96 gamma = log(0.5) / log(gamma)
97 PRINT *, 'gamma=', gamma
98 END IF
99 first = .false.
100 END IF
101
102 alphamin = factt / taumax
103 alphamax = factt / taumin
104
105 DO j = 1, size(alpha, 2)
106 DO i = 1, size(alpha, 1)
107 IF (type==1) THEN
108 dxdy = dxdys(i, j)
109 zlat = rlatu(j) * 180. / pi
110 ELSE IF (type==2) THEN
111 dxdy = dxdyu(i, j)
112 zlat = rlatu(j) * 180. / pi
113 ELSE IF (type==3) THEN
114 dxdy = dxdyv(i, j)
115 zlat = rlatv(j) * 180. / pi
116 END IF
117 IF (abs(grossismx - 1.) < 0.1 .OR. abs(grossismy - 1.) < 0.1) THEN
118 ! grille regulière
119 alpha(i, j) = alphamin
120 ELSE
121 xi = ((dxdy_max - dxdy) / (dxdy_max - dxdy_min))**gamma
122 xi = min(xi, 1.)
123 IF (lat_min_guide <= zlat .AND. zlat <= lat_max_guide) THEN
124 alpha(i, j) = xi * alphamin + (1. - xi) * alphamax
125 ELSE
126 alpha(i, j) = 0.
127 END IF
128 END IF
129 END DO
130 END DO
131
132 END SUBROUTINE tau2alpha
133
134 end module tau2alpha_m

  ViewVC Help
Powered by ViewVC 1.1.21