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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 26 - (show annotations)
Tue Mar 9 15:27:15 2010 UTC (14 years, 2 months ago) by guez
Original Path: trunk/libf/dyn3d/inidissip.f90
File size: 5063 byte(s)
Moved variable "dtdiss" from module "comconst", variable "idissip"
from module "conf_gcm_m" and all variables from module "comdissipn" to
module "inidissip_m". "inidissip" creates file
"inidissip.csv". "idissip" is no longer read from a namelist. Removed
useless computation of "dtdiss" in procedure "iniconst".

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