#include "rundeck_opts.h"
MODULE LAKES_COM 48,2
!@sum LAKES_COM model variables for Lake/Rivers module
!@auth Gavin Schmidt
!@ver 1.0
USE MODEL_COM
, only : IM,JM,ioread,iowrite,lhead,irerun,irsfic
* ,irsficno
#ifdef TRACERS_WATER
USE TRACER_COM
, only : ntm
#endif
IMPLICIT NONE
SAVE
!@var MWL mass of lake water (kg)
REAL*8, ALLOCATABLE, DIMENSION(:,:) :: MWL
!@var GML total enthalpy of lake (J)
REAL*8, ALLOCATABLE, DIMENSION(:,:) :: GML
!@var TLAKE temperature of lake (C)
REAL*8, ALLOCATABLE, DIMENSION(:,:) :: TLAKE
!@var MLDLK mixed layer depth in lake (m)
REAL*8, ALLOCATABLE, DIMENSION(:,:) :: MLDLK
!@var FLAKE variable lake fraction (1)
REAL*8, ALLOCATABLE, DIMENSION(:,:) :: FLAKE
!@var TANLK tan(alpha) = slope for conical lake (1)
REAL*8, ALLOCATABLE, DIMENSION(:,:) :: TANLK
!@var SVFLAKE previous lake fraction (1)
REAL*8, ALLOCATABLE, DIMENSION(:,:) :: SVFLAKE
#ifdef TRACERS_WATER
!@var TRLAKE tracer amount in each lake level (kg)
Crgr REAL*8, ALLOCATABLE, DIMENSION(NTM,2,:,:) :: TRLAKE
REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TRLAKE
#endif
END MODULE LAKES_COM
SUBROUTINE ALLOC_LAKES_COM (GRID) 1,5
C23456789012345678901234567890123456789012345678901234567890123456789012
!@SUM To alllocate arrays whose sizes now need to be determined
!@+ at run-time
!@auth Raul Garza-Robles
!@ver 1.0
USE DOMAIN_DECOMP
, only: DIST_GRID, GET
USE MODEL_COM
, only : IM, JM
USE LAKES_COM
, ONLY: MWL, GML, TLAKE, MLDLK, FLAKE, TANLK, SVFLAKE
#ifdef TRACERS_WATER
USE TRACER_COM
, only : NTM
USE LAKES_COM
, ONLY: TRLAKE
#endif
IMPLICIT NONE
TYPE (DIST_GRID), INTENT(IN) :: grid
INTEGER IER
#ifdef TRACERS_WATER
!@var TRLAKE tracer amount in each lake level (kg)
ALLOCATE( TRLAKE(NTM,2,IM,GRID%J_STRT_HALO:GRID%J_STOP_HALO)
* , STAT=IER)
#endif
ALLOCATE ( MWL(IM,GRID%J_STRT_HALO:GRID%J_STOP_HALO),
* GML(IM,GRID%J_STRT_HALO:GRID%J_STOP_HALO),
* TLAKE(IM,GRID%J_STRT_HALO:GRID%J_STOP_HALO),
* MLDLK(IM,GRID%J_STRT_HALO:GRID%J_STOP_HALO),
* FLAKE(IM,GRID%J_STRT_HALO:GRID%J_STOP_HALO),
* TANLK(IM,GRID%J_STRT_HALO:GRID%J_STOP_HALO),
* SVFLAKE(IM,GRID%J_STRT_HALO:GRID%J_STOP_HALO),
* STAT=IER
* )
RETURN
END SUBROUTINE ALLOC_LAKES_COM
SUBROUTINE io_lakes(kunit,iaction,ioerr) 1,17
!@sum io_lakes reads and writes lake arrays to file
!@auth Gavin Schmidt
!@ver 1.0
USE DOMAIN_DECOMP
, only : AM_I_ROOT, grid
USE DOMAIN_DECOMP
, only : PACK_DATA , PACK_BLOCK
USE DOMAIN_DECOMP
, only : UNPACK_DATA, UNPACK_BLOCK,
* BACKSPACE_PARALLEL
USE LAKES_COM
IMPLICIT NONE
INTEGER kunit !@var kunit unit number of read/write
INTEGER iaction !@var iaction flag for reading or writing to file
!@var IOERR 1 (or -1) if there is (or is not) an error in i/o
INTEGER, INTENT(INOUT) :: IOERR
!@var HEADER Character string label for individual records
CHARACTER*80 :: HEADER, MODULE_HEADER = "LAKE02"
REAL*8, DIMENSION(IM,JM):: MLDLK_glob,MWL_glob,TLAKE_glob,GML_glob
* ,FLAKE_glob
#ifdef TRACERS_WATER
!@var TRHEADER Character string label for individual records
CHARACTER*80 :: TRHEADER, TRMODULE_HEADER = "TRLAK01"
REAL*8 :: TRLAKE_GLOB(NTM,2,IM,JM)
IF (AM_I_ROOT())
* write (TRMODULE_HEADER(lhead+1:80)
* ,'(a7,i3,a)')'R8 dim(',NTM,',2,im,jm):TRLAKE'
#endif
MODULE_HEADER(lhead+1:80) = 'R8 dim(im,jm):MixLD,MWtr,Tlk,Enth,Fl'
SELECT CASE (IACTION)
CASE (:IOWRITE) ! output to standard restart file
CALL PACK_DATA
(grid, MLDLK, MLDLK_GLOB)
CALL PACK_DATA
(grid, MWL , MWL_GLOB)
CALL PACK_DATA
(grid, TLAKE, TLAKE_GLOB)
CALL PACK_DATA
(grid, GML , GML_GLOB)
CALL PACK_DATA
(grid, FLAKE, FLAKE_GLOB)
#ifdef TRACERS_WATER
CALL PACK_BLOCK
(grid, TRLAKE, TRLAKE_glob)
#endif
IF (AM_I_ROOT()) THEN
WRITE (kunit,err=10) MODULE_HEADER,MLDLK_glob,MWL_glob,
& TLAKE_glob,GML_glob,FLAKE_glob
#ifdef TRACERS_WATER
WRITE (kunit,err=10) TRMODULE_HEADER,TRLAKE_glob
#endif
END IF
CASE (IOREAD:) ! input from restart file
if ( AM_I_ROOT() ) then
READ (kunit,err=10) HEADER
CALL BACKSPACE_PARALLEL
(kunit)
if (HEADER(1:LHEAD).NE.MODULE_HEADER(1:LHEAD)) THEN
READ (kunit,err=10) HEADER,MLDLK_glob,MWL_glob,TLAKE_glob,
& GML_glob ! no FLAKE
FLAKE_glob = 0.d0
else
READ (kunit,err=10) HEADER,MLDLK_glob,MWL_glob,TLAKE_glob,
& GML_glob,FLAKE_glob
c IF (HEADER(1:LHEAD).NE.MODULE_HEADER(1:LHEAD)) THEN
c PRINT*,"Discrepancy in module version ",HEADER,MODULE_HEADER
c GO TO 10
END IF
end if
CALL UNPACK_DATA
(grid, MLDLK_GLOB, MLDLK)
CALL UNPACK_DATA
(grid, MWL_GLOB, MWL )
CALL UNPACK_DATA
(grid, TLAKE_GLOB, TLAKE)
CALL UNPACK_DATA
(grid, GML_GLOB, GML )
CALL UNPACK_DATA
(grid, FLAKE_GLOB, FLAKE)
#ifdef TRACERS_WATER
SELECT CASE (IACTION)
CASE (IRERUN,IOREAD,IRSFIC,IRSFICNO) ! reruns/restarts
if ( AM_I_ROOT() ) then
READ (kunit,err=10) TRHEADER,TRLAKE_glob
IF (TRHEADER(1:LHEAD).NE.TRMODULE_HEADER(1:LHEAD)) THEN
PRINT*,"Discrepancy in module version ",TRHEADER
* ,TRMODULE_HEADER
GO TO 10
END IF
end if
CALL UNPACK_BLOCK
(grid, TRLAKE_GLOB, TRLAKE)
END SELECT
#endif
END SELECT
RETURN
10 IOERR=1
RETURN
END SUBROUTINE io_lakes