#include <misc.h> #include <preproc.h> module iobinary 1,8 !----------------------------------------------------------------------- !BOP ! ! !MODULE: iobinary ! ! !DESCRIPTION: ! Set of wrappers to write binary I/O ! ! !USES: use shr_kind_mod, only: r8 => shr_kind_r8 use spmdMod , only : masterproc, mpicom, MPI_REAL8, MPI_INTEGER, & MPI_LOGICAL use spmdGathScatMod, only : scatter_data_from_master, gather_data_to_master use decompMod , only : get_clmlevel_gsize use abortutils , only : endrun use clm_varctl , only : iulog ! ! !PUBLIC TYPES: implicit none save ! ! !PUBLIC MEMBER FUNCTIONS: interface bin_iolocal 4 module procedure bin_2darray_int module procedure bin_2darray_real end interface ! ! !REVISION HISTORY: ! Created by Mariana Vertenstein ! Updated by tcraig, 3/2007 ! ! ! !PRIVATE MEMBER FUNCTIONS: None !EOP !----------------------------------------------------------------------- contains !----------------------------------------------------------------------- !BOP ! ! !IROUTINE: bin_2darray_int ! ! !INTERFACE: subroutine bin_2darray_int (iu, arrayin, clmlevel, flag) 1,7 ! ! !DESCRIPTION: ! Wrapper routine to read/write integer 2d array from restart binary file ! ! !ARGUMENTS: implicit none integer, intent(in) :: iu !input unit integer, pointer :: arrayin(:,:) !input data character(len=*), intent(in) :: clmlevel !type of input data character(len=*), intent(in) :: flag !'read' or 'write' ! ! !REVISION HISTORY: ! Created by Mariana Vertenstein ! Updated by tcraig, 3/2007 ! ! ! !LOCAL VARIABLES: !EOP integer :: n !index integer :: ier !return code integer :: gsize !size of first dimension integer :: lb1,ub1,lb2,ub2 !bound of arrayin integer, pointer :: arrayl(:) !temporary integer, pointer :: arrayg(:) !temporary character(len=*),parameter :: subname = 'bin_2darray_int' !----------------------------------------------------------------------- if (flag /= 'read' .and. flag /= 'write') then write(iulog,*) trim(subname),' error in flag ',trim(flag) call endrun() endif gsize = get_clmlevel_gsize(clmlevel) if (masterproc) then allocate(arrayg(gsize),stat=ier) if (ier /= 0) then write(iulog,*) trim(subname),'arrayg allocation error' call endrun() end if endif lb1 = lbound(arrayin,dim=1) ub1 = ubound(arrayin,dim=1) lb2 = lbound(arrayin,dim=2) ub2 = ubound(arrayin,dim=2) allocate(arrayl(lb1:ub1),stat=ier) if (ier /= 0) then write(iulog,*) trim(subname),'arrayg allocation error' call endrun() end if do n = lb2,ub2 if (flag == 'write') then arrayl(lb1:ub1) = arrayin(lb1:ub1,n) call gather_data_to_master(arrayl, arrayg, clmlevel) endif if (masterproc) then if (flag == 'write') write (iu,iostat=ier) arrayg if (flag == 'read' ) read (iu,iostat=ier) arrayg if (ier /= 0 ) then write(iulog,*) trim(subname),'ier = ',ier,' on i/o unit = ',iu call endrun() endif endif if (flag == 'read') then call scatter_data_from_master(arrayl, arrayg, clmlevel) arrayin(lb1:ub1,n) = arrayl(lb1:ub1) endif enddo if (masterproc) deallocate(arrayg) deallocate(arrayl) end subroutine bin_2darray_int !----------------------------------------------------------------------- !BOP ! ! !IROUTINE: bin_2darray_real ! ! !INTERFACE: subroutine bin_2darray_real (iu, arrayin, clmlevel, flag) 1,7 ! ! !DESCRIPTION: ! Wrapper routine to read/write integer 2d array from restart binary file ! ! !ARGUMENTS: implicit none integer, intent(in) :: iu !input unit real(r8), pointer :: arrayin(:,:) !input data character(len=*), intent(in) :: clmlevel !type of input data character(len=*), intent(in) :: flag !'read' or 'write' ! ! !REVISION HISTORY: ! Created by Mariana Vertenstein ! Updated by tcraig, 3/2007 ! ! ! !LOCAL VARIABLES: !EOP integer :: n !index integer :: ier !return code integer :: gsize !size of first dimension integer :: lb1,ub1,lb2,ub2 !bound of arrayin real(r8), pointer :: arrayl(:) !temporary real(r8), pointer :: arrayg(:) !temporary character(len=*),parameter :: subname = 'bin_2darray_real' !----------------------------------------------------------------------- if (flag /= 'read' .and. flag /= 'write') then write(iulog,*) trim(subname),' error in flag ',trim(flag) call endrun() endif gsize = get_clmlevel_gsize(clmlevel) if (masterproc) then allocate(arrayg(gsize),stat=ier) if (ier /= 0) then write(iulog,*) trim(subname),'arrayg allocation error' call endrun() end if endif lb1 = lbound(arrayin,dim=1) ub1 = ubound(arrayin,dim=1) lb2 = lbound(arrayin,dim=2) ub2 = ubound(arrayin,dim=2) allocate(arrayl(lb1:ub1),stat=ier) if (ier /= 0) then write(iulog,*) trim(subname),'arrayg allocation error' call endrun() end if do n = lb2,ub2 if (flag == 'write') then arrayl(lb1:ub1) = arrayin(lb1:ub1,n) call gather_data_to_master(arrayl, arrayg, clmlevel) endif if (masterproc) then if (flag == 'write') write (iu,iostat=ier) arrayg if (flag == 'read' ) read (iu,iostat=ier) arrayg if (ier /= 0 ) then write(iulog,*) trim(subname),'ier = ',ier,' on i/o unit = ',iu call endrun() endif endif if (flag == 'read') then call scatter_data_from_master(arrayl, arrayg, clmlevel) arrayin(lb1:ub1,n) = arrayl(lb1:ub1) endif enddo if (masterproc) deallocate(arrayg) deallocate(arrayl) end subroutine bin_2darray_real end module iobinary