perp_bnd_flux_netcdf_s.f90 Source File


Contents


Source Code

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