1 | c*********************************************************************** |
---|
2 | |
---|
3 | subroutine mzcud( tauinf,tau, c,cup,cdw,vc,taugr, |
---|
4 | @ ib,isot,icfout,itableout ) |
---|
5 | |
---|
6 | c old times mlp first version of mzcf |
---|
7 | c a.k.murphy method to avoid extrapolation in the curtis matrix |
---|
8 | c feb-89 malv AKM method to avoid extrapolation in C.M. |
---|
9 | c 25-sept-96 cristina dejar las matrices en doble precision |
---|
10 | c jan 98 malv version para mz1d |
---|
11 | c oct 01 malv update version for fluxes for hb and fb |
---|
12 | c jul 2011 malv+fgg Adapted to LMD-MGCM |
---|
13 | c*********************************************************************** |
---|
14 | |
---|
15 | implicit none |
---|
16 | |
---|
17 | include 'comcstfi.h' |
---|
18 | include 'nltedefs.h' |
---|
19 | include 'nlte_atm.h' |
---|
20 | include 'nlte_data.h' |
---|
21 | include 'tcr_15um.h' |
---|
22 | include 'nlte_curtis.h' |
---|
23 | |
---|
24 | c arguments |
---|
25 | real*8 c(nl,nl), cup(nl,nl), cdw(nl,nl) ! o |
---|
26 | real*8 vc(nl), taugr(nl) ! o |
---|
27 | real*8 tau(nl,nl) ! i |
---|
28 | real*8 tauinf(nl) ! i |
---|
29 | integer ib ! i |
---|
30 | integer isot ! i |
---|
31 | integer icfout, itableout ! i |
---|
32 | |
---|
33 | c external |
---|
34 | external bandid |
---|
35 | character*2 bandid |
---|
36 | |
---|
37 | c local variables |
---|
38 | integer i, in, ir, iw, itblout |
---|
39 | real*8 cfup(nl,nl), cfdw(nl,nl) |
---|
40 | real*8 a(nl,nl), cf(nl,nl) |
---|
41 | character isotcode*2, bcode*2 |
---|
42 | |
---|
43 | c formats |
---|
44 | 101 format(i1) |
---|
45 | 202 format(i2) |
---|
46 | 180 format(a80) |
---|
47 | 181 format(a80) |
---|
48 | c*********************************************************************** |
---|
49 | |
---|
50 | if (isot.eq.1) isotcode = '26' |
---|
51 | if (isot.eq.2) isotcode = '28' |
---|
52 | if (isot.eq.3) isotcode = '36' |
---|
53 | if (isot.eq.4) isotcode = '27' |
---|
54 | if (isot.eq.5) isotcode = 'co' |
---|
55 | bcode = bandid( ib ) |
---|
56 | |
---|
57 | ! write (*,*) ' ' |
---|
58 | |
---|
59 | do in=1,nl |
---|
60 | |
---|
61 | do ir=1,nl |
---|
62 | |
---|
63 | cf(in,ir) = 0.0d0 |
---|
64 | cfup(in,ir) = 0.0d0 |
---|
65 | cfdw(in,ir) = 0.0d0 |
---|
66 | c(in,ir) = 0.0d0 |
---|
67 | cup(in,ir) = 0.0d0 |
---|
68 | cdw(in,ir) = 0.0d0 |
---|
69 | a(in,ir) = 0.0d0 |
---|
70 | |
---|
71 | end do |
---|
72 | |
---|
73 | vc(in) = 0.0d0 |
---|
74 | taugr(in) = 0.0d0 |
---|
75 | |
---|
76 | end do |
---|
77 | |
---|
78 | |
---|
79 | c the next lines are a reduced and equivalent way of calculating |
---|
80 | c the c(in,ir) elements for n=2,nl1 and r=1,nl |
---|
81 | |
---|
82 | |
---|
83 | c do in=2,nl1 |
---|
84 | c do ir=1,nl |
---|
85 | c if(ir.eq.1)then |
---|
86 | c c(in,ir)=tau(in-1,1)-tau(in+1,1) |
---|
87 | c elseif(ir.eq.nl)then |
---|
88 | c c(in,ir)=tau(in+1,nl1)-tauinf(in+1)-tau(in-1,nl1)+tauinf(in-1) |
---|
89 | c else |
---|
90 | c c(in,ir)=tau(in+1,ir-1)-tau(in+1,ir)-tau(in-1,ir-1)+tau(in-1,ir) |
---|
91 | c end if |
---|
92 | c c(in,ir)=c(in,ir)*pi*deltanu(ib)/(2.*deltaz*1.0e5) |
---|
93 | c end do |
---|
94 | c end do |
---|
95 | c go to 1000 |
---|
96 | |
---|
97 | c calculation of the matrix cfup(nl,nl) |
---|
98 | |
---|
99 | cfup(1,1) = 1.d0 - tau(1,1) |
---|
100 | |
---|
101 | do in=2,nl |
---|
102 | do ir=1,in |
---|
103 | |
---|
104 | if (ir.eq.1) then |
---|
105 | cfup(in,ir) = tau(in,ir) - tau(in,1) |
---|
106 | elseif (ir.eq.in) then |
---|
107 | cfup(in,ir) = 1.d0 - tau(in,ir-1) |
---|
108 | else |
---|
109 | cfup(in,ir) = tau(in,ir) - tau(in,ir-1) |
---|
110 | end if |
---|
111 | |
---|
112 | end do |
---|
113 | end do |
---|
114 | |
---|
115 | ! contribution to upwards fluxes from bb at bottom : |
---|
116 | do in=1,nl |
---|
117 | taugr(in) = tau(in,1) |
---|
118 | enddo |
---|
119 | |
---|
120 | c calculation of the matrix cfdw(nl,nl) |
---|
121 | |
---|
122 | cfdw(nl,nl) = 1.d0 - tauinf(nl) |
---|
123 | |
---|
124 | do in=1,nl-1 |
---|
125 | do ir=in,nl |
---|
126 | |
---|
127 | if (ir.eq.in) then |
---|
128 | cfdw(in,ir) = 1.d0 - tau(in,ir) |
---|
129 | elseif (ir.eq.nl) then |
---|
130 | cfdw(in,ir) = tau(in,ir-1) - tauinf(in) |
---|
131 | else |
---|
132 | cfdw(in,ir) = tau(in,ir-1) - tau(in,ir) |
---|
133 | end if |
---|
134 | |
---|
135 | end do |
---|
136 | end do |
---|
137 | |
---|
138 | |
---|
139 | c calculation of the matrix cf(nl,nl) |
---|
140 | |
---|
141 | do in=1,nl |
---|
142 | do ir=1,nl |
---|
143 | |
---|
144 | if (ir.eq.1) then |
---|
145 | ! version con l_bb(tg) = l_bb(t(1))=j(1) (see also vc below) |
---|
146 | ! cf(in,ir) = tau(in,ir) |
---|
147 | ! version con l_bb(tg) =/= l_bb(t(1))=j(1) (see also vc below) |
---|
148 | cf(in,ir) = tau(in,ir) - tau(in,1) |
---|
149 | elseif (ir.eq.nl) then |
---|
150 | cf(in,ir) = tauinf(in) - tau(in,ir-1) |
---|
151 | else |
---|
152 | cf(in,ir) = tau(in,ir) - tau(in,ir-1) |
---|
153 | end if |
---|
154 | |
---|
155 | end do |
---|
156 | end do |
---|
157 | |
---|
158 | |
---|
159 | c definition of the a(nl,nl) matrix |
---|
160 | |
---|
161 | do in=2,nl-1 |
---|
162 | do ir=1,nl |
---|
163 | if (ir.eq.in+1) a(in,ir) = -1.d0 |
---|
164 | if (ir.eq.in-1) a(in,ir) = +1.d0 |
---|
165 | a(in,ir) = a(in,ir) / ( 2.d0*deltaz*1.d5 ) |
---|
166 | end do |
---|
167 | end do |
---|
168 | ! this is not needed anymore in the akm scheme |
---|
169 | ! a(1,1) = +3.d0 |
---|
170 | ! a(1,2) = -4.d0 |
---|
171 | ! a(1,3) = +1.d0 |
---|
172 | ! a(nl,nl) = -3.d0 |
---|
173 | ! a(nl,nl1) = +4.d0 |
---|
174 | ! a(nl,nl2) = -1.d0 |
---|
175 | |
---|
176 | c calculation of the final curtis matrix ("reduced" by murphy's method) |
---|
177 | |
---|
178 | if (isot.ne.5) then |
---|
179 | do in=1,nl |
---|
180 | do ir=1,nl |
---|
181 | cf(in,ir) = cf(in,ir) * pi*deltanu(isot,ib) |
---|
182 | cfup(in,ir) = cfup(in,ir) * pi*deltanu(isot,ib) |
---|
183 | cfdw(in,ir) = cfdw(in,ir) * pi*deltanu(isot,ib) |
---|
184 | end do |
---|
185 | taugr(in) = taugr(in) * pi*deltanu(isot,ib) |
---|
186 | end do |
---|
187 | else |
---|
188 | do in=1,nl |
---|
189 | do ir=1,nl |
---|
190 | cf(in,ir) = cf(in,ir) * pi*deltanuco |
---|
191 | enddo |
---|
192 | taugr(in) = taugr(in) * pi*deltanuco |
---|
193 | enddo |
---|
194 | endif |
---|
195 | |
---|
196 | do in=2,nl-1 |
---|
197 | |
---|
198 | do ir=1,nl |
---|
199 | |
---|
200 | do i=1,nl |
---|
201 | ! only c contains the matrix a. matrixes cup,cdw dont because |
---|
202 | ! these two will be used for flux calculations, not |
---|
203 | ! only for flux divergencies |
---|
204 | |
---|
205 | c(in,ir) = c(in,ir) + a(in,i) * cf(i,ir) |
---|
206 | ! from this matrix we will extract (see below) the |
---|
207 | ! nl2 x nl2 "core" for the "reduced" final curtis matrix. |
---|
208 | |
---|
209 | end do |
---|
210 | cup(in,ir) = cfup(in,ir) |
---|
211 | cdw(in,ir) = cfdw(in,ir) |
---|
212 | |
---|
213 | end do |
---|
214 | ! version con l_bb(tg) = l_bb(t(1))=j(1) (see cf above) |
---|
215 | !vc(in) = c(in,1) |
---|
216 | ! version con l_bb(tg) =/= l_bb(t(1))=j(1) (see cf above) |
---|
217 | if (isot.ne.5) then |
---|
218 | vc(in) = pi*deltanu(isot,ib)/( 2.d0*deltaz*1.d5 ) * |
---|
219 | @ ( tau(in-1,1) - tau(in+1,1) ) |
---|
220 | else |
---|
221 | vc(in) = pi*deltanuco/( 2.d0*deltaz*1.d5 ) * |
---|
222 | @ ( tau(in-1,1) - tau(in+1,1) ) |
---|
223 | endif |
---|
224 | |
---|
225 | end do |
---|
226 | |
---|
227 | 5 continue |
---|
228 | |
---|
229 | ! write (*,*) 'mztf/1/ c(2,*) =', (c(2,i), i=1,nl) |
---|
230 | |
---|
231 | ! call elimin_dibuja(c,nl,itableout) |
---|
232 | |
---|
233 | c ventana del smoothing de c es nw=3 y de vc es 5 (puesto en lisa): |
---|
234 | c subroutine elimin_mz4(c,vc,ilayer,nl,nan,iw, nw) |
---|
235 | |
---|
236 | iw = nan |
---|
237 | if (isot.eq.4) iw = 5 ! eliminates values < 1.d-19 |
---|
238 | if (itableout.eq.30) then |
---|
239 | itblout = 0 |
---|
240 | else |
---|
241 | itblout = itableout |
---|
242 | endif |
---|
243 | call elimin_mz1d (c,vc,0,iw,itblout,nw) |
---|
244 | |
---|
245 | ! upper boundary condition |
---|
246 | ! j'(nl) = j'(nl1) ==> j(nl) = 2j(nl1) - j(nl2) ==> |
---|
247 | do in=2,nl-1 |
---|
248 | c(in,nl-2) = c(in,nl-2) - c(in,nl) |
---|
249 | c(in,nl-1) = c(in,nl-1) + 2.d0*c(in,nl) |
---|
250 | cup(in,nl-2) = cup(in,nl-2) - cup(in,nl) |
---|
251 | cup(in,nl-1) = cup(in,nl-1) + 2.d0*cup(in,nl) |
---|
252 | cdw(in,nl-2) = cdw(in,nl-2) - cdw(in,nl) |
---|
253 | cdw(in,nl-1) = cdw(in,nl-1) + 2.d0*cdw(in,nl) |
---|
254 | end do |
---|
255 | ! j(nl) = j(nl1) ==> |
---|
256 | ! do in=2,nl1 |
---|
257 | ! c(in,nl1) = c(in,nl1) + c(in,nl) |
---|
258 | ! end do |
---|
259 | |
---|
260 | ! 1000 continue |
---|
261 | |
---|
262 | |
---|
263 | if (icfout.eq.1) then |
---|
264 | |
---|
265 | ! if (ib.eq.1 .or. ib.eq.12 .or. ib.eq.16 .or. ib.eq.18) then |
---|
266 | ! codmatrx = codmatrx_fb |
---|
267 | ! else |
---|
268 | ! codmatrx = codmatrx_hot |
---|
269 | ! end if |
---|
270 | ! if (ib.eq.1.or.ib.eq.2.or.ib.eq.3.or.ib.eq.4.or.ib.eq.5 |
---|
271 | ! @ .or.ib.eq.6.or.ib.eq.7.or.ib.eq.8.or.ib.eq.9) then |
---|
272 | ! ibcode2 = '0'//ibcode1 |
---|
273 | ! else |
---|
274 | ! write ( ibcode2, 202) ib |
---|
275 | ! endif |
---|
276 | |
---|
277 | ! open ( 1, access='sequential', form='unformatted', file= |
---|
278 | ! @ dircurtis//'cfl'//isotcode//dn//ibcode2//codmatrx//'.dat') |
---|
279 | ! open ( 2, access='sequential', form='unformatted', file= |
---|
280 | ! @ dircurtis//'cflup'//isotcode//dn//ibcode2//codmatrx//'.dat') |
---|
281 | ! open ( 3, access='sequential', form='unformatted', file= |
---|
282 | ! @ dircurtis//'cfldw'//isotcode//dn//ibcode2//codmatrx//'.dat') |
---|
283 | ! open ( 4, access='sequential', form='unformatted', file= |
---|
284 | ! @ dircurtis//'cflgr'//isotcode//dn//ibcode2//codmatrx//'.dat') |
---|
285 | |
---|
286 | ! write(1) dummy |
---|
287 | ! write(1) ' format: (vc(n),(ch(n,r),r=2,nl-1),n=2,nl-1)' |
---|
288 | ! do in=2,nl-1 |
---|
289 | ! write(1) vc(in), (c(in,ir) , ir=2,nl-1 ) |
---|
290 | !! write (*,*) in, vc(in) |
---|
291 | ! end do |
---|
292 | |
---|
293 | ! write(2) dummy |
---|
294 | ! write(2)' format: (cfup(n,r),r=1,nl), n=1,nl)' |
---|
295 | ! do in=1,nl |
---|
296 | ! write(2) ( cup(in,ir) , ir=1,nl ) |
---|
297 | ! end do |
---|
298 | |
---|
299 | ! write(3) dummy |
---|
300 | ! write(3)' format: (cfdw(n,r),r=1,nl), n=1,nl)' |
---|
301 | ! do in=1,nl |
---|
302 | ! write(3) (cdw(in,ir) , ir=1,nl ) |
---|
303 | ! end do |
---|
304 | |
---|
305 | ! write(4) dummy |
---|
306 | ! write(4)' format: (taugr(n), n=1,nl)' |
---|
307 | ! do in=1,nl |
---|
308 | ! write(4) (taugr(in), ir=1,nl ) |
---|
309 | ! end do |
---|
310 | ! !write (*,*) ' Last value in file: ', taugr(nl) |
---|
311 | |
---|
312 | ! write (*,'(1x,30hcurtis matrix written out in: ,a,a,a,a)' ) |
---|
313 | ! @ dircurtis//'cfl'//isotcode//dn//ibcode2//codmatrx//'.dat', |
---|
314 | ! @ dircurtis//'cflup'//isotcode//dn//ibcode2//codmatrx//'.dat', |
---|
315 | ! @ dircurtis//'cfldw'//isotcode//dn//ibcode2//codmatrx//'.dat', |
---|
316 | ! @ dircurtis//'cflgr'//isotcode//dn//ibcode2//codmatrx//'.dat' |
---|
317 | |
---|
318 | ! close (1) |
---|
319 | ! close (2) |
---|
320 | ! close (3) |
---|
321 | ! close (4) |
---|
322 | |
---|
323 | else |
---|
324 | |
---|
325 | ! write (*,*) ' no curtis matrix output file ', char(10) |
---|
326 | |
---|
327 | end if |
---|
328 | |
---|
329 | if (itableout.eq.30) then ! Force output of C.M. in ascii file |
---|
330 | |
---|
331 | ! if (ib.eq.1 .or. ib.eq.12 .or. ib.eq.16 .or. ib.eq.18) then |
---|
332 | ! codmatrx = codmatrx_fb |
---|
333 | ! else |
---|
334 | ! codmatrx = codmatrx_hot |
---|
335 | ! end if |
---|
336 | ! if (ib.eq.1.or.ib.eq.2.or.ib.eq.3.or.ib.eq.4.or.ib.eq.5 |
---|
337 | ! @ .or.ib.eq.6.or.ib.eq.7.or.ib.eq.8.or.ib.eq.9) then |
---|
338 | ! ibcode2 = '0'//ibcode1 |
---|
339 | ! else |
---|
340 | ! write ( ibcode2, 202) ib |
---|
341 | ! endif |
---|
342 | |
---|
343 | ! open (10, file= |
---|
344 | ! & dircurtis//'table'//isotcode//dn//ibcode2//codmatrx//'.dat') |
---|
345 | ! write(10,*) nl, ' = number of layers ' |
---|
346 | ! write(10,*) ' format: (vc(n),(ch(n,r),r=2,nl-1),n=2,nl-1)' |
---|
347 | ! do in=2,nl-1 |
---|
348 | ! write(10,*) vc(in), (c(in,ir) , ir=2,nl-1 ) |
---|
349 | ! enddo |
---|
350 | ! close (10) |
---|
351 | endif |
---|
352 | |
---|
353 | c end |
---|
354 | return |
---|
355 | end |
---|