equilibrium_storage_netcdf_s.f90 Source File


Contents


Source Code

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