From c66a11934bbb18dbbb678bfda1b3285dcc952a42 Mon Sep 17 00:00:00 2001 From: Anton Steketee Date: Mon, 29 Jan 2024 14:08:30 +1100 Subject: [PATCH 1/2] Netcdf chunking and compression --- .../cicedyn/analysis/ice_history_shared.F90 | 4 + cicecore/cicedyn/general/ice_init.F90 | 93 ++- .../cicedyn/infrastructure/ice_read_write.F90 | 6 +- .../io/io_netcdf/ice_history_write.F90 | 370 +++++------- .../io/io_netcdf/ice_restart.F90 | 19 +- .../io/io_pio2/ice_history_write.F90 | 545 +++++++++--------- .../infrastructure/io/io_pio2/ice_pio.F90 | 39 +- .../infrastructure/io/io_pio2/ice_restart.F90 | 70 ++- .../drivers/nuopc/cmeps/ice_comp_nuopc.F90 | 33 +- .../drivers/standalone/cice/CICE_InitMod.F90 | 2 +- cicecore/shared/ice_restart_shared.F90 | 7 +- doc/source/cice_index.rst | 4 + doc/source/user_guide/ug_case_settings.rst | 4 + 13 files changed, 633 insertions(+), 563 deletions(-) diff --git a/cicecore/cicedyn/analysis/ice_history_shared.F90 b/cicecore/cicedyn/analysis/ice_history_shared.F90 index db01b332b..197ed4f66 100644 --- a/cicecore/cicedyn/analysis/ice_history_shared.F90 +++ b/cicecore/cicedyn/analysis/ice_history_shared.F90 @@ -64,6 +64,10 @@ module ice_history_shared history_root , & ! iotasks, root, stride defines io pes for pio history_stride ! iotasks, root, stride defines io pes for pio + integer (kind=int_kind), public :: history_deflate ! compression level for netcdf4 + + integer (kind=int_kind), dimension(2), public :: history_chunksize ! chunksize for netcdf4 + !--------------------------------------------------------------- ! Instructions for adding a field: (search for 'example') ! Here or in ice_history_[process].F90: diff --git a/cicecore/cicedyn/general/ice_init.F90 b/cicecore/cicedyn/general/ice_init.F90 index c3e034fad..7f84ac636 100644 --- a/cicecore/cicedyn/general/ice_init.F90 +++ b/cicecore/cicedyn/general/ice_init.F90 @@ -81,14 +81,15 @@ subroutine input_data restart_pond_lvl, restart_pond_topo, restart_aero, & restart_fsd, restart_iso, restart_snow use ice_restart_shared, only: & - restart, restart_ext, restart_coszen, restart_dir, restart_file, pointer_file, & - runid, runtype, use_restart_time, restart_format, & - restart_rearranger, restart_iotasks, restart_root, restart_stride + restart, restart_ext, restart_coszen, use_restart_time, & + runtype, restart_file, restart_dir, runid, pointer_file, & + restart_format, restart_rearranger, restart_iotasks, restart_root, & + restart_stride, restart_deflate, restart_chunksize use ice_history_shared, only: & - hist_avg, history_dir, history_file, hist_suffix, & - incond_dir, incond_file, version_name, & - history_precision, history_format, hist_time_axis, & - history_rearranger, history_iotasks, history_root, history_stride + history_precision, hist_avg, history_format, history_file, incond_file, & + history_dir, incond_dir, version_name, history_rearranger, & + hist_suffix, history_iotasks, history_root, history_stride, & + history_deflate, history_chunksize, hist_time_axis use ice_flux, only: update_ocn_f, cpl_frazil, l_mpond_fresh use ice_flux, only: default_season use ice_flux_bgc, only: cpl_bgc @@ -194,13 +195,14 @@ subroutine input_data ice_ic, restart, restart_dir, restart_file, & restart_ext, use_restart_time, restart_format, lcdf64, & restart_root, restart_stride, restart_iotasks, restart_rearranger, & + restart_deflate, restart_chunksize, & pointer_file, dumpfreq, dumpfreq_n, dump_last, & diagfreq, diag_type, diag_file, history_format,& history_root, history_stride, history_iotasks, history_rearranger, & hist_time_axis, & print_global, print_points, latpnt, lonpnt, & debug_forcing, histfreq, histfreq_n, hist_avg, & - hist_suffix, & + hist_suffix, history_deflate, history_chunksize, & history_dir, history_file, history_precision, cpl_bgc, & histfreq_base, dumpfreq_base, timer_stats, memory_stats, & conserv_check, debug_model, debug_model_step, & @@ -347,6 +349,8 @@ subroutine input_data history_dir = './' ! write to executable dir for default history_file = 'iceh' ! history file name prefix history_precision = 4 ! precision of history files + history_deflate = 0 ! compression level for netcdf4 + history_chunksize = (/0,0/) ! chunksize for netcdf4 write_ic = .false. ! write out initial condition cpl_bgc = .false. ! couple bgc thru driver incond_dir = history_dir ! write to history dir for default @@ -367,6 +371,8 @@ subroutine input_data restart_stride = -99 ! restart iotasks, root, stride sets pes for pio restart_iotasks = -99 ! restart iotasks, root, stride sets pes for pio restart_rearranger = 'default' ! restart rearranger for pio + restart_deflate = 0 ! compression level for netcdf4 + restart_chunksize = (/0,0/) ! chunksize for netcdf4 lcdf64 = .false. ! 64 bit offset for netCDF ice_ic = 'default' ! latitude and sst-dependent grid_format = 'bin' ! file format ('bin'=binary or 'nc'=netcdf) @@ -946,6 +952,9 @@ subroutine input_data call broadcast_scalar(history_stride, master_task) call broadcast_scalar(history_rearranger, master_task) call broadcast_scalar(hist_time_axis, master_task) + call broadcast_scalar(history_deflate, master_task) + call broadcast_scalar(history_chunksize(1), master_task) + call broadcast_scalar(history_chunksize(2), master_task) call broadcast_scalar(write_ic, master_task) call broadcast_scalar(cpl_bgc, master_task) call broadcast_scalar(incond_dir, master_task) @@ -962,6 +971,9 @@ subroutine input_data call broadcast_scalar(restart_root, master_task) call broadcast_scalar(restart_stride, master_task) call broadcast_scalar(restart_rearranger, master_task) + call broadcast_scalar(restart_deflate, master_task) + call broadcast_scalar(restart_chunksize(1), master_task) + call broadcast_scalar(restart_chunksize(2), master_task) call broadcast_scalar(lcdf64, master_task) call broadcast_scalar(pointer_file, master_task) call broadcast_scalar(ice_ic, master_task) @@ -1753,6 +1765,65 @@ subroutine input_data abort_list = trim(abort_list)//":29" endif +#ifdef USE_PIO1 + if (history_deflate/=0 .or. restart_deflate/=0 & + .or. history_chunksize(1)/=0 .or. history_chunksize(2)/=0 & + .or. restart_chunksize(1)/=0 .or. restart_chunksize(2)/=0) then + if (my_task == master_task) then + write (nu_diag,*) subname//' WARNING: _deflate and _chunksize not compatible with PIO1, will be ignored' + endif +#else + if(history_deflate<0 .or. history_deflate>9) then + if (my_task == master_task) then + write (nu_diag,*) subname//' WARNING: history_deflate value not valid, setting to 0 ' + write (nu_diag,*) subname//' WARNING: Allowed range: integers from 0 to 9 ' + endif + history_deflate=0 + endif + + if(restart_deflate<0 .or. restart_deflate>9) then + if (my_task == master_task) then + write (nu_diag,*) subname//' WARNING: restart_deflate value not valid, setting to 0 ' + write (nu_diag,*) subname//' WARNING: Allowed range: integers from 0 to 9 ' + endif + restart_deflate=0 + endif + +#ifndef CESMCOUPLED + ! history_format not used by nuopc driver + if (history_format/='hdf5' .and. history_deflate/=0) then + if (my_task == master_task) then + write (nu_diag,*) subname//' WARNING: history_deflate not compatible with '//history_format + write (nu_diag,*) subname//' WARNING: netcdf compression only possible with history_type="hdf5" ' + endif + history_deflate=0 + endif + + if (history_format/='hdf5' .and. (history_chunksize(1)/=0 .or. history_chunksize(2)/=0)) then + if (my_task == master_task) then + write (nu_diag,*) subname//' WARNING: history_chunksize not compatible with '//history_format + write (nu_diag,*) subname//' WARNING: netcdf chunking only possible with history_type="hdf5" ' + endif + endif + + if (restart_format/='hdf5' .and. restart_deflate/=0) then + if (my_task == master_task) then + write (nu_diag,*) subname//' WARNING: restart_deflate not compatible with '//restart_format + write (nu_diag,*) subname//' WARNING: netcdf compression only possible with restart_type="hdf5" ' + endif + restart_deflate=0 + endif + + if (restart_format/='hdf5' .and. (restart_chunksize(1)/=0 .or. restart_chunksize(2)/=0)) then + if (my_task == master_task) then + write (nu_diag,*) subname//' WARNING: restart_chunksize not compatible with '//restart_format + write (nu_diag,*) subname//' WARNING: netcdf chunking only possible with restart_type="hdf5" ' + endif + endif + +#endif +#endif + ! Implicit solver input validation if (kdyn == 3) then if (.not. (trim(algo_nonlin) == 'picard' .or. trim(algo_nonlin) == 'anderson')) then @@ -2489,7 +2560,7 @@ subroutine input_data write(nu_diag,1033) ' histfreq = ', histfreq(:) write(nu_diag,1023) ' histfreq_n = ', histfreq_n(:) write(nu_diag,1033) ' histfreq_base = ', histfreq_base(:) - write(nu_diag,*) ' hist_avg = ', hist_avg(:) + write(nu_diag,1033) ' hist_avg = ', hist_avg(:) write(nu_diag,1033) ' hist_suffix = ', hist_suffix(:) write(nu_diag,1031) ' history_dir = ', trim(history_dir) write(nu_diag,1031) ' history_file = ', trim(history_file) @@ -2500,6 +2571,8 @@ subroutine input_data write(nu_diag,1021) ' history_root = ', history_root write(nu_diag,1021) ' history_stride = ', history_stride write(nu_diag,1031) ' hist_time_axis = ', trim(hist_time_axis) + write(nu_diag,1021) ' history_deflate = ', history_deflate + write(nu_diag,1023) ' history_chunksize= ', history_chunksize if (write_ic) then write(nu_diag,1039) ' Initial condition will be written in ', & trim(incond_dir) @@ -2513,6 +2586,8 @@ subroutine input_data write(nu_diag,1011) ' restart_ext = ', restart_ext write(nu_diag,1011) ' restart_coszen = ', restart_coszen write(nu_diag,1031) ' restart_format = ', trim(restart_format) + write(nu_diag,1021) ' restart_deflate = ', restart_deflate + write(nu_diag,1023) ' restart_chunksize= ', restart_chunksize ! write(nu_diag,1011) ' lcdf64 = ', lcdf64 ! deprecated write(nu_diag,1031) ' restart_rearranger = ', trim(restart_rearranger) write(nu_diag,1021) ' restart_iotasks = ', restart_iotasks diff --git a/cicecore/cicedyn/infrastructure/ice_read_write.F90 b/cicecore/cicedyn/infrastructure/ice_read_write.F90 index ad50b38f2..0e2abf74e 100644 --- a/cicecore/cicedyn/infrastructure/ice_read_write.F90 +++ b/cicecore/cicedyn/infrastructure/ice_read_write.F90 @@ -2589,13 +2589,13 @@ subroutine ice_check_nc(status, abort_msg, file, line) #ifdef USE_NETCDF if (status /= nf90_noerr) then if (present(file) .and. present(line)) then - call abort_ice(subname//trim(nf90_strerror(status))//', '//trim(abort_msg), & + call abort_ice(subname//' '//trim(nf90_strerror(status))//', '//trim(abort_msg), & file=file, line=line) elseif (present(file)) then - call abort_ice(subname//trim(nf90_strerror(status))//', '//trim(abort_msg), & + call abort_ice(subname//' '//trim(nf90_strerror(status))//', '//trim(abort_msg), & file=file) else - call abort_ice(subname//trim(nf90_strerror(status))//', '//trim(abort_msg)) + call abort_ice(subname//' '//trim(nf90_strerror(status))//', '//trim(abort_msg)) endif endif #else diff --git a/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_history_write.F90 b/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_history_write.F90 index 573ed2468..1dcee39ac 100644 --- a/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_history_write.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_history_write.F90 @@ -27,9 +27,22 @@ module ice_history_write use ice_read_write, only: ice_check_nc use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters + use ice_kinds_mod, only: int_kind implicit none private + + TYPE coord_attributes ! netcdf coordinate attributes + character (len=11) :: short_name + character (len=45) :: long_name + character (len=30) :: units + END TYPE coord_attributes + + TYPE req_attributes ! req'd netcdf attributes + type (coord_attributes) :: req + character (len=20) :: coordinates + END TYPE req_attributes + public :: ice_write_hist !======================================================================= @@ -50,7 +63,7 @@ subroutine ice_write_hist (ns) use ice_broadcast, only: broadcast_scalar use ice_calendar, only: msec, timesecs, idate, idate0, write_ic, & histfreq, histfreq_n, days_per_year, use_leap_years, dayyr, & - hh_init, mm_init, ss_init + hh_init, mm_init, ss_init use ice_communicate, only: my_task, master_task use ice_domain, only: distrb_info use ice_domain_size, only: nx_global, ny_global, max_nstrm, max_blocks @@ -85,18 +98,19 @@ subroutine ice_write_hist (ns) integer (kind=int_kind), dimension(3) :: dimid_nverts integer (kind=int_kind), dimension(6) :: dimidex real (kind=dbl_kind) :: ltime2 - character (char_len) :: title + character (char_len) :: title, cal_units, cal_att character (char_len) :: time_period_freq = 'none' character (char_len_long) :: ncfile(max_nstrm) real (kind=dbl_kind) :: secday, rad_to_deg - integer (kind=int_kind) :: ind,boundid - - integer (kind=int_kind) :: lprecision + integer (kind=int_kind) :: ind,boundid, lprecision character (char_len) :: start_time,current_date,current_time character (len=8) :: cdate + ! time coord + TYPE(coord_attributes) :: time_coord + ! 8 coordinate variables: TLON, TLAT, ULON, ULAT, NLON, NLAT, ELON, ELAT INTEGER (kind=int_kind), PARAMETER :: ncoord = 8 @@ -106,18 +120,7 @@ subroutine ice_write_hist (ns) ! 8 variables describe T, U grid boundaries: ! lont_bounds, latt_bounds, lonu_bounds, latu_bounds INTEGER (kind=int_kind), PARAMETER :: nvar_verts = 8 - - TYPE coord_attributes ! netcdf coordinate attributes - character (len=11) :: short_name - character (len=45) :: long_name - character (len=20) :: units - END TYPE coord_attributes - - TYPE req_attributes ! req'd netcdf attributes - type (coord_attributes) :: req - character (len=20) :: coordinates - END TYPE req_attributes - + TYPE(req_attributes), dimension(nvar_grd) :: var_grd TYPE(coord_attributes), dimension(ncoord) :: var_coord TYPE(coord_attributes), dimension(nvar_verts) :: var_nverts @@ -214,85 +217,46 @@ subroutine ice_write_hist (ns) file=__FILE__, line=__LINE__) !----------------------------------------------------------------- - ! define coordinate variables + ! define coordinate variables: time, time_bounds !----------------------------------------------------------------- - - status = nf90_def_var(ncid,'time',nf90_double,timid,varid) - call ice_check_nc(status, subname// ' ERROR: defining var time', & - file=__FILE__, line=__LINE__) - - status = nf90_put_att(ncid,varid,'long_name','time') - call ice_check_nc(status, subname// ' ERROR: time long_name', & - file=__FILE__, line=__LINE__) - + write(cdate,'(i8.8)') idate0 - write(title,'(a,a4,a1,a2,a1,a2,a1,i2.2,a1,i2.2,a1,i2.2)') 'days since ', & + write(cal_units,'(a,a4,a1,a2,a1,a2,a1,i2.2,a1,i2.2,a1,i2.2)') 'days since ', & cdate(1:4),'-',cdate(5:6),'-',cdate(7:8),' ', & hh_init,':',mm_init,':',ss_init - status = nf90_put_att(ncid,varid,'units',title) - call ice_check_nc(status, subname// ' ERROR: time units', & - file=__FILE__, line=__LINE__) - + if (days_per_year == 360) then - status = nf90_put_att(ncid,varid,'calendar','360_day') - call ice_check_nc(status, subname// ' ERROR: time calendar 360', & - file=__FILE__, line=__LINE__) + cal_att='360_day' elseif (days_per_year == 365 .and. .not.use_leap_years ) then - status = nf90_put_att(ncid,varid,'calendar','noleap') - call ice_check_nc(status, subname// ' ERROR: time calendar noleap', & - file=__FILE__, line=__LINE__) + cal_att='noleap' elseif (use_leap_years) then - status = nf90_put_att(ncid,varid,'calendar','Gregorian') - call ice_check_nc(status, subname// ' ERROR: time calendar Gregorian', & - file=__FILE__, line=__LINE__) + cal_att='Gregorian' else call abort_ice(subname//' ERROR: invalid calendar settings', file=__FILE__, line=__LINE__) endif - + + time_coord = coord_attributes('time', 'time', trim(cal_units)) + call ice_hist_coord_def(ncid, time_coord, nf90_double, (/timid/), varid) + + status = nf90_put_att(ncid,varid,'calendar',cal_att) !extra attribute + call ice_check_nc(status, subname//' ERROR: defining att calendar: '//cal_att,file=__FILE__,line=__LINE__) if (hist_avg(ns) .and. .not. write_ic) then status = nf90_put_att(ncid,varid,'bounds','time_bounds') - call ice_check_nc(status, subname// ' ERROR: time bounds', & - file=__FILE__, line=__LINE__) + call ice_check_nc(status, subname//' ERROR: defining att bounds time_bounds',file=__FILE__,line=__LINE__) endif - - !----------------------------------------------------------------- - ! Define attributes for time bounds if hist_avg is true - !----------------------------------------------------------------- - + + ! Define coord time_bounds if hist_avg is true if (hist_avg(ns) .and. .not. write_ic) then + time_coord = coord_attributes('time_bounds', 'time interval endpoints', trim(cal_units)) + dimid(1) = boundid dimid(2) = timid - status = nf90_def_var(ncid,'time_bounds',lprecision,dimid(1:2),varid) - call ice_check_nc(status, subname// ' ERROR: defining var time_bounds', & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid,varid,'long_name', 'time interval endpoints') - call ice_check_nc(status, subname// ' ERROR: time_bounds long_name', & - file=__FILE__, line=__LINE__) - write(cdate,'(i8.8)') idate0 - write(title,'(a,a4,a1,a2,a1,a2,a1,i2.2,a1,i2.2,a1,i2.2)') 'days since ', & - cdate(1:4),'-',cdate(5:6),'-',cdate(7:8),' ', & - hh_init,':',mm_init,':',ss_init - status = nf90_put_att(ncid,varid,'units',title) - call ice_check_nc(status, subname// ' ERROR: time_bounds units', & - file=__FILE__, line=__LINE__) - if (days_per_year == 360) then - status = nf90_put_att(ncid,varid,'calendar','360_day') - call ice_check_nc(status, subname// ' ERROR: time calendar 360 time bounds', & - file=__FILE__, line=__LINE__) - elseif (days_per_year == 365 .and. .not.use_leap_years ) then - status = nf90_put_att(ncid,varid,'calendar','noleap') - call ice_check_nc(status, subname// ' ERROR: time calendar noleap time bounds', & - file=__FILE__, line=__LINE__) - elseif (use_leap_years) then - status = nf90_put_att(ncid,varid,'calendar','Gregorian') - call ice_check_nc(status, subname// ' ERROR: time calendar Gregorian time bounds', & - file=__FILE__, line=__LINE__) - else - call abort_ice(subname//' ERROR: invalid calendar settings', file=__FILE__, line=__LINE__) - endif - + + call ice_hist_coord_def(ncid, time_coord, nf90_double, dimid(1:2), varid) + status = nf90_put_att(ncid,varid,'calendar',cal_att) + call ice_check_nc(status, subname//' ERROR: defining att calendar: '//cal_att,file=__FILE__,line=__LINE__) endif - + !----------------------------------------------------------------- ! define information for required time-invariant variables !----------------------------------------------------------------- @@ -440,16 +404,7 @@ subroutine ice_write_hist (ns) dimid(3) = timid do i = 1, ncoord - status = nf90_def_var(ncid, var_coord(i)%short_name, lprecision, & - dimid(1:2), varid) - call ice_check_nc(status, subname// ' ERROR: defining short_name for '//var_coord(i)%short_name, & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid,varid,'long_name',var_coord(i)%long_name) - call ice_check_nc(status, subname// ' ERROR: defining long_name for '//var_coord(i)%short_name, & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid, varid, 'units', var_coord(i)%units) - call ice_check_nc(status, subname// ' ERROR: defining units for '//var_coord(i)%short_name, & - file=__FILE__, line=__LINE__) + call ice_hist_coord_def(ncid, var_coord(i), lprecision, dimid(1:2), varid) call ice_write_hist_fill(ncid,varid,var_coord(i)%short_name,history_precision) if (var_coord(i)%short_name == 'ULAT') then status = nf90_put_att(ncid,varid,'comment', & @@ -474,31 +429,13 @@ subroutine ice_write_hist (ns) do i = 1, nvar_grdz if (igrdz(i)) then - status = nf90_def_var(ncid, var_grdz(i)%short_name, & - lprecision, dimidex(i), varid) - call ice_check_nc(status, subname// ' ERROR: defining short_name for '//var_grdz(i)%short_name, & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid,varid,'long_name',var_grdz(i)%long_name) - call ice_check_nc(status, subname// ' ERROR: defining long_name for '//var_grdz(i)%short_name, & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid, varid, 'units', var_grdz(i)%units) - call ice_check_nc(status, subname// ' ERROR: defining units for '//var_grdz(i)%short_name, & - file=__FILE__, line=__LINE__) + call ice_hist_coord_def(ncid, var_grdz(i), lprecision, dimidex(i:i), varid) endif enddo do i = 1, nvar_grd if (igrd(i)) then - status = nf90_def_var(ncid, var_grd(i)%req%short_name, & - lprecision, dimid(1:2), varid) - call ice_check_nc(status, subname// ' ERROR: defining variable '//var_grd(i)%req%short_name, & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid,varid, 'long_name', var_grd(i)%req%long_name) - call ice_check_nc(status, subname// ' ERROR: defining long_name for '//var_grd(i)%req%short_name, & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid, varid, 'units', var_grd(i)%req%units) - call ice_check_nc(status, subname// ' ERROR: defining units for '//var_grd(i)%req%short_name, & - file=__FILE__, line=__LINE__) + call ice_hist_coord_def(ncid, var_grd(i)%req, lprecision, dimid(1:2), varid) status = nf90_put_att(ncid, varid, 'coordinates', var_grd(i)%coordinates) call ice_check_nc(status, subname// ' ERROR: defining coordinates for '//var_grd(i)%req%short_name, & file=__FILE__, line=__LINE__) @@ -512,27 +449,18 @@ subroutine ice_write_hist (ns) dimid_nverts(3) = jmtid do i = 1, nvar_verts if (f_bounds) then - status = nf90_def_var(ncid, var_nverts(i)%short_name, & - lprecision,dimid_nverts, varid) - call ice_check_nc(status, subname// ' ERROR: defining variable '//var_nverts(i)%short_name, & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid,varid, 'long_name', var_nverts(i)%long_name) - call ice_check_nc(status, subname// ' ERROR: defining long_name for '//var_nverts(i)%short_name, & - file=__FILE__, line=__LINE__) - status = nf90_put_att(ncid, varid, 'units', var_nverts(i)%units) - call ice_check_nc(status, subname// ' ERROR: defining units for '//var_nverts(i)%short_name, & - file=__FILE__, line=__LINE__) + call ice_hist_coord_def(ncid, var_nverts(i), lprecision, dimid_nverts, varid) call ice_write_hist_fill(ncid,varid,var_nverts(i)%short_name,history_precision) endif enddo + !----------------------------------------------------------------- + ! define attributes for time-variant variables + !----------------------------------------------------------------- + do n=1,num_avail_hist_fields_2D if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - status = nf90_def_var(ncid, avail_hist_fields(n)%vname, & - lprecision, dimid, varid) - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, dimid,ns) endif enddo ! num_avail_hist_fields_2D @@ -543,71 +471,39 @@ subroutine ice_write_hist (ns) do n = n2D + 1, n3Dccum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - status = nf90_def_var(ncid, avail_hist_fields(n)%vname, & - lprecision, dimidz, varid) - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, dimidz,ns) endif enddo ! num_avail_hist_fields_3Dc - dimidz(1) = imtid - dimidz(2) = jmtid dimidz(3) = kmtidi - dimidz(4) = timid - + do n = n3Dccum + 1, n3Dzcum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - status = nf90_def_var(ncid, avail_hist_fields(n)%vname, & - lprecision, dimidz, varid) - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, dimidz,ns) endif enddo ! num_avail_hist_fields_3Dz - dimidz(1) = imtid - dimidz(2) = jmtid dimidz(3) = kmtidb - dimidz(4) = timid - + do n = n3Dzcum + 1, n3Dbcum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - status = nf90_def_var(ncid, avail_hist_fields(n)%vname, & - lprecision, dimidz, varid) - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, dimidz,ns) endif enddo ! num_avail_hist_fields_3Db - dimidz(1) = imtid - dimidz(2) = jmtid dimidz(3) = kmtida - dimidz(4) = timid - + do n = n3Dbcum + 1, n3Dacum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - status = nf90_def_var(ncid, avail_hist_fields(n)%vname, & - lprecision, dimidz, varid) - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, dimidz,ns) endif enddo ! num_avail_hist_fields_3Da - 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 = nf90_def_var(ncid, avail_hist_fields(n)%vname, & - lprecision, dimidz, varid) - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, dimidz,ns) endif enddo ! num_avail_hist_fields_3Df @@ -619,47 +515,26 @@ subroutine ice_write_hist (ns) do n = n3Dfcum + 1, n4Dicum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - status = nf90_def_var(ncid, avail_hist_fields(n)%vname, & -! lprecision, dimidcz, varid) - lprecision, dimidcz(1:4), varid) ! ferret - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, dimidcz,ns) endif enddo ! num_avail_hist_fields_4Di - dimidcz(1) = imtid - dimidcz(2) = jmtid dimidcz(3) = kmtids - dimidcz(4) = cmtid - dimidcz(5) = timid - + do n = n4Dicum + 1, n4Dscum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - status = nf90_def_var(ncid, avail_hist_fields(n)%vname, & -! lprecision, dimidcz, varid) - lprecision, dimidcz(1:4), varid) ! ferret - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, dimidcz,ns) endif enddo ! num_avail_hist_fields_4Ds - 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 = nf90_def_var(ncid, avail_hist_fields(n)%vname, & -! lprecision, dimidcz, varid) - lprecision, dimidcz(1:4), varid) ! ferret - call ice_check_nc(status, subname// ' ERROR: defining variable '//avail_hist_fields(n)%vname, & - file=__FILE__, line=__LINE__) - call ice_write_hist_attrs(ncid,varid,avail_hist_fields(n),ns) - endif + call ice_hist_field_def(ncid, avail_hist_fields(n),lprecision, & + ! dimidcz, ns) + dimidcz(1:4),ns) ! ferret + endif enddo ! num_avail_hist_fields_4Df !----------------------------------------------------------------- @@ -1270,27 +1145,46 @@ end subroutine ice_write_hist !======================================================================= - subroutine ice_write_hist_attrs(ncid, varid, hfield, ns) + ! Defines a (time-dependent) history var in the history file + ! coordinates have short_name, long_name and units, coordsiantes and cell_measures attributes, + ! and are compressed and chunked for 'hd5' + + subroutine ice_hist_field_def(ncid, hfield, lprecision, dimids, ns) - use ice_kinds_mod - use ice_calendar, only: histfreq, histfreq_n, write_ic - use ice_history_shared, only: ice_hist_field, history_precision, & - hist_avg + use ice_history_shared, only: history_deflate, history_chunksize, history_format, ice_hist_field, & + history_precision, hist_avg + use ice_calendar, only: histfreq, histfreq_n, write_ic #ifdef USE_NETCDF - use netcdf -#endif - - integer (kind=int_kind), intent(in) :: ncid ! netcdf file id - integer (kind=int_kind), intent(in) :: varid ! netcdf variable id - type (ice_hist_field) , intent(in) :: hfield ! history file info - integer (kind=int_kind), intent(in) :: ns ! history stream - - ! local variables - - integer (kind=int_kind) :: status - character(len=*), parameter :: subname = '(ice_write_hist_attrs)' + use netcdf, only: NF90_CHUNKED, nf90_def_var, nf90_put_att + + integer(kind=int_kind), intent(in) :: ncid, dimids(:), lprecision, ns + type(ice_hist_field), intent(in) :: hfield + + !local vars + integer(kind=int_kind) :: chunks(size(dimids)), i, status, varid + + character(len=*), parameter :: subname = '(ice_hist_field_def)' + + if (history_format=='hdf5') then + chunks(1)=history_chunksize(1) + chunks(2)=history_chunksize(2) + do i = 3, size(dimids) + chunks(i) = 0 + enddo + status = nf90_def_var(ncid, hfield%vname, & + lprecision, dimids, varid, & + chunksizes=chunks, deflate_level=history_deflate) + call ice_check_nc(status, & + subname//' ERROR: defining var '//hfield%vname,file=__FILE__,line=__LINE__) + else + ! no chunk and compress + status = nf90_def_var(ncid, hfield%vname, & + lprecision, dimids, varid) + call ice_check_nc(status, & + subname//' ERROR: defining var '//hfield%vname,file=__FILE__,line=__LINE__) + endif -#ifdef USE_NETCDF + ! add attributes status = nf90_put_att(ncid,varid,'units', hfield%vunit) call ice_check_nc(status, subname// ' ERROR: defining units for '//hfield%vname, & file=__FILE__, line=__LINE__) @@ -1355,13 +1249,13 @@ subroutine ice_write_hist_attrs(ncid, varid, hfield, ns) call abort_ice(subname//' ERROR: USE_NETCDF cpp not defined', file=__FILE__, line=__LINE__) #endif - end subroutine ice_write_hist_attrs + end subroutine ice_hist_field_def !======================================================================= + ! Defines missing_value and _FillValue attributes subroutine ice_write_hist_fill(ncid,varid,vname,precision) - use ice_kinds_mod #ifdef USE_NETCDF use netcdf #endif @@ -1398,6 +1292,54 @@ subroutine ice_write_hist_fill(ncid,varid,vname,precision) end subroutine ice_write_hist_fill +!======================================================================= + + ! Defines a coordinate var in the history file + ! coordinates have short_name, long_name and units attributes, + ! and are compressed for 'hd5' when more than one dimensional + + subroutine ice_hist_coord_def(ncid, coord, lprecision, dimids, varid) + + use ice_history_shared, only: history_deflate, history_format +#ifdef USE_NETCDF + use netcdf, only: nf90_def_var, nf90_put_att + + integer(kind=int_kind), intent(in) :: ncid, dimids(:), lprecision + type(coord_attributes), intent(in) :: coord + integer(kind=int_kind), intent(inout) :: varid + + !local vars + integer(kind=int_kind) :: status + + character(len=*), parameter :: subname = '(ice_hist_coord_def)' + + !define var, set deflate, long_name and units + if (history_format=='hdf5' .and. size(dimids)>1 ) then + status = nf90_def_var(ncid, trim(coord%short_name), & + lprecision, dimids, varid, deflate_level=history_deflate) + call ice_check_nc(status, & + subname//' ERROR: defining coord '//coord%short_name,file=__FILE__,line=__LINE__) + else + ! no compress + status = nf90_def_var(ncid, coord%short_name, & + lprecision, dimids, varid) + call ice_check_nc(status, & + subname//' ERROR: defining coord '//coord%short_name,file=__FILE__,line=__LINE__) + endif + status = nf90_put_att(ncid,varid,'long_name',trim(coord%long_name)) + call ice_check_nc(status, subname// ' ERROR: defining long_name for '//coord%short_name, & + file=__FILE__, line=__LINE__) + status = nf90_put_att(ncid, varid, 'units', trim(coord%units)) + call ice_check_nc(status, subname// ' ERROR: defining units for '//coord%short_name, & + file=__FILE__, line=__LINE__) + +#else + call abort_ice(subname//' ERROR: USE_NETCDF cpp not defined', & + file=__FILE__, line=__LINE__) +#endif + + end subroutine ice_hist_coord_def + !======================================================================= end module ice_history_write diff --git a/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_restart.F90 b/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_restart.F90 index 923b68944..3059ac359 100644 --- a/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_restart.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_restart.F90 @@ -18,7 +18,8 @@ module ice_restart use ice_read_write, only: ice_check_nc use ice_restart_shared, only: & restart_ext, restart_dir, restart_file, pointer_file, & - runid, use_restart_time, lenstr, restart_coszen, restart_format + runid, use_restart_time, lenstr, restart_coszen, restart_format, & + restart_chunksize, restart_deflate use ice_fileunits, only: nu_diag, nu_rst_pointer use ice_exit, only: abort_ice use icepack_intfc, only: icepack_query_parameters @@ -883,13 +884,23 @@ subroutine define_rest_field(ncid, vname, dims) integer (kind=int_kind) :: varid - integer (kind=int_kind) :: & - status ! status variable from netCDF routine + integer (kind=int_kind) :: chunks(size(dims)), status, i character(len=*), parameter :: subname = '(define_rest_field)' #ifdef USE_NETCDF - status = nf90_def_var(ncid,trim(vname),nf90_double,dims,varid) + + if (restart_format=='hdf5') then + chunks(1)=restart_chunksize(1) + chunks(2)=restart_chunksize(2) + do i = 3, size(dims) + chunks(i) = 0 + enddo + status = nf90_def_var(ncid,trim(vname),nf90_double,dims,varid, & + chunksizes=chunks, deflate_level=restart_deflate) + else + status = nf90_def_var(ncid,trim(vname),nf90_double,dims,varid) + end if call ice_check_nc(status, subname//' ERROR: def var '//trim(vname), file=__FILE__, line=__LINE__) #else call abort_ice(subname//' ERROR: USE_NETCDF cpp not defined', & diff --git a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_history_write.F90 b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_history_write.F90 index 5196c48cf..f03844d0a 100644 --- a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_history_write.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_history_write.F90 @@ -23,11 +23,28 @@ module ice_history_write use ice_exit, only: abort_ice use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc, only: icepack_query_parameters + use ice_calendar, only: write_ic, histfreq + use ice_pio, only: ice_pio_check implicit none private + + TYPE coord_attributes ! netcdf coordinate attributes + character (len=11) :: short_name + character (len=45) :: long_name + character (len=30) :: units + END TYPE coord_attributes + + TYPE req_attributes ! req'd netcdf attributes + type (coord_attributes) :: req + character (len=20) :: coordinates + END TYPE req_attributes + public :: ice_write_hist + integer (kind=int_kind) :: deflate , shuffle = 0 + integer (kind=int_kind) :: imtid,jmtid + !======================================================================= contains @@ -42,8 +59,8 @@ subroutine ice_write_hist (ns) use ice_blocks, only: nx_block, ny_block use ice_broadcast, only: broadcast_scalar - use ice_calendar, only: msec, timesecs, idate, idate0, write_ic, & - histfreq, histfreq_n, days_per_year, use_leap_years, dayyr, & + use ice_calendar, only: msec, timesecs, idate, idate0, & + histfreq_n, days_per_year, use_leap_years, dayyr, & hh_init, mm_init, ss_init use ice_communicate, only: my_task, master_task use ice_domain, only: distrb_info, nblocks @@ -58,15 +75,15 @@ subroutine ice_write_hist (ns) use ice_history_shared use ice_arrays_column, only: hin_max, floe_rad_c use ice_restart_shared, only: runid - use ice_pio use pio + use ice_pio integer (kind=int_kind), intent(in) :: ns ! local variables integer (kind=int_kind) :: i,j,k,ic,n,nn, & - ncid,status,imtid,jmtid,kmtidi,kmtids,kmtidb, cmtid,timid, & + ncid,status,kmtidi,kmtids,kmtidb, cmtid,timid, & length,nvertexid,ivertex,kmtida,fmtid integer (kind=int_kind), dimension(2) :: dimid2 integer (kind=int_kind), dimension(3) :: dimid3 @@ -75,16 +92,16 @@ subroutine ice_write_hist (ns) integer (kind=int_kind), dimension(3) :: dimid_nverts integer (kind=int_kind), dimension(6) :: dimidex real (kind= dbl_kind) :: ltime2 - character (char_len) :: title - character (char_len) :: time_period_freq = 'none' - character (char_len_long) :: ncfile(max_nstrm) + character (len=8) :: cdate + character (len=char_len_long) :: title, cal_units, cal_att + character (len=char_len) :: time_period_freq = 'none' + character (len=char_len_long) :: ncfile(max_nstrm) - integer (kind=int_kind) :: icategory,ind,i_aice,boundid + integer (kind=int_kind) :: icategory,ind,i_aice,boundid, lprecision - character (char_len) :: start_time,current_date,current_time + character (len=char_len) :: start_time,current_date,current_time character (len=16) :: c_aice - character (len=8) :: cdate - + type(file_desc_t) :: File type(io_desc_t) :: iodesc2d, & iodesc3dc, iodesc3dv, iodesc3di, iodesc3db, iodesc3da, & @@ -92,6 +109,9 @@ subroutine ice_write_hist (ns) iodesc4di, iodesc4ds, iodesc4df type(var_desc_t) :: varid + ! time coord + TYPE(coord_attributes) :: time_coord + ! 8 coordinate variables: TLON, TLAT, ULON, ULAT, NLON, NLAT, ELON, ELAT INTEGER (kind=int_kind), PARAMETER :: ncoord = 8 @@ -103,17 +123,6 @@ subroutine ice_write_hist (ns) ! lonn_bounds, latn_bounds, lone_bounds, late_bounds INTEGER (kind=int_kind), PARAMETER :: nvar_verts = 8 - TYPE coord_attributes ! netcdf coordinate attributes - character (len=11) :: short_name - character (len=45) :: long_name - character (len=20) :: units - END TYPE coord_attributes - - TYPE req_attributes ! req'd netcdf attributes - type (coord_attributes) :: req - character (len=20) :: coordinates - END TYPE req_attributes - TYPE(req_attributes), dimension(nvar_grd) :: var_grd TYPE(coord_attributes), dimension(ncoord) :: var_coord TYPE(coord_attributes), dimension(nvar_verts) :: var_nverts @@ -130,8 +139,7 @@ subroutine ice_write_hist (ns) real (kind=real_kind), allocatable :: workr4(:,:,:,:,:) real (kind=real_kind), allocatable :: workr3v(:,:,:,:) - character(len=char_len_long) :: & - filename + character(len=char_len_long) :: filename integer (kind=int_kind), dimension(1) :: & tim_start,tim_length ! dimension quantities for netCDF @@ -142,8 +150,6 @@ subroutine ice_write_hist (ns) real (kind=dbl_kind) :: secday real (kind=dbl_kind) :: rad_to_deg - integer (kind=int_kind) :: lprecision - logical (kind=log_kind), save :: first_call = .true. character(len=*), parameter :: subname = '(ice_write_hist)' @@ -188,6 +194,13 @@ subroutine ice_write_hist (ns) lprecision = pio_real if (history_precision == 8) lprecision = pio_double + ! option to deflate netcdf4 iotypes + if (history_deflate/=0 .and. history_format=='hdf5') then + deflate = 1 + else + deflate = 0 + endif + !----------------------------------------------------------------- ! define dimensions !----------------------------------------------------------------- @@ -232,64 +245,40 @@ subroutine ice_write_hist (ns) ! define coordinate variables: time, time_bounds !----------------------------------------------------------------- - call ice_pio_check(pio_def_var(File,'time',pio_double,(/timid/),varid), & - subname//' ERROR: defining var time',file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File,varid,'long_name','time'), & - subname//' ERROR: defining att long_name time',file=__FILE__,line=__LINE__) - write(cdate,'(i8.8)') idate0 - write(title,'(a,a4,a1,a2,a1,a2,a1,i2.2,a1,i2.2,a1,i2.2)') 'days since ', & + write(cal_units,'(a,a4,a1,a2,a1,a2,a1,i2.2,a1,i2.2,a1,i2.2)') 'days since ', & cdate(1:4),'-',cdate(5:6),'-',cdate(7:8),' ', & hh_init,':',mm_init,':',ss_init - call ice_pio_check(pio_put_att(File,varid,'units',trim(title)), & - subname//' ERROR: defining att units '//trim(title),file=__FILE__,line=__LINE__) - + if (days_per_year == 360) then - call ice_pio_check(pio_put_att(File,varid,'calendar','360_day'), & - subname//' ERROR: defining att calendar 360',file=__FILE__,line=__LINE__) + cal_att='360_day' elseif (days_per_year == 365 .and. .not.use_leap_years ) then - call ice_pio_check(pio_put_att(File,varid,'calendar','noleap'), & - subname//' ERROR: defining att calendar noleap',file=__FILE__,line=__LINE__) + cal_att='noleap' elseif (use_leap_years) then - call ice_pio_check(pio_put_att(File,varid,'calendar','Gregorian'), & - subname//' ERROR: defining att calendar Gregorian',file=__FILE__,line=__LINE__) + cal_att='Gregorian' else call abort_ice(subname//' ERROR: invalid calendar settings') endif - + + time_coord = coord_attributes('time', 'time', trim(cal_units)) + call ice_hist_coord_def(File, time_coord, pio_double, (/timid/), varid) !why is pio_double this not lprecision ? + call ice_pio_check(pio_put_att(File,varid,'calendar',cal_att), & + subname//' ERROR: defining att calendar: '//cal_att,file=__FILE__,line=__LINE__) if (hist_avg(ns) .and. .not. write_ic) then call ice_pio_check(pio_put_att(File,varid,'bounds','time_bounds'), & subname//' ERROR: defining att bounds time_bounds',file=__FILE__,line=__LINE__) endif - ! Define attributes for time_bounds if hist_avg is true + ! Define coord time_bounds if hist_avg is true if (hist_avg(ns) .and. .not. write_ic) then + time_coord = coord_attributes('time_bounds', 'time interval endpoints', trim(cal_units)) + dimid2(1) = boundid dimid2(2) = timid - call ice_pio_check(pio_def_var(File,'time_bounds',pio_double,dimid2,varid), & - subname//' ERROR: defining var time_bounds',file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File,varid,'long_name', 'time interval endpoints'), & - subname//' ERROR: defining att long_name time interval endpoints',file=__FILE__,line=__LINE__) - - if (days_per_year == 360) then - call ice_pio_check(pio_put_att(File,varid,'calendar','360_day'), & - subname//' ERROR: defining att calendar 360 time bounds',file=__FILE__,line=__LINE__) - elseif (days_per_year == 365 .and. .not.use_leap_years ) then - call ice_pio_check(pio_put_att(File,varid,'calendar','noleap'), & - subname//' ERROR: defining att calendar noleap time bounds',file=__FILE__,line=__LINE__) - elseif (use_leap_years) then - call ice_pio_check(pio_put_att(File,varid,'calendar','Gregorian'), & - subname//' ERROR: defining att calendar Gregorian time bounds',file=__FILE__,line=__LINE__) - else - call abort_ice(subname//' ERROR: invalid calendar settings') - endif - write(cdate,'(i8.8)') idate0 - write(title,'(a,a4,a1,a2,a1,a2,a1,i2.2,a1,i2.2,a1,i2.2)') 'days since ', & - cdate(1:4),'-',cdate(5:6),'-',cdate(7:8),' ', & - hh_init,':',mm_init,':',ss_init - call ice_pio_check(pio_put_att(File,varid,'units',trim(title)), & - subname//' ERROR: defining att units '//trim(title),file=__FILE__,line=__LINE__) + call ice_hist_coord_def(File, time_coord, pio_double, dimid2, varid) !why is pio_double this not lprecision ? + call ice_pio_check(pio_put_att(File,varid,'calendar',cal_att), & + subname//' ERROR: defining att calendar: '//cal_att,file=__FILE__,line=__LINE__) endif !----------------------------------------------------------------- @@ -438,12 +427,7 @@ subroutine ice_write_hist (ns) dimid2(2) = jmtid do i = 1, ncoord - call ice_pio_check(pio_def_var(File, trim(var_coord(i)%short_name), lprecision,dimid2, varid), & - subname//' ERROR: defining var '//trim(var_coord(i)%short_name),file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File,varid,'long_name',trim(var_coord(i)%long_name)), & - subname//' ERROR: defining att long_name '//trim(var_coord(i)%long_name),file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File, varid, 'units', trim(var_coord(i)%units)), & - subname//' ERROR: defining att units '//trim(var_coord(i)%units),file=__FILE__,line=__LINE__) + call ice_hist_coord_def(File, var_coord(i), lprecision, dimid2, varid) call ice_write_hist_fill(File,varid,var_coord(i)%short_name,history_precision) if (var_coord(i)%short_name == 'ULAT') then call ice_pio_check(pio_put_att(File,varid,'comment', & @@ -466,23 +450,13 @@ subroutine ice_write_hist (ns) do i = 1, nvar_grdz if (igrdz(i)) then - call ice_pio_check(pio_def_var(File, trim(var_grdz(i)%short_name), lprecision,(/dimidex(i)/), varid), & - subname//' ERROR: defining var'//trim(var_grdz(i)%short_name),file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File, varid, 'long_name', var_grdz(i)%long_name), & - subname//' ERROR: defining att long_name '//trim(var_grdz(i)%long_name),file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File, varid, 'units' , var_grdz(i)%units), & - subname//' ERROR: defining att units '//trim(var_grdz(i)%units),file=__FILE__,line=__LINE__) + call ice_hist_coord_def(File, var_grdz(i), lprecision, dimidex(i:i), varid) endif enddo do i = 1, nvar_grd if (igrd(i)) then - call ice_pio_check(pio_def_var(File, trim(var_grd(i)%req%short_name), lprecision, dimid2, varid), & - subname//' ERROR: defining var'//trim(var_grd(i)%req%short_name),file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File,varid, 'long_name', trim(var_grd(i)%req%long_name)), & - subname//' ERROR: defining att long_name '//trim(var_grd(i)%req%long_name),file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File, varid, 'units', trim(var_grd(i)%req%units)), & - subname//' ERROR: defining att units '//trim(var_grd(i)%req%units),file=__FILE__,line=__LINE__) + call ice_hist_coord_def(File, var_grd(i)%req, lprecision, dimid2, varid) call ice_pio_check(pio_put_att(File, varid, 'coordinates', trim(var_grd(i)%coordinates)), & subname//' ERROR: defining att coordinates '//trim(var_grd(i)%coordinates),file=__FILE__,line=__LINE__) call ice_write_hist_fill(File,varid,var_grd(i)%req%short_name,history_precision) @@ -495,12 +469,7 @@ subroutine ice_write_hist (ns) dimid_nverts(3) = jmtid do i = 1, nvar_verts if (f_bounds) then - call ice_pio_check(pio_def_var(File, trim(var_nverts(i)%short_name),lprecision,dimid_nverts, varid), & - subname//' ERROR: defining var'//trim(var_nverts(i)%short_name),file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File,varid, 'long_name', trim(var_nverts(i)%long_name)), & - subname//' ERROR: defining att long_name '//trim(var_nverts(i)%long_name),file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File, varid, 'units', trim(var_nverts(i)%units)), & - subname//' ERROR: defining att units '//trim(var_nverts(i)%units),file=__FILE__,line=__LINE__) + call ice_hist_coord_def(File, var_nverts(i), lprecision, dimid_nverts, varid) call ice_write_hist_fill(File,varid,var_nverts(i)%short_name,history_precision) endif enddo @@ -509,165 +478,96 @@ subroutine ice_write_hist (ns) ! define attributes for time-variant variables !----------------------------------------------------------------- - !----------------------------------------------------------------- ! 2D - !----------------------------------------------------------------- - - dimid3(1) = imtid - dimid3(2) = jmtid - dimid3(3) = timid - - do n=1,num_avail_hist_fields_2D - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimid3, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_2D - - !----------------------------------------------------------------- - ! 3D (category) - !----------------------------------------------------------------- - - dimidz(1) = imtid - dimidz(2) = jmtid - dimidz(3) = cmtid - dimidz(4) = timid - - do n = n2D + 1, n3Dccum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimidz, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_3Dc - - !----------------------------------------------------------------- - ! 3D (ice layers) - !----------------------------------------------------------------- - - dimidz(1) = imtid - dimidz(2) = jmtid - dimidz(3) = kmtidi - dimidz(4) = timid - - do n = n3Dccum + 1, n3Dzcum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimidz, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_3Dz - - !----------------------------------------------------------------- - ! 3D (biology ice layers) - !----------------------------------------------------------------- - - dimidz(1) = imtid - dimidz(2) = jmtid - dimidz(3) = kmtidb - dimidz(4) = timid - - do n = n3Dzcum + 1, n3Dbcum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimidz, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_3Db - - !----------------------------------------------------------------- - ! 3D (biology snow layers) - !----------------------------------------------------------------- - - dimidz(1) = imtid - dimidz(2) = jmtid - dimidz(3) = kmtida - dimidz(4) = timid - - do n = n3Dbcum + 1, n3Dacum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimidz, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_3Da - - !----------------------------------------------------------------- - ! 3D (fsd) - !----------------------------------------------------------------- + dimid3(1) = imtid + dimid3(2) = jmtid + dimid3(3) = timid - dimidz(1) = imtid - dimidz(2) = jmtid - dimidz(3) = fmtid - dimidz(4) = timid + do n=1,num_avail_hist_fields_2D + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimid3, ns) + endif + enddo - do n = n3Dacum + 1, n3Dfcum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimidz, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_3Df + ! 3D (category) + dimidz(1) = imtid + dimidz(2) = jmtid + dimidz(3) = cmtid + dimidz(4) = timid - !----------------------------------------------------------------- - ! define attributes for 4D variables - ! time coordinate is dropped - !----------------------------------------------------------------- + do n = n2D + 1, n3Dccum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Dc + + ! 3D (ice layers) + dimidz(3) = kmtidi + + do n = n3Dccum + 1, n3Dzcum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Dz + + ! 3D (biology ice layers) + dimidz(3) = kmtidb + + do n = n3Dzcum + 1, n3Dbcum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Db + + ! 3D (biology snow layers) + dimidz(3) = kmtida + + do n = n3Dbcum + 1, n3Dacum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Da + + ! 3D (fsd) + dimidz(3) = fmtid + + do n = n3Dacum + 1, n3Dfcum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Df - !----------------------------------------------------------------- ! 4D (ice categories) - !----------------------------------------------------------------- - - dimidcz(1) = imtid - dimidcz(2) = jmtid - dimidcz(3) = kmtidi - dimidcz(4) = cmtid - dimidcz(5) = timid - - do n = n3Dfcum + 1, n4Dicum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimidcz, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_4Di - - !----------------------------------------------------------------- - ! 4D (snow layers) - !----------------------------------------------------------------- - - dimidcz(1) = imtid - dimidcz(2) = jmtid - dimidcz(3) = kmtids - dimidcz(4) = cmtid - dimidcz(5) = timid - - do n = n4Dicum + 1, n4Dscum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimidcz, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_4Ds + + dimidcz(1) = imtid + dimidcz(2) = jmtid + dimidcz(3) = kmtidi + dimidcz(4) = cmtid + dimidcz(5) = timid + + do n = n3Dfcum + 1, n4Dicum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) + endif + enddo ! num_avail_hist_fields_4Di + + ! 4D (snow layers) + dimidcz(3) = kmtids + + do n = n4Dicum + 1, n4Dscum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) + endif + enddo ! num_avail_hist_fields_4Ds - !----------------------------------------------------------------- ! 4D (fsd layers) - !----------------------------------------------------------------- + dimidcz(3) = fmtid - 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 - call ice_pio_check(pio_def_var(File, trim(avail_hist_fields(n)%vname), lprecision, dimidcz, varid), & - subname//' ERROR: defining var'//trim(avail_hist_fields(n)%vname),file=__FILE__,line=__LINE__) - call ice_write_hist_attrs(File,varid,avail_hist_fields(n),ns) - endif - enddo ! num_avail_hist_fields_4Df + do n = n4Dscum + 1, n4Dfcum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) + endif + enddo ! num_avail_hist_fields_4Df !----------------------------------------------------------------- ! global attributes @@ -1310,7 +1210,6 @@ subroutine ice_write_hist (ns) ! similarly for num_avail_hist_fields_4Db (define workd4b, iodesc4db) - !----------------------------------------------------------------- ! clean-up PIO descriptors !----------------------------------------------------------------- @@ -1341,25 +1240,107 @@ subroutine ice_write_hist (ns) end subroutine ice_write_hist + !======================================================================= - subroutine ice_write_hist_attrs(File, varid, hfield, ns) + ! Defines a coordinate var in the history file + subroutine ice_hist_coord_def(File, coord,lprecision, dimids,varid) + use pio, only: file_desc_t, var_desc_t, pio_def_var, pio_put_att +#ifndef USE_PIO1 + use pio, only: pio_def_var_deflate + use pio_nf, only: pio_def_var_chunking !This is missing from pio module <2.6.0 + use netcdf, only: NF90_CHUNKED + use ice_history_shared, only: history_deflate, history_chunksize, history_format +#endif + + type(file_desc_t), intent(in) :: File + type(coord_attributes), intent(in) :: coord + integer(kind=int_kind), intent(in) :: dimids(:), lprecision + type(var_desc_t), intent(inout):: varid + + ! local vars + integer(kind=int_kind) :: chunks(size(dimids)), i, status + + character(len=*), parameter :: subname = '(ice_hist_coord_def)' + + !define var, set deflate, long_name and units + status = pio_def_var(File, coord%short_name, lprecision, dimids, varid) + call ice_pio_check(status, & + subname//' ERROR: defining coord '//coord%short_name,file=__FILE__,line=__LINE__) +#ifndef USE_PIO1 + if (deflate==1 .and. size(dimids)>1 ) then + status = pio_def_var_deflate(File, varid, shuffle, deflate ,history_deflate) + call ice_pio_check(status, & + subname//' ERROR: deflating coord '//coord%short_name,file=__FILE__,line=__LINE__) + endif + + if (history_format=='hdf5' .and. dimids(1)==imtid .and. dimids(2)==jmtid) then + chunks(1)=history_chunksize(1) + chunks(2)=history_chunksize(2) + do i = 3, size(dimids) + chunks(i) = 0 + enddo + status = pio_def_var_chunking(File, varid, NF90_CHUNKED, chunks) + call ice_pio_check(status, & + subname//' ERROR: chunking coord '//coord%short_name,file=__FILE__,line=__LINE__) + endif +#endif + call ice_pio_check(pio_put_att(File,varid,'long_name',trim(coord%long_name)), & + subname//' ERROR: defining att long_name '//coord%long_name,file=__FILE__,line=__LINE__) + call ice_pio_check(pio_put_att(File, varid, 'units', trim(coord%units)), & + subname//' ERROR: defining att units '//coord%units,file=__FILE__,line=__LINE__) + + end subroutine ice_hist_coord_def + +!======================================================================= + + ! Defines a (time-dependent) history var in the history file + subroutine ice_hist_field_def(File, hfield,lprecision, dimids, ns) + + use pio, only: file_desc_t , var_desc_t, pio_def_var, pio_put_att +#ifndef USE_PIO1 + use pio, only: pio_def_var_deflate + use pio_nf, only: pio_def_var_chunking !This is missing from pio module <2.6.0 + use netcdf, only: NF90_CHUNKED + use ice_history_shared, only: history_deflate, history_chunksize, history_format +#endif + use ice_history_shared, only: ice_hist_field, history_precision, hist_avg use ice_calendar, only: histfreq, histfreq_n, write_ic - use ice_history_shared, only: ice_hist_field, history_precision, & - hist_avg - use ice_pio - use pio - type(file_desc_t) :: File ! file id - type(var_desc_t) :: varid ! variable id - type (ice_hist_field), intent(in) :: hfield ! history file info - integer (kind=int_kind), intent(in) :: ns + type(file_desc_t), intent(in) :: File + type(ice_hist_field), intent(in) :: hfield + integer(kind=int_kind), intent(in) :: dimids(:), lprecision, ns - ! local variables + ! local vars + type(var_desc_t) :: varid + integer(kind=int_kind) :: chunks(size(dimids)), i, status + + character(len=*), parameter :: subname = '(ice_hist_field_def)' + + status = pio_def_var(File, hfield%vname, lprecision, dimids, varid) + call ice_pio_check(status, & + subname//' ERROR: defining var '//hfield%vname,file=__FILE__,line=__LINE__) - integer (kind=int_kind) :: status - character(len=*), parameter :: subname = '(ice_write_hist_attrs)' +#ifndef USE_PIO1 + if (deflate==1) then + status = pio_def_var_deflate(File, varid, shuffle, deflate ,history_deflate) + call ice_pio_check(status, & + subname//' ERROR: deflating var '//hfield%vname,file=__FILE__,line=__LINE__) + endif + + if (history_format=='hdf5' .and. dimids(1)==imtid .and. dimids(2)==jmtid) then + chunks(1)=history_chunksize(1) + chunks(2)=history_chunksize(2) + do i = 1, size(dimids) + chunks(i) = 0 + enddo + status = pio_def_var_chunking(File, varid, NF90_CHUNKED, chunks) + call ice_pio_check(status, & + subname//' ERROR: chunking var '//hfield%vname,file=__FILE__,line=__LINE__) + endif +#endif + !var attributes call ice_pio_check(pio_put_att(File,varid,'units', trim(hfield%vunit)), & subname//' ERROR: defining att units '//trim(hfield%vunit),file=__FILE__,line=__LINE__) @@ -1414,40 +1395,40 @@ subroutine ice_write_hist_attrs(File, varid, hfield, ns) call ice_pio_check(pio_put_att(File,varid,'time_rep','averaged'), & subname//' ERROR: defining att time_rep a',file=__FILE__,line=__LINE__) endif - - end subroutine ice_write_hist_attrs + + end subroutine ice_hist_field_def !======================================================================= + ! Defines missing_value and _FillValue attributes subroutine ice_write_hist_fill(File,varid,vname,precision) - use ice_pio, only: ice_pio_check - use pio, only: pio_put_att, file_desc_t, var_desc_t - - type(file_desc_t) , intent(inout) :: File - type(var_desc_t) , intent(in) :: varid - character(len=*), intent(in) :: vname - integer (kind=int_kind), intent(in) :: precision - - ! local variables - - integer (kind=int_kind) :: status - character(len=*), parameter :: subname = '(ice_write_hist_fill)' - - if (precision == 8) then - call ice_pio_check(pio_put_att(File, varid, 'missing_value', spval_dbl), & - subname//' ERROR: defining att missing_value',file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File, varid,'_FillValue',spval_dbl), & - subname//' ERROR: defining att _FillValue',file=__FILE__,line=__LINE__) - else - call ice_pio_check(pio_put_att(File, varid, 'missing_value', spval), & - subname//' ERROR: defining att missing_value',file=__FILE__,line=__LINE__) - call ice_pio_check(pio_put_att(File, varid,'_FillValue',spval), & - subname//' ERROR: defining att _FillValue',file=__FILE__,line=__LINE__) - endif - - end subroutine ice_write_hist_fill - + use pio, only: pio_put_att, file_desc_t, var_desc_t + + type(file_desc_t) , intent(in) :: File + type(var_desc_t) , intent(in) :: varid + character(len=*), intent(in) :: vname + integer (kind=int_kind), intent(in) :: precision + + ! local variables + + integer (kind=int_kind) :: status + character(len=*), parameter :: subname = '(ice_write_hist_fill)' + + if (precision == 8) then + call ice_pio_check(pio_put_att(File, varid, 'missing_value', spval_dbl), & + subname//' ERROR: defining att missing_value',file=__FILE__,line=__LINE__) + call ice_pio_check(pio_put_att(File, varid,'_FillValue',spval_dbl), & + subname//' ERROR: defining att _FillValue',file=__FILE__,line=__LINE__) + else + call ice_pio_check(pio_put_att(File, varid, 'missing_value', spval), & + subname//' ERROR: defining att missing_value',file=__FILE__,line=__LINE__) + call ice_pio_check(pio_put_att(File, varid,'_FillValue',spval), & + subname//' ERROR: defining att _FillValue',file=__FILE__,line=__LINE__) + endif + + end subroutine ice_write_hist_fill + !======================================================================= end module ice_history_write diff --git a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_pio.F90 b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_pio.F90 index 046a02f05..a63d6e5a6 100644 --- a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_pio.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_pio.F90 @@ -48,7 +48,7 @@ subroutine ice_pio_init(mode, filename, File, clobber, fformat, & rearr, iotasks, root, stride, debug) #ifdef CESMCOUPLED - use shr_pio_mod, only: shr_pio_getiosys, shr_pio_getiotype + use shr_pio_mod, only: shr_pio_getiosys, shr_pio_getiotype, shr_pio_getioformat #else #ifdef GPTL use perf_mod, only : t_initf @@ -80,6 +80,11 @@ subroutine ice_pio_init(mode, filename, File, clobber, fformat, & #ifdef CESMCOUPLED ice_pio_subsystem => shr_pio_getiosys(inst_name) pio_iotype = shr_pio_getiotype(inst_name) + if ((pio_iotype==PIO_IOTYPE_NETCDF).or.(pio_iotype==PIO_IOTYPE_PNETCDF)) then + nmode0 = shr_pio_getioformat(inst_name) + else + nmode=0 + endif call pio_seterrorhandling(ice_pio_subsystem, PIO_RETURN_ERROR) #else @@ -91,12 +96,6 @@ subroutine ice_pio_init(mode, filename, File, clobber, fformat, & #endif !--- initialize type of io - - lclobber = .false. - if (present(clobber)) then - lclobber=clobber - endif - ldebug = .false. if (present(debug)) then ldebug = debug @@ -183,31 +182,17 @@ subroutine ice_pio_init(mode, filename, File, clobber, fformat, & call pio_seterrorhandling(ice_pio_subsystem, PIO_RETURN_ERROR) - !--- initialize rearranger options - !pio_rearr_opt_comm_type = integer (PIO_REARR_COMM_[P2P,COLL]) - !pio_rearr_opt_fcd = integer, flow control (PIO_REARR_COMM_FC_[2D_ENABLE,1D_COMP2IO,1D_IO2COMP,2D_DISABLE]) - !pio_rearr_opt_c2i_enable_hs = logical - !pio_rearr_opt_c2i_enable_isend = logical - !pio_rearr_opt_c2i_max_pend_req = integer - !pio_rearr_opt_i2c_enable_hs = logical - !pio_rearr_opt_i2c_enable_isend = logical - !pio_rearr_opt_c2i_max_pend_req = integer - !ret = pio_set_rearr_opts(ice_pio_subsystem, pio_rearr_opt_comm_type,& - ! pio_rearr_opt_fcd,& - ! pio_rearr_opt_c2i_enable_hs, pio_rearr_opt_c2i_enable_isend,& - ! pio_rearr_opt_c2i_max_pend_req,& - ! pio_rearr_opt_i2c_enable_hs, pio_rearr_opt_i2c_enable_isend,& - ! pio_rearr_opt_i2c_max_pend_req) - !if(ret /= PIO_NOERR) then - ! call abort_ice(subname//'ERROR: aborting in pio_set_rearr_opts') - !end if - #endif if (present(mode) .and. present(filename) .and. present(File)) then if (trim(mode) == 'write') then + lclobber = .false. + if (present(clobber)) then + lclobber=clobber + endif + if (File%fh<0) then ! filename not open inquire(file=trim(filename),exist=exists) @@ -215,7 +200,7 @@ subroutine ice_pio_init(mode, filename, File, clobber, fformat, & if (lclobber) then nmode = ior(PIO_CLOBBER,nmode0) status = pio_createfile(ice_pio_subsystem, File, pio_iotype, trim(filename), nmode) - call ice_pio_check(status, subname//' ERROR: Failed to create file '//trim(filename), & + call ice_pio_check(status, subname//' ERROR: Failed to overwrite file '//trim(filename), & file=__FILE__,line=__LINE__) if (my_task == master_task) then write(nu_diag,*) subname,' create file ',trim(filename) diff --git a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_restart.F90 b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_restart.F90 index e801e6c85..17a702e37 100644 --- a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_restart.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_restart.F90 @@ -10,11 +10,7 @@ module ice_restart use ice_exit, only: abort_ice use ice_fileunits, only: nu_diag, nu_restart, nu_rst_pointer use ice_kinds_mod - use ice_restart_shared, only: & - restart, restart_ext, restart_dir, restart_file, pointer_file, & - runid, runtype, use_restart_time, restart_format, lenstr, & - restart_coszen, restart_rearranger, & - restart_iotasks, restart_root, restart_stride + use ice_restart_shared use ice_pio use pio use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted @@ -33,6 +29,8 @@ module ice_restart type(io_desc_t) :: iodesc2d type(io_desc_t) :: iodesc3d_ncat + integer (kind=int_kind) :: deflate + !======================================================================= contains @@ -56,7 +54,7 @@ subroutine init_restart_read(ice_ic) character(len=char_len_long) :: & filename, filename0 - integer (kind=int_kind) :: status, iotype + integer (kind=int_kind) :: status logical (kind=log_kind), save :: first_call = .true. @@ -88,7 +86,7 @@ subroutine init_restart_read(ice_ic) call pio_seterrorhandling(File, PIO_RETURN_ERROR) call ice_pio_initdecomp(iodesc=iodesc2d, precision=8) - call ice_pio_initdecomp(ndim3=ncat , iodesc=iodesc3d_ncat,remap=.true., precision=8) + call ice_pio_initdecomp(ndim3=ncat, iodesc=iodesc3d_ncat, remap=.true., precision=8) if (use_restart_time) then ! for backwards compatibility, check nyr, month, and sec as well @@ -182,9 +180,7 @@ subroutine init_restart_write(filename_spec) dimid_nilyr, dimid_nslyr, dimid_naero integer (kind=int_kind), allocatable :: dims(:) - - integer (kind=int_kind) :: iotype - + integer (kind=int_kind) :: k, n ! loop index character (len=3) :: nchar, ncharb @@ -230,6 +226,12 @@ subroutine init_restart_write(filename_spec) close(nu_rst_pointer) endif + if (restart_deflate/=0 .and. restart_format=='hdf5') then + deflate = 1 + else + deflate = 0 + endif + File%fh=-1 call ice_pio_init(mode='write',filename=trim(filename), File=File, & clobber=.true., fformat=trim(restart_format), rearr=trim(restart_rearranger), & @@ -239,22 +241,22 @@ subroutine init_restart_write(filename_spec) call pio_seterrorhandling(File, PIO_RETURN_ERROR) call ice_pio_check(pio_put_att(File,pio_global,'istep1',istep1), & - subname//' ERROR: writing restart step',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart step',file=__FILE__,line=__LINE__) call ice_pio_check(pio_put_att(File,pio_global,'myear',myear), & - subname//' ERROR: writing restart year',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart year',file=__FILE__,line=__LINE__) call ice_pio_check(pio_put_att(File,pio_global,'mmonth',mmonth), & - subname//' ERROR: writing restart month',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart month',file=__FILE__,line=__LINE__) call ice_pio_check(pio_put_att(File,pio_global,'mday',mday), & - subname//' ERROR: writing restart day',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart day',file=__FILE__,line=__LINE__) call ice_pio_check(pio_put_att(File,pio_global,'msec',msec), & - subname//' ERROR: writing restart sec',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart sec',file=__FILE__,line=__LINE__) call ice_pio_check(pio_def_dim(File,'ni',nx_global,dimid_ni), & - subname//' ERROR: defining restart dim ni',file=__FILE__,line=__LINE__) + subname//' ERROR: defining restart dim ni',file=__FILE__,line=__LINE__) call ice_pio_check(pio_def_dim(File,'nj',ny_global,dimid_nj), & - subname//' ERROR: defining restart dim nj',file=__FILE__,line=__LINE__) + subname//' ERROR: defining restart dim nj',file=__FILE__,line=__LINE__) call ice_pio_check(pio_def_dim(File,'ncat',ncat,dimid_ncat), & - subname//' ERROR: defining restart dim ncat',file=__FILE__,line=__LINE__) + subname//' ERROR: defining restart dim ncat',file=__FILE__,line=__LINE__) !----------------------------------------------------------------- ! 2D restart fields @@ -917,14 +919,42 @@ end subroutine final_restart subroutine define_rest_field(File, vname, dims) +#ifndef USE_PIO1 + use netcdf, only: NF90_CHUNKED + use pio_nf, only: pio_def_var_chunking !PIO <2.6.0 was missing this in the pio module +#endif type(file_desc_t) , intent(in) :: File character (len=*) , intent(in) :: vname integer (kind=int_kind), intent(in) :: dims(:) + integer (kind=int_kind) :: chunks(size(dims)), i, status + character(len=*), parameter :: subname = '(define_rest_field)' - call ice_pio_check(pio_def_var(File,trim(vname),pio_double,dims,vardesc), & - subname//' ERROR: def_var '//trim(vname),file=__FILE__,line=__LINE__) + + status = pio_def_var(File,trim(vname),pio_double,dims,vardesc) + call ice_pio_check(status, & + subname//' ERROR defining restart field '//trim(vname)) + +#ifndef USE_PIO1 + if (deflate==1) then + status = pio_def_var_deflate(File, vardesc, 0, deflate,restart_deflate) + call ice_pio_check(status, & + subname//' ERROR: deflating restart field '//trim(vname),file=__FILE__,line=__LINE__) + endif + + if (restart_format=='hdf5' .and. size(dims)>1) then + chunks(1)=restart_chunksize(1) + chunks(2)=restart_chunksize(2) + do i = 3, size(dims) + chunks(i) = 0 + enddo + + status = pio_def_var_chunking(File, vardesc, NF90_CHUNKED, chunks) + call ice_pio_check(status, subname//' ERROR: chunking restart field '//trim(vname),& + file=__FILE__,line=__LINE__) + endif +#endif end subroutine define_rest_field diff --git a/cicecore/drivers/nuopc/cmeps/ice_comp_nuopc.F90 b/cicecore/drivers/nuopc/cmeps/ice_comp_nuopc.F90 index 5dec8a942..30b7e0d89 100644 --- a/cicecore/drivers/nuopc/cmeps/ice_comp_nuopc.F90 +++ b/cicecore/drivers/nuopc/cmeps/ice_comp_nuopc.F90 @@ -30,8 +30,9 @@ module ice_comp_nuopc use ice_kinds_mod , only : dbl_kind, int_kind, char_len, char_len_long use ice_fileunits , only : nu_diag, nu_diag_set, inst_index, inst_name use ice_fileunits , only : inst_suffix, release_all_fileunits, flush_fileunit - use ice_restart_shared , only : runid, runtype, restart, use_restart_time, restart_dir, restart_file + use ice_restart_shared , only : runid, runtype, restart, use_restart_time, restart_dir, restart_file, restart_format, restart_chunksize use ice_history , only : accum_hist + use ice_history_shared , only : history_format, history_chunksize use ice_exit , only : abort_ice use icepack_intfc , only : icepack_warnings_flush, icepack_warnings_aborted use icepack_intfc , only : icepack_init_orbit, icepack_init_parameters, icepack_query_orbit @@ -645,6 +646,36 @@ subroutine InitializeAdvertise(gcomp, importState, exportState, clock, rc) call abort_ice(trim(errmsg)) endif + ! Netcdf output created by PIO + call NUOPC_CompAttributeGet(gcomp, name="pio_typename", value=cvalue, & + isPresent=isPresent, isSet=isSet, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + if (isPresent .and. isSet) then + if (trim(history_format)/='cdf2' .and. mastertask) then + write(nu_diag,*) trim(subname)//history_format//'WARNING: history_format from cice_namelist ignored' + write(nu_diag,*) trim(subname)//'WARNING: using '//trim(cvalue)//' from ICE_modelio' + endif + if (trim(restart_format)/='cdf2' .and. mastertask) then + write(nu_diag,*) trim(subname)//restart_format//'WARNING: restart_format from cice_namelist ignored' + write(nu_diag,*) trim(subname)//'WARNING: using '//trim(cvalue)//' from ICE_modelio' + endif + + ! The only reason to set these is to detect in ice_history_write if the chunk/deflate settings are ok. + select case (trim(cvalue)) + case ('netcdf4p') + history_format='hdf5' + restart_format='hdf5' + case ('netcdf4c') + if (mastertask) write(nu_diag,*) trim(subname)//'WARNING: pio_typename = netcdf4c is superseded, use netcdf4p' + history_format='hdf5' + restart_format='hdf5' + case default !pio_typename=netcdf or pnetcdf + ! do nothing + end select + else + if(mastertask) write(nu_diag,*) trim(subname)//'WARNING: pio_typename from driver needs to be set for netcdf output to work' + end if + #else ! Read the cice namelist as part of the call to cice_init1 diff --git a/cicecore/drivers/standalone/cice/CICE_InitMod.F90 b/cicecore/drivers/standalone/cice/CICE_InitMod.F90 index a48bdda30..194293118 100644 --- a/cicecore/drivers/standalone/cice/CICE_InitMod.F90 +++ b/cicecore/drivers/standalone/cice/CICE_InitMod.F90 @@ -66,7 +66,7 @@ subroutine cice_init floe_binwidth, c_fsd_range use ice_state, only: alloc_state use ice_flux_bgc, only: alloc_flux_bgc - use ice_calendar, only: dt, dt_dyn, write_ic, & + use ice_calendar, only: dt, write_ic, & init_calendar, advance_timestep, calc_timesteps use ice_communicate, only: init_communicate, my_task, master_task use ice_diagnostics, only: init_diags diff --git a/cicecore/shared/ice_restart_shared.F90 b/cicecore/shared/ice_restart_shared.F90 index ed760a4c1..87d6b7763 100644 --- a/cicecore/shared/ice_restart_shared.F90 +++ b/cicecore/shared/ice_restart_shared.F90 @@ -32,8 +32,11 @@ module ice_restart_shared integer (kind=int_kind), public :: & restart_iotasks , & ! iotasks, root, stride defines io pes for pio restart_root , & ! iotasks, root, stride defines io pes for pio - restart_stride ! iotasks, root, stride defines io pes for pio - + restart_stride , & ! iotasks, root, stride defines io pes for pio + restart_deflate , & ! compression level for netcdf4 + restart_chunksize(2) ! chunksize for netcdf4 + + !======================================================================= contains diff --git a/doc/source/cice_index.rst b/doc/source/cice_index.rst index cc637fb82..6b97d2b8f 100644 --- a/doc/source/cice_index.rst +++ b/doc/source/cice_index.rst @@ -320,6 +320,8 @@ section :ref:`tabnamelist`. "histfreq", "units of history output frequency: y, m, w, d or 1", "m,x,x,x,x" "histfreq_base", "reference date for history output, zero or init", "" "histfreq_n", "integer output frequency in histfreq units", "1,1,1,1,1" + "history_chunksize", "history chunksizes in x,y directions (_format='hdf5' only)", "0,0" + "history_deflate", "compression level for history (_format='hdf5' only)", "0" "history_dir", "path to history output files", "" "history_file", "history output file prefix", "" "history_format", "history file format", "" @@ -581,6 +583,8 @@ section :ref:`tabnamelist`. "restart", "if true, initialize ice state from file", "T" "restart_age", "if true, read age restart file", "" "restart_bgc", "if true, read bgc restart file", "" + "restart_chunksize", "restart chunksizes in x,y directions (_format='hdf5' only)", "0,0" + "restart_deflate", "compression level for restart (_format='hdf5' only)", "0" "restart_dir", "path to restart/dump files", "" "restart_file", "restart file prefix", "" "restart_format", "restart file format", "" diff --git a/doc/source/user_guide/ug_case_settings.rst b/doc/source/user_guide/ug_case_settings.rst index 510501091..021e2a65b 100644 --- a/doc/source/user_guide/ug_case_settings.rst +++ b/doc/source/user_guide/ug_case_settings.rst @@ -194,6 +194,8 @@ setup_nml "``histfreq_base``", "init", "history output frequency relative to year_init, month_init, day_init", "'zero','zero','zero','zero','zero'" "", "zero", "history output frequency relative to year-month-day of 0000-01-01", "" "``histfreq_n``", "integer array", "frequency history output is written with ``histfreq``", "1,1,1,1,1" + "``history_chunksize``", "integer array", "chunksizes (x,y) for history output (_format='hdf5' only)", "0,0" + "``history_deflate``", "integer", "compression level (0 to 9) for history output (_format='hdf5' only)", "0" "``history_dir``", "string", "path to history output directory", "'./'" "``history_file``", "string", "output file for history", "'iceh'" "``history_format``", "``cdf1``", "read/write history files with netcdf cdf1 (netcdf3-classic) format", "``cdf2``" @@ -241,6 +243,8 @@ setup_nml "``print_global``", "logical", "print global sums diagnostic data", "``.true.``" "``print_points``", "logical", "print diagnostic data for two grid points", "``.false.``" "``restart``", "logical", "exists but deprecated, now set internally based on other inputs", "" + "``restart_chunksize``", "integer array", "chunksizes (x,y) for restart output (_format='hdf5' only)", "0,0" + "``restart_deflate``", "integer", "compression level (0 to 9) for restart output (_format='hdf5' only)", "0" "``restart_dir``", "string", "path to restart directory", "'./'" "``restart_ext``", "logical", "read/write halo cells in restart files", "``.false.``" "``restart_file``", "string", "output file prefix for restart dump", "'iced'" From 4829247ccf80f76b03fd8ce46a42a24a6fa316e4 Mon Sep 17 00:00:00 2001 From: Anton Steketee Date: Wed, 31 Jan 2024 16:15:55 +1100 Subject: [PATCH 2/2] Review comments and no-1d chunking --- .../cicedyn/analysis/ice_history_shared.F90 | 8 +- cicecore/cicedyn/general/ice_init.F90 | 47 ++-- .../io/io_netcdf/ice_history_write.F90 | 106 +++++--- .../io/io_netcdf/ice_restart.F90 | 41 ++-- .../io/io_pio2/ice_history_write.F90 | 228 ++++++++++-------- .../infrastructure/io/io_pio2/ice_restart.F90 | 51 ++-- cicecore/shared/ice_restart_shared.F90 | 4 +- 7 files changed, 262 insertions(+), 223 deletions(-) diff --git a/cicecore/cicedyn/analysis/ice_history_shared.F90 b/cicecore/cicedyn/analysis/ice_history_shared.F90 index 197ed4f66..ac2cf8afb 100644 --- a/cicecore/cicedyn/analysis/ice_history_shared.F90 +++ b/cicecore/cicedyn/analysis/ice_history_shared.F90 @@ -62,11 +62,9 @@ module ice_history_shared integer (kind=int_kind), public :: & history_iotasks , & ! iotasks, root, stride defines io pes for pio history_root , & ! iotasks, root, stride defines io pes for pio - history_stride ! iotasks, root, stride defines io pes for pio - - integer (kind=int_kind), public :: history_deflate ! compression level for netcdf4 - - integer (kind=int_kind), dimension(2), public :: history_chunksize ! chunksize for netcdf4 + history_stride , & ! iotasks, root, stride defines io pes for pio + history_deflate , & ! compression level for hdf5/netcdf4 + history_chunksize(2) ! chunksize for hdf5/netcdf4 !--------------------------------------------------------------- ! Instructions for adding a field: (search for 'example') diff --git a/cicecore/cicedyn/general/ice_init.F90 b/cicecore/cicedyn/general/ice_init.F90 index 7f84ac636..73980683c 100644 --- a/cicecore/cicedyn/general/ice_init.F90 +++ b/cicecore/cicedyn/general/ice_init.F90 @@ -350,7 +350,7 @@ subroutine input_data history_file = 'iceh' ! history file name prefix history_precision = 4 ! precision of history files history_deflate = 0 ! compression level for netcdf4 - history_chunksize = (/0,0/) ! chunksize for netcdf4 + history_chunksize(:) = 0 ! chunksize for netcdf4 write_ic = .false. ! write out initial condition cpl_bgc = .false. ! couple bgc thru driver incond_dir = history_dir ! write to history dir for default @@ -372,7 +372,7 @@ subroutine input_data restart_iotasks = -99 ! restart iotasks, root, stride sets pes for pio restart_rearranger = 'default' ! restart rearranger for pio restart_deflate = 0 ! compression level for netcdf4 - restart_chunksize = (/0,0/) ! chunksize for netcdf4 + restart_chunksize(:) = 0 ! chunksize for netcdf4 lcdf64 = .false. ! 64 bit offset for netCDF ice_ic = 'default' ! latitude and sst-dependent grid_format = 'bin' ! file format ('bin'=binary or 'nc'=netcdf) @@ -953,8 +953,7 @@ subroutine input_data call broadcast_scalar(history_rearranger, master_task) call broadcast_scalar(hist_time_axis, master_task) call broadcast_scalar(history_deflate, master_task) - call broadcast_scalar(history_chunksize(1), master_task) - call broadcast_scalar(history_chunksize(2), master_task) + call broadcast_array(history_chunksize, master_task) call broadcast_scalar(write_ic, master_task) call broadcast_scalar(cpl_bgc, master_task) call broadcast_scalar(incond_dir, master_task) @@ -972,8 +971,7 @@ subroutine input_data call broadcast_scalar(restart_stride, master_task) call broadcast_scalar(restart_rearranger, master_task) call broadcast_scalar(restart_deflate, master_task) - call broadcast_scalar(restart_chunksize(1), master_task) - call broadcast_scalar(restart_chunksize(2), master_task) + call broadcast_array(restart_chunksize, master_task) call broadcast_scalar(lcdf64, master_task) call broadcast_scalar(pointer_file, master_task) call broadcast_scalar(ice_ic, master_task) @@ -1769,26 +1767,10 @@ subroutine input_data if (history_deflate/=0 .or. restart_deflate/=0 & .or. history_chunksize(1)/=0 .or. history_chunksize(2)/=0 & .or. restart_chunksize(1)/=0 .or. restart_chunksize(2)/=0) then - if (my_task == master_task) then - write (nu_diag,*) subname//' WARNING: _deflate and _chunksize not compatible with PIO1, will be ignored' - endif -#else - if(history_deflate<0 .or. history_deflate>9) then - if (my_task == master_task) then - write (nu_diag,*) subname//' WARNING: history_deflate value not valid, setting to 0 ' - write (nu_diag,*) subname//' WARNING: Allowed range: integers from 0 to 9 ' - endif - history_deflate=0 - endif - - if(restart_deflate<0 .or. restart_deflate>9) then - if (my_task == master_task) then - write (nu_diag,*) subname//' WARNING: restart_deflate value not valid, setting to 0 ' - write (nu_diag,*) subname//' WARNING: Allowed range: integers from 0 to 9 ' - endif - restart_deflate=0 + if (my_task == master_task) write (nu_diag,*) subname//' ERROR: _deflate and _chunksize not compatible with PIO1' + abort_list = trim(abort_list)//":54" endif - +#else #ifndef CESMCOUPLED ! history_format not used by nuopc driver if (history_format/='hdf5' .and. history_deflate/=0) then @@ -1796,7 +1778,6 @@ subroutine input_data write (nu_diag,*) subname//' WARNING: history_deflate not compatible with '//history_format write (nu_diag,*) subname//' WARNING: netcdf compression only possible with history_type="hdf5" ' endif - history_deflate=0 endif if (history_format/='hdf5' .and. (history_chunksize(1)/=0 .or. history_chunksize(2)/=0)) then @@ -1811,7 +1792,6 @@ subroutine input_data write (nu_diag,*) subname//' WARNING: restart_deflate not compatible with '//restart_format write (nu_diag,*) subname//' WARNING: netcdf compression only possible with restart_type="hdf5" ' endif - restart_deflate=0 endif if (restart_format/='hdf5' .and. (restart_chunksize(1)/=0 .or. restart_chunksize(2)/=0)) then @@ -1820,8 +1800,19 @@ subroutine input_data write (nu_diag,*) subname//' WARNING: netcdf chunking only possible with restart_type="hdf5" ' endif endif - #endif + + if(history_deflate<0 .or. history_deflate>9) then + if (my_task == master_task) write (nu_diag,*) subname//& + ' ERROR: history_deflate value not valid. Allowed range: integers from 0 to 9 ' + abort_list = trim(abort_list)//":55" + endif + + if(restart_deflate<0 .or. restart_deflate>9) then + if (my_task == master_task) write (nu_diag,*) subname//& + ' ERROR: restart_deflate value not valid. Allowed range: integers from 0 to 9 ' + abort_list = trim(abort_list)//":56" + endif #endif ! Implicit solver input validation diff --git a/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_history_write.F90 b/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_history_write.F90 index 1dcee39ac..4827a8f8f 100644 --- a/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_history_write.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_history_write.F90 @@ -45,6 +45,8 @@ module ice_history_write public :: ice_write_hist + integer (kind=int_kind) :: imtid,jmtid + !======================================================================= contains @@ -90,7 +92,7 @@ subroutine ice_write_hist (ns) real (kind=dbl_kind), dimension(nx_block,ny_block,max_blocks) :: work1 integer (kind=int_kind) :: i,k,ic,n,nn, & - ncid,status,imtid,jmtid,kmtidi,kmtids,kmtidb, cmtid,timid,varid, & + ncid,status,kmtidi,kmtids,kmtidb, cmtid,timid,varid, & nvertexid,ivertex,kmtida,iflag, fmtid integer (kind=int_kind), dimension(3) :: dimid integer (kind=int_kind), dimension(4) :: dimidz @@ -454,9 +456,9 @@ subroutine ice_write_hist (ns) endif enddo - !----------------------------------------------------------------- - ! define attributes for time-variant variables - !----------------------------------------------------------------- + !----------------------------------------------------------------- + ! define attributes for time-variant variables + !----------------------------------------------------------------- do n=1,num_avail_hist_fields_2D if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then @@ -475,7 +477,10 @@ subroutine ice_write_hist (ns) endif enddo ! num_avail_hist_fields_3Dc + dimidz(1) = imtid + dimidz(2) = jmtid dimidz(3) = kmtidi + dimidz(4) = timid do n = n3Dccum + 1, n3Dzcum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then @@ -483,7 +488,10 @@ subroutine ice_write_hist (ns) endif enddo ! num_avail_hist_fields_3Dz + dimidz(1) = imtid + dimidz(2) = jmtid dimidz(3) = kmtidb + dimidz(4) = timid do n = n3Dzcum + 1, n3Dbcum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then @@ -491,7 +499,10 @@ subroutine ice_write_hist (ns) endif enddo ! num_avail_hist_fields_3Db + dimidz(1) = imtid + dimidz(2) = jmtid dimidz(3) = kmtida + dimidz(4) = timid do n = n3Dbcum + 1, n3Dacum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then @@ -499,7 +510,10 @@ subroutine ice_write_hist (ns) endif enddo ! num_avail_hist_fields_3Da + 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 @@ -519,7 +533,11 @@ subroutine ice_write_hist (ns) endif enddo ! num_avail_hist_fields_4Di + dimidcz(1) = imtid + dimidcz(2) = jmtid dimidcz(3) = kmtids + dimidcz(4) = cmtid + dimidcz(5) = timid do n = n4Dicum + 1, n4Dscum if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then @@ -527,7 +545,11 @@ subroutine ice_write_hist (ns) endif enddo ! num_avail_hist_fields_4Ds + 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 @@ -1155,7 +1177,7 @@ subroutine ice_hist_field_def(ncid, hfield, lprecision, dimids, ns) history_precision, hist_avg use ice_calendar, only: histfreq, histfreq_n, write_ic #ifdef USE_NETCDF - use netcdf, only: NF90_CHUNKED, nf90_def_var, nf90_put_att + use netcdf, only: NF90_CHUNKED, nf90_def_var, nf90_put_att, nf90_def_var_chunking, nf90_def_var_deflate integer(kind=int_kind), intent(in) :: ncid, dimids(:), lprecision, ns type(ice_hist_field), intent(in) :: hfield @@ -1164,24 +1186,25 @@ subroutine ice_hist_field_def(ncid, hfield, lprecision, dimids, ns) integer(kind=int_kind) :: chunks(size(dimids)), i, status, varid character(len=*), parameter :: subname = '(ice_hist_field_def)' - - if (history_format=='hdf5') then - chunks(1)=history_chunksize(1) - chunks(2)=history_chunksize(2) - do i = 3, size(dimids) - chunks(i) = 0 - enddo - status = nf90_def_var(ncid, hfield%vname, & - lprecision, dimids, varid, & - chunksizes=chunks, deflate_level=history_deflate) - call ice_check_nc(status, & - subname//' ERROR: defining var '//hfield%vname,file=__FILE__,line=__LINE__) - else - ! no chunk and compress - status = nf90_def_var(ncid, hfield%vname, & - lprecision, dimids, varid) - call ice_check_nc(status, & - subname//' ERROR: defining var '//hfield%vname,file=__FILE__,line=__LINE__) + + status = nf90_def_var(ncid, hfield%vname, lprecision, dimids, varid) + call ice_check_nc(status, subname//' ERROR: defining var '//trim(hfield%vname),file=__FILE__,line=__LINE__) + + if (history_format=='hdf5' .and. size(dimids)>1) then + if (dimids(1)==imtid .and. dimids(2)==jmtid) then + chunks(1)=history_chunksize(1) + chunks(2)=history_chunksize(2) + do i = 3, size(dimids) + chunks(i) = 0 + enddo + status = nf90_def_var_chunking(ncid,varid, NF90_CHUNKED, chunksizes=chunks) + call ice_check_nc(status, subname//' ERROR chunking var '//trim(hfield%vname), file=__FILE__, line=__LINE__) + endif + endif + + if (history_format=='hdf5' .and. history_deflate/=0) then + status=nf90_def_var_deflate(ncid, varid, shuffle=0, deflate=1, deflate_level=history_deflate) + call ice_check_nc(status, subname//' ERROR deflating var '//trim(hfield%vname), file=__FILE__, line=__LINE__) endif ! add attributes @@ -1300,32 +1323,39 @@ end subroutine ice_write_hist_fill subroutine ice_hist_coord_def(ncid, coord, lprecision, dimids, varid) - use ice_history_shared, only: history_deflate, history_format + use ice_history_shared, only: history_deflate, history_format, history_chunksize #ifdef USE_NETCDF - use netcdf, only: nf90_def_var, nf90_put_att + use netcdf, only: nf90_def_var, nf90_put_att, nf90_def_var_chunking, nf90_def_var_deflate, NF90_CHUNKED integer(kind=int_kind), intent(in) :: ncid, dimids(:), lprecision type(coord_attributes), intent(in) :: coord integer(kind=int_kind), intent(inout) :: varid !local vars - integer(kind=int_kind) :: status + integer(kind=int_kind) ::chunks(size(dimids)), i, status character(len=*), parameter :: subname = '(ice_hist_coord_def)' + + status = nf90_def_var(ncid, coord%short_name, lprecision, dimids, varid) + call ice_check_nc(status, subname//' ERROR: defining coord '//coord%short_name,file=__FILE__,line=__LINE__) - !define var, set deflate, long_name and units - if (history_format=='hdf5' .and. size(dimids)>1 ) then - status = nf90_def_var(ncid, trim(coord%short_name), & - lprecision, dimids, varid, deflate_level=history_deflate) - call ice_check_nc(status, & - subname//' ERROR: defining coord '//coord%short_name,file=__FILE__,line=__LINE__) - else - ! no compress - status = nf90_def_var(ncid, coord%short_name, & - lprecision, dimids, varid) - call ice_check_nc(status, & - subname//' ERROR: defining coord '//coord%short_name,file=__FILE__,line=__LINE__) + if (history_format=='hdf5' .and. size(dimids)>1) then + if (dimids(1)==imtid .and. dimids(2)==jmtid) then + chunks(1)=history_chunksize(1) + chunks(2)=history_chunksize(2) + do i = 3, size(dimids) + chunks(i) = 0 + enddo + status = nf90_def_var_chunking(ncid,varid, NF90_CHUNKED, chunksizes=chunks) + call ice_check_nc(status, subname//' ERROR chunking var '//trim(coord%short_name), file=__FILE__, line=__LINE__) + endif + endif + + if (history_format=='hdf5' .and. history_deflate/=0) then + status=nf90_def_var_deflate(ncid, varid, shuffle=0, deflate=1, deflate_level=history_deflate) + call ice_check_nc(status, subname//' ERROR deflating var '//trim(coord%short_name), file=__FILE__, line=__LINE__) endif + status = nf90_put_att(ncid,varid,'long_name',trim(coord%long_name)) call ice_check_nc(status, subname// ' ERROR: defining long_name for '//coord%short_name, & file=__FILE__, line=__LINE__) diff --git a/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_restart.F90 b/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_restart.F90 index 3059ac359..ebc05dedc 100644 --- a/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_restart.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_netcdf/ice_restart.F90 @@ -30,10 +30,12 @@ module ice_restart implicit none private public :: init_restart_write, init_restart_read, & - read_restart_field, write_restart_field, final_restart, & - query_field + read_restart_field, write_restart_field, final_restart, & + query_field - integer (kind=int_kind) :: ncid + integer (kind=int_kind) :: ncid , & + dimid_ni, & ! netCDF identifiers + dimid_nj !======================================================================= @@ -170,8 +172,7 @@ subroutine init_restart_write(filename_spec) integer (kind=int_kind), allocatable :: dims(:) integer (kind=int_kind) :: & - dimid_ni, & ! netCDF identifiers - dimid_nj, & ! + dimid_ncat, & ! iflag, & ! netCDF creation flag status ! status variable from netCDF routine @@ -890,18 +891,26 @@ subroutine define_rest_field(ncid, vname, dims) #ifdef USE_NETCDF - if (restart_format=='hdf5') then - chunks(1)=restart_chunksize(1) - chunks(2)=restart_chunksize(2) - do i = 3, size(dims) - chunks(i) = 0 - enddo - status = nf90_def_var(ncid,trim(vname),nf90_double,dims,varid, & - chunksizes=chunks, deflate_level=restart_deflate) - else - status = nf90_def_var(ncid,trim(vname),nf90_double,dims,varid) - end if + status = nf90_def_var(ncid,trim(vname),nf90_double,dims,varid) call ice_check_nc(status, subname//' ERROR: def var '//trim(vname), file=__FILE__, line=__LINE__) + + if (restart_format=='hdf5' .and. size(dims)>1) then + if (dims(1)==dimid_ni .and. dims(2)==dimid_nj) then + chunks(1)=restart_chunksize(1) + chunks(2)=restart_chunksize(2) + do i = 3, size(dims) + chunks(i) = 0 + enddo + status = nf90_def_var_chunking(ncid,varid, NF90_CHUNKED, chunksizes=chunks) + call ice_check_nc(status, subname//' ERROR: chunking var '//trim(vname), file=__FILE__, line=__LINE__) + endif + endif + + if (restart_format=='hdf5' .and. restart_deflate/=0) then + status=nf90_def_var_deflate(ncid, varid, shuffle=0, deflate=1, deflate_level=restart_deflate) + call ice_check_nc(status, subname//' ERROR deflating var '//trim(vname), file=__FILE__, line=__LINE__) + endif + #else call abort_ice(subname//' ERROR: USE_NETCDF cpp not defined', & file=__FILE__, line=__LINE__) diff --git a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_history_write.F90 b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_history_write.F90 index f03844d0a..1c9650b57 100644 --- a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_history_write.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_history_write.F90 @@ -42,7 +42,6 @@ module ice_history_write public :: ice_write_hist - integer (kind=int_kind) :: deflate , shuffle = 0 integer (kind=int_kind) :: imtid,jmtid !======================================================================= @@ -193,13 +192,6 @@ subroutine ice_write_hist (ns) ! option of turning on double precision history files lprecision = pio_real if (history_precision == 8) lprecision = pio_double - - ! option to deflate netcdf4 iotypes - if (history_deflate/=0 .and. history_format=='hdf5') then - deflate = 1 - else - deflate = 0 - endif !----------------------------------------------------------------- ! define dimensions @@ -479,95 +471,114 @@ subroutine ice_write_hist (ns) !----------------------------------------------------------------- ! 2D - dimid3(1) = imtid - dimid3(2) = jmtid - dimid3(3) = timid + dimid3(1) = imtid + dimid3(2) = jmtid + dimid3(3) = timid - do n=1,num_avail_hist_fields_2D - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimid3, ns) - endif - enddo + do n=1,num_avail_hist_fields_2D + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimid3, ns) + endif + enddo - ! 3D (category) - dimidz(1) = imtid - dimidz(2) = jmtid - dimidz(3) = cmtid - dimidz(4) = timid + ! 3D (category) + dimidz(1) = imtid + dimidz(2) = jmtid + dimidz(3) = cmtid + dimidz(4) = timid - do n = n2D + 1, n3Dccum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) - endif - enddo ! num_avail_hist_fields_3Dc + do n = n2D + 1, n3Dccum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Dc - ! 3D (ice layers) - dimidz(3) = kmtidi - - do n = n3Dccum + 1, n3Dzcum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) - endif - enddo ! num_avail_hist_fields_3Dz + ! 3D (ice layers) + dimidz(1) = imtid + dimidz(2) = jmtid + dimidz(3) = kmtidi + dimidz(4) = timid + + do n = n3Dccum + 1, n3Dzcum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Dz - ! 3D (biology ice layers) - dimidz(3) = kmtidb - - do n = n3Dzcum + 1, n3Dbcum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) - endif - enddo ! num_avail_hist_fields_3Db + ! 3D (biology ice layers) + dimidz(1) = imtid + dimidz(2) = jmtid + dimidz(3) = kmtidb + dimidz(4) = timid + + do n = n3Dzcum + 1, n3Dbcum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Db - ! 3D (biology snow layers) - dimidz(3) = kmtida - - do n = n3Dbcum + 1, n3Dacum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) - endif - enddo ! num_avail_hist_fields_3Da + ! 3D (biology snow layers) + dimidz(1) = imtid + dimidz(2) = jmtid + dimidz(3) = kmtida + dimidz(4) = timid + + do n = n3Dbcum + 1, n3Dacum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Da - ! 3D (fsd) - dimidz(3) = fmtid - - do n = n3Dacum + 1, n3Dfcum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) - endif - enddo ! num_avail_hist_fields_3Df + ! 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 + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidz,ns) + endif + enddo ! num_avail_hist_fields_3Df ! 4D (ice categories) - - dimidcz(1) = imtid - dimidcz(2) = jmtid - dimidcz(3) = kmtidi - dimidcz(4) = cmtid - dimidcz(5) = timid - - do n = n3Dfcum + 1, n4Dicum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) - endif - enddo ! num_avail_hist_fields_4Di + dimidcz(1) = imtid + dimidcz(2) = jmtid + dimidcz(3) = kmtidi + dimidcz(4) = cmtid + dimidcz(5) = timid - ! 4D (snow layers) - dimidcz(3) = kmtids - - do n = n4Dicum + 1, n4Dscum - if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) - endif - enddo ! num_avail_hist_fields_4Ds + do n = n3Dfcum + 1, n4Dicum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) + endif + enddo ! num_avail_hist_fields_4Di + + ! 4D (snow layers) + dimidcz(1) = imtid + dimidcz(2) = jmtid + dimidcz(3) = kmtids + dimidcz(4) = cmtid + dimidcz(5) = timid + + do n = n4Dicum + 1, n4Dscum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) + endif + enddo ! num_avail_hist_fields_4Ds ! 4D (fsd layers) - dimidcz(3) = fmtid + 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 - call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) - endif - enddo ! num_avail_hist_fields_4Df + do n = n4Dscum + 1, n4Dfcum + if (avail_hist_fields(n)%vhistfreq == histfreq(ns) .or. write_ic) then + call ice_hist_field_def(File, avail_hist_fields(n),lprecision, dimidcz,ns) + endif + enddo ! num_avail_hist_fields_4Df !----------------------------------------------------------------- ! global attributes @@ -1269,21 +1280,23 @@ subroutine ice_hist_coord_def(File, coord,lprecision, dimids,varid) call ice_pio_check(status, & subname//' ERROR: defining coord '//coord%short_name,file=__FILE__,line=__LINE__) #ifndef USE_PIO1 - if (deflate==1 .and. size(dimids)>1 ) then - status = pio_def_var_deflate(File, varid, shuffle, deflate ,history_deflate) + if (history_deflate/=0 .and. history_format=='hdf5') then + status = pio_def_var_deflate(File, varid, shuffle=0, deflate=1, deflate_level=history_deflate) call ice_pio_check(status, & subname//' ERROR: deflating coord '//coord%short_name,file=__FILE__,line=__LINE__) endif - if (history_format=='hdf5' .and. dimids(1)==imtid .and. dimids(2)==jmtid) then - chunks(1)=history_chunksize(1) - chunks(2)=history_chunksize(2) - do i = 3, size(dimids) - chunks(i) = 0 - enddo - status = pio_def_var_chunking(File, varid, NF90_CHUNKED, chunks) - call ice_pio_check(status, & - subname//' ERROR: chunking coord '//coord%short_name,file=__FILE__,line=__LINE__) + if (history_format=='hdf5' .and. size(dimids)>1) then + if (dimids(1)==imtid .and. dimids(2)==jmtid) then + chunks(1)=history_chunksize(1) + chunks(2)=history_chunksize(2) + do i = 3, size(dimids) + chunks(i) = 0 + enddo + status = pio_def_var_chunking(File, varid, NF90_CHUNKED, chunks) + call ice_pio_check(status, & + subname//' ERROR: chunking coord '//coord%short_name,file=__FILE__,line=__LINE__) + endif endif #endif call ice_pio_check(pio_put_att(File,varid,'long_name',trim(coord%long_name)), & @@ -1323,23 +1336,26 @@ subroutine ice_hist_field_def(File, hfield,lprecision, dimids, ns) subname//' ERROR: defining var '//hfield%vname,file=__FILE__,line=__LINE__) #ifndef USE_PIO1 - if (deflate==1) then - status = pio_def_var_deflate(File, varid, shuffle, deflate ,history_deflate) + if (history_deflate/=0 .and. history_format=='hdf5') then + status = pio_def_var_deflate(File, varid, shuffle=0, deflate=1, deflate_level=history_deflate) call ice_pio_check(status, & subname//' ERROR: deflating var '//hfield%vname,file=__FILE__,line=__LINE__) endif - if (history_format=='hdf5' .and. dimids(1)==imtid .and. dimids(2)==jmtid) then - chunks(1)=history_chunksize(1) - chunks(2)=history_chunksize(2) - do i = 1, size(dimids) - chunks(i) = 0 - enddo - status = pio_def_var_chunking(File, varid, NF90_CHUNKED, chunks) - call ice_pio_check(status, & - subname//' ERROR: chunking var '//hfield%vname,file=__FILE__,line=__LINE__) + if (history_format=='hdf5' .and. size(dimids)>1) then + if (dimids(1)==imtid .and. dimids(2)==jmtid) then + chunks(1)=history_chunksize(1) + chunks(2)=history_chunksize(2) + do i = 1, size(dimids) + chunks(i) = 0 + enddo + status = pio_def_var_chunking(File, varid, NF90_CHUNKED, chunks) + call ice_pio_check(status, & + subname//' ERROR: chunking var '//hfield%vname,file=__FILE__,line=__LINE__) + endif endif #endif + !var attributes call ice_pio_check(pio_put_att(File,varid,'units', trim(hfield%vunit)), & diff --git a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_restart.F90 b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_restart.F90 index 17a702e37..a646cac36 100644 --- a/cicecore/cicedyn/infrastructure/io/io_pio2/ice_restart.F90 +++ b/cicecore/cicedyn/infrastructure/io/io_pio2/ice_restart.F90 @@ -29,7 +29,7 @@ module ice_restart type(io_desc_t) :: iodesc2d type(io_desc_t) :: iodesc3d_ncat - integer (kind=int_kind) :: deflate + integer (kind=int_kind) :: dimid_ni, dimid_nj !======================================================================= @@ -176,8 +176,7 @@ subroutine init_restart_write(filename_spec) character(len=char_len_long) :: filename integer (kind=int_kind) :: & - dimid_ni, dimid_nj, dimid_ncat, & - dimid_nilyr, dimid_nslyr, dimid_naero + dimid_ncat, dimid_nilyr, dimid_nslyr, dimid_naero integer (kind=int_kind), allocatable :: dims(:) @@ -225,12 +224,6 @@ subroutine init_restart_write(filename_spec) write(nu_rst_pointer,'(a)') filename close(nu_rst_pointer) endif - - if (restart_deflate/=0 .and. restart_format=='hdf5') then - deflate = 1 - else - deflate = 0 - endif File%fh=-1 call ice_pio_init(mode='write',filename=trim(filename), File=File, & @@ -241,22 +234,22 @@ subroutine init_restart_write(filename_spec) call pio_seterrorhandling(File, PIO_RETURN_ERROR) call ice_pio_check(pio_put_att(File,pio_global,'istep1',istep1), & - subname//' ERROR: writing restart step',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart step',file=__FILE__,line=__LINE__) call ice_pio_check(pio_put_att(File,pio_global,'myear',myear), & - subname//' ERROR: writing restart year',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart year',file=__FILE__,line=__LINE__) call ice_pio_check(pio_put_att(File,pio_global,'mmonth',mmonth), & - subname//' ERROR: writing restart month',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart month',file=__FILE__,line=__LINE__) call ice_pio_check(pio_put_att(File,pio_global,'mday',mday), & - subname//' ERROR: writing restart day',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart day',file=__FILE__,line=__LINE__) call ice_pio_check(pio_put_att(File,pio_global,'msec',msec), & - subname//' ERROR: writing restart sec',file=__FILE__,line=__LINE__) + subname//' ERROR: writing restart sec',file=__FILE__,line=__LINE__) call ice_pio_check(pio_def_dim(File,'ni',nx_global,dimid_ni), & - subname//' ERROR: defining restart dim ni',file=__FILE__,line=__LINE__) + subname//' ERROR: defining restart dim ni',file=__FILE__,line=__LINE__) call ice_pio_check(pio_def_dim(File,'nj',ny_global,dimid_nj), & - subname//' ERROR: defining restart dim nj',file=__FILE__,line=__LINE__) + subname//' ERROR: defining restart dim nj',file=__FILE__,line=__LINE__) call ice_pio_check(pio_def_dim(File,'ncat',ncat,dimid_ncat), & - subname//' ERROR: defining restart dim ncat',file=__FILE__,line=__LINE__) + subname//' ERROR: defining restart dim ncat',file=__FILE__,line=__LINE__) !----------------------------------------------------------------- ! 2D restart fields @@ -937,22 +930,24 @@ subroutine define_rest_field(File, vname, dims) subname//' ERROR defining restart field '//trim(vname)) #ifndef USE_PIO1 - if (deflate==1) then - status = pio_def_var_deflate(File, vardesc, 0, deflate,restart_deflate) + if (restart_format=='hdf5' .and. restart_deflate/=0) then + status = pio_def_var_deflate(File, vardesc, shuffle=0, deflate=0,deflate_level=restart_deflate) call ice_pio_check(status, & subname//' ERROR: deflating restart field '//trim(vname),file=__FILE__,line=__LINE__) endif if (restart_format=='hdf5' .and. size(dims)>1) then - chunks(1)=restart_chunksize(1) - chunks(2)=restart_chunksize(2) - do i = 3, size(dims) - chunks(i) = 0 - enddo - - status = pio_def_var_chunking(File, vardesc, NF90_CHUNKED, chunks) - call ice_pio_check(status, subname//' ERROR: chunking restart field '//trim(vname),& - file=__FILE__,line=__LINE__) + if (dims(1)==dimid_ni .and. dims(2)==dimid_nj) then + chunks(1)=restart_chunksize(1) + chunks(2)=restart_chunksize(2) + do i = 3, size(dims) + chunks(i) = 0 + enddo + + status = pio_def_var_chunking(File, vardesc, NF90_CHUNKED, chunks) + call ice_pio_check(status, subname//' ERROR: chunking restart field '//trim(vname),& + file=__FILE__,line=__LINE__) + endif endif #endif diff --git a/cicecore/shared/ice_restart_shared.F90 b/cicecore/shared/ice_restart_shared.F90 index 87d6b7763..8452dac7c 100644 --- a/cicecore/shared/ice_restart_shared.F90 +++ b/cicecore/shared/ice_restart_shared.F90 @@ -33,8 +33,8 @@ module ice_restart_shared restart_iotasks , & ! iotasks, root, stride defines io pes for pio restart_root , & ! iotasks, root, stride defines io pes for pio restart_stride , & ! iotasks, root, stride defines io pes for pio - restart_deflate , & ! compression level for netcdf4 - restart_chunksize(2) ! chunksize for netcdf4 + restart_deflate , & ! compression level for hdf5/netcdf4 + restart_chunksize(2) ! chunksize for hdf5/netcdf4 !=======================================================================