100 ( tpdom,pmlf,pderiv,tpsit,tpdia, &
101 pnsftop,pswtra,pent,pvsp,pcondb,pqtopmelt,pdhmelt,gsmelt )
109 USE modi_gltools_glterr
110 USE modi_glt_vhdslab_r
122 TYPE(t_dom),
DIMENSION(np),
INTENT(in) :: &
124 REAL,
DIMENSION(np),
INTENT(in) :: &
126 REAL,
DIMENSION(nt,np),
INTENT(inout) :: &
128 TYPE(t_sit),
DIMENSION(nt,np),
INTENT(inout) :: &
130 TYPE(t_dia),
DIMENSION(np),
INTENT(inout) :: &
132 REAL,
DIMENSION(nt,np),
INTENT(inout) :: &
134 REAL,
DIMENSION(nl,nt,np),
INTENT(in) :: &
136 REAL,
DIMENSION(nl,nt,np),
INTENT(inout) :: &
138 REAL,
DIMENSION(nl,nt,np),
INTENT(inout) :: &
140 REAL,
DIMENSION(nt,np),
INTENT(out) :: &
142 REAL,
DIMENSION(nl,nt,np),
INTENT(out) :: &
144 LOGICAL,
DIMENSION(nt,np),
INTENT(out) :: &
152 llice,llsnw,llmelt,llconv,lltempcond
153 LOGICAL,
DIMENSION(nt,np) :: &
157 INTEGER,
PARAMETER :: &
161 INTEGER,
DIMENSION(nt,np) :: &
163 LOGICAL,
DIMENSION(nt,np) :: &
166 zcva,zcvb,zdhmelt,zhs
168 zcpsn,zrks,zfsi,zrkeq,zderiv, &
169 zinsftop,zicondb,zidhi,zidhs, &
170 ziswa,zinrg,ztsfa,zcondb,zqtopmelta
171 REAL,
DIMENSION(nilay) :: &
173 REAL,
DIMENSION(0:nilay) :: &
175 REAL,
DIMENSION(nilay) :: &
177 REAL,
DIMENSION(np) :: &
179 REAL,
DIMENSION(nl) :: &
181 REAL,
DIMENSION(nt,np) :: &
182 ztsftrd,zderiv2,ztint,zwork
183 REAL,
DIMENSION(nt,np) :: &
184 z1,z2,z3,z4,z5,z6,z7, &
185 zswtra_all,zcondb_all,zderiv_all,zdh_all,zqtopmelta_all, &
186 zdhmelt0,zdhmelt1,zdhmelt2,zdhmelt3,zdhmelt4,zdhmelt5, &
188 type(t_vtp),
dimension(nl,nt,np) :: &
190 REAL,
DIMENSION(nl,nt,np) :: &
192 REAL,
DIMENSION(nl,nt,np) :: &
193 zvtptrd,zvtp,zdent,zdenti
195 ztot_ice_snow, zfailures
207 'The number of snow layers should be equal to 1',
'STOP' )
212 'The number of ice layers should be >= 3',
'STOP' )
222 ALLOCATE( zetai(0:nilay))
223 ALLOCATE( zinvetai(0:nilay) )
224 ALLOCATE( zetaik(0:nilay))
225 ALLOCATE( zetaikp1(0:nilay) )
226 ALLOCATE( zrhocpsi(nilay))
227 ALLOCATE( ztsib(0:nilay))
228 ALLOCATE( ztsi0(0:nilay) )
229 ALLOCATE( ztsi_m0(0:nilay) )
230 ALLOCATE( zkodzi(0:nilay+1) )
242 ztsi_m(:,:,:) = -mu * pvsp(:,:,:)
271 gsmelt(:,:) = .false.
286 WHERE( tpsit(:,:)%hsi>epsil1 )
304 WHERE ( pent(jl,:,:)>cpsw*ztsi_m(jl,:,:) )
305 pdhmelt(jl,:,:) = pdhmelt(jl,:,:) + &
306 rhoice*tpsit(:,:)%hsi*sf3tinv(jl)*( pent(jl,:,:)-cpsw*ztsi_m(jl,:,:) )
307 pent(jl,:,:) = cpsw*ztsi_m(jl,:,:)
316 WHERE ( pent(nilay+1,:,:)>-xmhofusn0 )
317 pdhmelt(nilay+1,:,:) = pdhmelt(nilay+1,:,:) + &
318 tpsit(:,:)%rsn*tpsit(:,:)%hsn*( pent(nilay+1,:,:)+xmhofusn0 )
319 pent(nilay+1,:,:) = -xmhofusn0
321 zdenti = pent(:,:,:) - zdenti(:,:,:)
327 zdhmelt0 = sum(pdhmelt,dim=1)/dtt
347 ztsfb = tpsit(jk,jp)%tsf
351 ztsib(jl) = zvtp(nilay+1-jl,jk,jp)
355 ztsib(0) = zvtp(nl,jk,jp)
360 zfsi = tpsit(jk,jp)%fsi
361 zdzi(:) = tpsit(jk,jp)%hsi * sf3t(:)
365 ztsi_m0(jl) = ztsi_m(nilay+1-jl,jk,jp)
366 zvsp0(jl) = pvsp(nilay+1-jl,jk,jp)
379 znsftop0 = pnsftop(jk,jp)
398 llice = ( zfsi>epsil1 .AND. tpsit(jk,jp)%hsi>epsil1 )
399 llsnw = ( llice .AND. zfsi>epsil1 .AND. tpsit(jk,jp)%hsn>epsil1 )
404 DO WHILE ( icv(jk,jp)==0 .AND. jit<=nit )
414 IF ( llredo .AND. lwg )
THEN
415 WRITE(noutlu,*)
'Sea ice concentr. = ',zfsi
416 WRITE(noutlu,*)
'Sea ice thickness = ',tpsit(jk,jp)%hsi
417 WRITE(noutlu,*)
'Snow thickness = ',tpsit(jk,jp)%hsn
418 WRITE(noutlu,*)
'Snow density = ',tpsit(jk,jp)%rsn
431 zrhocpsi(:) = rhocpice0
432 WHERE( ztsi_m0(1:nilay)<-epsil1 )
433 zrhocpsi(:) = zrhocpsi(:) - &
434 hofusn0*ztsi_m0(1:nilay) / ( ztsi0(1:nilay)*ztsia(1:nilay) )
442 WHERE( ztsia(1:nilay)<xtempc )
443 zrkice(:) = rhoice/rhoice0 * &
444 ( xrki1 + xrki2*ztsia(1:nilay) + &
445 xrki3 * zvsp0(1:nilay) / ztsia(1:nilay) )
447 zrkice(:) = rhoice/rhoice0 * &
448 ( xrki1 + xrki2*xtempc + xrki3 * zvsp0(:) / xtempc )
450 zetai(1:nilay) = dtt / ( zrhocpsi(:)*zdzi(:) )
451 zinvetai(1:nilay) = 1./zetai(1:nilay)
459 zetai(0) = dtt / ( tpsit(jk,jp)%rsn*zcpsn*tpsit(jk,jp)%hsn )
460 zinvetai(0) = 1./zetai(0)
462 zkodzi(0) = 2.*zrks / tpsit(jk,jp)%hsn
464 zkodzi(1) = 2.*zrkice(1)*zrks / &
465 ( zrkice(1)*tpsit(jk,jp)%hsn + zrks*zdzi(1) )
474 zkodzi(1) = 2.*zrkice(1)/zdzi(1)
479 zkodzi(jl) = 2.*zrkice(jl-1)*zrkice(jl) / &
480 ( zrkice(jl-1)*zdzi(jl) + zrkice(jl)*zdzi(jl-1) )
483 zkodzi(nilay+1) = 2.*zrkice(nilay)/zdzi(nilay)
486 zetaik(:) = zetai(:)*zkodzi(0:nilay)
487 zetaikp1(:) = zetai(:)*zkodzi(1:nilay+1)
497 zderiv = pderiv(jk,jp)
500 ( jit,pnsftop(jk,jp),pswtra(:,jk,jp), &
501 zderiv,zcondb,ztsfa,zqtopmelta,zdh,ztsia,llmelt,osnow=llsnw )
503 pcondb(jk,jp) = zcondb
504 zderiv2(jk,jp) = zderiv
505 gsmelt(jk,jp) = llmelt
506 zdent(:,jk,jp) = zdh(:)
509 WRITE(noutlu,*)
' Non-solar heat flux at the top:', &
511 zswtra_all(jk,jp) = xswhdfr * sum(pswtra(:,jk,jp))
512 WRITE(noutlu,*)
'Absorbed solar heat flux:', &
514 zcondb_all(jk,jp) = zcondb
515 WRITE(noutlu,*)
' Cond. heat flux at the bottom:', &
517 zderiv_all(jk,jp) = zderiv*( ztsfa-ztsf0 )
519 ' Additional heat flux at the top dQ/dT*(Tnew-Told):', &
522 ( rhoice*sum(zdh(1:nilay)*zdzi(nilay:1:-1))+ &
523 tpsit(jk,jp)%hsn*tpsit(jk,jp)%rsn*zdh(nilay+1) ) / dtt
524 WRITE(noutlu,*)
' Enthalpy change per time unit:', &
526 zqtopmelta_all(jk,jp) = zqtopmelta
527 WRITE(noutlu,*)
' Top melting flux:', &
528 zqtopmelta_all(jk,jp)
529 WRITE(noutlu,*)
'Balance =', &
530 zdh_all(jk,jp) + zqtopmelta_all(jk,jp) - &
531 (zcondb_all(jk,jp) + zswtra_all(jk,jp) + pnsftop(jk,jp) + &
544 IF ( llice .OR. llsnw )
THEN
549 'Error in heat conduction scheme. ' // &
550 'See gltout for details',
'WARN' )
565 fmt=
'("Vertical diffusion scheme did not converge &
566 & Error at jk=",I2," jp=",I6)' ) jk,jp
567 CALL
gltools_glterr(
'vhdiff (heat conduction scheme)', ymess,
'WARN' )
597 IF ( ztsfa<=-51. .AND. .NOT.llredo )
THEN
598 IF(lwg)
WRITE(noutlu,*)
'Error at ',jp, &
599 ' ztsfa(',jk,
') =',ztsfa
603 IF (zmlf<=-10. .and. .NOT.llredo)
THEN
604 IF(lwg)
WRITE(noutlu,*)
'Error at ',jp,
' zmlf =',zmlf
612 IF ( .NOT.llice .AND. .NOT.llsnw )
THEN
617 WRITE(noutlu,*)
'no ice / snow: convergence at jk,jp=',jk,jp
632 zdhmelta(1) = zdhmelta(1) + dtt*zqtopmelta
633 ztsfa = amin1( ztsfa,ztsi_m0(0) )
635 zdhmelta(2) = zdhmelta(2) + dtt*zqtopmelta
636 ztsfa = amin1( ztsfa,ztsi_m0(1) )
639 WRITE(noutlu,*)
'ZDHMELTA (1) llsnow = true = ', zdhmelta
640 WRITE(noutlu,*)
'ZTSFA (1) llsnow = true = ', ztsfa
641 WRITE(noutlu,*)
'ZTSFB (1) llsnow = true = ', ztsfb
650 zcva = sum( (ztsia(1:nilay)-ztsib(1:nilay))*sf3t )
651 llconv = ( llconv .OR. abs(zcva)<0.001 )
660 WRITE(noutlu,*)
'Scheme has converged at jk,jp=',jk,jp
661 WRITE(noutlu,*)
' (iteration #',jit,
')'
662 WRITE(noutlu,*)
'Z DT =',zcva
666 zvtpa(jl) = ztsia(nilay+1-jl)
670 zvtpa(nilay+1) = ztsia(0)
672 zvtpa(nilay+1) = ztsia(1)
676 pdhmelt(jl,jk,jp) = pdhmelt(jl,jk,jp) + zdhmelta(nl+1-jl)
682 zvtptrd(:,jk,jp)=zvtpa(:)-zvtp(:,jk,jp)
683 ztsftrd(jk,jp)=ztsfa-ztsf0
690 zhs = tpsit(jk,jp)%hsn
692 ( zvtpa(nilay)*zrkice(1)*zhs + &
693 zvtpa(nilay+1)*zrks*zdzi(1) ) / &
694 ( zrks*zdzi(1) + zrkice(1)*zhs )
696 ztint(jk,jp) = zvtpa(nilay+1)
703 WRITE(noutlu,*)
'Scheme has not converged yet at jk,jp=',jk,jp
704 WRITE(noutlu,*)
' (iteration #',jit,
')'
705 WRITE(noutlu,*)
'Z DT =', &
710 'Previous temperature profile (top -> bottom )=', ztsi0
712 'New temperature profile (top -> bottom ) =', ztsia
716 IF ( zcva*zcvb < 0. )
THEN
717 ztsfa = 0.5*( ztsfa+ztsfb )
718 ztsia(:) = 0.5*( ztsia(:)+ztsib(:) )
733 ztot_ice_snow= np*nt+sum(icv,mask=icv<0)
735 WRITE(noutlu,*)
' ** WARNING **'
737 ' Total number of cases with ice/snow : ', &
740 ' Convergence failed on # of points : ', &
742 IF ( ztot_ice_snow > 0)
THEN
743 zfailures=100.*float(np*nt-sum(abs(icv)))/ztot_ice_snow
747 WRITE(noutlu,fmt=
'(A,F6.2)') &
748 ' % of failure : ', &
753 pcondb(:,:) = -pcondb(:,:)
757 tpsit(:,:)%tsf = tpsit(:,:)%tsf+ztsftrd(:,:)
768 pent(:,:,:) = pent(:,:,:) + zdent(:,:,:)
782 WHERE ( tpsit(:,:)%fsi>epsil1 .AND. tpsit(:,:)%hsi>epsil1 )
783 pent(jl,:,:) = pent(jl,:,:) + &
784 dtt * (1.-xswhdfr) * pswtra(jl,:,:) / &
785 ( rhoice*sf3tinv(jl)*tpsit(:,:)%hsi )
790 WHERE ( tpsit(:,:)%fsi>epsil1 .AND. tpsit(:,:)%hsn>epsil1 )
791 pent(nilay+1,:,:) = pent(nilay+1,:,:) + &
792 dtt * (1.-xswhdfr) * pswtra(nilay+1,:,:) / &
793 ( tpsit(:,:)%rsn*tpsit(:,:)%hsn )
798 zdhmelt1 = sum(pdhmelt,dim=1)/dtt
800 WHERE( pent(nilay,:,:)>cpsw*ztsi_m(nilay,:,:) )
804 WHERE ( pent(jl,:,:)>cpsw*ztsi_m(jl,:,:) )
805 pdhmelt(jl,:,:) = pdhmelt(jl,:,:) + &
806 rhoice*tpsit(:,:)%hsi*sf3tinv(jl)*( pent(jl,:,:)-cpsw*ztsi_m(jl,:,:) )
807 pent(jl,:,:) = cpsw*ztsi_m(jl,:,:)
811 zdhmelt2 = sum(pdhmelt,dim=1)/dtt
814 WHERE ( pent(nilay+1,:,:)>-xmhofusn0 )
816 pdhmelt(nilay+1,:,:) = pdhmelt(nilay+1,:,:) + &
817 tpsit(:,:)%rsn*tpsit(:,:)%hsn*( pent(nilay+1,:,:)+xmhofusn0 )
818 pent(nilay+1,:,:) = -xmhofusn0
820 zdhmelt3 = sum(pdhmelt,dim=1)/dtt
825 WHERE( pdhmelt(nilay,:,:)<0. )
826 pcondb(:,:) = pcondb(:,:) + pdhmelt(nilay,:,:)/dtt
827 pdhmelt(nilay,:,:) = 0.
829 WHERE( pdhmelt(nilay+1,:,:)<0. )
830 pcondb(:,:) = pcondb(:,:) + pdhmelt(nilay+1,:,:)/dtt
831 pdhmelt(nilay+1,:,:) = 0.
833 zdhmelt4 = sum(pdhmelt,dim=1)/dtt
837 pqtopmelt(:,:) = -zderiv2(:,:)*ztsftrd(:,:)
838 WHERE( .NOT. gsmelt(:,:) .OR. tpsit(:,:)%hsn>epsil1 .OR. pqtopmelt(:,:)<0. )
844 pcondb(:,:) = pcondb(:,:) - zderiv2(:,:)*ztsftrd(:,:)
854 zfsit(:) = sum( tpsit(:,:)%fsi, mask=(omask), dim=1 )
856 sum( (ztint(:,:)+t0deg)*tpsit(:,:)%fsi, mask=(omask), dim=1 )
857 tpdia(:)%tiw = tpdia(:)%tiw + zfsit(:)
865 zdent(:,:,:) = zdent(:,:,:)+zdenti(:,:,:)
868 z3 = tpsit(:,:)%rsn*tpsit(:,:)%hsn*zdent(nilay+1,:,:)/dtt
869 z4 = sum( pswtra(:,:,:),dim=1 )
872 z5(:,:) = z5(:,:) + &
873 ( rhoice*sf3tinv(jl)*zdent(jl,:,:)*tpsit(:,:)%hsi/dtt )
875 z6 = sum( pdhmelt(:,:,:),dim=1 )/dtt
876 zwork = tpsit%fsi * ( z1 + z4 + z2 - z3 - z5 - z6 )
883 WHERE( abs(zwork)>0.1 )
888 WRITE(noutlu,*)
' ** WARNING **'
890 ' The energy balance is not closed on # of points : ', &
893 ' Total number of points : ', &
895 WRITE(noutlu,fmt=
'(A,F6.2)') &
896 '% of failure: : ', &
897 100.*float(sum(icount))/float(np*nt)
901 pcondb(:,:) = pcondb(:,:)+zwork(:,:)
921 'At the end of VHDIFF (vert. heat diffusion scheme), W/m2 of ice'
925 zinsftop =
glt_avg_r( tpdom, sum( tpsit%fsi*z1, dim=1 ),0 )
926 WRITE(noutlu,fmt=
'(A,F8.2)') &
927 ' Top non-solar flux integral :', zinsftop
931 ziswa =
glt_avg_r( tpdom, sum( tpsit%fsi*z4, dim=1 ),0 )
932 WRITE(noutlu,fmt=
'(A,F8.2)') &
933 ' Input solar energy :', ziswa
937 zicondb =
glt_avg_r( tpdom, sum( tpsit%fsi*z2, dim=1 ),0 )
938 WRITE(noutlu,fmt=
'(A,F8.2)') &
939 ' Bottom flux integral:', zicondb
942 WRITE(noutlu,fmt=
'(A,F10.4)') &
943 ' ==> Total incoming energy :', &
944 zinsftop+ziswa+zicondb
950 zidhi =
glt_avg_r( tpdom, sum( tpsit%fsi*z5, dim=1 ),0 )
951 WRITE(noutlu,fmt=
'(A,F8.2)') &
952 ' Ice enthalpy change due to heat conduction :', zidhi
956 zidhs =
glt_avg_r( tpdom, sum( tpsit%fsi*z3, dim=1 ),0 )
957 WRITE(noutlu,fmt=
'(A,F8.2)') &
958 ' Snow enthalpy change due to heat conduction :', zidhs
962 zdhmelt =
glt_avg_r( tpdom, sum( tpsit%fsi*z6, dim=1 ),0 )
963 WRITE(noutlu,fmt=
'(A,F8.2)') &
964 ' Energy devoted to melting :', zdhmelt
968 WRITE(noutlu,fmt=
'(A,F10.4)') &
969 ' ==> Total energy change for sea ice / snow:', &
970 zidhi + zidhs + zdhmelt
977 zinrg = zinsftop + ziswa + zicondb - zidhi - zidhs - zdhmelt
979 WRITE(noutlu,fmt=
'(A,F10.4)') &
980 ' ==> Energy variation of the whole system :', zinrg
983 IF ( abs(zinrg)>0.01 )
THEN
985 WRITE(noutlu,*)
' ** WARNING **'
987 ' Heat conduction scheme not conservative'
989 ' ========================================='
994 WRITE(noutlu,*)
' Non-solar heat flux at the top:', &
995 glt_avg_r( tpdom,sum( pnsftop(:,:)*tpsit%fsi, dim=1 ),0 )
996 WRITE(noutlu,*)
' Absorbed solar heat flux:', &
997 glt_avg_r( tpdom,sum( zswtra_all(:,:)*tpsit%fsi, dim=1 ),0 )
998 WRITE(noutlu,*)
' Cond. heat flux at the bottom:', &
999 glt_avg_r( tpdom,sum( zcondb_all(:,:)*tpsit%fsi, dim=1 ),0 )
1000 WRITE(noutlu,*)
' Additional heat flux at the top dQ/dT*(Tnew-Told):', &
1001 glt_avg_r( tpdom,sum( zderiv_all(:,:)*tpsit%fsi, dim=1 ),0 )
1002 WRITE(noutlu,*)
' Sum of the previous two form final condb:', &
1003 glt_avg_r( tpdom,sum( (zcondb_all(:,:)+zderiv_all(:,:) )*tpsit%fsi, dim=1 ),0 )
1004 WRITE(noutlu,*)
' Enthalpy change per time unit:', &
1005 glt_avg_r( tpdom,sum( zdh_all(:,:)*tpsit%fsi, dim=1 ),0 )
1006 WRITE(noutlu,*)
' Top melting flux:', &
1007 glt_avg_r( tpdom,sum( zqtopmelta_all(:,:)*tpsit%fsi, dim=1 ),0 )
1008 WRITE(noutlu,*)
'Imbalance =', &
1010 sum( tpsit%fsi*( zdh_all(:,:)+zqtopmelta_all(:,:) - &
1011 ( zcondb_all(:,:)+zswtra_all(:,:)+pnsftop(:,:)+zderiv_all(:,:) ) ), &
1018 DEALLOCATE( zkodzi )
1019 DEALLOCATE( ztsi_m0 )
1022 DEALLOCATE( zrhocpsi )
1023 DEALLOCATE( zetaikp1 )
1024 DEALLOCATE( zetaik )
1025 DEALLOCATE( zinvetai )
subroutine glt_vhdiff_r(tpdom, pmlf, pderiv, tpsit, tpdia, pnsftop, pswtra, pent, pvsp, pcondb, pqtopmelt, pdhmelt, gsmelt)
subroutine glt_vhdslab_r(kit, pnsftop, pswtra, pderiv, pcondb, ptsfa, pqtopmelt, pdh, ptsia, osmelt, osnow)