Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update io_pio and io_pio2 for fsd input and output fields #444

Merged
merged 1 commit into from
May 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 140 additions & 10 deletions cicecore/cicedynB/infrastructure/io/io_pio/ice_history_write.F90
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ subroutine ice_write_hist (ns)
dxu, dxt, dyu, dyt, HTN, HTE, ANGLE, ANGLET, tmask, &
lont_bounds, latt_bounds, lonu_bounds, latu_bounds
use ice_history_shared
use ice_arrays_column, only: hin_max
use ice_arrays_column, only: hin_max, floe_rad_c
use ice_restart_shared, only: runid, lcdf64
use netcdf
#endif
Expand All @@ -67,13 +67,13 @@ subroutine ice_write_hist (ns)
#ifdef ncdf
integer (kind=int_kind) :: i,j,k,ic,n,nn, &
ncid,status,imtid,jmtid,kmtidi,kmtids,kmtidb, cmtid,timid, &
length,nvertexid,ivertex,kmtida
length,nvertexid,ivertex,kmtida,fmtid
integer (kind=int_kind), dimension(2) :: dimid2
integer (kind=int_kind), dimension(3) :: dimid3
integer (kind=int_kind), dimension(4) :: dimidz
integer (kind=int_kind), dimension(5) :: dimidcz
integer (kind=int_kind), dimension(3) :: dimid_nverts
integer (kind=int_kind), dimension(5) :: dimidex
integer (kind=int_kind), dimension(6) :: dimidex
real (kind=real_kind) :: ltime
real (kind= dbl_kind) :: ltime2
character (char_len) :: title
Expand All @@ -89,7 +89,8 @@ subroutine ice_write_hist (ns)
type(file_desc_t) :: File
type(io_desc_t) :: iodesc2d, &
iodesc3dc, iodesc3dv, iodesc3di, iodesc3db, iodesc3da, &
iodesc4di, iodesc4ds
iodesc3df, &
iodesc4di, iodesc4ds, iodesc4df
type(var_desc_t) :: varid

! 4 coordinate variables: TLON, TLAT, ULON, ULAT
Expand Down Expand Up @@ -168,9 +169,11 @@ subroutine ice_write_hist (ns)
call ice_pio_initdecomp(ndim3=nzilyr, iodesc=iodesc3di)
call ice_pio_initdecomp(ndim3=nzblyr, iodesc=iodesc3db)
call ice_pio_initdecomp(ndim3=nzalyr, iodesc=iodesc3da)
call ice_pio_initdecomp(ndim3=nfsd_hist, iodesc=iodesc3df)
call ice_pio_initdecomp(ndim3=nverts, inner_dim=.true., iodesc=iodesc3dv)
call ice_pio_initdecomp(ndim3=nzilyr, ndim4=ncat_hist, iodesc=iodesc4di)
call ice_pio_initdecomp(ndim3=nzslyr, ndim4=ncat_hist, iodesc=iodesc4ds)
call ice_pio_initdecomp(ndim3=nzslyr, ndim4=nfsd_hist, iodesc=iodesc4df)

ltime2 = time/int(secday)
ltime = real(time/int(secday),kind=real_kind)
Expand All @@ -192,6 +195,7 @@ subroutine ice_write_hist (ns)
status = pio_def_dim(File,'nkaer',nzalyr,kmtida)
status = pio_def_dim(File,'time',PIO_UNLIMITED,timid)
status = pio_def_dim(File,'nvertices',nverts,nvertexid)
status = pio_def_dim(File,'nf',nfsd_hist,fmtid)

!-----------------------------------------------------------------
! define coordinate variables: time, time_bounds
Expand Down Expand Up @@ -261,6 +265,7 @@ subroutine ice_write_hist (ns)
var_nz(3) = coord_attributes('VGRDs', 'vertical snow levels', '1')
var_nz(4) = coord_attributes('VGRDb', 'vertical ice-bio levels', '1')
var_nz(5) = coord_attributes('VGRDa', 'vertical snow-ice-bio levels', '1')
var_nz(6) = coord_attributes('NFSD', 'category floe size (center)', 'm')

!-----------------------------------------------------------------
! define information for optional time-invariant variables
Expand Down Expand Up @@ -342,12 +347,13 @@ subroutine ice_write_hist (ns)
endif
enddo

! Extra dimensions (NCAT, NZILYR, NZSLYR, NZBLYR, NZALYR)
! Extra dimensions (NCAT, NZILYR, NZSLYR, NZBLYR, NZALYR, NFSD)
dimidex(1)=cmtid
dimidex(2)=kmtidi
dimidex(3)=kmtids
dimidex(4)=kmtidb
dimidex(5)=kmtida
dimidex(6)=fmtid

do i = 1, nvarz
if (igrdz(i)) then
Expand Down Expand Up @@ -605,6 +611,43 @@ subroutine ice_write_hist (ns)
endif
enddo ! num_avail_hist_fields_3Da

!-----------------------------------------------------------------
! 3D (fsd)
!-----------------------------------------------------------------

dimidz(1) = imtid
dimidz(2) = jmtid
dimidz(3) = fmtid
dimidz(4) = timid

do n = n3Dacum + 1, n3Dfcum
if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then
status = pio_def_var(File, trim(avail_hist_fields(n)%vname), &
pio_real, dimidz, varid)
status = pio_put_att(File,varid,'units', &
trim(avail_hist_fields(n)%vunit))
status = pio_put_att(File,varid, 'long_name', &
trim(avail_hist_fields(n)%vdesc))
status = pio_put_att(File,varid,'coordinates', &
trim(avail_hist_fields(n)%vcoord))
status = pio_put_att(File,varid,'cell_measures', &
trim(avail_hist_fields(n)%vcellmeas))
status = pio_put_att(File,varid,'missing_value',spval)
status = pio_put_att(File,varid,'_FillValue',spval)

! Add cell_methods attribute to variables if averaged
if (hist_avg .and. histfreq(ns) /= '1') then
status = pio_put_att(File,varid,'cell_methods','time: mean')
endif

if (histfreq(ns) == '1' .or. .not. hist_avg) then
status = pio_put_att(File,varid,'time_rep','instantaneous')
else
status = pio_put_att(File,varid,'time_rep','averaged')
endif
endif
enddo ! num_avail_hist_fields_3Df

!-----------------------------------------------------------------
! define attributes for 4D variables
! time coordinate is dropped
Expand All @@ -620,7 +663,7 @@ subroutine ice_write_hist (ns)
dimidcz(4) = cmtid
dimidcz(5) = timid

do n = n3Dacum + 1, n4Dicum
do n = n3Dfcum + 1, n4Dicum
if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then
status = pio_def_var(File, trim(avail_hist_fields(n)%vname), &
pio_real, dimidcz, varid)
Expand Down Expand Up @@ -686,6 +729,45 @@ subroutine ice_write_hist (ns)
endif
enddo ! num_avail_hist_fields_4Ds


!-----------------------------------------------------------------
! 4D (fsd layers)
!-----------------------------------------------------------------

dimidcz(1) = imtid
dimidcz(2) = jmtid
dimidcz(3) = fmtid
dimidcz(4) = cmtid
dimidcz(5) = timid

do n = n4Dscum + 1, n4Dfcum
if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then
status = pio_def_var(File, trim(avail_hist_fields(n)%vname), &
pio_real, dimidcz, varid)
status = pio_put_att(File,varid,'units', &
trim(avail_hist_fields(n)%vunit))
status = pio_put_att(File,varid, 'long_name', &
trim(avail_hist_fields(n)%vdesc))
status = pio_put_att(File,varid,'coordinates', &
trim(avail_hist_fields(n)%vcoord))
status = pio_put_att(File,varid,'cell_measures', &
trim(avail_hist_fields(n)%vcellmeas))
status = pio_put_att(File,varid,'missing_value',spval)
status = pio_put_att(File,varid,'_FillValue',spval)

! Add cell_methods attribute to variables if averaged
if (hist_avg .and. histfreq(ns) /= '1') then
status = pio_put_att(File,varid,'cell_methods','time: mean')
endif

if (histfreq(ns) == '1' .or. .not. hist_avg) then
status = pio_put_att(File,varid,'time_rep','instantaneous')
else
status = pio_put_att(File,varid,'time_rep','averaged')
endif
endif
enddo ! num_avail_hist_fields_4Df

!-----------------------------------------------------------------
! global attributes
!-----------------------------------------------------------------
Expand Down Expand Up @@ -780,14 +862,16 @@ subroutine ice_write_hist (ns)
workr2, status, fillval=spval_dbl)
enddo

! Extra dimensions (NCAT, VGRD*)
! Extra dimensions (NCAT, NFSD, VGRD*)

do i = 1, nvarz
if (igrdz(i)) then
status = pio_inq_varid(File, var_nz(i)%short_name, varid)
SELECT CASE (var_nz(i)%short_name)
CASE ('NCAT')
status = pio_put_var(File, varid, hin_max(1:ncat_hist))
CASE ('NFSD')
status = pio_put_var(File, varid, floe_rad_c(1:nfsd_hist))
CASE ('VGRDi')
status = pio_put_var(File, varid, (/(k, k=1,nzilyr)/))
CASE ('VGRDs')
Expand Down Expand Up @@ -984,10 +1068,31 @@ subroutine ice_write_hist (ns)
enddo ! num_avail_hist_fields_3Db
deallocate(workr3)

allocate(workr4(nx_block,ny_block,nblocks,ncat_hist,nzilyr))
! 4D (categories, vertical ice)
do n = n3Dacum+1, n4Dicum
! 3D (fsd)
allocate(workr3(nx_block,ny_block,nblocks,nfsd_hist))
do n = n3Dacum+1, n3Dfcum
nn = n - n3Dacum
if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then
status = pio_inq_varid(File,avail_hist_fields(n)%vname,varid)
if (status /= pio_noerr) call abort_ice(subname// &
'ERROR: getting varid for '//avail_hist_fields(n)%vname)
do j = 1, nblocks
do i = 1, nfsd_hist
workr3(:,:,j,i) = a3Df(:,:,i,nn,j)
enddo
enddo
call pio_setframe(varid, int(1,kind=PIO_OFFSET))
! call pio_setframe(File, varid, int(1,kind=PIO_OFFSET_KIND))
call pio_write_darray(File, varid, iodesc3df,&
workr3, status, fillval=spval_dbl)
endif
enddo ! num_avail_hist_fields_3Df
deallocate(workr3)

allocate(workr4(nx_block,ny_block,nblocks,ncat_hist,nzilyr))
! 4D (categories, fsd)
do n = n3Dfcum+1, n4Dicum
nn = n - n3Dfcum
if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then
status = pio_inq_varid(File,avail_hist_fields(n)%vname,varid)
if (status /= pio_noerr) call abort_ice(subname// &
Expand Down Expand Up @@ -1029,6 +1134,29 @@ subroutine ice_write_hist (ns)
enddo ! num_avail_hist_fields_4Di
deallocate(workr4)

allocate(workr4(nx_block,ny_block,nblocks,ncat_hist,nfsd_hist))
! 4D (categories, vertical ice)
do n = n4Dscum+1, n4Dfcum
nn = n - n4Dscum
if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then
status = pio_inq_varid(File,avail_hist_fields(n)%vname,varid)
if (status /= pio_noerr) call abort_ice(subname// &
'ERROR: getting varid for '//avail_hist_fields(n)%vname)
do j = 1, nblocks
do i = 1, ncat_hist
do k = 1, nfsd_hist
workr4(:,:,j,i,k) = a4Ds(:,:,k,i,nn,j)
enddo ! k
enddo ! i
enddo ! j
call pio_setframe(varid, int(1,kind=PIO_OFFSET))
! call pio_setframe(File, varid, int(1,kind=PIO_OFFSET_KIND))
call pio_write_darray(File, varid, iodesc4df,&
workr4, status, fillval=spval_dbl)
endif
enddo ! num_avail_hist_fields_4Di
deallocate(workr4)

! similarly for num_avail_hist_fields_4Db (define workr4b, iodesc4db)


Expand All @@ -1042,8 +1170,10 @@ subroutine ice_write_hist (ns)
call pio_freedecomp(File,iodesc3di)
call pio_freedecomp(File,iodesc3db)
call pio_freedecomp(File,iodesc3da)
call pio_freedecomp(File,iodesc3df)
call pio_freedecomp(File,iodesc4di)
call pio_freedecomp(File,iodesc4ds)
call pio_freedecomp(File,iodesc4df)

!-----------------------------------------------------------------
! close output dataset
Expand Down
17 changes: 12 additions & 5 deletions cicecore/cicedynB/infrastructure/io/io_pio/ice_restart.F90
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ subroutine init_restart_write(filename_spec)
use ice_communicate, only: my_task, master_task
use ice_domain_size, only: nx_global, ny_global, ncat, nilyr, nslyr, &
n_iso, n_aero, nblyr, n_zaero, n_algae, n_doc, &
n_dic, n_don, n_fed, n_fep
n_dic, n_don, n_fed, n_fep, nfsd
use ice_dyn_shared, only: kdyn
use ice_arrays_column, only: oceanmixed_ice

Expand All @@ -138,10 +138,10 @@ subroutine init_restart_write(filename_spec)
tr_pond_topo, tr_pond_lvl, tr_brine, &
tr_bgc_N, tr_bgc_C, tr_bgc_Nit, &
tr_bgc_Sil, tr_bgc_DMS, &
tr_bgc_chl, tr_bgc_Am, &
tr_bgc_chl, tr_bgc_Am, &
tr_bgc_PON, tr_bgc_DON, &
tr_zaero, tr_bgc_Fe, &
tr_bgc_hum
tr_zaero, tr_bgc_Fe, &
tr_bgc_hum, tr_fsd

integer (kind=int_kind) :: &
nbtrcr
Expand Down Expand Up @@ -178,7 +178,7 @@ subroutine init_restart_write(filename_spec)
tr_bgc_chl_out=tr_bgc_chl, tr_bgc_Am_out=tr_bgc_Am, &
tr_bgc_PON_out=tr_bgc_PON, tr_bgc_DON_out=tr_bgc_DON, &
tr_zaero_out=tr_zaero, tr_bgc_Fe_out=tr_bgc_Fe, &
tr_bgc_hum_out=tr_bgc_hum)
tr_bgc_hum_out=tr_bgc_hum, tr_fsd_out=tr_fsd)
call icepack_query_parameters(solve_zsal_out=solve_zsal, skl_bgc_out=skl_bgc, &
z_tracers_out=z_tracers)
call icepack_warnings_flush(nu_diag)
Expand Down Expand Up @@ -473,6 +473,13 @@ subroutine init_restart_write(filename_spec)
call define_rest_field(File,'qsno'//trim(nchar),dims)
enddo

if (tr_fsd) then
do k=1,nfsd
write(nchar,'(i3.3)') k
call define_rest_field(File,'fsd'//trim(nchar),dims)
enddo
endif

if (tr_iso) then
do k=1,n_iso
write(nchar,'(i3.3)') k
Expand Down
Loading