immersed_netcdf_s.f90 Source File


This file depends on

sourcefile~~immersed_netcdf_s.f90~~EfferentGraph sourcefile~immersed_netcdf_s.f90 immersed_netcdf_s.f90 sourcefile~error_handling_m.f90 error_handling_m.f90 sourcefile~immersed_netcdf_s.f90->sourcefile~error_handling_m.f90 sourcefile~immersed_m.f90 immersed_m.f90 sourcefile~immersed_netcdf_s.f90->sourcefile~immersed_m.f90 sourcefile~comm_handling_m.f90 comm_handling_m.f90 sourcefile~error_handling_m.f90->sourcefile~comm_handling_m.f90 sourcefile~precision_m.f90 precision_m.f90 sourcefile~error_handling_m.f90->sourcefile~precision_m.f90 sourcefile~screen_io_m.f90 screen_io_m.f90 sourcefile~error_handling_m.f90->sourcefile~screen_io_m.f90 sourcefile~status_codes_m.f90 status_codes_m.f90 sourcefile~error_handling_m.f90->sourcefile~status_codes_m.f90 sourcefile~equilibrium_m.f90 equilibrium_m.f90 sourcefile~immersed_m.f90->sourcefile~equilibrium_m.f90 sourcefile~list_operations_m.f90 list_operations_m.f90 sourcefile~immersed_m.f90->sourcefile~list_operations_m.f90 sourcefile~mesh_cart_m.f90 mesh_cart_m.f90 sourcefile~immersed_m.f90->sourcefile~mesh_cart_m.f90 sourcefile~immersed_m.f90->sourcefile~precision_m.f90 sourcefile~equilibrium_m.f90->sourcefile~precision_m.f90 sourcefile~list_operations_m.f90->sourcefile~precision_m.f90 sourcefile~list_operations_m.f90->sourcefile~screen_io_m.f90 sourcefile~mesh_cart_m.f90->sourcefile~error_handling_m.f90 sourcefile~mesh_cart_m.f90->sourcefile~comm_handling_m.f90 sourcefile~mesh_cart_m.f90->sourcefile~equilibrium_m.f90 sourcefile~mesh_cart_m.f90->sourcefile~precision_m.f90 sourcefile~mesh_cart_m.f90->sourcefile~status_codes_m.f90 sourcefile~descriptors_m.f90 descriptors_m.f90 sourcefile~mesh_cart_m.f90->sourcefile~descriptors_m.f90 sourcefile~slab_equilibrium.f90 slab_equilibrium.f90 sourcefile~mesh_cart_m.f90->sourcefile~slab_equilibrium.f90 sourcefile~screen_io_m.f90->sourcefile~precision_m.f90 sourcefile~descriptors_m.f90->sourcefile~screen_io_m.f90 sourcefile~slab_equilibrium.f90->sourcefile~equilibrium_m.f90 sourcefile~slab_equilibrium.f90->sourcefile~precision_m.f90 sourcefile~slab_equilibrium.f90->sourcefile~screen_io_m.f90 sourcefile~slab_equilibrium.f90->sourcefile~descriptors_m.f90 sourcefile~params_equi_slab_m.f90 params_equi_slab_m.f90 sourcefile~slab_equilibrium.f90->sourcefile~params_equi_slab_m.f90 sourcefile~params_equi_slab_m.f90->sourcefile~error_handling_m.f90 sourcefile~params_equi_slab_m.f90->sourcefile~precision_m.f90 sourcefile~params_equi_slab_m.f90->sourcefile~screen_io_m.f90 sourcefile~params_equi_slab_m.f90->sourcefile~status_codes_m.f90

Source Code

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