/[lmdze]/trunk/Sources/dyn3d/Dissipation/inidissip.f
ViewVC logotype

Contents of /trunk/Sources/dyn3d/Dissipation/inidissip.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 39 - (show annotations)
Tue Jan 25 15:11:05 2011 UTC (13 years, 4 months ago) by guez
Original Path: trunk/libf/dyn3d/inidissip.f90
File size: 5052 byte(s)
"pi" comes from "nr_util". Removed subroutine "initialize" in module
"comconst".

Copied the content of "fxy_sin.h" into "fxysinus", instead of getting
it from an "include" line. Removed file "fxy_sin.h".

"ps" has rank 2 in "gcm" and "dynetat0".

Assumed-shape for argument "q" of "integrd".

1 module inidissip_m
2
3 use dimens_m, only: llm
4
5 IMPLICIT NONE
6
7 private llm
8
9 REAL dtdiss
10 integer idissip ! periode de la dissipation (en pas)
11 real tetaudiv(llm),tetaurot(llm),tetah(llm)
12 real cdivu, crot, cdivh
13
14 contains
15
16 SUBROUTINE inidissip
17
18 ! From dyn3d/inidissip.F, version 1.1.1.1 2004/05/19 12:53:06
19 ! Initialisation de la dissipation horizontale
20
21 USE comconst, ONLY : dtvr
22 use comdissnew, only: lstardis, nitergdiv, nitergrot, niterh, tetagdiv, &
23 tetagrot, tetatemp
24 USE comvert, ONLY : preff, presnivs
25 USE conf_gcm_m, ONLY : iperiod
26 USE dimens_m, ONLY : jjm, llm
27 USE paramet_m, ONLY : iip1, ip1jm, ip1jmp1, jjp1
28 use new_unit_m, only: new_unit
29 use filtreg_m, only: filtreg
30
31 ! Variables local to the procedure:
32 REAL zvert(llm), max_zvert
33 REAL zh(ip1jmp1), zu(ip1jmp1), zv(ip1jm), deltap(ip1jmp1, llm)
34 REAL ullm, vllm, umin, vmin, zhmin, zhmax
35 REAL zllm, z1llm
36 INTEGER l, ij, idum, ii, unit
37 REAL tetamin ! in s
38 REAL ran1
39
40 !-----------------------------------------------------------------------
41
42 PRINT *, 'Call sequence information: inidissip'
43
44 ! calcul des valeurs propres des operateurs par methode iterrative:
45
46 crot = -1.
47 cdivu = -1.
48 cdivh = -1.
49
50 ! calcul de la valeur propre de divgrad:
51
52 idum = 0
53 DO l = 1, llm
54 DO ij = 1, ip1jmp1
55 deltap(ij, l) = 1.
56 END DO
57 END DO
58
59 idum = -1
60 zh(1) = ran1(idum) - .5
61 idum = 0
62 DO ij = 2, ip1jmp1
63 zh(ij) = ran1(idum) - .5
64 END DO
65
66 CALL filtreg(zh, jjp1, 1, 2, 1, .TRUE., 1)
67
68 CALL minmax(iip1*jjp1, zh, zhmin, zhmax)
69 IF (zhmin >= zhmax) THEN
70 PRINT *, 'zhmin zhmax', zhmin, zhmax
71 print *, 'Problème générateur aléatoire dans inidissip'
72 STOP 1
73 END IF
74
75 zllm = abs(zhmax)
76 DO l = 1, 50
77 IF (lstardis) THEN
78 CALL divgrad2(1, zh, deltap, niterh, zh)
79 ELSE
80 CALL divgrad(1, zh, niterh, zh)
81 END IF
82
83 CALL minmax(iip1*jjp1, zh, zhmin, zhmax)
84
85 zllm = abs(zhmax)
86 z1llm = 1./zllm
87 DO ij = 1, ip1jmp1
88 zh(ij) = zh(ij)*z1llm
89 END DO
90 END DO
91
92 IF (lstardis) THEN
93 cdivh = 1./zllm
94 ELSE
95 cdivh = zllm**(-1./niterh)
96 END IF
97
98 ! calcul des valeurs propres de gradiv (ii =1) et nxgrarot(ii=2)
99
100 PRINT *, 'calcul des valeurs propres'
101
102 DO ii = 1, 2
103 DO ij = 1, ip1jmp1
104 zu(ij) = ran1(idum) - .5
105 END DO
106 CALL filtreg(zu, jjp1, 1, 2, 1, .TRUE., 1)
107 DO ij = 1, ip1jm
108 zv(ij) = ran1(idum) - .5
109 END DO
110 CALL filtreg(zv, jjm, 1, 2, 1, .FALSE., 1)
111
112 CALL minmax(iip1*jjp1, zu, umin, ullm)
113 CALL minmax(iip1*jjm, zv, vmin, vllm)
114
115 ullm = abs(ullm)
116 vllm = abs(vllm)
117
118 DO l = 1, 50
119 IF (ii==1) THEN
120 IF (lstardis) THEN
121 CALL gradiv2(1, zu, zv, nitergdiv, zu, zv)
122 ELSE
123 CALL gradiv(1, zu, zv, nitergdiv, zu, zv)
124 END IF
125 ELSE
126 IF (lstardis) THEN
127 CALL nxgraro2(1, zu, zv, nitergrot, zu, zv)
128 ELSE
129 CALL nxgrarot(1, zu, zv, nitergrot, zu, zv)
130 END IF
131 END IF
132
133 CALL minmax(iip1*jjp1, zu, umin, ullm)
134 CALL minmax(iip1*jjm, zv, vmin, vllm)
135
136 ullm = abs(ullm)
137 vllm = abs(vllm)
138
139 zllm = max(ullm, vllm)
140 z1llm = 1./zllm
141 DO ij = 1, ip1jmp1
142 zu(ij) = zu(ij)*z1llm
143 END DO
144 DO ij = 1, ip1jm
145 zv(ij) = zv(ij)*z1llm
146 END DO
147 end DO
148
149 IF (ii==1) THEN
150 IF (lstardis) THEN
151 cdivu = 1./zllm
152 ELSE
153 cdivu = zllm**(-1./nitergdiv)
154 END IF
155 ELSE
156 IF (lstardis) THEN
157 crot = 1./zllm
158 ELSE
159 crot = zllm**(-1./nitergrot)
160 END IF
161 END IF
162 END DO
163
164 PRINT *, 'cdivu = ', cdivu
165 PRINT *, 'crot = ', crot
166 PRINT *, 'cdivh = ', cdivh
167
168 ! Variation verticale du coefficient de dissipation :
169 zvert = 2. - 1. / (1. + (preff / presnivs - 1.)**2)
170 ! (between 1 and 2)
171
172 tetaudiv = zvert / tetagdiv
173 tetaurot = zvert / tetagrot
174 tetah = zvert / tetatemp
175 call new_unit(unit)
176 open(unit, file="inidissip.csv", status="replace", action="write")
177 write(unit, fmt=*) "tetaudiv tetaurot tetah" ! title line
178 do l = 1, llm
179 write(unit, fmt=*) tetaudiv(l), tetaurot(l), tetah(l)
180 end do
181 close(unit)
182 print *, 'Created file "inidissip.csv".'
183
184 max_zvert = maxval(zvert)
185 tetamin = min(1E6, tetagdiv / max_zvert, tetagrot / max_zvert, &
186 tetatemp / max_zvert)
187 PRINT *, 'tetamin = ', tetamin
188 idissip = max(1, int(tetamin / (2 * dtvr * iperiod))) * iperiod
189 PRINT *, 'idissip = ', idissip
190 dtdiss = idissip * dtvr
191 PRINT *, 'dtdiss = ', dtdiss
192
193 END SUBROUTINE inidissip
194
195 end module inidissip_m

  ViewVC Help
Powered by ViewVC 1.1.21