#include "rundeck_opts.h" MODULE GHY_COM 83,2 !@sum GHY_COM contains the areas used by the Ground Hydrology routines !@auth Frank Abramopolus/Igor Aleinov !@ver 1.0 USE MODEL_COM, only : im,jm !!! USE SLE001, only : ngm,imt,nlsn #ifdef TRACERS_WATER USE TRACER_COM, only : ntm #endif IMPLICIT NONE SAVE ccc CONSTANTS ccc dimensions of the GHY arrays !@var ngm number of soil layers !@var imt number of soil textures !@var nlsn max number of snow layers integer, parameter, public :: ngm=6, imt=5, nlsn=3 !@dbparam WSN_MAX snow amount limit (m, water equivalent) real*8, public :: WSN_MAX = 2.d0 !@var LS_NFRAC number of land surface fractions integer, parameter, public :: LS_NFRAC=3 !@var shc_soil_texture specific heat capacity of soil texture (J/K/M^3) real*8, parameter,public :: shc_soil_texture(imt) & = (/2d6,2d6,2d6,2.5d6,2.4d6/) ccc variable earth fraction REAL*8, ALLOCATABLE, DIMENSION(:,:) :: FEARTH ccc bare/veg not in merged array because WBARE does not contain ccc 0 index for legacy reasons !REAL*8, POINTER, DIMENSION(:,:,:) :: WBARE !REAL*8, POINTER, DIMENSION(:,:,:) :: WVEGE !REAL*8, POINTER, DIMENSION(:,:,:) :: HTBARE !REAL*8, POINTER, DIMENSION(:,:,:) :: HTVEGE REAL*8, ALLOCATABLE, TARGET, DIMENSION(:,:,:,:) :: W_IJ REAL*8, ALLOCATABLE, TARGET, DIMENSION(:,:,:,:) :: HT_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: SNOWBV REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: DZ_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: Q_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: QK_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:) :: SL_IJ ccc the following arrays contain prognostic variables for the snow model INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: NSN_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: DZSN_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: WSN_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: HSN_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: FR_SNOW_IJ ccc FR_SNOW_RAD_IJ is snow fraction for albedo computations ccc actually it should be the same as FR_SNOW_IJ but currently the snow ccc model can't handle fractional cover for thick snow (will fix later) REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: FR_SNOW_RAD_IJ C**** Canopy temperature (C) REAL*8, ALLOCATABLE, DIMENSION(:,:) :: CANOPY_TEMP_IJ C**** replacements for GDATA REAL*8, ALLOCATABLE, DIMENSION(:,:) :: SNOWE REAL*8, ALLOCATABLE, DIMENSION(:,:) :: TEARTH REAL*8, ALLOCATABLE, DIMENSION(:,:) :: WEARTH REAL*8, ALLOCATABLE, DIMENSION(:,:) :: AIEARTH REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: SNOAGE !@var GDEEP keeps average (2:n) values of temperature, water and ice REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: GDEEP !@dbparam snoage_def determines how snowage is calculated: !@+ = 0 independent of temperature !@+ = 1 only when max daily local temp. over type > 0 integer :: snoage_def = 0 ccc topmodel input data and standard deviation of the elevation REAL*8, ALLOCATABLE, DIMENSION(:,:) :: TOP_INDEX_IJ, top_dev_ij ccc evaporation limits from previous time step REAL*8, ALLOCATABLE, DIMENSION(:,:) :: evap_max_ij, fr_sat_ij, & qg_ij #ifdef TRACERS_WATER_OLD !@var TRBARE,TRVEGE tracers in bare and veg. soil fraction (kg/m^2) REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TRBARE REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TRVEGE C**** What is the prognostic variable for snow here? !@var TRSNOWBV tracer amount in snow over bare and veg. soil (kg/m^2) REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TRSNOWBV #endif #ifdef TRACERS_WATER ccc new tracers !integer, parameter :: NTM = 3 !!!@var TR_WBARE tracers in bare soil fraction (kg/m^2) !!!@var TR_WVEGE tracers in vegetated soil fraction (kg/m^2) !@var TR_W_IJ water tracers in soil (kg/m^2) !@var TR_WSN_IJ tracer amount in snow (multiplied by fr_snow) (kg/m^2) !REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TR_WBARE !REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TR_WVEGE REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: TR_W_IJ REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: TR_WSN_IJ ccc TRSNOWBV is not used !@var TRSNOWBV tracer amount in snow over bare and veg. soil (kg/m^2) REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TRSNOWBV0 !@var ntixw index array for tracers (shared by OMP threads) integer ntixw(ntm) #endif #ifdef USE_ENT ccc stuff that got back from VEG_COM, maybe should be relocated to Ent !@var Cint Internal foliage CO2 concentration (mol/m3) real*8, ALLOCATABLE, dimension(:,:) :: Ci_ij !@var Qfol Foliage surface mixing ratio (kg/kg) real*8, ALLOCATABLE, dimension(:,:) :: Qf_ij !@var cnc_ij canopy conductance real*8, ALLOCATABLE, dimension(:,:) :: cnc_ij !@var aalbveg vegetation albedo, eventually should be moved to a !@+ better place DO WE NEED THIS ??? real*8, ALLOCATABLE, dimension(:,:) :: aalbveg #endif END MODULE GHY_COM SUBROUTINE ALLOC_GHY_COM(grid) 1,3 !@sum To allocate arrays whose sizes now need to be determined at !@+ run time !@auth NCCS (Goddard) Development Team !@ver 1.0 USE GHY_COM USE DOMAIN_DECOMP, ONLY : DIST_GRID, GET IMPLICIT NONE TYPE (DIST_GRID), INTENT(IN) :: grid INTEGER :: J_1H, J_0H INTEGER :: IER C**** C**** Extract useful local domain parameters from "grid" C**** CALL GET(grid, J_STRT_HALO=J_0H, J_STOP_HALO=J_1H) ALLOCATE( FEARTH(IM,J_0H:J_1H), * STAT=IER) cddd ALLOCATE( WBARE( NGM,IM,J_0H:J_1H), cddd * WVEGE(0:NGM,IM,J_0H:J_1H), cddd * HTBARE(0:NGM,IM,J_0H:J_1H), cddd * HTVEGE(0:NGM,IM,J_0H:J_1H), cddd * SNOWBV( 2,IM,J_0H:J_1H), cddd * STAT=IER) ALLOCATE( W_IJ(0:NGM,LS_NFRAC,IM,J_0H:J_1H), * HT_IJ(0:NGM,LS_NFRAC,IM,J_0H:J_1H), * SNOWBV( LS_NFRAC,IM,J_0H:J_1H), * STAT=IER) !WBARE => W_IJ(1:,1,1:,1:) !WVEGE => W_IJ(1:,1,1:,1:) !HTBARE => HT_IJ(1:,1,1:,1:) !HTVEGE => HT_IJ(1:,1,1:,1:) ALLOCATE( DZ_IJ(IM,J_0H:J_1H,NGM), * Q_IJ(IM,J_0H:J_1H,IMT,NGM), * QK_IJ(IM,J_0H:J_1H,IMT,NGM), * SL_IJ(IM,J_0H:J_1H), * STAT=IER) ALLOCATE( NSN_IJ( 2,IM,J_0H:J_1H), * DZSN_IJ(NLSN,2,IM,J_0H:J_1H), * WSN_IJ(NLSN,2,IM,J_0H:J_1H), * HSN_IJ(NLSN,2,IM,J_0H:J_1H), * STAT=IER) ALLOCATE( FR_SNOW_IJ(2,IM,J_0H:J_1H), * FR_SNOW_RAD_IJ(2,IM,J_0H:J_1H), * CANOPY_TEMP_IJ( IM,J_0H:J_1H), * STAT=IER) ALLOCATE( SNOWE( IM,J_0H:J_1H), * TEARTH( IM,J_0H:J_1H), * WEARTH( IM,J_0H:J_1H), * AIEARTH( IM,J_0H:J_1H), * SNOAGE(3,IM,J_0H:J_1H), * STAT=IER) ALLOCATE( GDEEP(IM,J_0H:J_1H,3), * STAT=IER) ALLOCATE( TOP_INDEX_IJ(IM,J_0H:J_1H), * top_dev_ij(IM,J_0H:J_1H), * evap_max_ij(IM,J_0H:J_1H), * fr_sat_ij(IM,J_0H:J_1H), * qg_ij(IM,J_0H:J_1H), * STAT=IER) #ifdef USE_ENT ALLOCATE( aalbveg(im,J_0H:J_1H), * Ci_ij(im,J_0H:J_1H), * Qf_ij(im,J_0H:J_1H), * cnc_ij(im,J_0H:J_1H), * STAT=IER) #endif C**** Initialize evaporation limits evap_max_ij(:,J_0H:J_1H)=1. fr_sat_ij(:,J_0H:J_1H)=1. qg_ij(:,J_0H:J_1H)=0. ccc init snow arrays to prevent addressing uninitialized vars nsn_ij (:,:,J_0H:J_1H)=0 fr_snow_ij(:,:,J_0H:J_1H)=0. dzsn_ij (:,:,:,J_0H:J_1H)=0. hsn_ij (:,:,:,J_0H:J_1H)=0. wsn_ij (:,:,:,J_0H:J_1H)=0. #ifdef TRACERS_WATER_OLD ALLOCATE( TRBARE(NTM, NGM,IM,J_0H:J_1H), * TRVEGE(NTM,0:NGM,IM,J_0H:J_1H), * TRSNOWBV(NTM, 2,IM,J_0H:J_1H), * STAT=IER) #endif #ifdef TRACERS_WATER cddd ALLOCATE( TR_WBARE(NTM, NGM,IM,J_0H:J_1H), cddd * TR_WVEGE(NTM,0:NGM,IM,J_0H:J_1H), ALLOCATE( TR_W_IJ(NTM,0:NGM,LS_NFRAC,IM,J_0H:J_1H), * TR_WSN_IJ(NTM,NLSN, 2,IM,J_0H:J_1H), * TRSNOWBV0(NTM, 2,IM,J_0H:J_1H), * STAT=IER) C**** Initialize to zero !TR_WBARE(:,:,:,J_0H:J_1H)=0.d0 !TR_WVEGE(:,:,:,J_0H:J_1H)=0.d0 TR_W_IJ(:,:,:,:,J_0H:J_1H)=0.d0 TR_WSN_IJ(:,:,:,:,J_0H:J_1H)=0.d0 #endif END SUBROUTINE ALLOC_GHY_COM SUBROUTINE io_earth(kunit,iaction,ioerr) 7,21 !@sum io_earth reads and writes ground data to file !@auth Gavin Schmidt !@ver 1.0 USE MODEL_COM, only : ioread,iowrite,lhead USE GHY_COM USE DOMAIN_DECOMP, only : GRID, GET, AM_I_ROOT USE DOMAIN_DECOMP, only : PACK_DATA, PACK_COLUMN USE DOMAIN_DECOMP, only : UNPACK_DATA, UNPACK_COLUMN 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 = "EARTH01" REAL*8, DIMENSION(IM,JM) :: SNOWE_glob, TEARTH_glob, WEARTH_glob, & AIEARTH_GLOB,evap_max_ij_glob, & fr_sat_ij_glob, qg_ij_glob REAL*8 :: SNOAGE_glob(3,IM,JM) MODULE_HEADER(lhead+1:80) = * 'R8 dim(ijm) : SNOWe,Te,WTRe,ICEe, SNOage(3,.),evmax,fsat,gq' ! * //',fe' SELECT CASE (IACTION) CASE (:IOWRITE) ! output to standard restart file CALL PACK_DATA(grid, SNOWE , SNOWE_glob) CALL PACK_DATA(grid, TEARTH , TEARTH_glob) CALL PACK_DATA(grid, WEARTH , WEARTH_glob) CALL PACK_DATA(grid, AIEARTH , AIEARTH_GLOB) CALL PACK_DATA(grid, evap_max_ij , evap_max_ij_glob) CALL PACK_DATA(grid, fr_sat_ij , fr_sat_ij_glob) CALL PACK_DATA(grid, qg_ij , qg_ij_glob) CALL PACK_COLUMN(grid, SNOAGE , SNOAGE_glob) IF (AM_I_ROOT()) * WRITE (kunit,err=10) MODULE_HEADER,SNOWE_glob,TEARTH_glob * ,WEARTH_glob,AIEARTH_glob * ,SNOAGE_glob,evap_max_ij_glob,fr_sat_ij_glob,qg_ij_glob CASE (IOREAD:) ! input from restart file cgsfc READ (kunit,err=10) HEADER,SNOWE,TEARTH,WEARTH,AIEARTH cgsfc & ,SNOAGE,evap_max_ij,fr_sat_ij,qg_ij if (AM_I_ROOT()) & READ (kunit,err=10) HEADER,SNOWE_glob,TEARTH_glob,WEARTH_glob & ,AIEARTH_glob,SNOAGE_glob,evap_max_ij_glob,fr_sat_ij_glob & ,qg_ij_glob CALL UNPACK_DATA(grid, SNOWE_glob , SNOWE ) CALL UNPACK_DATA(grid, TEARTH_glob , TEARTH ) CALL UNPACK_DATA(grid, WEARTH_glob , WEARTH ) CALL UNPACK_DATA(grid, AIEARTH_glob , AIEARTH ) CALL UNPACK_DATA(grid, evap_max_ij_glob , evap_max_ij) CALL UNPACK_DATA(grid, fr_sat_ij_glob , fr_sat_ij ) CALL UNPACK_DATA(grid, qg_ij_glob , qg_ij ) CALL UNPACK_COLUMN(grid, SNOAGE_glob , SNOAGE ) if (AM_I_ROOT() .and. & HEADER(1:lhead).NE.MODULE_HEADER(1:lhead)) THEN PRINT*,"Discrepancy in module version ",HEADER,MODULE_HEADER GO TO 10 END IF END SELECT RETURN 10 IOERR=1 RETURN END SUBROUTINE io_earth SUBROUTINE io_soils(kunit,iaction,ioerr) 7,18 !@sum io_soils reads and writes soil arrays to file !@auth Gavin Schmidt !@ver 1.0 USE MODEL_COM, only : ioread,iowrite,lhead,irerun,irsfic,irsficno USE DOMAIN_DECOMP, ONLY: GRID, GET, CHECKSUM_COLUMN USE DOMAIN_DECOMP, ONLY: PACK_DATA, PACK_COLUMN, AM_I_ROOT USE DOMAIN_DECOMP, ONLY: PACK_BLOCK, UNPACK_BLOCK USE DOMAIN_DECOMP, ONLY: UNPACK_COLUMN #ifdef TRACERS_WATER USE TRACER_COM, only : ntm #endif USE GHY_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 REAL*8 SNOWBV_GLOB(2,IM,JM) REAL*8, DIMENSION(0:NGM,LS_NFRAC,IM,JM) :: W_GLOB,HT_GLOB !@var HEADER Character string label for individual records CHARACTER*80 :: HEADER, MODULE_HEADER = "SOILS03" INTEGER :: J_0H, J_1H #ifdef TRACERS_WATER integer m !@var TRHEADER Character string label for individual records CHARACTER*80 :: TRHEADER, TRMODULE_HEADER = "TRSOILS03" REAL*8 :: TRSNOWBV0_GLOB(NTM,2,IM,JM) REAL*8 :: TR_W_GLOB (NTM,0:NGM,LS_NFRAC,IM,JM) write (TRMODULE_HEADER(lhead+1:80) * ,'(a21,i3,a1,i2,a1,i2,a11,i3,a2)') * 'R8 dim(im,jm) TR_W(',NTM,',',NGM,',',LS_NFRAC * ,'),TRSNOWBV(',ntm,'2)' #endif CALL GET(grid, J_STRT_HALO=J_0H, J_STOP_HALO=J_1H) write(MODULE_HEADER(lhead+1:80),'(a7,i1,a1,i1,a23)') * 'R8 dim(',ngm+1,',',LS_NFRAC,',ijm):W,HT, SNWbv(2,ijm)' SELECT CASE (IACTION) CASE (:IOWRITE) ! output to standard restart file CALL PACK_BLOCK(grid, W_IJ(0:NGM,:,1:IM,J_0H:J_1H) , W_GLOB) CALL PACK_BLOCK(grid, HT_IJ(0:NGM,:,1:IM,J_0H:J_1H),HT_GLOB) CALL PACK_COLUMN(grid, SNOWBV(1:2,1:IM,J_0H:J_1H), SNOWBV_GLOB) #ifdef TRACERS_WATER do m=1,LS_NFRAC CALL PACK_BLOCK(grid, TR_W_IJ(1:NTM,0:NGM,m,1:IM,J_0H:J_1H), & TR_W_GLOB(1:NTM,0:NGM,m,1:IM,1:JM)) enddo CALL PACK_BLOCK(grid, TRSNOWBV0, TRSNOWBV0_GLOB) #endif IF (AM_I_ROOT()) THEN WRITE (kunit,err=10) MODULE_HEADER,w_glob, * ht_glob,snowbv_glob #ifdef TRACERS_WATER WRITE (kunit,err=10) TRMODULE_HEADER,TR_W_GLOB & ,TRSNOWBV0_GLOB #endif END IF CASE (IOREAD:) ! input from restart file if (AM_I_ROOT()) then READ(kunit,err=10) HEADER BACKSPACE kunit if (HEADER(1:lhead) == "SOILS02" ) then ! hack to read old format w_glob = 0.d0; ht_glob = 0.d0 READ(kunit,err=10) HEADER, w_glob(1:NGM,1,:,:), & w_glob(0:NGM,2,:,:), ht_glob(0:NGM,1,:,:), & ht_glob(0:NGM,2,:,:), snowbv_glob else if (HEADER(1:lhead) == MODULE_HEADER(1:lhead)) then READ(kunit,err=10) HEADER,w_glob,ht_glob,snowbv_glob else PRINT*,"Discrepancy in module version ",HEADER,MODULE_HEADER GO TO 10 end if end if !...am_i_root call unpack_block(grid, w_glob, & w_ij(0:NGM,:,1:IM,J_0H:J_1H)) call unpack_block(grid, ht_glob, & ht_ij(0:NGM,:,1:IM,J_0H:J_1H)) call unpack_column(grid, snowbv_glob, & snowbv(1:2,1:IM,J_0H:J_1H)) #ifdef TRACERS_WATER SELECT CASE (IACTION) CASE (IRERUN,IOREAD,IRSFIC,IRSFICNO) ! reruns/restarts if (AM_I_ROOT()) then READ (kunit,err=10) TRHEADER, TR_W_GLOB & ,TRSNOWBV0_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 do m=1,LS_NFRAC CALL UNPACK_BLOCK(grid,TR_W_GLOB(1:NTM,0:NGM,m,1:IM,1:JM), & TR_W_IJ(1:NTM,0:NGM,m,1:IM,J_0H:J_1H) ) enddo CALL UNPACK_BLOCK(grid,TRSNOWBV0_GLOB,TRSNOWBV0) END SELECT #endif END SELECT RETURN 10 IOERR=1 RETURN END SUBROUTINE io_soils SUBROUTINE io_snow(kunit,iaction,ioerr) 1,19 !@sum io_snow reads and writes snow model arrays to file !@auth Gavin Schmidt !@ver 1.0 USE MODEL_COM, only : ioread,iowrite,lhead,irerun,irsfic,irsficno USE DOMAIN_DECOMP, only : grid, AM_I_ROOT USE DOMAIN_DECOMP, only : PACK_BLOCK , PACK_COLUMN USE DOMAIN_DECOMP, only : UNPACK_BLOCK, UNPACK_COLUMN USE GHY_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 = "SNOW01" INTEGER :: NSN_IJ_GLOB(2,IM,JM) REAL*8, DIMENSION(NLSN,2,IM,JM) :: DZSN_IJ_GLOB, WSN_IJ_GLOB & ,HSN_IJ_GLOB REAL*8 :: FR_SNOW_IJ_GLOB(2,IM,JM) #ifdef TRACERS_WATER !@var TRHEADER Character string label for individual records CHARACTER*80 :: TRHEADER, TRMODULE_HEADER = "TRSNOW01" REAL*8 TR_WSN_IJ_GLOB(NTM,NLSN,2,IM,JM) write (TRMODULE_HEADER(lhead+1:80) * ,'(a7,i3,a1,i3,a)')'R8 dim(',NTM,',',NLSN,',2,IM,JM):TRSNW' #endif write (MODULE_HEADER(lhead+1:80),'(a29,I1,a)') 'I dim(2,ijm):'// * 'Nsn, R8 dim(',NLSN,',2,ijm):dz,w,ht, Fsn(2,ijm)' SELECT CASE (IACTION) CASE (:IOWRITE) ! output to standard restart file CALL PACK_BLOCK(grid, DZSN_IJ, DZSN_IJ_GLOB) CALL PACK_BLOCK(grid, WSN_IJ, WSN_IJ_GLOB) CALL PACK_BLOCK(grid, HSN_IJ, HSN_IJ_GLOB) CALL PACK_COLUMN(grid, NSN_IJ, NSN_IJ_GLOB) CALL PACK_COLUMN(grid, FR_SNOW_IJ, FR_SNOW_IJ_GLOB) #ifdef TRACERS_WATER CALL PACK_BLOCK(grid, TR_WSN_IJ( :,:,1,:,:) & , TR_WSN_IJ_GLOB(:,:,1,:,:) ) CALL PACK_BLOCK(grid, TR_WSN_IJ( :,:,2,:,:) & , TR_WSN_IJ_GLOB(:,:,2,:,:) ) #endif IF (AM_I_ROOT()) THEN WRITE (kunit,err=10) MODULE_HEADER, NSN_IJ_glob, DZSN_IJ_glob * ,WSN_IJ_glob, HSN_IJ_glob, FR_SNOW_IJ_glob #ifdef TRACERS_WATER WRITE (kunit,err=10) TRMODULE_HEADER,TR_WSN_IJ_glob #endif END IF CASE (IOREAD:) ! input from restart file if (AM_I_ROOT()) then READ (kunit,err=10) HEADER,NSN_IJ_glob, DZSN_IJ_glob * ,WSN_IJ_glob, HSN_IJ_glob, FR_SNOW_IJ_glob IF (HEADER(1:LHEAD).NE.MODULE_HEADER(1:LHEAD)) THEN PRINT*,"Discrepancy in module version ",HEADER,MODULE_HEADER GO TO 10 END IF end if CALL UNPACK_BLOCK(grid, DZSN_IJ_GLOB, DZSN_IJ) CALL UNPACK_BLOCK(grid, WSN_IJ_GLOB, WSN_IJ) CALL UNPACK_BLOCK(grid, HSN_IJ_GLOB, HSN_IJ) CALL UNPACK_COLUMN(grid, NSN_IJ_GLOB, NSN_IJ) CALL UNPACK_COLUMN(grid, FR_SNOW_IJ_GLOB, FR_SNOW_IJ) #ifdef TRACERS_WATER SELECT CASE (IACTION) CASE (IRERUN,IOREAD,IRSFIC,IRSFICNO) ! reruns/restarts if (AM_I_ROOT()) then READ (kunit,err=10) TRHEADER,TR_WSN_IJ_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, TR_WSN_IJ_GLOB(:,:,1,:,:) & , TR_WSN_IJ(:,:,1,:,:)) CALL UNPACK_BLOCK(grid, TR_WSN_IJ_GLOB(:,:,2,:,:) & , TR_WSN_IJ(:,:,2,:,:)) END SELECT #endif END SELECT RETURN 10 IOERR=1 RETURN END SUBROUTINE io_snow #ifdef USE_ENT subroutine io_veg_related(kunit,iaction,ioerr) 1,13 !@sum reads and writes data needed to drive vegetation module !@auth I. Aleinov !@ver 1.0 use model_com, only : ioread,iowrite,lhead,irerun,irsfic,irsficno use model_com, only : im,jm use domain_decomp, only : grid, am_i_root use domain_decomp, only : pack_data, unpack_data use ghy_com, only : Ci_ij, Qf_ij, cnc_ij use param 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 = "vegetation01" !@var Ci_ij_glob work array for parallel_io !@var Qf_ij_glob work array for parallel_io !@var cnc_ij_glob work array for parallel_io real*8, dimension(im,jm) :: Ci_ij_glob, Qf_ij_glob, cnc_ij_glob integer :: force_init_ent=0 !!! hack call sync_param( "init_ent", force_init_ent) write(module_header(lhead+1:80),'(a)') 'Ci_ij,Qf_ij,cnc_ij' select case (iaction) case (:iowrite) ! output to standard restart file call pack_data(grid, Ci_ij, Ci_ij_glob) call pack_data(grid, Qf_ij, Qf_ij_glob) call pack_data(grid, cnc_ij, cnc_ij_glob) if (am_i_root()) & write (kunit,err=10) module_header,Ci_ij_glob,Qf_ij_glob, & cnc_ij_glob case (ioread:) ! input from restart file if ( force_init_ent .ne. 1 ) then if ( AM_I_ROOT() ) then read(kunit,err=10) header, Ci_ij_glob, Qf_ij_glob, cnc_ij_glob if (header(1:lhead).ne.module_header(1:lhead)) then print*,"discrepancy in module version ",header,module_header go to 10 end if end if call unpack_data(grid, Ci_ij_glob, Ci_ij) call unpack_data(grid, Qf_ij_glob, Qf_ij) call unpack_data(grid, cnc_ij_glob, cnc_ij) endif end select return 10 ioerr=1 return end subroutine io_veg_related #endif