86 ( kit,pnsftop,pswtra,pderiv, &
87 pcondb,ptsfa,pqtopmelt,pdh,ptsia,osmelt,osnow )
96 INTEGER,
INTENT(in) :: &
100 REAL,
DIMENSION(nl),
INTENT(in) :: &
102 REAL,
INTENT(inout) :: &
104 REAL,
INTENT(out) :: &
105 pcondb,ptsfa,pqtopmelt
106 REAL,
DIMENSION(nilay+1),
INTENT(out) :: &
108 REAL,
DIMENSION(0:nilay),
INTENT(out) :: &
110 LOGICAL,
INTENT(out) :: &
112 LOGICAL,
OPTIONAL,
INTENT(in) :: &
123 LOGICAL,
DIMENSION(0:nilay) :: &
128 zderiv,ztsm,zmelt,zdht,zdqdt,zbl
129 REAL,
DIMENSION(0:nilay+1) :: &
131 REAL,
DIMENSION(0:nilay+1,0:nilay+1) :: &
143 IF ( present(osnow) )
THEN
163 llmeltop = ( ztsfb>=ztsm .AND. zcondt_m>0. )
176 IF ( .NOT. gsnow ) zmat(0,0) = 1.
180 WRITE(noutlu,*)
'=================================='
181 WRITE(noutlu,*)
' Temp. condition: ztsfb=',ztsfb
182 WRITE(noutlu,*)
'=================================='
185 zmat(itop,itop+1) = 0.
186 zmat(itop+1,itop) = 0.
189 WRITE(noutlu,*)
'=================================='
190 WRITE(noutlu,*)
' Flux condition : ztsfb=',ztsfb
191 WRITE(noutlu,*)
' zcondt_m=',zcondt_m
192 WRITE(noutlu,*)
'=================================='
194 zmat(itop,itop) = pderiv - zkodzi(itop)
195 zmat(itop,itop+1) = zkodzi(itop)
196 IF ( .NOT.llmelt(itop) ) zmat(itop+1,itop) = -zetaik(itop)
199 IF ( llmelt(itop) )
THEN
200 zmat(itop+1,itop+1) = 1.
202 zmat(itop+1,itop+1) = 1. + zetaik(itop) + zetaikp1(itop)
203 zmat(itop+1,itop+2) = -zetaikp1(itop)
207 IF ( llmelt(jl-1) )
THEN
210 zmat(jl,jl-1) = -zetaik(jl-1)
211 zmat(jl,jl) = 1. + zetaik(jl-1) + zetaikp1(jl-1)
212 zmat(jl,jl+1) = -zetaikp1(jl-1)
216 IF ( llmelt(nilay) )
THEN
217 zmat(nilay+1,nilay+1) = 1.
219 zmat(nilay+1,nilay) = -zetaik(nilay) + zg2*zetaikp1(nilay)
220 zmat(nilay+1,nilay+1) = 1. + zetaik(nilay) + zg1*zetaikp1(nilay)
225 IF ( lp5 .OR. llredo )
THEN
227 '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
229 WRITE(noutlu,*)
'Initial matrix M'
231 WRITE(noutlu,*) zmat(jl,:)
244 IF ( .NOT. gsnow ) zy(0) = 0.
248 IF ( llmelt(itop) )
THEN
249 zy(itop+1) = ztsi_m0(itop)
251 zy(itop+1) = ztsi0(itop) + zetaik(itop)*ztsm + &
252 xswhdfr*pswtra(nilay+1-itop)*zetai(itop)
255 zy(itop) = -znsftop0 + pderiv*ztsf0
256 IF ( llmelt(itop) )
THEN
257 zy(itop+1) = ztsi_m0(itop)
259 zy(itop+1) = ztsi0(itop) + &
260 xswhdfr*pswtra(nilay+1-itop)*zetai(itop)
264 IF ( llmelt(jl-1) )
THEN
265 zy(jl) = ztsi_m0(jl-1)
267 zy(jl) = ztsi0(jl-1) + xswhdfr*pswtra(nilay+2-jl)*zetai(jl-1)
270 IF ( llmelt(nilay) )
THEN
271 zy(nilay+1) = ztsi_m0(nilay)
273 zy(nilay+1) = (zg1+zg2)*zetaikp1(nilay)*zmlf + ztsi0(nilay) + &
274 xswhdfr*pswtra(1)*zetai(nilay)
283 IF ( lp4 .OR. llredo )
THEN
285 WRITE(noutlu,*)
'Initial vector'
287 WRITE(noutlu,*)
'Initial vtp'
288 WRITE(noutlu,*) ztsi0(:)
292 zx(jl) = sum( zmatinv(jl,:)*zy(:) )
295 IF ( lp4 .OR. llredo )
THEN
297 WRITE(noutlu,*)
'Initial matrix by found vector:'
299 WRITE(noutlu,*) sum( zmat(jl,:)*zx(:) )
309 ptsfa = max( zx(itop),pptsfmin )
318 zkodzi(nilay+1)*( zg1*( zmlf-ptsia(nilay) )+ &
319 zg2*( zmlf-ptsia(nilay-1) ) )
322 llmeltop = ( ptsfa>=ztsm )
324 zcondt_m = -zkodzi(itop)* ( ptsia(itop) - ptsfa )
341 zdqdt = zderiv*min( zx(itop)-pptsfmin,0. )
342 pcondb = pcondb + zdqdt
347 zmelt = sum( zinvetai(:)*max(ptsia(:)-ztsi_m0(:),0.) )
350 ptsia(:) = min( ptsia(:),ztsi_m0(:) )
354 pqtopmelt = znsftop0-zcondt_m+zmelt
359 IF ( lp4 .OR. llredo )
THEN
360 WRITE(noutlu,*)
'Previous surface temperature =',ztsf0
361 WRITE(noutlu,*)
'New surface temperature =',ptsfa
362 WRITE(noutlu,*)
'Previous vtp:'
363 WRITE(noutlu,*) ztsi0
364 WRITE(noutlu,*)
'New vtp :'
365 WRITE(noutlu,*) ptsia
366 WRITE(noutlu,*)
'zcondt =',znsftop0
376 IF ( lp3 .OR. llredo )
THEN
379 WRITE(noutlu,*)
'Energy check'
380 WRITE(noutlu,*)
'============='
382 WRITE(noutlu,*)
'Left hand-side (vhdslab):'
383 WRITE(noutlu,*)
'--------------------------'
384 WRITE(noutlu,*)
' Non-solar heat flux at the top:', &
386 WRITE(noutlu,*)
' Absorbed solar heat flux:', &
387 xswhdfr * sum(pswtra(1:nilay+1-itop))
388 WRITE(noutlu,*)
' Cond. heat flux at the bottom:', &
391 ' Additional heat flux at the top dQ/dT*(Tnew-Told):', &
392 zderiv*( ptsfa-ztsf0 )
396 WRITE(noutlu,*)
'Right hand-side:'
397 WRITE(noutlu,*)
'-----------------'
398 zdht = sum( ( ptsia(:)-ztsi0(:) ) * zinvetai(:) )
399 WRITE(noutlu,*)
' Enthalpy change per time unit:', &
401 WRITE(noutlu,*)
' Top melting flux:', &
410 'Left hand-side minus right-hand side'
412 '-------------------------------------'
413 zbl = zdht + pqtopmelt - &
414 ( pcondb + xswhdfr*sum(pswtra(1:nilay+1-itop)) + &
415 pnsftop + zderiv*( ptsfa-ztsf0 ) )
417 IF ( abs(zbl)>0.1 )
THEN
419 WRITE(noutlu,*)
'Imbalance'
420 WRITE(noutlu,*)
'llmeltop =',llmeltop
421 WRITE(noutlu,*)
'gsnow =',gsnow
422 WRITE(noutlu,*)
'pqtopmelt=',pqtopmelt
423 WRITE(noutlu,*)
'znsftop0 =',znsftop0
424 WRITE(noutlu,*)
'-zcondt_m=',-zcondt_m
425 WRITE(noutlu,*)
'zmelt =',zmelt
431 IF ( lp5 .OR. llredo )
THEN
434 WRITE(noutlu,*)
'Check the equations'
439 zmat(itop,itop)*ptsfa + zmat(itop,itop+1)*ptsia(itop), &
447 - zmat(itop+1,itop)*ptsfa + &
448 zmat(itop+1,itop+1)*ptsia(itop) &
449 - zmat(itop+1,itop+2)*ptsia(itop+1), &
462 - zetaik(jl-1)*ptsia(jl-2) + &
463 ( 1.+zetaik(jl-1)+zetaikp1(jl-1) )*ptsia(jl-1) &
464 - zetaikp1(jl-1)*ptsia(jl), &
470 ( -zetaik(nilay)+zg2*zetaikp1(nilay) )*ptsia(nilay-1) + &
471 ( 1.+zetaik(nilay)+zg1*zetaikp1(nilay) )*ptsia(nilay), &
472 (zg1+zg2)*zetaikp1(nilay)*zmlf + ztsi0(nilay)
483 pdh(jl) = zrhocpsi(nilay+1-jl)/rhoice * &
484 ( ptsia(nilay+1-jl)-ztsi0(nilay+1-jl) )
487 pdh(nilay+1) = cpice0 * ( ptsia(0)-ztsi0(0) )
subroutine glt_vhdslab_r(kit, pnsftop, pswtra, pderiv, pcondb, ptsfa, pqtopmelt, pdh, ptsia, osmelt, osnow)
subroutine glt_invert(kdiag, pmat)