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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 114 - (show annotations)
Fri Sep 19 11:41:35 2014 UTC (9 years, 8 months ago) by guez
File size: 3848 byte(s)


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