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

Annotation of /trunk/dyn3d/Guide/tau2alpha.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 112 - (hide annotations)
Thu Sep 18 13:36:51 2014 UTC (9 years, 8 months ago) by guez
Original Path: trunk/dyn3d/tau2alpha.f
File size: 3924 byte(s)
Removed 8 first arguments of fxyhyper, use variables of module serre
instead.

Moved reading of variables of module serre from procedure conf_gcm to
new procedure read_serre.

In guide, added conditions to avoid useless calls to tau2alpha and
writefield. Bugfix: offline corresponds to alpha = 1. Open only one
NetCDF file to read number of vertical levels.

In tau2alpha, added conditions to avoid useless computations of dxdyu
and dxdyv. gamma is not needed for a regular grid.

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

  ViewVC Help
Powered by ViewVC 1.1.21