/[lmdze]/trunk/libf/dyn3d/inidissip.f90
ViewVC logotype

Contents of /trunk/libf/dyn3d/inidissip.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 27 - (show annotations)
Thu Mar 25 14:29:07 2010 UTC (14 years, 1 month ago) by guez
File size: 5046 byte(s)
"dyn3d" and "filtrez" do not contain any included file so make rules
have been updated.

"comdissip.f90" was useless, removed it.

"dynredem0" wrote undefined value in "controle(31)", that was
overwritten by "dynredem1". Now "dynredem0" just writes 0 to
"controle(31)".

Removed arguments of "inidissip". "inidissip" now accesses the
variables by use association.

In program "etat0_lim", "itaufin" is not defined so "dynredem1" wrote
undefined value to "controle(31)". Added argument "itau" of
"dynredem1" to correct that.

"itaufin" does not need to be a module variable (of "temps"), made it
a local variable of "leapfrog".

Removed calls to "diagedyn" from "leapfrog".

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
70 IF (zhmin>=zhmax) THEN
71 PRINT *, ' Inidissip zh min max ', zhmin, zhmax
72 STOP 'probleme generateur alleatoire dans inidissip'
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
104 DO ij = 1, ip1jmp1
105 zu(ij) = ran1(idum) - .5
106 END DO
107 CALL filtreg(zu, jjp1, 1, 2, 1, .TRUE., 1)
108 DO ij = 1, ip1jm
109 zv(ij) = ran1(idum) - .5
110 END DO
111 CALL filtreg(zv, jjm, 1, 2, 1, .FALSE., 1)
112
113 CALL minmax(iip1*jjp1, zu, umin, ullm)
114 CALL minmax(iip1*jjm, zv, vmin, vllm)
115
116 ullm = abs(ullm)
117 vllm = abs(vllm)
118
119 DO l = 1, 50
120 IF (ii==1) THEN
121 IF (lstardis) THEN
122 CALL gradiv2(1, zu, zv, nitergdiv, zu, zv)
123 ELSE
124 CALL gradiv(1, zu, zv, nitergdiv, zu, zv)
125 END IF
126 ELSE
127 IF (lstardis) THEN
128 CALL nxgraro2(1, zu, zv, nitergrot, zu, zv)
129 ELSE
130 CALL nxgrarot(1, zu, zv, nitergrot, zu, zv)
131 END IF
132 END IF
133
134 CALL minmax(iip1*jjp1, zu, umin, ullm)
135 CALL minmax(iip1*jjm, zv, vmin, vllm)
136
137 ullm = abs(ullm)
138 vllm = abs(vllm)
139
140 zllm = max(ullm, vllm)
141 z1llm = 1./zllm
142 DO ij = 1, ip1jmp1
143 zu(ij) = zu(ij)*z1llm
144 END DO
145 DO ij = 1, ip1jm
146 zv(ij) = zv(ij)*z1llm
147 END DO
148 end DO
149
150 IF (ii==1) THEN
151 IF (lstardis) THEN
152 cdivu = 1./zllm
153 ELSE
154 cdivu = zllm**(-1./nitergdiv)
155 END IF
156 ELSE
157 IF (lstardis) THEN
158 crot = 1./zllm
159 ELSE
160 crot = zllm**(-1./nitergrot)
161 END IF
162 END IF
163
164 END DO
165
166 PRINT *, 'cdivu = ', cdivu
167 PRINT *, 'crot = ', crot
168 PRINT *, 'cdivh = ', cdivh
169
170 ! Variation verticale du coefficient de dissipation :
171 zvert = 2. - 1. / (1. + (preff / presnivs - 1.)**2)
172 ! (between 1 and 2)
173
174 tetaudiv = zvert / tetagdiv
175 tetaurot = zvert / tetagrot
176 tetah = zvert / tetatemp
177 call new_unit(unit)
178 open(unit, file="inidissip.csv", status="replace", action="write")
179 write(unit, fmt=*) "tetaudiv tetaurot tetah" ! title line
180 do l = 1, llm
181 write(unit, fmt=*) tetaudiv(l), tetaurot(l), tetah(l)
182 end do
183 close(unit)
184 print *, 'Created file "inidissip.csv".'
185
186 max_zvert = maxval(zvert)
187 tetamin = min(1E6, tetagdiv / max_zvert, tetagrot / max_zvert, &
188 tetatemp / max_zvert)
189 PRINT *, 'tetamin = ', tetamin
190 idissip = max(1, int(tetamin / (2 * dtvr * iperiod))) * iperiod
191 PRINT *, 'idissip = ', idissip
192 dtdiss = idissip * dtvr
193 PRINT *, 'dtdiss = ', dtdiss
194
195 END SUBROUTINE inidissip
196
197 end module inidissip_m

  ViewVC Help
Powered by ViewVC 1.1.21