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

Annotation of /trunk/dyn3d/tau2alpha.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 109 - (hide annotations)
Wed Sep 17 10:08:00 2014 UTC (9 years, 9 months ago) by guez
File size: 3899 byte(s)
Moved a call to writefield from guide to tau2alpha. (dxdys does not
change with itau.) So dxdys does not need to be a module variable any
longer. Other variables of modules tau2alpha_m downgraded to local
variables of tau2alpha, since they were not used elsewhere.

Procedures write_field[13]d and formcoord were never called. Could
then remove int2str.

Inline writefield_gen into writefield.

CreateNewField takes an integer array argument instead of 3 scalar
integers. CreateNewField now creates a number of dimensions adapted to
the rank of the output field, instead of always 4 dimensions.

Changed names of variables of module write_field: fieldid to
ncid, fieldindex to record, fieldvarid to varid.

In writefield_gen, if index == -1, no need to call GetFieldIndex
again, we know that the result is nbfield.

In guide, moved calls to writefield for some variables inside if
first_call: those variables do not change with time. Removed ztau:
computed only to be output, does not seem meaningful. Removed
writefield for aire: does not change with time and is already in
"grilles_gcm.nc".

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

  ViewVC Help
Powered by ViewVC 1.1.21