! $Id: tpcore_bc_mod.f,v 1.2 2012/03/01 22:00:26 daven Exp $ MODULE TPCORE_BC_MOD ! !****************************************************************************** ! Module TPCORE_BC_MOD contains modules and variables which are needed to ! save and read TPCORE nested-grid boundary conditions to/from disk. ! (yxw, bmy, 3/4/03, 3/15/06) ! ! Module Variables: ! ============================================================================ ! (1 ) CLEAN_BC (LOGICAL ) : Flag which denotes if we will zero BC's ! (2 ) I0_W (INTEGER ) : Lon offset of 1x1 TPCORE REGION [# boxes] ! (3 ) J0_W (INTEGER ) : Lat offset of 1x1 TPCORE REGION [# boxes] ! (4 ) IM_W (INTEGER ) : Lon extent of 1x1 TPCORE REGION [# boxes] ! (5 ) JM_W (INTEGER ) : Lat extent of 1x1 TPCORE REGION [# boxes] ! (6 ) I1_W (INTEGER ) : Lower left-hand lon index of 1x1 WINDOW ! (7 ) J1_W (INTEGER ) : Lower left-hand lat index of 1x1 WINDOW ! (8 ) I2_W (INTEGER ) : Upper right-hand lon index of 1x1 WINDOW ! (9 ) J2_W (INTEGER ) : Upper right-hand lat index of 1x1 WINDOW ! (10) IGZD (INTEGER ) : ??? ! (110 TS_BC (INTEGER ) : Timestep for reading in BC's from disk [min] ! (11) I0_BC (INTEGER ) : Lon offset of 4x5 WINDOW REGION [# boxes] ! (12) J0_BC (INTEGER ) : Lat offset of 4x5 WINDOW REGION [# boxes] ! (13) IM_BC (INTEGER ) : Lon extent of 4x5 WINDOW REGION [# boxes] ! (14) JM_BC (INTEGER ) : Lat extent of 4x5 WINDOW REGION [# boxes] ! (15) I1_BC (INTEGER ) : Lower left-hand lon index of 4x5 WINDOW ! (16) J1_BC (INTEGER ) : Lower left-hand lat index of 4x5 WINDOW ! (17) I2_BC (INTEGER ) : Upper right-hand lon index of 4x5 WINDOW ! (18) J2_BC (INTEGER ) : Upper right-hand lat index of 4x5 WINDOW ! (19) BC (REAL*4 ) : Array containing tracers on coarse grid ! (19b) BC_NA (REAL*4 ) : Array containing NA tracers on coarse grid ! (19c) BC_EU (REAL*4 ) : Array containing EU tracers on coarse grid ! (19d) BC_CH (REAL*4 ) : Array containing CH tracers on coarse grid ! (20) MAP1x1 (INTEGER ) : Mapping array from 1x1 -> 4x5 grid ! ! Module Routines: ! ============================================================================ ! (1 ) SET_CLEAN_BC : Initializes the CLEAN_BC module variable ! (2 ) OPEN_BC_FILE : Opens a new boundary conditions file (R or W) ! (3 ) SAVE_GLOBAL_TPCORE_BC : Saves boundary conditions from GLOBAL run ! (4 ) DO_WINDOW_TPCORE_BC : Calls routine to clean or read window BC's ! (5 ) CLEAN_WINDOW_TPCORE_BC : Zeroes the nested-grid TPCORE boundary cond's ! (6 ) READ_WINDOW_TPCORE_BC : Reads nested-grid TPCORE BC's from disk ! (7 ) GET_4x5_BC : Returns the 4x5 BC at a given 1x1 location ! (7b) GET_2x25_BC : Returns the 2x2.5 BC at a given 1x1 location ! (8 ) ITS_TIME_FOR_BC : Returns T if it is time to read BC's ! (9 ) INIT_TPCORE_BC : Initalizes and allocates module variables ! (10) CLEANUP_TPCORE_BC : Deallocates module vaf ! ! GEOS-CHEM modules referenced by tpcore_call_mod.f ! ============================================================================ ! (1 ) bpch2_mod.f : Module containing routines for bpch file I/O ! (2 ) directory_mod.f : Module containing GEOS-CHEM data & metfld dirs ! (3 ) error_mod.f : Module containing I/O error/NaN check routines ! (4 ) file_mod.f : Contains file unit numbers and error checks ! (5 ) grid_mod.f : Module containing horizontal grid information ! (6 ) logical_mod.f : Module containing GEOS-CHEM logical switches ! (7 ) time_mod.f : Module containing routines for date & time ! (8 ) tracer_mod.f : Module containing GEOS-CHEM tracer array STT ! ! Reference Diagram: ! ============================================================================ ! ! <-------------------------------------- IGLOB ----------------------> ! ! +-------------------------------------------------------------------+ ^ ! | GLOBAL REGION | | ! | | | ! | <-------------- IIPAR -------------> | | ! | | | ! | +=================================[Y] ^ | | ! | | WINDOW REGION (met field size) | | | | ! | | | | | | ! | | <------- IM_W -------> | | | | ! | | +--------------------+ ^ | | | | ! | | | TPCORE REGION | | | | | | ! | | | (transport is | | | | | | ! |<------- I0 ---------->|<---->| done in this | JM_W | JJPAR | JGLOB ! | | I0_W | window!!!) | | | | | | ! | | | | | | | | | ! | | +--------------------+ V | | | | ! | | ^ | | | | ! | | | J0_W | | | | ! | | V | | | | ! | [X]=================================+ V | | ! | ^ | | ! | | J0 | | ! | V | | ! [1]------------------------------------------------------------------+ V ! ! DIAGRAM NOTES: ! (a) The outermost box ("Global Region") is the global grid size. This ! region has IGLOB boxes in longitude and JGLOB boxes in latitude. ! The origin of the "Global Region" is at the south pole, at the ! lower left-hand corner (point [1]). ! ! (b) The next innermost box ("Window Region") is the nested-grid window. ! This region has IIPAR boxes in longitude and JJPAR boxes in latitude. ! This is the size of the trimmed met fields that will be used for ! a 1 x 1 "nested-grid" simulation. ! ! (c) The innermost region ("TPCORE Region") is the actual area in which ! TPCORE transport will be performed. Note that this region is smaller ! than the "Window Region". It is set up this way since a cushion of ! grid boxes is needed TPCORE Region for boundary conditions. ! ! (d) I0 is the longitude offset (# of boxes) and J0 is the latitude offset ! (# of boxes) which translate between the "Global Region" and the ! "Window Region". ! ! (e) I0_W is the longitude offset (# of boxes), and J0_W is the latitude ! offset (# of boxes) which translate between the "Window Region" ! and the "TPCORE Region". ! ! (f) The lower left-hand corner of the "Window Region" (point [X]) has ! longitude and latitude indices (I1_W, J1_W). Similarly, the upper ! right-hand corner (point [Y]) has longitude and latitude indices ! (I2_W, J2_W). ! ! (g) Note that if I0=0, J0=0, I0_W=0, J0_W=0, IIPAR=IGLOB, JJPAR=JGLOB ! specifies a global simulation. In this case the "Window Region" ! totally coincides with the "Global Region". ! ! (h) In order for the nested-grid to work we must save out concentrations ! over the WINDOW REGION from a coarse model (e.g. 4x5) corresponding to ! the same WINDOW REGION at 1x1. These concentrations are copied along ! the edges of the 1x1 WINDOW REGION and are thus used as boundary ! conditions for TPCORE. We assume that we will save out concentrations ! from the 4x5 model since presently it takes too long to run at 2x25. ! ! NOTES: ! (1 ) Bug fix for LINUX w/ TIMESTAMP_STRING (bmy, 9/29/03) ! (2 ) Now references "tracer_mod.f", "directory_mod.f", and ! "logical_mod.f" (bmy, 7/20/04) ! (3 ) Now get HALFPOLAR for GEOS or GCAP grids (bmy, 6/28/05) ! (4 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) ! (5 ) Rename arguments in GET_4x5_BC to avoid name conflict (bmy, 10/24/05) ! (6 ) Now use EXPAND_DATE instead of obsolete DATE_STRING (bmy, 3/15/06) !****************************************************************************** ! IMPLICIT NONE !================================================================= ! MODULE PRIVATE DECLARATIONS -- keep certain internal variables ! and routines from being seen outside "tpcore_bc_mod.f" !================================================================= ! Make everything PRIVATE ... PRIVATE ! ... except these variables ... PUBLIC :: I0_W, J0_W PUBLIC :: I1_W, J1_W PUBLIC :: I2_W, J2_W PUBLIC :: IM_W, JM_W PUBLIC :: IGZD ! ... and these routines PUBLIC :: INIT_TPCORE_BC PUBLIC :: INIT_TPCORE_BC_05x0666 PUBLIC :: DO_WINDOW_TPCORE_BC PUBLIC :: DO_WINDOW_TPCORE_BC_05x0666 PUBLIC :: DO_WINDOW_TPCORE_BC_ADJ PUBLIC :: SET_CLEAN_BC PUBLIC :: SAVE_GLOBAL_TPCORE_BC PUBLIC :: SAVE_GLOBAL_TPCORE_BC_05x0666 !================================================================= ! MODULE VARIABLES !================================================================= LOGICAL :: CLEAN_BC INTEGER :: I0_W, J0_W, IM_W, JM_W INTEGER :: I1_W, J1_W, I2_W, J2_W INTEGER :: I0_BC, J0_BC, I1_BC, J1_BC INTEGER :: I2_BC, J2_BC, IM_BC, JM_BC INTEGER :: I0_BC_NA, J0_BC_NA, I1_BC_NA, J1_BC_NA !!(lzh,02/01/2015) INTEGER :: I2_BC_NA, J2_BC_NA, IM_BC_NA, JM_BC_NA INTEGER :: I0_BC_EU, J0_BC_EU, I1_BC_EU, J1_BC_EU INTEGER :: I2_BC_EU, J2_BC_EU, IM_BC_EU, JM_BC_EU INTEGER :: I0_BC_CH, J0_BC_CH, I1_BC_CH, J1_BC_CH INTEGER :: I2_BC_CH, J2_BC_CH, IM_BC_CH, JM_BC_CH INTEGER :: IGZD, TS_BC INTEGER, ALLOCATABLE :: MAP1x1(:,:,:) REAL*4, ALLOCATABLE :: BC(:,:,:,:) REAL*4, ALLOCATABLE :: BC_NA(:,:,:,:) ! (lzh,02/01/2015) REAL*4, ALLOCATABLE :: BC_EU(:,:,:,:) REAL*4, ALLOCATABLE :: BC_CH(:,:,:,:) !================================================================= ! MODULE VARIABLES FOR 05x0666 BC (Zhe, Jan 2012) !================================================================= INTEGER :: I1_BC_05x06, J1_BC_05x06 INTEGER :: I1_BC_GLOBAL, J1_BC_GLOBAL INTEGER :: I2_BC_05x06, J2_BC_05x06 INTEGER :: IM_BC_05x06, JM_BC_05x06 INTEGER :: TS_BC_05x06, IJ_BC_05x06 REAL*4, ALLOCATABLE :: BC_05x06(:,:,:,:) !================================================================= ! MODULE ROUTINES -- follow below the "CONTAINS" statement !================================================================= CONTAINS !------------------------------------------------------------------------------ SUBROUTINE SET_CLEAN_BC( THIS_CLEAN_BC ) ! !****************************************************************************** ! Subroutine SET_CLEAN_BC initializes the CLEAN_BC logical flag. CLEAN_BC ! decides whether or not we will zero the nested-grid tpcore boundary. ! (bmy, 3/4/03) ! ! Arguments as Input: ! ============================================================================ ! (1 ) THIS_CLEAN_BC (LOGICAL) : Logical value (T/F) to assign to CLEAN_BC ! ! NOTES: !****************************************************************************** ! ! Arguments LOGICAL, INTENT(IN) :: THIS_CLEAN_BC !================================================================= ! SET_CLEAN_BC begins here! !================================================================= CLEAN_BC = THIS_CLEAN_BC ! Return to calling program END SUBROUTINE SET_CLEAN_BC !------------------------------------------------------------------------------ ! update nested runs based on standard GC (lzh,02/01/2015) SUBROUTINE OPEN_BC_FILE( FOR_READ, FOR_WRITE, WINDOW ) ! !****************************************************************************** ! Subroutine OPEN_BC_FILE opens the file which contains boundary conditions ! saved from the coarse-grid WINDOW REGION for either reading or writing. ! (bmy, 3/7/03, 3/15/06) ! ! Arguments as Input: ! ============================================================================ ! (1 ) FOR_READ (LOGICAL) : If passed, opens binary punch file for reading ! (2 ) FOR_WRITE (LOGICAL) : If passed, opens binary punch file for writing ! ! NOTES: ! (1 ) Now use ITS_A_NEW_DAY from "time_mod.f". Now references TPBC_DIR ! from "directory_mod.f" (bmy, 7/20/04) ! (2 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) ! (3 ) DATE_STRING is now obsolete; use EXPAND_DATE instead (bmy, 3/15/06) !****************************************************************************** ! ! References to F90 modules USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_WRITE USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ USE DIRECTORY_MOD, ONLY : TPBC_DIR USE FILE_MOD, ONLY : IU_BC USE DIRECTORY_MOD, ONLY : TPBC_DIR_CH, TPBC_DIR_EU, TPBC_DIR_NA USE FILE_MOD, ONLY : IU_BC_NA, IU_BC_EU, IU_BC_CH !(lzh,02/01/2015) USE TIME_MOD, ONLY : EXPAND_DATE, GET_NYMD, ITS_A_NEW_DAY IMPLICIT NONE # include "define.h" ! Size parameters ! Arguments LOGICAL, INTENT(IN), OPTIONAL :: FOR_READ, FOR_WRITE INTEGER, INTENT(IN) :: WINDOW !(lzh,02/01/2015) ! Local variables CHARACTER(LEN=255) :: FILENAME !================================================================= ! OPEN_BC_FILE begins here! !================================================================= ! Only open file if it's a new day IF ( ITS_A_NEW_DAY() ) THEN ! File name for BC's ! (lzh, 02/01/2015) IF ( WINDOW .eq. 5 ) THEN #if defined( NESTED_NA ) FILENAME = TRIM( TPBC_DIR_NA ) // 'BC.YYYYMMDD' #elif defined( NESTED_EU ) FILENAME = TRIM( TPBC_DIR_EU ) // 'BC.YYYYMMDD' #elif defined( NESTED_CH ) FILENAME = TRIM( TPBC_DIR_CH ) // 'BC.YYYYMMDD' #endif ELSEIF ( WINDOW .eq. 1 ) THEN FILENAME = TRIM( TPBC_DIR ) // 'BC.YYYYMMDD' ELSEIF ( WINDOW .eq. 2 ) THEN FILENAME = TRIM( TPBC_DIR_NA ) // 'BC.YYYYMMDD' ELSEIF ( WINDOW .eq. 3 ) THEN FILENAME = TRIM( TPBC_DIR_EU ) // 'BC.YYYYMMDD' ELSEIF ( WINDOW .eq. 4 ) THEN FILENAME = TRIM( TPBC_DIR_CH ) // 'BC.YYYYMMDD' ENDIF ! Replace YYYYMMDD with the actual date CALL EXPAND_DATE( FILENAME, GET_NYMD(), 000000 ) ! Echo file name to stdout WRITE( 6, 100 ) TRIM( FILENAME ) 100 FORMAT( ' - OPEN_BC_FILE: Opening ', a ) ! Open file for reading or writing ! IF ( PRESENT( FOR_WRITE ) ) THEN ! CALL OPEN_BPCH2_FOR_WRITE( IU_BC, FILENAME ) ! ! ELSE IF ( PRESENT( FOR_READ ) ) THEN ! CALL OPEN_BPCH2_FOR_READ( IU_BC, FILENAME ) ! ! ENDIF ! (lzh, 02/01/2015) IF ( WINDOW .eq. 5 ) THEN IF ( PRESENT( FOR_READ ) ) & CALL OPEN_BPCH2_FOR_READ( IU_BC, & FILENAME ) ELSEIF ( WINDOW .eq. 1 ) THEN IF ( PRESENT( FOR_WRITE ) ) & CALL OPEN_BPCH2_FOR_WRITE( IU_BC, & FILENAME ) ELSEIF ( WINDOW .eq. 2 ) THEN IF ( PRESENT( FOR_WRITE ) ) & CALL OPEN_BPCH2_FOR_WRITE( IU_BC_NA, & FILENAME ) ELSEIF ( WINDOW .eq. 3 ) THEN IF ( PRESENT( FOR_WRITE ) ) & CALL OPEN_BPCH2_FOR_WRITE( IU_BC_EU, & FILENAME ) ELSEIF ( WINDOW .eq. 4 ) THEN IF ( PRESENT( FOR_WRITE ) ) & CALL OPEN_BPCH2_FOR_WRITE( IU_BC_CH, & FILENAME ) ENDIF ENDIF ! Return to calling program END SUBROUTINE OPEN_BC_FILE !------------------------------------------------------------------------------ SUBROUTINE OPEN_BC_FILE_05x0666( FOR_READ, FOR_WRITE ) ! !****************************************************************************** ! Subroutine OPEN_BC_FILE_05x0666 opens the file which contains boundary conditions ! saved from 05x0666 nested simulation for either reading or writing. ! (Zhe, Jan 2012) ! ! Arguments as Input: ! ============================================================================ ! (1 ) FOR_READ (LOGICAL) : If passed, opens binary punch file for reading ! (2 ) FOR_WRITE (LOGICAL) : If passed, opens binary punch file for writing !****************************************************************************** ! ! References to F90 modules USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_WRITE USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ USE DIRECTORY_MOD, ONLY : TPBC_DIR USE FILE_MOD, ONLY : IU_BC_05x06 USE TIME_MOD, ONLY : EXPAND_DATE, GET_NYMD, ITS_A_NEW_DAY ! Arguments LOGICAL, INTENT(IN), OPTIONAL :: FOR_READ, FOR_WRITE ! Local variables CHARACTER(LEN=255) :: FILENAME !================================================================= ! OPEN_BC_FILE_05x0666 begins here! !================================================================= ! Only open file if it's a new day IF ( ITS_A_NEW_DAY() ) THEN ! File name for BC's FILENAME = TRIM( TPBC_DIR ) // 'BC.YYYYMMDD' // '.05x0666' ! Replace YYYYMMDD with the actual date CALL EXPAND_DATE( FILENAME, GET_NYMD(), 000000 ) ! Echo file name to stdout WRITE( 6, 100 ) TRIM( FILENAME ) 100 FORMAT( ' - OPEN_BC_FILE: Opening ', a ) ! Open file for reading or writing IF ( PRESENT( FOR_WRITE ) ) THEN CALL OPEN_BPCH2_FOR_WRITE( IU_BC_05x06, FILENAME ) ELSE IF ( PRESENT( FOR_READ ) ) THEN CALL OPEN_BPCH2_FOR_READ( IU_BC_05x06, FILENAME ) ENDIF ENDIF ! Return to calling program END SUBROUTINE OPEN_BC_FILE_05x0666 !------------------------------------------------------------------------------ SUBROUTINE SAVE_GLOBAL_TPCORE_BC ! !****************************************************************************** ! Subroutine SAVE_GLOBAL_TPCORE_BC saves concentrations from the WINDOW ! REGION of a coarse-resolution model run (e.g. 4x5) to a bpch file. ! A new boundary conditions file is created for each day. ! (yxw, bmy, 3/4/03, 10/3/05) ! ! NOTES: ! (1 ) Now references N_TRACERS and STT from "tracer_mod.f". Also now ! references TIMESTAMP_STRING from "time_mod.f". (bmy, 7/20/04) ! (2 ) Now call GET_HALFPOLAR from "bpch2_mod.f" to get the HALFPOLAR flag ! value for GEOS or GCAP grids (bmy, 6/28/05) ! (3 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) !****************************************************************************** ! ! References to F90 modules USE BPCH2_MOD, ONLY : BPCH2, GET_HALFPOLAR, GET_MODELNAME USE FILE_MOD, ONLY : IU_BC USE FILE_MOD, ONLY : IU_BC_NA, IU_BC_EU, IU_BC_CH !(lzh,02/01/2015) USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS, & GET_TAU, TIMESTAMP_STRING USE TRACER_MOD, ONLY : N_TRACERS, STT USE LOGICAL_MOD, ONLY : LWINDO_CU, LWINDO_NA !(lzh,02/01/2015) USE LOGICAL_MOD, ONLY : LWINDO_CH, LWINDO_EU # include "CMN_SIZE" ! Size parameters ! Local variables LOGICAL, SAVE :: FIRST = .TRUE. INTEGER :: HALFPOLAR INTEGER, PARAMETER :: CENTER180 = 1 INTEGER :: I, IOS, J, L, N REAL*4 :: LONRES, LATRES REAL*4 :: ARRAY(IIPAR,JJPAR,LLPAR) REAL*8 :: TAU CHARACTER(LEN=16) :: STAMP CHARACTER(LEN=20) :: MODELNAME CHARACTER(LEN=40) :: CATEGORY = 'IJ-AVG-$' CHARACTER(LEN=40) :: UNIT = 'v/v' CHARACTER(LEN=40) :: RESERVED = '' INTEGER :: IC ! (lzh,02/01/2015) !================================================================= ! SAVE_GLOBAL_TPCORE_BC begins here! !================================================================= ! Return if it's not time to write data to disk IF ( .not. ITS_TIME_FOR_BC() ) RETURN ! (lzh,02/01/2015) open below ! ! Open file for writing, if necessary ! CALL OPEN_BC_FILE( FOR_WRITE=.TRUE. ) !================================================================= ! Save boundary conditions from coarse grid to a BPCH file !================================================================= ! Define variables for BPCH output LONRES = DISIZE LATRES = DJSIZE HALFPOLAR = GET_HALFPOLAR() MODELNAME = GET_MODELNAME() TAU = GET_TAU() ! (lzh,02/01/2015) add all nested domains as in standard GC DO IC = 1, 4 IF ((IC .eq. 1) .and. LWINDO_CU )THEN ! Open file for writing, if necessary CALL OPEN_BC_FILE( FOR_WRITE=.TRUE., WINDOW=IC) ! Loop over each tracer DO N = 1, N_TRACERS ! Save concentrations in WINDOW REGION to disk DO L = 1, LLPAR BC(1:IM_BC,1:JM_BC,L,N) = & STT(I1_BC:I2_BC,J1_BC:J2_BC,L,N) ENDDO ! Write boundary conditions to binary punch file CALL BPCH2( IU_BC, MODELNAME, LONRES, LATRES, & HALFPOLAR, CENTER180, CATEGORY, N, & UNIT, TAU, TAU, RESERVED, & IM_BC, JM_BC, LLPAR, I1_BC, & J1_BC, 1, BC(1:IM_BC, 1:JM_BC, 1:LLPAR, N) ) ENDDO ! Echo info STAMP = TIMESTAMP_STRING() WRITE( 6, 110 ) STAMP 110 FORMAT( ' - SAVE_GLOBAL_TPCORE_BC: Wrote BC''s at ', a ) ELSEIF ((IC .eq. 2) .and. LWINDO_NA )THEN ! Open file for writing, if necessary CALL OPEN_BC_FILE( FOR_WRITE=.TRUE., WINDOW=IC) ! Loop over each tracer DO N = 1, N_TRACERS ! Save concentrations in WINDOW REGION to disk DO L = 1, LLPAR BC_NA(1:IM_BC_NA,1:JM_BC_NA,L,N) = & STT(I1_BC_NA:I2_BC_NA,J1_BC_NA:J2_BC_NA,L,N) ENDDO ! Write boundary conditions to binary punch file CALL BPCH2( IU_BC_NA, MODELNAME, LONRES, LATRES, & HALFPOLAR, CENTER180, CATEGORY, N, & UNIT, TAU, TAU, RESERVED, & IM_BC_NA, JM_BC_NA, LLPAR, I1_BC_NA, & J1_BC_NA, 1, BC_NA(1:IM_BC_NA, 1:JM_BC_NA, & 1:LLPAR, N) ) ENDDO ! Echo info STAMP = TIMESTAMP_STRING() WRITE( 6, 111 ) STAMP 111 FORMAT( ' - SAVE_GLOBAL_TPCORE_BC: Wrote NA BC''s at ', a ) ELSEIF ((IC .eq. 3) .and. LWINDO_EU )THEN ! Open file for writing, if necessary CALL OPEN_BC_FILE( FOR_WRITE=.TRUE., WINDOW=IC) ! Loop over each tracer DO N = 1, N_TRACERS ! Save concentrations in WINDOW REGION to disk DO L = 1, LLPAR BC_EU(1:IM_BC_EU,1:JM_BC_EU,L,N) = & STT(I1_BC_EU:I2_BC_EU,J1_BC_EU:J2_BC_EU,L,N) ENDDO ! Write boundary conditions to binary punch file CALL BPCH2( IU_BC_EU, MODELNAME, LONRES, LATRES, & HALFPOLAR, CENTER180, CATEGORY, N, & UNIT, TAU, TAU, RESERVED, & IM_BC_EU, JM_BC_EU, LLPAR, I1_BC_EU, & J1_BC_EU, 1, BC_EU(1:IM_BC_EU, 1:JM_BC_EU, & 1:LLPAR, N) ) ENDDO ! Echo info STAMP = TIMESTAMP_STRING() WRITE( 6, 112 ) STAMP 112 FORMAT( ' - SAVE_GLOBAL_TPCORE_BC: Wrote EU BC''s at ', a ) ELSEIF ((IC .eq. 4) .and. LWINDO_CH )THEN ! Open file for writing, if necessary CALL OPEN_BC_FILE( FOR_WRITE=.TRUE., WINDOW=IC) ! Loop over each tracer DO N = 1, N_TRACERS ! Save concentrations in WINDOW REGION to disk DO L = 1, LLPAR BC_CH(1:IM_BC_CH,1:JM_BC_CH,L,N) = & STT(I1_BC_CH:I2_BC_CH,J1_BC_CH:J2_BC_CH,L,N) ENDDO ! Write boundary conditions to binary punch file CALL BPCH2( IU_BC_CH, MODELNAME, LONRES, LATRES, & HALFPOLAR, CENTER180, CATEGORY, N, & UNIT, TAU, TAU, RESERVED, & IM_BC_CH, JM_BC_CH, LLPAR, I1_BC_CH, & J1_BC_CH, 1, BC_CH(1:IM_BC_CH, 1:JM_BC_CH, & 1:LLPAR, N) ) ENDDO ! Echo info STAMP = TIMESTAMP_STRING() WRITE( 6, 113 ) STAMP 113 FORMAT( ' - SAVE_GLOBAL_TPCORE_BC: Wrote CH BC''s at ', a ) ENDIF ENDDO ! Return to calling program END SUBROUTINE SAVE_GLOBAL_TPCORE_BC !------------------------------------------------------------------------ SUBROUTINE SAVE_GLOBAL_TPCORE_BC_05x0666 ! !****************************************************************************** ! Subroutine SAVE_GLOBAL_TPCORE_BC_05x0666 saves concentrations from the 05x0666 ! simulation to a smaller nested region. ! A new boundary conditions file is created for each day. ! (Zhe, Jan 2012) !****************************************************************************** ! ! References to F90 modules USE BPCH2_MOD, ONLY : BPCH2, GET_HALFPOLAR, GET_MODELNAME USE FILE_MOD, ONLY : IU_BC_05x06 USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS, & GET_TAU, TIMESTAMP_STRING USE TRACER_MOD, ONLY : N_TRACERS, STT # include "CMN_SIZE" ! Size parameters ! Local variables LOGICAL, SAVE :: FIRST = .TRUE. INTEGER :: HALFPOLAR INTEGER, PARAMETER :: CENTER180 = 1 INTEGER :: I, IOS, J, L, N REAL*4 :: LONRES, LATRES REAL*4 :: ARRAY(IIPAR,JJPAR,LLPAR) REAL*4 :: STT_BC(I0_W,JM_BC_05x06) REAL*8 :: TAU CHARACTER(LEN=16) :: STAMP CHARACTER(LEN=20) :: MODELNAME CHARACTER(LEN=40) :: CATEGORY = 'IJ-AVG-$' CHARACTER(LEN=40) :: UNIT = 'v/v' CHARACTER(LEN=40) :: RESERVED = '' !================================================================= ! SAVE_GLOBAL_TPCORE_BC_05x0666 begins here! !================================================================= ! Return if it's not time to write data to disk IF ( .not. ITS_TIME_FOR_BC_05x0666() ) RETURN ! Open file for writing, if necessary CALL OPEN_BC_FILE_05x0666( FOR_WRITE=.TRUE. ) !================================================================= ! Save boundary conditions from coarse grid to a BPCH file !================================================================= ! Define variables for BPCH output LONRES = DISIZE LATRES = DJSIZE HALFPOLAR = GET_HALFPOLAR() MODELNAME = GET_MODELNAME() TAU = GET_TAU() ! Loop over each tracer DO N = 1, N_TRACERS ! We only save concentrations in CUSHION to save disk space DO L = 1, LLPAR !Southern boundary, 1:J0_W BC_05x06(1:IM_BC_05x06, 1:J0_W, L, N) & = STT(I1_BC_05x06:I2_BC_05x06, & J1_BC_05x06:(J1_BC_05x06 + J0_W - 1), L, N) !Northern boundary, (J0_W + 1):(J0_W * 2) BC_05x06(1:IM_BC_05x06, (J0_W + 1):(J0_W * 2), L, N) & = STT(I1_BC_05x06:I2_BC_05x06, & (J2_BC_05x06 - J0_W + 1):J2_BC_05x06, L, N) !Western boundary, (J0_W * 2 + 1):(J0_W * 2 + I0_W) STT_BC(1:I0_W, 1:JM_BC_05x06) & = STT(I1_BC_05x06:(I1_BC_05x06 + I0_W - 1), & J1_BC_05x06:J2_BC_05x06, L, N) BC_05x06(1:JM_BC_05x06, & (J0_W * 2 + 1):(J0_W * 2 + I0_W), L, N) & = TRANSPOSE(STT_BC) !Eestern boundary, (J0_W * 2 + I0_W + 1):((J0_W + I0_W)* 2) STT_BC(1:I0_W, 1:JM_BC_05x06) & = STT((I2_BC_05x06 - I0_W + 1):I2_BC_05x06, & J1_BC_05x06:J2_BC_05x06, L, N) BC_05x06(1:JM_BC_05x06, & (J0_W * 2 + I0_W + 1):((J0_W + I0_W)* 2), L, N) & = TRANSPOSE(STT_BC) ENDDO ! Write boundary conditions to binary punch file CALL BPCH2( IU_BC_05x06, MODELNAME, LONRES, LATRES, & HALFPOLAR, CENTER180, CATEGORY, N, & UNIT, TAU, TAU, RESERVED, & IJ_BC_05x06, (I0_W + J0_W)*2, LLPAR, I1_BC_GLOBAL, & J1_BC_GLOBAL, 1, BC_05x06(:, :, :, N) ) ENDDO ! Echo info STAMP = TIMESTAMP_STRING() WRITE( 6, 110 ) STAMP 110 FORMAT( ' - SAVE_GLOBAL_TPCORE_BC: Wrote BC''s at ', a ) ! Return to calling program END SUBROUTINE SAVE_GLOBAL_TPCORE_BC_05x0666 !------------------------------------------------------------------------------ SUBROUTINE DO_WINDOW_TPCORE_BC ! !****************************************************************************** ! Subroutine DO_WINDOW_TPCORE_BC is a driver routine for assigning TPCORE ! boundary conditions to the tracer array STT. (bmy, 3/7/03, 7/20/04) ! ! At present, assume that we have saved ! ! NOTES: ! (1 ) Now references N_TRACERS and STT from "tracer_mod.f" (bmy, 7/20/04) !****************************************************************************** ! ! References to F90 modules USE TRACER_MOD, ONLY : N_TRACERS, STT USE LOGICAL_MOD, ONLY : LWINDO2x25 !add 2x25 BC (lzh,02/01/2015) # include "CMN_SIZE" ! Size parameters ! Local variables LOGICAL, SAVE :: FIRST = .TRUE. INTEGER :: I, J, L, N !================================================================= ! DO_WINDOW_TPCORE_BC begins here! !================================================================= ! Either zero BC's or read them from disk IF ( CLEAN_BC ) THEN CALL CLEAN_WINDOW_TPCORE_BC ELSE CALL READ_WINDOW_TPCORE_BC ENDIF !================================================================= ! Copy the BC data into the proper elements of STT ! ! NOTE: We assume that we have saved 4x5 BC's from a global ! GEOS-CHEM run. It takes too long to save the 2x25 BC's. ! One may always another subroutine for 2x25 BC's later. !================================================================= IF ( .not. LWINDO2x25 ) THEN !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR ! First loop over all latitudes (WINDOW REGION) DO J = 1, JJPAR ! West BC DO I = 1, I0_W STT(I,J,L,N) = GET_4x5_BC(I,J,L,N) ENDDO ! East BC DO I = IIPAR-I0_W+1, IIPAR STT(I,J,L,N) = GET_4x5_BC(I,J,L,N) ENDDO ENDDO ! Now loop over the longitudes of the TPCORE REGION DO I = 1+I0_W, IM_W+I0_W ! South BC DO J = 1, J0_W STT(I,J,L,N) = GET_4x5_BC(I,J,L,N) ENDDO ! North BC DO J = JJPAR-J0_W+1, JJPAR STT(I,J,L,N) = GET_4x5_BC(I,J,L,N) ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO ELSE !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR ! First loop over all latitudes (WINDOW REGION) DO J = 1, JJPAR ! West BC DO I = 1, I0_W STT(I,J,L,N) = GET_2x25_BC(I,J,L,N) ENDDO ! East BC DO I = IIPAR-I0_W+1, IIPAR STT(I,J,L,N) = GET_2x25_BC(I,J,L,N) ENDDO ENDDO ! Now loop over the longitudes of the TPCORE REGION DO I = 1+I0_W, IM_W+I0_W ! South BC DO J = 1, J0_W STT(I,J,L,N) = GET_2x25_BC(I,J,L,N) ENDDO ! North BC DO J = JJPAR-J0_W+1, JJPAR STT(I,J,L,N) = GET_2x25_BC(I,J,L,N) ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO ENDIF ! Return to calling program END SUBROUTINE DO_WINDOW_TPCORE_BC !------------------------------------------------------------------------------ SUBROUTINE DO_WINDOW_TPCORE_BC_ADJ ! !****************************************************************************** ! Subroutine DO_WINDOW_TPCORE_BC_ADJ is the adjoint for assigning TPCORE ! boundary conditions to the tracer array STT. The impact is to set the ! adjoint values with the cushion region to zero. ! (zhej, dkh, 02/09/12, adj32_020) ! ! Based on DO_WINDOW_TPCORE_BC by (bmy, 3/7/03, 7/20/04) ! ! NOTES: ! !****************************************************************************** ! ! References to F90 modules USE TRACER_MOD, ONLY : N_TRACERS USE ADJ_ARRAYS_MOD, ONLY : STT_ADJ # include "CMN_SIZE" ! Size parameters ! Local variables INTEGER :: I, J, L, N !================================================================= ! Set the adjoint concentration of cushion grids to ZERO because ! the current nested transport module allows transport crossing ! west/east boundary. (Zhe Jan 2012) !================================================================= !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR ! First loop over all latitudes (WINDOW REGION) DO J = 1, JJPAR ! West BC DO I = 1, I0_W STT_ADJ(I,J,L,N) = 0.0 ENDDO ! East BC DO I = IIPAR-I0_W+1, IIPAR STT_ADJ(I,J,L,N) = 0.0 ENDDO ENDDO ! Now loop over the longitudes of the TPCORE REGION DO I = 1, IIPAR ! South BC DO J = 1, J0_W STT_ADJ(I,J,L,N) = 0.0 ENDDO ! North BC DO J = JJPAR-J0_W+1, JJPAR STT_ADJ(I,J,L,N) = 0.0 ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO ! Return to calling program END SUBROUTINE DO_WINDOW_TPCORE_BC_ADJ !------------------------------------------------------------------------------ SUBROUTINE DO_WINDOW_TPCORE_BC_05x0666 ! !****************************************************************************** ! Subroutine DO_WINDOW_TPCORE_BC_05x0666 is a driver routine for assigning TPCORE ! boundary conditions to the tracer array STT. (Zhe, Jan 2012) !****************************************************************************** ! ! References to F90 modules USE TRACER_MOD, ONLY : N_TRACERS, STT # include "CMN_SIZE" ! Size parameters ! Local variables LOGICAL, SAVE :: FIRST = .TRUE. INTEGER :: I, J, L, N REAL*4 :: STT_BC(JM_BC_05x06, I0_W) !================================================================= ! DO_WINDOW_TPCORE_BC begins here! !================================================================= ! Either zero BC's or read them from disk IF ( CLEAN_BC ) THEN CALL CLEAN_WINDOW_TPCORE_BC_05x0666 ELSE CALL READ_WINDOW_TPCORE_BC_05x0666 ENDIF !================================================================= ! Copy the BC data into the proper elements of STT !================================================================= ! Do this sequentially for now (zhej, dkh, 02/09/12, adj32_021) !!$OMP PARALLEL DO !!$OMP+DEFAULT( SHARED ) !!$OMP+PRIVATE( L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR !Southern boundary, 1:J0_W STT(1:IIPAR, 1:J0_W, L, N) & = BC_05x06(1:IIPAR, 1:J0_W, L, N) !Northern boundary, (J0_W + 1):(J0_W * 2) STT(1:IIPAR, (JJPAR - J0_W + 1):JJPAR, L, N) & = BC_05x06(1:IIPAR, (J0_W + 1):(J0_W * 2), L, N) !Western boundary, (J0_W * 2 + 1):(J0_W * 2 + I0_W) STT_BC(1:JJPAR, 1:I0_W) & = BC_05x06(1:JJPAR, (J0_W * 2 + 1):(J0_W * 2 + I0_W), L, N) STT(1:I0_W, 1:JJPAR, L, N) & = TRANSPOSE(STT_BC) !Eestern boundary, (J0_W * 2 + I0_W + 1):((J0_W + I0_W)* 2) STT_BC(1:JJPAR, 1:I0_W) & = BC_05x06(1:JJPAR, (J0_W*2+I0_W +1):((J0_W+I0_W)*2), L, N) STT((IIPAR - I0_W + 1):IIPAR, 1:JJPAR, L, N) & = TRANSPOSE(STT_BC) ENDDO ENDDO !!$OMP END PARALLEL DO ! Return to calling program END SUBROUTINE DO_WINDOW_TPCORE_BC_05x0666 !------------------------------------------------------------------------ SUBROUTINE CLEAN_WINDOW_TPCORE_BC ! !****************************************************************************** ! Subroutine CLEAN_WINDOW_TPCORE_BC zeroes the boundary conditions array ! BC at each timestep. (bmy, 3/7/03, 7/20/04) ! ! NOTES: ! (1 ) Now references N_TRACERS from "tracer_mod.f" (bmy, 7/20/04) !****************************************************************************** ! ! References to F90 modules USE TRACER_MOD, ONLY : N_TRACERS USE LOGICAL_MOD, ONLY : LWINDO_NA, LWINDO_EU !(lzh,02/01/2015) USE LOGICAL_MOD, ONLY : LWINDO_CH, LWINDO_CU # include "CMN_SIZE" ! Size parameters ! Local variables INTEGER :: I, J, L, N !================================================================= ! CLEAN_WINDOW_TPCORE_BC begins here! !================================================================= !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR DO J = 1, JM_BC DO I = 1, IM_BC BC(I,J,L,N) = 0e0 ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO !===== (lzh,02/01/2015)===== IF ( LWINDO_NA ) THEN !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR DO J = 1, JM_BC_NA DO I = 1, IM_BC_NA BC_NA(I,J,L,N) = 0e0 ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO ENDIF IF ( LWINDO_EU ) THEN !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR DO J = 1, JM_BC_EU DO I = 1, IM_BC_EU BC_EU(I,J,L,N) = 0e0 ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO ENDIF IF ( LWINDO_CH ) THEN !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR DO J = 1, JM_BC_CH DO I = 1, IM_BC_CH BC_CH(I,J,L,N) = 0e0 ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO ENDIF ! Return to calling program END SUBROUTINE CLEAN_WINDOW_TPCORE_BC !------------------------------------------------------------------------------ SUBROUTINE CLEAN_WINDOW_TPCORE_BC_05x0666 ! !****************************************************************************** ! Subroutine CLEAN_WINDOW_TPCORE_BC_05x0666 zeroes the boundary conditions array ! BC_05x06 at each timestep. (Zhe, Jan 2012) !****************************************************************************** ! ! References to F90 modules USE TRACER_MOD, ONLY : N_TRACERS # include "CMN_SIZE" ! Size parameters ! Local variables INTEGER :: I, J, L, N !================================================================= ! CLEAN_WINDOW_TPCORE_BC begins here! !================================================================= !$OMP PARALLEL DO !$OMP+DEFAULT( SHARED ) !$OMP+PRIVATE( I, J, L, N ) DO N = 1, N_TRACERS DO L = 1, LLPAR DO J = 1, JM_BC_05x06 DO I = 1, IM_BC_05x06 BC_05x06(I,J,L,N) = 0e0 ENDDO ENDDO ENDDO ENDDO !$OMP END PARALLEL DO ! Return to calling program END SUBROUTINE CLEAN_WINDOW_TPCORE_BC_05x0666 !------------------------------------------------------------------------------ SUBROUTINE READ_WINDOW_TPCORE_BC ! !****************************************************************************** ! Subroutine READ_WINDOW_TPCORE_BC reads tracer concentrations saved on the ! WINDOW REGION of a coarse-grid simulation (e.g. 4x5). These concentrations ! will be used as boundary conditions for TPCORE transport. (bmy, 3/7/03) ! ! NOTES: ! (1 ) LINUX has a problem putting a function call w/in a WRITE statement. ! Now save output from TIMESTAMP_STRING to STAMP and print that. ! (bmy, 9/29/03) ! (2 ) Now references N_TRACERS from "tracer_mod.f" (bmy, 7/20/04) !****************************************************************************** ! ! References to F90 modules USE FILE_MOD, ONLY : IOERROR, IU_BC USE TIME_MOD, ONLY : GET_TAU, TIMESTAMP_STRING USE TRACER_MOD, ONLY : N_TRACERS # include "CMN_SIZE" ! Size parameters ! Local variables INTEGER :: I, IOS, J, L INTEGER :: NI, NJ, NL, NT INTEGER :: NFOUND, IFIRST, JFIRST, LFIRST INTEGER :: NSKIP, NTRACER, HALFPOLAR, CENTER180 REAL*4 :: LONRES, LATRES REAL*4 :: ARRAY(IIPAR,JJPAR,LLPAR) REAL*8 :: ZTAU0, ZTAU1 CHARACTER(LEN=20) :: S = 'read_window_boundary' CHARACTER(LEN=20) :: MODELNAME CHARACTER(LEN=40) :: CATEGORY CHARACTER(LEN=40) :: UNIT CHARACTER(LEN=40) :: RESERVED ! For LINUX fix CHARACTER(LEN=16) :: STAMP !================================================================= ! READ_WINDOW_TPCORE_BC begins here! !================================================================= IF ( ITS_TIME_FOR_BC() ) THEN ! Open boundary conditions file (if necessary) ! (lzh,02/01/2015) add multiple nested domains CALL OPEN_BC_FILE( FOR_READ=.TRUE., WINDOW=5 ) ! Initialize # of tracers found NFOUND = 0 ! Loop DO !=========================================================== ! Read each data block one at a time !=========================================================== ! Read first header line READ( IU_BC, IOSTAT=IOS ) & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180 ! IOS < 0 is end-of-file, so exit IF ( IOS < 0 ) EXIT ! IOS > 0 is a real I/O error -- print error message IF ( IOS > 0 ) CALL IOERROR( IOS, IU_BC, S//':1' ) ! Read second header line READ( IU_BC, IOSTAT=IOS ) & CATEGORY, NT, UNIT, ZTAU0, ZTAU1, RESERVED, & NI, NJ, NL, IFIRST, JFIRST, LFIRST, NSKIP IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_BC, S//':2' ) ! Read data array READ( IU_BC, IOSTAT=IOS ) ARRAY(1:NI,1:NJ,1:NL) IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_BC, S//':3' ) !=========================================================== ! If this is the right time, then save into BC array !=========================================================== IF ( GET_TAU() == ZTAU0 ) THEN ! Copy into the BC array DO L = 1, NL BC( 1:IM_BC, 1:JM_BC, L, NT ) = ARRAY(1:NI, 1:NJ, L) ENDDO ! Increment count of tracers found NFOUND = NFOUND + 1 ENDIF !=========================================================== ! Exit if we've found all tracers for this TAU value !=========================================================== IF ( NFOUND == N_TRACERS ) THEN ! Echo output STAMP = TIMESTAMP_STRING() WRITE( 6, 100 ) N_TRACERS, STAMP 100 FORMAT( ' - READ_WINDOW_TPCORE_BC: Found all ', & i3, ' BC''s at ', a ) EXIT ENDIF ENDDO ENDIF ! Return to calling program END SUBROUTINE READ_WINDOW_TPCORE_BC !------------------------------------------------------------------------------ SUBROUTINE READ_WINDOW_TPCORE_BC_05x0666 ! !****************************************************************************** ! Subroutine READ_WINDOW_TPCORE_BC_05x0666 reads tracer concentrations saved on the ! WINDOW REGION. These concentrations will be used as boundary conditions for TPCORE transport. (bmy, 3/7/03) ! (Zhe, Jan 2012) !****************************************************************************** ! ! References to F90 modules USE FILE_MOD, ONLY : IOERROR, IU_BC_05x06 USE TIME_MOD, ONLY : GET_TAU, TIMESTAMP_STRING USE TRACER_MOD, ONLY : N_TRACERS # include "CMN_SIZE" ! Size parameters ! Local variables INTEGER :: I, IOS, J, L INTEGER :: NI, NJ, NL, NT INTEGER :: NFOUND, IFIRST, JFIRST, LFIRST INTEGER :: NSKIP, NTRACER, HALFPOLAR, CENTER180 REAL*4 :: LONRES, LATRES REAL*4 :: ARRAY(IIPAR,JJPAR,LLPAR) REAL*8 :: ZTAU0, ZTAU1 CHARACTER(LEN=20) :: S = 'read_window_boundary' CHARACTER(LEN=20) :: MODELNAME CHARACTER(LEN=40) :: CATEGORY CHARACTER(LEN=40) :: UNIT CHARACTER(LEN=40) :: RESERVED ! For LINUX fix CHARACTER(LEN=16) :: STAMP !================================================================= ! READ_WINDOW_TPCORE_BC begins here! !================================================================= IF ( ITS_TIME_FOR_BC_05x0666() ) THEN ! Open boundary conditions file (if necessary) CALL OPEN_BC_FILE_05x0666( FOR_READ=.TRUE. ) ! Initialize # of tracers found NFOUND = 0 ! Loop DO !=========================================================== ! Read each data block one at a time !=========================================================== ! Read first header line READ( IU_BC_05x06, IOSTAT=IOS ) & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180 ! IOS < 0 is end-of-file, so exit IF ( IOS < 0 ) EXIT ! IOS > 0 is a real I/O error -- print error message IF ( IOS > 0 ) CALL IOERROR( IOS, IU_BC_05x06, S//':1' ) ! Read second header line READ( IU_BC_05x06, IOSTAT=IOS ) & CATEGORY, NT, UNIT, ZTAU0, ZTAU1, RESERVED, & NI, NJ, NL, IFIRST, JFIRST, LFIRST, NSKIP IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_BC_05x06, S//':2' ) ! Read data array READ( IU_BC_05x06, IOSTAT=IOS ) ARRAY(1:NI,1:NJ,1:NL) IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_BC_05x06, S//':3' ) !=========================================================== ! If this is the right time, then save into BC array !=========================================================== IF ( GET_TAU() == ZTAU0 ) THEN ! Copy into the BC array DO L = 1, NL BC_05x06( 1:IJ_BC_05x06, 1:((I0_W + J0_W)*2), L, NT ) & = ARRAY(1:NI, 1:NJ, L) ENDDO ! Increment count of tracers found NFOUND = NFOUND + 1 ENDIF !=========================================================== ! Exit if we've found all tracers for this TAU value !=========================================================== IF ( NFOUND == N_TRACERS ) THEN ! Echo output STAMP = TIMESTAMP_STRING() WRITE( 6, 100 ) N_TRACERS, STAMP 100 FORMAT( ' - READ_WINDOW_TPCORE_BC: Found all ', & i3, ' BC''s at ', a ) EXIT ENDIF ENDDO ENDIF ! Return to calling program END SUBROUTINE READ_WINDOW_TPCORE_BC_05x0666 !------------------------------------------------------------------------------ FUNCTION GET_4x5_BC( I_1x1, J_1x1, L_1x1, N_1x1 ) RESULT( VALUE ) ! !****************************************************************************** ! Function GET_4x5_BC returns a value from the 4x5 BC boundary conditions ! array at the location of a 1x1 grid box. (yxw, bmy, 3/7/03) ! ! For now we will assume that we have saved tracer concentrations from a ! 4x5 window whioh overlays the corresponding 1x1 WINDOW REGION. These 4x5 ! tracer concentrations are used as boundary conditions for TPCORE. ! ! We assume that we won't be saving 2x2.5 boundary conditions anytime in the ! near future since it currently takes too long to run a 2x2.5 full-chemistry ! simulation for a whole year. However, if we ever do save 2x25 boundary ! conditions, one may always write a corresponding subroutine GET_2x25_BC to ! do the mapping from 1x1 -> 2x25. (yxw, bmy, 3/7/03) ! ! Arguments as Input: ! ============================================================================ ! (1 ) I_1x1 (INTEGER) : Longitude index of 1x1 grid box ! (2 ) J_1x1 (INTEGER) : Latitude index of 1x1 grid box ! (3 ) L_1x1 (INTEGER) : Altitude index of 1x1 grid box ! (4 ) N_1x1 (INTEGER) : Tracer index of 1x1 grid box ! ! NOTES: ! (1 ) Rename arguments to avoid conflict w/ I1x1, J1x1 parameters in ! CMN_SIZE. (bmy, 10/24/05) !****************************************************************************** ! ! References to F90 modules USE GRID_MOD, ONLY : GET_XMID, GET_YMID # include "CMN_SIZE" ! Size parameters # include "CMN" ! NTRACE ! Arguments INTEGER, INTENT(IN) :: I_1x1, J_1x1, L_1x1, N_1x1 ! Local variables LOGICAL, SAVE :: FIRST = .TRUE. INTEGER :: I, II, J, JJ, JJ1 REAL*8 :: X, Y REAL*8, SAVE :: XE4x5(73), YE4x5(47) ! Function value REAL*8 :: VALUE !================================================================= ! GET_4x5_BC begins here! !================================================================= ! First-time initialization IF ( FIRST ) THEN !============================================================== ! Define lon & lat edges of the 4x5 grid -- we need to ! use these to do the mapping from 1x1 --> 4x5 !============================================================== ! Lon edges DO I = 1, 73 XE4x5(I) = -182.5d0 + 5 * ( I - 1 ) ENDDO ! Lat edges DO J = 2, 46 YE4x5(J) = -92d0 + 4 * ( J - 1 ) ENDDO ! Polar lats YE4x5(1) = -90d0 YE4x5(47) = +90d0 !============================================================== ! Locate the 4x5 box(es) to which each 1x1 box belongs ! X, Y are lon & lat centers of the 1x1 boxes in degrees ! Save in the MAP1x1 array for future reference !============================================================== DO J = 1, JJPAR Y = GET_YMID( J ) DO I = 1, IIPAR X = GET_XMID( I ) ! Loop over 4x5 longitudes DO II = 1, 72 ! If the 1x1 center lon lies w/in the 4x5 lon edges ! then we have found the proper 4x5 box! IF ( X > XE4x5(II) .and. X < XE4x5(II+1) ) THEN MAP1x1(I,J,1) = II EXIT ENDIF ENDDO ! Loop over 4x5 latitudes DO JJ = 1, 46 ! If the 1x1 lat center lies between the 4x5 lat ! edges, we have found the proper 4x5 box! IF ( Y > YE4x5(JJ) .and. Y < YE4x5(JJ+1) ) THEN MAP1x1(I,J,2) = JJ MAP1x1(I,J,3) = 0 EXIT ! If the 1x1 lat center equals the 4x5 lower lat ! edge, then we need to average this 4x5 box and ! the box just south of it ELSE IF ( Y == YE4x5(JJ) ) THEN MAP1x1(I,J,2) = JJ-1 MAP1x1(I,J,3) = JJ EXIT ! If the 1x1 lat center equals the 4x5 lower lat ! edge, then we need to average this 4x5 box and ! the box just north of it ELSE IF ( Y == YE4x5(JJ+1) ) THEN MAP1x1(I,J,2) = JJ MAP1x1(I,J,3) = JJ+1 EXIT ENDIF ENDDO ENDDO ENDDO ! Reset first-time flag FIRST = .FALSE. ENDIF !============================================================= ! Locate the tracer concentration at the 4x5 box which ! corresponds to the 1x1 box (I_1x1, J_1x1, L_1x1, N_1x1) !============================================================= ! Get lon indices II = MAP1x1( I_1x1, J_1x1, 1 ) - I0_BC ! Get lat indices JJ = MAP1x1( I_1x1, J_1x1, 2 ) - J0_BC JJ1 = MAP1x1( I_1x1, J_1x1, 3 ) - J0_BC ! Locate the 4x5 box(es) corresponding to the 1x1 box ! If our 1x1 box straddles 2 4x5 boxes, average the 4x5 values IF ( MAP1x1( I_1x1, J_1x1, 3 ) > 0 ) THEN VALUE = 0.5 * ( BC(II,JJ,L_1x1,N_1x1) + BC(II,JJ1,L_1x1,N_1x1)) ELSE VALUE = BC(II,JJ,L_1x1,N_1x1) ENDIF ! Return to calling program END FUNCTION GET_4x5_BC !------------------------------------------------------------------------------ ! (lzh,02/01/2015) add 2x2.5 BC FUNCTION GET_2x25_BC( I_1x1, J_1x1, L_1x1, N_1x1 ) RESULT( VALUE ) ! !****************************************************************************** ! Function GET_2x25_BC returns a value from the 2x2.5 BC boundary conditions ! array at the location of a 1x1 grid box. (yxw, bmy, 3/7/03) ! ! For now we will assume that we have saved tracer concentrations from a ! 2x25 window which overlays the corresponding 1x1 WINDOW REGION. These 2x2.5 ! tracer concentrations are used as boundary conditions for TPCORE. ! ! Arguments as Input: ! ============================================================================ ! (1 ) I_1x1 (INTEGER) : Longitude index of 1x1 grid box ! (2 ) J_1x1 (INTEGER) : Latitude index of 1x1 grid box ! (3 ) L_1x1 (INTEGER) : Altitude index of 1x1 grid box ! (4 ) N_1x1 (INTEGER) : Tracer index of 1x1 grid box ! ! NOTES: ! (1 ) Rename arguments to avoid conflict w/ I1x1, J1x1 parameters in ! CMN_SIZE. (bmy, 10/24/05) !****************************************************************************** ! ! References to F90 modules USE GRID_MOD, ONLY : GET_XMID, GET_YMID # include "CMN_SIZE" ! Size parameters # include "CMN" ! NTRACE ! Arguments INTEGER, INTENT(IN) :: I_1x1, J_1x1, L_1x1, N_1x1 ! Local variables LOGICAL, SAVE :: FIRST = .TRUE. INTEGER :: I, II, J, JJ, JJ1 REAL*8 :: X, Y REAL*8, SAVE :: XE2x25(145), YE2x25(92) ! Function value REAL*8 :: VALUE !================================================================= ! GET_2x25_BC begins here! !================================================================= ! First-time initialization IF ( FIRST ) THEN !============================================================== ! Define lon & lat edges of the 2x25 grid -- we need to ! use these to do the mapping from 1x1 --> 2x25 !============================================================== ! Lon edges DO I = 1, 145 XE2x25(I) = -181.25d0 + 2.5 * ( I - 1 ) ENDDO ! Lat edges DO J = 2, 91 YE2x25(J) = -91d0 + 2 * ( J - 1 ) ENDDO ! Polar lats YE2x25(1) = -90d0 YE2x25(92) = +90d0 !============================================================== ! Locate the 2x25 box(es) to which each 1x1 box belongs ! X, Y are lon & lat centers of the 1x1 boxes in degrees ! Save in the MAP1x1 array for future reference !============================================================== DO J = 1, JJPAR Y = GET_YMID( J ) DO I = 1, IIPAR X = GET_XMID( I ) ! Loop over 2x25 longitudes DO II = 1, 144 ! If the 1x1 center lon lies w/in the 2x25 lon edges ! then we have found the proper 2x25 box! !! IF ( X > XE2x25(II) .and. X < XE2x25(II+1) ) THEN !! (lzh, 02/01/2014) IF ( X >= XE2x25(II) .and. X < XE2x25(II+1) ) THEN MAP1x1(I,J,1) = II EXIT ENDIF ENDDO ! Loop over 2x25 latitudes DO JJ = 1, 91 ! If the 1x1 lat center lies between the 2x25 lat ! edges, we have found the proper 2x25 box! IF ( Y > YE2x25(JJ) .and. Y < YE2x25(JJ+1) ) THEN MAP1x1(I,J,2) = JJ MAP1x1(I,J,3) = 0 EXIT ! If the 1x1 lat center equals the 2x25 lower lat ! edge, then we need to average this 2x25 box and ! the box just south of it ELSE IF ( Y == YE2x25(JJ) ) THEN MAP1x1(I,J,2) = JJ-1 MAP1x1(I,J,3) = JJ EXIT ! If the 1x1 lat center equals the 2x25 lower lat ! edge, then we need to average this 2x25 box and ! the box just north of it ELSE IF ( Y == YE2x25(JJ+1) ) THEN MAP1x1(I,J,2) = JJ MAP1x1(I,J,3) = JJ+1 EXIT ENDIF ENDDO ENDDO ENDDO ! Reset first-time flag FIRST = .FALSE. ENDIF !============================================================= ! Locate the tracer concentration at the 4x5 box which ! corresponds to the 1x1 box (I_1x1, J_1x1, L_1x1, N_1x1) !============================================================= ! Get lon indices II = MAP1x1( I_1x1, J_1x1, 1 ) - I0_BC ! Get lat indices JJ = MAP1x1( I_1x1, J_1x1, 2 ) - J0_BC JJ1 = MAP1x1( I_1x1, J_1x1, 3 ) - J0_BC ! Locate the 2x25 box(es) corresponding to the 1x1 box ! If our 1x1 box straddles 2 2x25 boxes, average the 2x25 values IF ( MAP1x1( I_1x1, J_1x1, 3 ) > 0 ) THEN VALUE = 0.5 * ( BC(II,JJ,L_1x1,N_1x1) + BC(II,JJ1,L_1x1,N_1x1)) ELSE VALUE = BC(II,JJ,L_1x1,N_1x1) ENDIF ! Return to calling program END FUNCTION GET_2x25_BC !------------------------------------------------------------------------------ FUNCTION ITS_TIME_FOR_BC() RESULT( FLAG ) ! !****************************************************************************** ! Subroutine ITS_TIME_FOR_BC returns TRUE if it is time to read in the next ! set of boundary conditions for TPCORE, or FALSE otherwise. (bmy, 3/5/03) ! ! NOTES: !****************************************************************************** ! ! References to F90 modules USE TIME_MOD, ONLY : GET_ELAPSED_MIN ! Function value LOGICAL :: FLAG !================================================================= ! ITS_TIME_FOR_BC begins here! !================================================================= FLAG = ( MOD( GET_ELAPSED_MIN(), TS_BC ) == 0 ) ! Return to calling program END FUNCTION ITS_TIME_FOR_BC !------------------------------------------------------------------------------ FUNCTION ITS_TIME_FOR_BC_05x0666() RESULT( FLAG ) ! !****************************************************************************** ! Subroutine ITS_TIME_FOR_BC_0666 returns TRUE if it is time to read in the next ! set of boundary conditions for TPCORE, or FALSE otherwise. (Zhe, Jan 2012) !****************************************************************************** ! ! References to F90 modules USE TIME_MOD, ONLY : GET_ELAPSED_MIN ! Function value LOGICAL :: FLAG !================================================================= ! ITS_TIME_FOR_BC begins here! !================================================================= FLAG = ( MOD( GET_ELAPSED_MIN(), TS_BC_05x06 ) == 0 ) ! Return to calling program END FUNCTION ITS_TIME_FOR_BC_05x0666 !------------------------------------------------------------------------------ SUBROUTINE INIT_TPCORE_BC( TS, I0W, J0W, I1, J1, I2, J2 ) ! !****************************************************************************** ! Subroutine INIT_TPCORE_BC initializes module variables and arrays ! (bmy, 2/10/03, 7/20/04) ! ! NOTES: ! (1 ) Now references N_TRACERS from "tracer_mod.f". Now references LWINDO ! from "logical_mod.f". Now references TPBC_DIR from "directory_mod.f". ! Now references ITS_A_NESTED_GRID from "grid_mod.f". Also added ! arguments to take values from "input_mod.f". (bmy, 7/20/04) !****************************************************************************** ! ! References to F90 modules USE DIRECTORY_MOD, ONLY : TPBC_DIR USE ERROR_MOD, ONLY : ALLOC_ERR USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET USE GRID_MOD, ONLY : ITS_A_NESTED_GRID ! USE LOGICAL_MOD, ONLY : LWINDO USE LOGICAL_MOD, ONLY : LWINDO, LWINDO_NA, LWINDO_CU !(lzh) USE LOGICAL_MOD, ONLY : LWINDO_EU, LWINDO_CH USE LOGICAL_MOD, ONLY : LWINDO2x25 USE TRACER_MOD, ONLY : N_TRACERS # include "CMN_SIZE" ! Size parameters ! Arguments INTEGER, INTENT(IN) :: TS, I0W, J0W, I1, J1, I2, J2 ! Local variables INTEGER :: AS, I, J !================================================================= ! INIT_TPCORE_BC begins here! !================================================================= ! Timestep for BC's [min] TS_BC = TS !--------------------- ! *** NESTED GRID *** !--------------------- ! TPCORE transport region offsets I0_W = I0W J0_W = J0W ! Extent of TPCORE transport region IM_W = IIPAR - ( 2 * I0_W ) JM_W = JJPAR - ( 2 * J0_W ) ! I and J at lower-left corner of TPCORE transport region I1_W = GET_XOFFSET( GLOBAL=.TRUE. ) + I0_W + 1 J1_W = GET_YOFFSET( GLOBAL=.TRUE. ) + J0_W + 1 ! I and J at upper-right corner of TPCORE transport region I2_W = GET_XOFFSET( GLOBAL=.TRUE. ) + IIPAR - I0_W J2_W = GET_YOFFSET( GLOBAL=.TRUE. ) + JJPAR - J0_W ! IGZD = ? IGZD = I0_W - 1 !--------------------- ! *** GLOBAL GRID *** !--------------------- ! Lower-left corner of coarse-grid BC WINDOW region I1_BC = I1 J1_BC = J1 ! Upper-right corner of coarse-grid BC WINDOW region I2_BC = I2 J2_BC = J2 ! Extent of coarse-grid BC REGION IM_BC = I2_BC - I1_BC + 1 JM_BC = J2_BC - J1_BC + 1 ! TPCORE internal transport window offset I0_BC = I1_BC - 1 J0_BC = J1_BC - 1 IF (.not. LWINDO2x25) THEN #if defined(GRID4x5) || defined(NESTED_NA) #if defined( GEOS_FP ) !%%%%% 4x5 BC REGION FOR NORTH AMERICA NESTED GRID (GEOS_FP) I1_BC_NA = 11 ! 4x5 lon index, LL corner J1_BC_NA = 26 ! 4x5 lat index, LL corner I2_BC_NA = 25 ! 4x5 lon index, UR corner J2_BC_NA = 39 ! 4x5 lat index, UR corner #else !%%%%% 4x5 BC REGION FOR NORTH AMERICA NESTED GRID %%%%% I1_BC_NA = 9 ! 4x5 lon index, LL corner J1_BC_NA = 26 ! 4x5 lat index, LL corner I2_BC_NA = 29 ! 4x5 lon index, UR corner J2_BC_NA = 41 ! 4x5 lat index, UR corner #endif #endif ELSE #if defined(GRID2x25) || defined(NESTED_NA) #if defined( GEOS_FP ) !%%%%% 2x25 BC REGION FOR NORTH AMERICA NESTED GRID (GEOS_FP) I1_BC_NA = 21 ! 2x25 lon index, LL corner J1_BC_NA = 51 ! 2x25 lat index, LL corner I2_BC_NA = 49 ! 2x25 lon index, UR corner J2_BC_NA = 76 ! 2x25 lat index, UR corner #else !%%%%% 2x25 BC REGION FOR NORTH AMERICA NESTED GRID %%%%% I1_BC_NA = 17 ! 2x25 lon index, LL corner J1_BC_NA = 51 ! 2x25 lat index, LL corner I2_BC_NA = 57 ! 2x25 lon index, UR corner J2_BC_NA = 81 ! 2x25 lat index, UR corner #endif #endif ENDIF ! Extent of coarse-grid NA BC REGION IM_BC_NA = I2_BC_NA - I1_BC_NA + 1 JM_BC_NA = J2_BC_NA - J1_BC_NA + 1 ! TPCORE NA internal transport window offset I0_BC_NA = I1_BC_NA - 1 J0_BC_NA = J1_BC_NA - 1 IF (.not. LWINDO2x25) THEN #if defined(GRID4x5) || defined(NESTED_EU) ! Lower-left corner of coarse-grid EU BC WINDOW region I1_BC_EU = 31 J1_BC_EU = 31 ! Upper-right corner of coarse-grid EU BC WINDOW region I2_BC_EU = 47 J2_BC_EU = 41 #endif ELSE #if defined(GRID2x25) || defined(NESTED_EU) ! Lower-left corner of coarse-grid EU BC WINDOW region I1_BC_EU = 61 J1_BC_EU = 61 ! Upper-right corner of coarse-grid EU BC WINDOW region I2_BC_EU = 93 J2_BC_EU = 81 #endif ENDIF ! Extent of coarse-grid EU BC REGION IM_BC_EU = I2_BC_EU - I1_BC_EU + 1 JM_BC_EU = J2_BC_EU - J1_BC_EU + 1 ! TPCORE NA internal transport window offset I0_BC_EU = I1_BC_EU - 1 J0_BC_EU = J1_BC_EU - 1 IF (.not. LWINDO2x25) THEN #if defined(GRID4x5) || defined(NESTED_CH) #if defined(GEOS_FP) !!! (lzh,04/20/2014) ! Lower-left corner of coarse-grid CH BC WINDOW region I1_BC_CH = 51 J1_BC_CH = 27 ! Upper-right corner of coarse-grid CH BC WINDOW region I2_BC_CH = 65 J2_BC_CH = 37 #else ! Lower-left corner of coarse-grid CH BC WINDOW region I1_BC_CH = 51 J1_BC_CH = 21 ! Upper-right corner of coarse-grid CH BC WINDOW region I2_BC_CH = 67 J2_BC_CH = 37 #endif #endif ELSE #if defined(GRID2x25) || defined(NESTED_CH) #if defined( GEOS_FP ) !!! (lzh,04/20/2014) ! Lower-left corner of coarse-grid CH BC WINDOW region I1_BC_CH = 101 J1_BC_CH = 53 ! Upper-right corner of coarse-grid CH BC WINDOW region I2_BC_CH = 129 J2_BC_CH = 74 #else ! Lower-left corner of coarse-grid CH BC WINDOW region I1_BC_CH = 101 J1_BC_CH = 40 ! Upper-right corner of coarse-grid CH BC WINDOW region I2_BC_CH = 133 J2_BC_CH = 74 #endif #endif ENDIF ! Extent of coarse-grid EU BC REGION IM_BC_CH = I2_BC_CH - I1_BC_CH + 1 JM_BC_CH = J2_BC_CH - J1_BC_CH + 1 ! TPCORE NA internal transport window offset I0_BC_CH = I1_BC_CH - 1 J0_BC_CH = J1_BC_CH - 1 ! Return if we are not saving 4x5 BC's ! or if it's not a nested grid simulation IF ( .not. ITS_A_NESTED_GRID() ) THEN IF ( .not. LWINDO ) RETURN ENDIF !================================================================= ! Allocate and initialize arrays !================================================================= ! ALLOCATE( BC( IM_BC, JM_BC, LLPAR, N_TRACERS ), STAT=AS ) ! IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC' ) ! BC = 0e0 IF ( LWINDO_CU ) THEN ALLOCATE( BC( IM_BC, JM_BC, LLPAR, N_TRACERS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC' ) BC = 0e0 ENDIF IF ( LWINDO_CH ) THEN ALLOCATE( BC_CH( IM_BC_CH, JM_BC_CH, LLPAR, N_TRACERS ) & , STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC_CH' ) BC_CH = 0e0 ENDIF IF ( LWINDO_NA ) THEN ALLOCATE( BC_NA( IM_BC_NA, JM_BC_NA, LLPAR, N_TRACERS ) & , STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC_NA' ) BC_NA = 0e0 ENDIF IF ( LWINDO_EU ) THEN ALLOCATE( BC_EU( IM_BC_EU, JM_BC_EU, LLPAR, N_TRACERS ) & , STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC_EU' ) BC_EU = 0e0 ENDIF ! If running a nested simulation, just allocate the custom BC ! array with nested dimensions #if defined( NESTED_CH ) I1_BC = I1_BC_CH J1_BC = J1_BC_CH I2_BC = I2_BC_CH J2_BC = J2_BC_CH IM_BC = IM_BC_CH JM_BC = JM_BC_CH I0_BC = I0_BC_CH J0_BC = J0_BC_CH ALLOCATE( BC( IM_BC, JM_BC, LLPAR, N_TRACERS ) & , STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC' ) BC = 0e0 #elif defined( NESTED_NA ) I1_BC = I1_BC_NA J1_BC = J1_BC_NA I2_BC = I2_BC_NA J2_BC = J2_BC_NA IM_BC = IM_BC_NA JM_BC = JM_BC_NA I0_BC = I0_BC_NA J0_BC = J0_BC_NA ALLOCATE( BC( IM_BC, JM_BC, LLPAR, N_TRACERS ) & , STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC' ) BC = 0e0 #elif defined( NESTED_EU ) I1_BC = I1_BC_EU J1_BC = J1_BC_EU I2_BC = I2_BC_EU J2_BC = J2_BC_EU IM_BC = IM_BC_EU JM_BC = JM_BC_EU I0_BC = I0_BC_EU J0_BC = J0_BC_EU ALLOCATE( BC( IM_BC, JM_BC, LLPAR, N_TRACERS ) & , STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC' ) BC = 0e0 #endif ALLOCATE( MAP1x1( IIPAR, JJPAR, 3 ) , STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'MAP1x1' ) MAP1x1 = 0 ! Return to calling program END SUBROUTINE INIT_TPCORE_BC !------------------------------------------------------------------------------ SUBROUTINE INIT_TPCORE_BC_05x0666 ! !****************************************************************************** ! Subroutine INIT_TPCORE_BC_05x0666 initializes module variables and arrays ! (Zhe, Jan 2012) !****************************************************************************** ! ! References to F90 modules USE ERROR_MOD, ONLY : ALLOC_ERR USE TRACER_MOD, ONLY : N_TRACERS # include "CMN_SIZE" ! Size parameters INTEGER :: AS !================================================================= ! INIT_TPCORE_BC_05x0666 begins here! !================================================================= ! Parameters for smaller domain ! Timestep for BC's [min] TS_BC_05x06 = 60 ! Lower-left corner of coarse-grid BC WINDOW region I1_BC_05x06 = 22 J1_BC_05x06 = 7 I1_BC_GLOBAL = 82 J1_BC_GLOBAL = 207 ! Upper-right corner of coarse-grid BC WINDOW region I2_BC_05x06 = 112 J2_BC_05x06 = 95 ! Extent of coarse-grid BC REGION IM_BC_05x06 = I2_BC_05x06 - I1_BC_05x06 + 1 JM_BC_05x06 = J2_BC_05x06 - J1_BC_05x06 + 1 IF ( IM_BC_05x06 > JM_BC_05x06 ) THEN IJ_BC_05x06 = IM_BC_05x06 ELSE IJ_BC_05x06 = JM_BC_05x06 ENDIF !================================================================= ! Allocate and initialize arrays !================================================================= ALLOCATE( BC_05x06( IJ_BC_05x06, (I0_W + J0_W)*2, & LLPAR, N_TRACERS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'BC_05x06' ) BC_05x06 = 0e0 ! Return to calling program END SUBROUTINE INIT_TPCORE_BC_05x0666 !------------------------------------------------------------------------------ SUBROUTINE CLEANUP_TPCORE_BC ! !****************************************************************************** ! Subroutine CLEANUP_TPCORE_BC deallocates all module arrays. (3/4/03) ! ! NOTES: !****************************************************************************** ! !================================================================= ! CLEANUP_TPCORE_BC begins here! !================================================================= IF ( ALLOCATED( BC ) ) DEALLOCATE( BC ) IF ( ALLOCATED( BC_NA ) ) DEALLOCATE( BC_NA ) IF ( ALLOCATED( BC_EU ) ) DEALLOCATE( BC_EU ) IF ( ALLOCATED( BC_CH ) ) DEALLOCATE( BC_CH ) IF ( ALLOCATED( MAP1x1 ) ) DEALLOCATE( MAP1x1 ) IF ( ALLOCATED( BC_05x06 ) ) DEALLOCATE( BC_05x06 ) ! Return to calling program END SUBROUTINE CLEANUP_TPCORE_BC !------------------------------------------------------------------------------ END MODULE TPCORE_BC_MOD