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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 47 - (show annotations)
Fri Jul 1 15:00:48 2011 UTC (12 years, 10 months ago) by guez
File size: 4339 byte(s)
Split "thermcell.f" and "cv3_routines.f".
Removed copies of files that are now in "L_util".
Moved "mva9" and "diagetpq" to their own files.
Unified variable names across procedures.

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 ! période de la dissipation (en pas de temps)
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 l_util, 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 zhmin, zhmax
35 REAL zllm
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 opérateurs par méthode itérative :
45
46 crot = -1.
47 cdivu = -1.
48 cdivh = -1.
49
50 ! Calcul de la valeur propre de divgrad :
51
52 deltap = 1.
53 idum = -1
54 zh(1) = ran1(idum) - 0.5
55 idum = 0
56 DO ij = 2, ip1jmp1
57 zh(ij) = ran1(idum) - 0.5
58 END DO
59
60 CALL filtreg(zh, jjp1, 1, 2, 1, .TRUE., 1)
61
62 CALL minmax(iip1*jjp1, zh, zhmin, zhmax)
63 IF (zhmin >= zhmax) THEN
64 PRINT *, 'zhmin zhmax', zhmin, zhmax
65 print *, 'Problème générateur aléatoire dans inidissip'
66 STOP 1
67 END IF
68
69 DO l = 1, 50
70 IF (lstardis) THEN
71 CALL divgrad2(1, zh, deltap, niterh, zh)
72 ELSE
73 CALL divgrad(1, zh, niterh, zh)
74 END IF
75
76 zllm = abs(maxval(zh))
77 zh = zh / zllm
78 END DO
79
80 IF (lstardis) THEN
81 cdivh = 1. / zllm
82 ELSE
83 cdivh = zllm**(- 1. / niterh)
84 END IF
85
86 ! Calcul des valeurs propres de gradiv (ii = 1) et nxgrarot (ii = 2)
87
88 PRINT *, 'Calcul des valeurs propres'
89
90 DO ii = 1, 2
91 DO ij = 1, ip1jmp1
92 zu(ij) = ran1(idum) - 0.5
93 END DO
94 CALL filtreg(zu, jjp1, 1, 2, 1, .TRUE., 1)
95 DO ij = 1, ip1jm
96 zv(ij) = ran1(idum) - 0.5
97 END DO
98 CALL filtreg(zv, jjm, 1, 2, 1, .FALSE., 1)
99
100 DO l = 1, 50
101 IF (ii==1) THEN
102 IF (lstardis) THEN
103 CALL gradiv2(1, zu, zv, nitergdiv, zu, zv)
104 ELSE
105 CALL gradiv(1, zu, zv, nitergdiv, zu, zv)
106 END IF
107 ELSE
108 IF (lstardis) THEN
109 CALL nxgraro2(1, zu, zv, nitergrot, zu, zv)
110 ELSE
111 CALL nxgrarot(1, zu, zv, nitergrot, zu, zv)
112 END IF
113 END IF
114
115 zllm = max(abs(maxval(zu)), abs(maxval(zv)))
116 zu = zu / zllm
117 zv = zv / zllm
118 end DO
119
120 IF (ii==1) THEN
121 IF (lstardis) THEN
122 cdivu = 1. / zllm
123 ELSE
124 cdivu = zllm**(- 1. / nitergdiv)
125 END IF
126 ELSE
127 IF (lstardis) THEN
128 crot = 1./zllm
129 ELSE
130 crot = zllm**(-1. / nitergrot)
131 END IF
132 END IF
133 END DO
134
135 PRINT *, 'cdivu = ', cdivu
136 PRINT *, 'crot = ', crot
137 PRINT *, 'cdivh = ', cdivh
138
139 ! Variation verticale du coefficient de dissipation :
140 zvert = 2. - 1. / (1. + (preff / presnivs - 1.)**2)
141 ! (between 1 and 2)
142
143 tetaudiv = zvert / tetagdiv
144 tetaurot = zvert / tetagrot
145 tetah = zvert / tetatemp
146 call new_unit(unit)
147 open(unit, file="inidissip.csv", status="replace", action="write")
148 write(unit, fmt=*) "tetaudiv tetaurot tetah" ! title line
149 do l = 1, llm
150 write(unit, fmt=*) tetaudiv(l), tetaurot(l), tetah(l)
151 end do
152 close(unit)
153 print *, 'Created file "inidissip.csv".'
154
155 max_zvert = maxval(zvert)
156 tetamin = min(1E6, tetagdiv / max_zvert, tetagrot / max_zvert, &
157 tetatemp / max_zvert)
158 PRINT *, 'tetamin = ', tetamin
159 idissip = max(1, int(tetamin / (2 * dtvr * iperiod))) * iperiod
160 PRINT *, 'idissip = ', idissip
161 dtdiss = idissip * dtvr
162 PRINT *, 'dtdiss = ', dtdiss
163
164 END SUBROUTINE inidissip
165
166 end module inidissip_m

  ViewVC Help
Powered by ViewVC 1.1.21