submodule(equilibrium_storage_m) equilibrium_storage_netcdf_s !! Routines related with NETCDF I/O of equilibroim_storage implicit none contains module subroutine write_netcdf_equilibrium_storage(self, fgid) class(equilibrium_storage_t), intent(in) :: self integer, intent(in) :: fgid integer :: npoints integer :: nf90_stat, iddim_npoints, iddim_two, id_rho, id_bx, id_by, id_btor, id_epol, id_erad, id_district ! define dimensions npoints = size(self%rho) nf90_stat = nf90_def_dim(fgid, 'npoints', npoints , iddim_npoints) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_dim(fgid, 'two', 2 , iddim_two) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! define variables nf90_stat = nf90_def_var(fgid, 'rho', NF90_DOUBLE, iddim_npoints, id_rho) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'bx', NF90_DOUBLE, iddim_npoints, id_bx) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'by', NF90_DOUBLE, iddim_npoints, id_by) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'btor', NF90_DOUBLE, iddim_npoints, id_btor) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'epol', NF90_DOUBLE, (/iddim_npoints, iddim_two/), id_epol) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'erad', NF90_DOUBLE, (/iddim_npoints, iddim_two/), id_erad) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'district', NF90_INT, iddim_npoints, id_district) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! end of definition nf90_stat = nf90_enddef(fgid) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! put variables nf90_stat = nf90_put_var(fgid, id_rho, self%rho ) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_bx, self%bx ) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_by, self%by ) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_btor, self%btor ) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_epol, self%epol ) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_erad, self%erad ) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_district, self%district ) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! put into redefinition state nf90_stat = nf90_redef(fgid) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) end subroutine module subroutine read_netcdf_equilibrium_storage(self, fgid) class(equilibrium_storage_t), intent(inout) :: self integer, intent(in) :: fgid integer :: npoints, two integer :: nf90_stat, iddim_npoints, iddim_two, id_rho, id_bx, id_by, & id_btor, id_epol, id_erad, id_district ! Get dimensions nf90_stat = nf90_inq_dimid(fgid, 'npoints', iddim_npoints) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inquire_dimension(fgid, iddim_npoints, len = npoints) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_dimid(fgid, 'two', iddim_two) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inquire_dimension(fgid, iddim_two, len = two) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! Allocate fields allocate(self%rho(npoints)) allocate(self%bx(npoints)) allocate(self%by(npoints)) allocate(self%btor(npoints)) allocate(self%epol(npoints,two)) allocate(self%erad(npoints, two)) allocate(self%district(npoints)) ! Read variables nf90_stat = nf90_inq_varid(fgid, 'rho', id_rho) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_rho, self%rho) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'bx', id_bx) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_bx, self%bx) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'by', id_by) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_by, self%by) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'btor', id_btor) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_btor, self%btor) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'epol', id_epol) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_epol, self%epol) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'erad', id_erad) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_erad, self%erad) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'district', id_district) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_district, self%district) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) end subroutine end submodule