@@ -79,7 +79,7 @@ module FV3GFS_io_mod
79
79
80
80
!- -- GFDL FMS restart containers
81
81
character (len= 32 ), allocatable , dimension (:) :: oro_name2, sfc_name2, sfc_name3
82
- real (kind= kind_phys), allocatable , target , dimension (:,:,:) :: oro_var2, sfc_var2, phy_var2
82
+ real (kind= kind_phys), allocatable , target , dimension (:,:,:) :: oro_var2, sfc_var2, phy_var2, sfc_var3ice
83
83
real (kind= kind_phys), allocatable , target , dimension (:,:,:,:) :: sfc_var3, phy_var3
84
84
!- -- Noah MP restart containers
85
85
real (kind= kind_phys), allocatable , target , dimension (:,:,:,:) :: sfc_var3sn,sfc_var3eq,sfc_var3zn
@@ -89,7 +89,7 @@ module FV3GFS_io_mod
89
89
integer :: tot_diag_idx = 0
90
90
integer :: total_outputlevel = 0
91
91
integer :: isco,ieco,jsco,jeco,levo,num_axes_phys
92
- integer :: fhzero, ncld, nsoil, imp_physics, landsfcmdl
92
+ integer :: fhzero, ncld, nsoil, imp_physics, landsfcmdl, k
93
93
real (4 ) :: dtp
94
94
logical :: lprecip_accu
95
95
character (len= 64 ) :: Sprecip_accu
@@ -193,9 +193,9 @@ subroutine FV3GFS_IPD_checksum (Model, IPD_Data, Atm_block)
193
193
ntr = size (IPD_Data(1 )% Statein% qgrs,3 )
194
194
195
195
if (Model% lsm == Model% lsm_noahmp) then
196
- nsfcprop2d = 149
196
+ nsfcprop2d = 151
197
197
else
198
- nsfcprop2d = 100
198
+ nsfcprop2d = 102
199
199
endif
200
200
201
201
allocate (temp2d(isc:iec,jsc:jec,nsfcprop2d+ Model% ntot3d+ Model% nctp))
@@ -321,8 +321,10 @@ subroutine FV3GFS_IPD_checksum (Model, IPD_Data, Atm_block)
321
321
temp2d(i,j,82 ) = IPD_Data(nb)% Radtend% sfcflw(ix)% upfx0
322
322
temp2d(i,j,83 ) = IPD_Data(nb)% Radtend% sfcflw(ix)% dnfxc
323
323
temp2d(i,j,84 ) = IPD_Data(nb)% Radtend% sfcflw(ix)% dnfx0
324
+ temp2d(i,j,85 ) = IPD_Data(nb)% Sfcprop% tiice(ix,1 )
325
+ temp2d(i,j,86 ) = IPD_Data(nb)% Sfcprop% tiice(ix,2 )
324
326
325
- idx_opt = 85
327
+ idx_opt = 87
326
328
if (Model% lsm == Model% lsm_noahmp) then
327
329
temp2d(i,j,idx_opt) = IPD_Data(nb)% Sfcprop% snowxy(ix)
328
330
temp2d(i,j,idx_opt+1 ) = IPD_Data(nb)% Sfcprop% tvxy(ix)
@@ -374,7 +376,7 @@ subroutine FV3GFS_IPD_checksum (Model, IPD_Data, Atm_block)
374
376
temp2d(i,j,idx_opt+46 ) = IPD_Data(nb)% Sfcprop% zsnsoxy(ix,2 )
375
377
temp2d(i,j,idx_opt+47 ) = IPD_Data(nb)% Sfcprop% zsnsoxy(ix,3 )
376
378
temp2d(i,j,idx_opt+48 ) = IPD_Data(nb)% Sfcprop% zsnsoxy(ix,4 )
377
- idx_opt = 134
379
+ idx_opt = 136
378
380
endif
379
381
380
382
if (Model% nstf_name(1 ) > 0 ) then
@@ -602,7 +604,6 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
602
604
call mpp_error(NOTE,' reading topographic/orographic information from INPUT/oro_data.tile*.nc' )
603
605
call restore_state(Oro_restart)
604
606
605
- Model% frac_grid = .false.
606
607
!- -- copy data into GFS containers
607
608
do nb = 1 , Atm_block% nblks
608
609
!- -- 2D variables
@@ -635,17 +636,6 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
635
636
enddo
636
637
enddo
637
638
638
- if (nint (oro_var2(1 ,1 ,18 )) == - 9999._kind_phys ) then ! lakefrac doesn't exist in the restart, need to create it
639
- if (Model% me == Model% master ) call mpp_error(NOTE, ' gfs_driver::surface_props_input - will computing lakefrac' )
640
- Model% frac_grid = .false.
641
- elseif (Model% frac_grid_off) then
642
- Model% frac_grid = .false.
643
- else
644
- Model% frac_grid = .true.
645
- endif
646
-
647
- if (Model% me == Model% master ) write (0 ,* )' resetting Model%frac_grid=' ,Model% frac_grid
648
-
649
639
!- -- deallocate containers and free restart container
650
640
deallocate (oro_name2, oro_var2)
651
641
call free_restart_type(Oro_restart)
@@ -655,23 +645,24 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
655
645
!- -- allocate the various containers needed for restarts
656
646
#ifdef CCPP
657
647
allocate (sfc_name2(nvar_s2m+ nvar_s2o+ nvar_s2mp+ nvar_s2r))
658
- allocate (sfc_name3(nvar_s3+ nvar_s3mp))
648
+ allocate (sfc_name3(0 : nvar_s3+ nvar_s3mp))
659
649
660
- allocate (sfc_var2(nx,ny,nvar_s2m+ nvar_s2o+ nvar_s2mp+ nvar_s2r))
650
+ allocate (sfc_var2(nx,ny,nvar_s2m+ nvar_s2o+ nvar_s2mp+ nvar_s2r),sfc_var3ice(nx,ny,Model % kice) )
661
651
if (Model% lsm == Model% lsm_noah .or. Model% lsm == Model% lsm_noahmp .or. (.not. warm_start)) then
662
652
allocate (sfc_var3(nx,ny,Model% lsoil,nvar_s3))
663
653
else if (Model% lsm == Model% lsm_ruc) then
664
654
allocate (sfc_var3(nx,ny,Model% lsoil_lsm,nvar_s3))
665
655
end if
666
656
#else
667
657
allocate (sfc_name2(nvar_s2m+ nvar_s2o+ nvar_s2mp))
668
- allocate (sfc_name3(nvar_s3+ nvar_s3mp))
658
+ allocate (sfc_name3(0 : nvar_s3+ nvar_s3mp))
669
659
670
660
allocate (sfc_var2(nx,ny,nvar_s2m+ nvar_s2o+ nvar_s2mp))
671
661
allocate (sfc_var3(nx,ny,Model% lsoil,nvar_s3))
672
662
#endif
673
663
sfc_var2 = - 9999._kind_phys
674
664
sfc_var3 = - 9999._kind_phys
665
+ sfc_var3ice= - 9999._kind_phys
675
666
!
676
667
if (Model% lsm == Model% lsm_noahmp) then
677
668
allocate (sfc_var3sn(nx,ny,- 2 :0 ,4 :6 ))
@@ -717,8 +708,8 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
717
708
!- -- variables below here are optional
718
709
sfc_name2(32 ) = ' sncovr'
719
710
if (Model% cplflx) then
720
- sfc_name2(33 ) = ' tsfcl' ! temp on land portion of a cell
721
- sfc_name2(34 ) = ' zorll' ! zorl on land portion of a cell
711
+ sfc_name2(33 ) = ' tsfcl' ! temp on land portion of a cell
712
+ sfc_name2(34 ) = ' zorll' ! zorl on land portion of a cell
722
713
end if
723
714
724
715
!- -- NSSTM inputs only needed when (nstf_name(1) > 0) .and. (nstf_name(2)) == 0)
@@ -865,6 +856,12 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
865
856
endif
866
857
#endif
867
858
!- -- register the 3D fields
859
+ if (Model% frac_grid) then
860
+ sfc_name3(0 ) = ' tiice'
861
+ var3_p = > sfc_var3ice(:,:,:)
862
+ id_restart = register_restart_field(Sfc_restart, fn_srf, sfc_name3(0 ), var3_p, domain= fv_domain, mandatory= .false. )
863
+ end if
864
+
868
865
do num = 1 ,nvar_s3
869
866
var3_p = > sfc_var3(:,:,:,num)
870
867
id_restart = register_restart_field(Sfc_restart, fn_srf, sfc_name3(num), var3_p, domain= fv_domain)
@@ -1087,6 +1084,10 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
1087
1084
Sfcprop(nb)% flag_frsoil(ix,lsoil) = sfc_var3(i,j,lsoil,5 ) !- -- flag_frsoil
1088
1085
enddo
1089
1086
end if
1087
+
1088
+ do k = 1 ,Model% kice
1089
+ Sfcprop(nb)% tiice(ix,k)= sfc_var3ice(i,j,k) !- -- internal ice temp
1090
+ enddo
1090
1091
#else
1091
1092
!- -- 3D variables
1092
1093
do lsoil = 1 ,Model% lsoil
@@ -1155,7 +1156,7 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
1155
1156
enddo
1156
1157
endif
1157
1158
1158
- if (Model% cplflx .or. Model% frac_grid) then
1159
+ if (Model% cplflx .or. Model% frac_grid) then
1159
1160
if (nint (sfc_var2(1 ,1 ,33 )) == - 9999 ) then
1160
1161
if (Model% me == Model% master ) call mpp_error(NOTE, ' gfs_driver::surface_props_input - computing tsfcl' )
1161
1162
do nb = 1 , Atm_block% nblks
@@ -1175,6 +1176,16 @@ subroutine sfc_prop_restart_read (Sfcprop, Atm_block, Model, fv_domain)
1175
1176
endif
1176
1177
endif
1177
1178
1179
+ if (nint (sfc_var3ice(1 ,1 ,1 )) == - 9999 ) then
1180
+ if (Model% me == Model% master ) call mpp_error(NOTE, ' gfs_driver::surface_props_input - computing tiice' )
1181
+ do nb = 1 , Atm_block% nblks
1182
+ do ix = 1 , Atm_block% blksz(nb)
1183
+ Sfcprop(nb)% tiice(ix,1 ) = Sfcprop(nb)% stc(ix,1 ) !- -- initialize internal ice temp from soil temp at layer 1
1184
+ Sfcprop(nb)% tiice(ix,2 ) = Sfcprop(nb)% stc(ix,2 ) !- -- initialize internal ice temp from soil temp at layer 2
1185
+ enddo
1186
+ enddo
1187
+ endif
1188
+
1178
1189
! #endif
1179
1190
1180
1191
if (Model% frac_grid) then ! 3-way composite
@@ -1561,7 +1572,7 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
1561
1572
!- -- allocate the various containers needed for restarts
1562
1573
#ifdef CCPP
1563
1574
allocate (sfc_name2(nvar2m+ nvar2o+ nvar2mp+ nvar2r))
1564
- allocate (sfc_name3(nvar3+ nvar3mp))
1575
+ allocate (sfc_name3(0 : nvar3+ nvar3mp))
1565
1576
allocate (sfc_var2(nx,ny,nvar2m+ nvar2o+ nvar2mp+ nvar2r))
1566
1577
if (Model% lsm == Model% lsm_noah .or. Model% lsm == Model% lsm_noahmp) then
1567
1578
allocate (sfc_var3(nx,ny,Model% lsoil,nvar3))
@@ -1570,7 +1581,7 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
1570
1581
endif
1571
1582
#else
1572
1583
allocate (sfc_name2(nvar2m+ nvar2o+ nvar2mp))
1573
- allocate (sfc_name3(nvar3+ nvar3mp))
1584
+ allocate (sfc_name3(0 : nvar3+ nvar3mp))
1574
1585
allocate (sfc_var2(nx,ny,nvar2m+ nvar2o+ nvar2mp))
1575
1586
allocate (sfc_var3(nx,ny,Model% lsoil,nvar3))
1576
1587
#endif
@@ -1762,6 +1773,12 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
1762
1773
#endif
1763
1774
1764
1775
!- -- register the 3D fields
1776
+ if (Model% frac_grid) then
1777
+ sfc_name3(0 ) = ' tiice'
1778
+ var3_p = > sfc_var3ice(:,:,:)
1779
+ id_restart = register_restart_field(Sfc_restart, fn_srf, sfc_name3(0 ), var3_p, domain= fv_domain)
1780
+ end if
1781
+
1765
1782
do num = 1 ,nvar3
1766
1783
var3_p = > sfc_var3(:,:,:,num)
1767
1784
id_restart = register_restart_field(Sfc_restart, fn_srf, sfc_name3(num), var3_p, domain= fv_domain)
@@ -1901,6 +1918,10 @@ subroutine sfc_prop_restart_write (Sfcprop, Atm_block, Model, fv_domain, timesta
1901
1918
endif
1902
1919
1903
1920
#ifdef CCPP
1921
+ do k = 1 ,Model% kice
1922
+ sfc_var3ice(i,j,k) = Sfcprop(nb)% tiice(ix,k) !- -- internal ice temperature
1923
+ end do
1924
+
1904
1925
if (Model% lsm == Model% lsm_noah .or. Model% lsm == Model% lsm_noahmp) then
1905
1926
!- -- 3D variables
1906
1927
do lsoil = 1 ,Model% lsoil
0 commit comments