submodule(perp_bnd_flux_m) perp_bnd_flux_netcdf_s !! Routines for storing and reading boundary polygons !! related to perpendicular boundary flux module implicit none contains module subroutine write_netcdf_perp_bnd_flux(self, fgid) class(perp_bnd_flux_t), intent(in) :: self integer, intent(in) :: fgid integer :: nf90_stat integer :: id_core, id_outer, id_target, & id_conn_core, id_conn_outer, id_conn_target, & id_n_points, id_full_to_inner ! Define dimension for full_to_inner nf90_stat = nf90_def_dim(fgid, 'n_points', size(self%full_to_inner), & id_n_points) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! Define full_to_inner variable nf90_stat = nf90_def_var(fgid, 'full_to_inner', NF90_INT, id_n_points, & id_full_to_inner) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! Define netcdf groups for polygons nf90_stat = nf90_def_grp(fgid, 'core', id_core) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_grp(fgid, 'outer', id_outer) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_grp(fgid, 'target', id_target) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! Define netcdf groups for connectivity matrices nf90_stat = nf90_def_grp(fgid, 'conn_core', id_conn_core) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_grp(fgid, 'conn_outer', id_conn_outer) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_grp(fgid, 'conn_target', id_conn_target) 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 data nf90_stat = nf90_put_var(fgid, id_full_to_inner, self%full_to_inner) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call self%core%write_netcdf(id_core) call self%outer%write_netcdf(id_outer) call self%target%write_netcdf(id_target) call self%conn_core%write_netcdf(id_conn_core) call self%conn_outer%write_netcdf(id_conn_outer) call self%conn_target%write_netcdf(id_conn_target) end subroutine module subroutine read_netcdf_perp_bnd_flux(self, fgid) class(perp_bnd_flux_t), intent(inout) :: self integer, intent(in) :: fgid integer :: nf90_stat integer :: id_core, id_outer, id_target, & id_conn_core, id_conn_outer, id_conn_target, & id_n_points, id_full_to_inner integer :: n_points ! Get dimension nf90_stat = nf90_inq_dimid(fgid, 'n_points', id_n_points) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inquire_dimension(fgid, id_n_points, len=n_points) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! Allocate full_to_inner allocate(self%full_to_inner(n_points)) ! Read fields nf90_stat = nf90_inq_varid(fgid, 'full_to_inner', id_full_to_inner) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_full_to_inner, self%full_to_inner) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! Read groups for polygons nf90_stat = nf90_inq_grp_ncid(fgid, 'core', id_core) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call self%core%read_netcdf(id_core) nf90_stat = nf90_inq_grp_ncid(fgid, 'outer', id_outer) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call self%outer%read_netcdf(id_outer) nf90_stat = nf90_inq_grp_ncid(fgid, 'target', id_target) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call self%target%read_netcdf(id_target) ! Read groups for connectivity matrices nf90_stat = nf90_inq_grp_ncid(fgid, 'conn_core', id_conn_core) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call self%conn_core%read_netcdf(id_conn_core) nf90_stat = nf90_inq_grp_ncid(fgid, 'conn_outer', id_conn_outer) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call self%conn_outer%read_netcdf(id_conn_outer) nf90_stat = nf90_inq_grp_ncid(fgid, 'conn_target', id_conn_target) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) call self%conn_target%read_netcdf(id_conn_target) end subroutine end submodule