submodule(immersed_m) immersed_netcdf_s !! Routines related with NetCDF I/O of immersed boundary use netcdf use error_handling_m, only : handle_error_netcdf implicit none contains module subroutine write_netcdf_immersed(self, fgid) class(immersed_t), intent(in) :: self integer, intent(in) :: fgid integer :: np_mesh, nf90_stat integer :: iddim_np_mesh, iddim_n_inds, & iddim_n_adj_inds, id_charfun, id_dirindfun, & id_inds, id_adj_inds ! Define dimensions np_mesh = size(self%charfun) nf90_stat = nf90_def_dim(fgid, 'np_mesh', np_mesh , iddim_np_mesh) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_dim(fgid, 'n_inds', & self%n_inds, iddim_n_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_dim(fgid, 'n_adj_inds', & self%n_adj_inds, iddim_n_adj_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! Define variables nf90_stat = nf90_def_var(fgid, 'charfun', NF90_DOUBLE, & iddim_np_mesh, id_charfun) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'dirindfun', NF90_DOUBLE, & iddim_np_mesh, id_dirindfun) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'inds', NF90_INT, & iddim_n_inds, id_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_def_var(fgid, 'adj_inds', NF90_INT, & iddim_n_adj_inds, id_adj_inds) 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_charfun, self%charfun) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_dirindfun, self%dirindfun ) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_inds, self%inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_put_var(fgid, id_adj_inds, & self%adj_inds) 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_immersed(self, fgid) class(immersed_t), intent(inout) :: self integer, intent(in) :: fgid integer :: np_mesh, nf90_stat integer :: iddim_np_mesh, iddim_n_inds, & iddim_n_adj_inds, id_charfun, id_dirindfun, & id_inds, id_adj_inds ! Get dimensions nf90_stat = nf90_inq_dimid(fgid, 'np_mesh', iddim_np_mesh) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inquire_dimension(fgid, iddim_np_mesh, len=np_mesh) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_dimid(fgid, 'n_inds', & iddim_n_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inquire_dimension(fgid, & iddim_n_inds, len=self%n_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_dimid(fgid, 'n_adj_inds', & iddim_n_adj_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inquire_dimension(fgid, & iddim_n_adj_inds, len=self%n_adj_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) ! Allocate fields allocate(self%charfun(np_mesh)) allocate(self%dirindfun(np_mesh)) allocate(self%inds(self%n_inds)) allocate(self%adj_inds(self%n_adj_inds)) ! Read fields nf90_stat = nf90_inq_varid(fgid, 'charfun', id_charfun) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_charfun, self%charfun) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'dirindfun', id_dirindfun) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_dirindfun, self%dirindfun) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'inds', id_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_inds, self%inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_inq_varid(fgid, 'adj_inds', & id_adj_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) nf90_stat = nf90_get_var(fgid, id_adj_inds, & self%adj_inds) call handle_error_netcdf(nf90_stat, __LINE__, __FILE__) end subroutine end submodule