diff --git a/src/main.f90 b/src/main.f90 index 062885d34180b3a62f14b25328bfdb0624cc262d..95285696246f52b1e33e42d66e448d63e1b1b0bc 100644 --- a/src/main.f90 +++ b/src/main.f90 @@ -4,10 +4,23 @@ program main type(io_struct) :: ios real, dimension(10) :: time_data = (/1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0/) real, dimension(10) :: series_data = (/10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0/) + real, dimension(10, 10) :: timescan_data + real, dimension(10) :: profile_data + integer :: i, j - call open_netcdf('series_data.nc', ios, 10) + ! Инициализация данных timescan и profile + do i = 1, 10 + profile_data(i) = real(i) + do j = 1, 10 + timescan_data(j, i) = real(j) + real(i) + end do + end do + + call open_netcdf('series_data.nc', ios, 10, 10) if (ios%is_open) then call write_series(ios, time_data, series_data) + call write_timescan(ios, timescan_data) + call write_profile(ios, profile_data) call close_netcdf(ios) else print *, 'Failed to open NetCDF file.' diff --git a/src/netcdf_io_module.f90 b/src/netcdf_io_module.f90 index 2a467186f9197b5ecf77c7706665029172231e10..373d42c595581998060a19734756917a00376759 100644 --- a/src/netcdf_io_module.f90 +++ b/src/netcdf_io_module.f90 @@ -4,29 +4,45 @@ module netcdf_io_module type :: io_struct integer :: ncid - integer :: time_dimid, varid_time, varid_series + integer :: time_dimid, height_dimid + integer :: varid_time, varid_series, varid_timescan, varid_profile logical :: is_open = .false. character(len=128) :: series_name = 'timeseries of variable' character(len=128) :: series_long_name = 'timeseries of some variable' character(len=128) :: series_units = 'unit' + character(len=128) :: timescan_name = 'vertical timescan of variable' + character(len=128) :: timescan_long_name = 'vertical timescan of some variable' + character(len=128) :: timescan_units = 'unit' + character(len=128) :: profile_name = 'vertical profile of variable' + character(len=128) :: profile_long_name = 'vertical profile of some variable' + character(len=128) :: profile_units = 'unit' end type io_struct contains - subroutine open_netcdf(filename, ios, time_len) + subroutine open_netcdf(filename, ios, time_len, height_len) character(len=*), intent(in) :: filename type(io_struct), intent(out) :: ios - integer, intent(in) :: time_len + integer, intent(in) :: time_len, height_len integer :: ierr ierr = nf90_create(filename, nf90_clobber, ios%ncid) if (ierr == nf90_noerr) then ios%is_open = .true. ierr = nf90_def_dim(ios%ncid, 'time', time_len, ios%time_dimid) + ierr = nf90_def_dim(ios%ncid, 'height', height_len, ios%height_dimid) ierr = nf90_def_var(ios%ncid, 'time', nf90_float, ios%time_dimid, ios%varid_time) ierr = nf90_def_var(ios%ncid, 'series', nf90_float, ios%time_dimid, ios%varid_series) + ierr = nf90_def_var(ios%ncid, 'timescan', nf90_float, [ios%time_dimid, ios%height_dimid], ios%varid_timescan) + ierr = nf90_def_var(ios%ncid, 'profile', nf90_float, ios%height_dimid, ios%varid_profile) ierr = nf90_put_att(ios%ncid, ios%varid_series, 'standard_name', ios%series_name) ierr = nf90_put_att(ios%ncid, ios%varid_series, 'long_name', ios%series_long_name) ierr = nf90_put_att(ios%ncid, ios%varid_series, 'units', ios%series_units) + ierr = nf90_put_att(ios%ncid, ios%varid_timescan, 'standard_name', ios%timescan_name) + ierr = nf90_put_att(ios%ncid, ios%varid_timescan, 'long_name', ios%timescan_long_name) + ierr = nf90_put_att(ios%ncid, ios%varid_timescan, 'units', ios%timescan_units) + ierr = nf90_put_att(ios%ncid, ios%varid_profile, 'standard_name', ios%profile_name) + ierr = nf90_put_att(ios%ncid, ios%varid_profile, 'long_name', ios%profile_long_name) + ierr = nf90_put_att(ios%ncid, ios%varid_profile, 'units', ios%profile_units) ierr = nf90_enddef(ios%ncid) else print *, 'Error opening file: ', ierr @@ -47,10 +63,42 @@ contains ierr = nf90_put_var(ios%ncid, ios%varid_time, time_data) ierr = nf90_put_var(ios%ncid, ios%varid_series, series_data) if (ierr /= nf90_noerr) then - print *, 'Error writing data:', ierr + print *, 'Error writing series data:', ierr endif end subroutine write_series + subroutine write_timescan(ios, timescan_data) + type(io_struct), intent(in) :: ios + real, dimension(:,:), intent(in) :: timescan_data + integer :: ierr + + if (.not. ios%is_open) then + print *, "File is not open." + return + endif + + ierr = nf90_put_var(ios%ncid, ios%varid_timescan, timescan_data) + if (ierr /= nf90_noerr) then + print *, 'Error writing timescan data:', ierr + endif + end subroutine write_timescan + + subroutine write_profile(ios, profile_data) + type(io_struct), intent(in) :: ios + real, dimension(:), intent(in) :: profile_data + integer :: ierr + + if (.not. ios%is_open) then + print *, "File is not open." + return + endif + + ierr = nf90_put_var(ios%ncid, ios%varid_profile, profile_data) + if (ierr /= nf90_noerr) then + print *, 'Error writing profile data:', ierr + endif + end subroutine write_profile + subroutine close_netcdf(ios) type(io_struct), intent(inout) :: ios integer :: ierr