!----------------------------------------------------------------------- ! MODULE module_SOLVER_GRID_COMP ! !----------------------------------------------------------------------- ! !*** This module holds the Solver component's Register, Init, Run, !*** and Finalize routines. They are called from the DOMAIN component !*** (DOMAIN_INITIALIZE calls SOLVER_INITIALIZE, etc.) !*** in MODULE_DOMAIN_GRID_COMP.F90. ! !----------------------------------------------------------------------- ! HISTORY LOG: ! ! 2008-07-30 Janjic - Add CONVECTION='none' to OPERATIONAL_PHYSICS. ! Janjic - Fix lower J limit in FFTFHN(WATER). ! 2008-08-23 Janjic - General pressure-sigma hybrid ! Janjic - Consistent nonhydrostatic correction in the ! first term of the pressure gradient force ! 2008-09-03 Black - Added initialization of boundary arrays ! for nests. ! 2009-03-12 Black - Changes for general hybrid coordinate. ! 2009-11 Jovic - Modified for ownership/import/export specification ! 2010-11-03 Pyle - Modifications/corrections for digital filter. ! 2011-02 Yang - Updated to use both the ESMF 4.0.0rp2 library, ! ESMF 5 series library and the the ! ESMF 3.1.0rp2 library. ! 2011-05-12 Yang - Modified for using the ESMF 5.2.0r_beta_snapshot_07. ! 2011-12-22 Jovic - Combined Dyn and Phy into single component. ! ! 2012-02-08 Yang - Modified for using the ESMF 5.2.0rp1 library. ! 2012-04-06 Juang - add passing argument for gbphys for idea ! 2012-07-20 Black - Modified for generational usage. ! 2013-09-09 Moorthi - Adding SR, DTDT, and TRIGGERPERTS for GBPHYS call ! 2013-11-09 Xingren Wu - Adding DUSFCI/DVSFCI for GBPHYS call ! 2014-03-28 Xingren Wu - Add "_CPL" field for GBPHYS call ! 2014-05-14 J. Wang - Adding cgwf,prslrd0 and levr to gbphys call ! 2014-06-26 Weiguo Wang -- Add HURRICANE PBL and SFCLAY calls ! 2016-02-16 J. Wang - change newsas/sashal from logical to integer ! 2016-05-09 Ferrier/Janjic - Constants epsq2,epsl function of level, ! added subroutine TQadjust ! 2016-08-29 Weiguo wang -- add scale-aware convection schemes !----------------------------------------------------------------------- ! USE MPI USE ESMF USE MODULE_KINDS USE MODULE_VARS,ONLY : FIND_VAR_INDX USE MODULE_VARS_STATE USE MODULE_SOLVER_INTERNAL_STATE !<-- Horizontal loop limits obtained here ! USE MODULE_MY_DOMAIN_SPECS, IDS_share=>IDS,IDE_share=>IDE & ,IMS_share=>IMS,IME_share=>IME & ,ITS_share=>ITS,ITE_share=>ITE & ,JDS_share=>JDS,JDE_share=>JDE & ,JMS_share=>JMS,JME_share=>JME & ,JTS_share=>JTS,JTE_share=>JTE ! USE MODULE_EXCHANGE,ONLY: HALO_EXCH ! USE MODULE_GET_CONFIG ! USE MODULE_DERIVED_TYPES,ONLY : BC_H_ALL,BC_V_ALL ! USE MODULE_CONTROL,ONLY : NUM_DOMAINS_MAX,TIMEF,NMMB_FINALIZE ! USE MODULE_CONSTANTS,ONLY : A2,A3,A4,CAPPA,CP,ELIV,ELWV,EPSQ,G & ,P608,PQ0,R_D,TIW,DBZmin ! USE MODULE_DIAGNOSE,ONLY : EXIT,FIELD_STATS & ,MAX_FIELDS,MAX_FIELDS_HR,MAX_FIELDS_W6 & ,MAX_FIELDS_THO & ,HMAXMIN,TWR,VMAXMIN,VWR,WRT_PCP & ,LAT_LON_BNDS,WRT_SWATH ! USE MODULE_CLOCKTIMES,ONLY : INTEGRATION_TIMERS,TIMERS ! USE MODULE_ERROR_MSG,ONLY: ERR_MSG,MESSAGE_CHECK ! USE MODULE_FLTBNDS,ONLY : POLEHN,POLEWN,SWAPHN,SWAPWN ! USE MODULE_VARS,ONLY : VAR ! USE MODULE_NESTING,ONLY : READ_NETCDF_LATLON,SUFFIX_NESTBC ! USE MODULE_RADIATION ,ONLY : RADIATION USE MODULE_RA_GFDL ,ONLY : GFDL_INIT,RDTEMP,TIME_MEASURE USE MODULE_RA_RRTM ,ONLY : RRTM_INIT USE MODULE_TURBULENCE USE MODULE_SF_JSFC ,ONLY : JSFC_INIT USE MODULE_SF_GFDL ,ONLY : JSFC_INIT4GFDL USE MODULE_BL_MYJPBL ,ONLY : MYJPBL_INIT USE MODULE_LS_NOAHLSM ,ONLY : DZSOIL,NOAH_LSM_INIT & ,NUM_SOIL_LAYERS,SLDPTH USE MODULE_CU_BMJ ,ONLY : BMJ_INIT USE MODULE_CU_SAS ,ONLY : SAS_INIT USE MODULE_CU_SASHUR ,ONLY : SASHUR_INIT USE MODULE_CU_SCALE ,ONLY : SCALECU_INIT USE MODULE_CONVECTION USE MODULE_MICROPHYSICS_NMM ,ONLY : GSMDRIVE & ,MICRO_RESTART USE MODULE_MP_ETANEW ,ONLY : FERRIER_INIT USE MODULE_MP_FER_HIRES ,ONLY : FERRIER_INIT_HR USE MODULE_MP_WSM6 ,ONLY : WSM6INIT USE MODULE_MP_THOMPSON, ONLY : thompson_init USE MODULE_MP_GFS ,ONLY : GFSMP_INIT USE MODULE_H_TO_V ,ONLY : H_TO_V,H_TO_V_TEND USE MODULE_GWD ,ONLY : GWD_INIT USE MODULE_PRECIP_ADJUST USE ATM_CC ,ONLY : ATM_DOFLUXES,ATM_SENDFLUXES & ,ATM_TSTEP_INIT,ATM_GETSST ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! PRIVATE ! PUBLIC :: SOLVER_REGISTER ! INTEGER(kind=KINT),PUBLIC :: IM,JM,LM,RESTVAL ! INTEGER(kind=KINT) :: START_YEAR,START_MONTH,START_DAY & ,START_HOUR,START_MINUTE,START_SECOND ! INTEGER(kind=KINT),SAVE :: JC ! INTEGER(kind=KINT) :: NUM_PES ! LOGICAL(kind=KLOG),SAVE :: QUILTING !<-- Was quilting specified by the user? ! LOGICAL(kind=KLOG) :: I_AM_A_NEST !<-- Flag indicating if DOMAIN Component is a nest ! LOGICAL(kind=KLOG),SAVE :: MOVE_NOW !<-- Flag indicating if nested moves this timestep ! LOGICAL(kind=KLOG) :: MOVE_NOW & !<-- Flag indicating if nested moves this timestep ! ,MY_DOMAIN_MOVES !<-- Flag indicating if nested domain moves REAL(kind=KFPT),SAVE :: PT ! TYPE(SOLVER_INTERNAL_STATE),POINTER :: INT_STATE !<-- The Solver component internal state pointer. ! !----------------------------------------------------------------------- !*** For determining clocktimes of various pieces of the Solver. !----------------------------------------------------------------------- ! REAL(kind=KDBL) :: btim,btim0 ! TYPE(INTEGRATION_TIMERS),POINTER :: TD ! !----------------------------------------------------------------------- ! CONTAINS ! !----------------------------------------------------------------------- !####################################################################### !----------------------------------------------------------------------- ! SUBROUTINE SOLVER_REGISTER(GRID_COMP,RC_REG) ! !----------------------------------------------------------------------- !*** Register the Solver component's Initialize, Run, and Finalize !*** subroutine names. !----------------------------------------------------------------------- ! !------------------------ !*** Argument variables !------------------------ ! TYPE(ESMF_GridComp) :: GRID_COMP !<-- The Solver Gridded Component ! INTEGER(kind=KINT),INTENT(OUT) :: RC_REG !<-- Return code for Solver register ! !--------------------- !*** Local Variables !--------------------- ! INTEGER(kind=KINT) :: RC ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! RC =ESMF_SUCCESS RC_REG=ESMF_SUCCESS !<-- Initialize error signal variable ! !----------------------------------------------------------------------- !*** Register the Solver initialize subroutine. Since it is just one !*** subroutine, use ESMF_SINGLEPHASE. The second argument is !*** a pre-defined subroutine type, such as ESMF_SETINIT, ESMF_SETRUN, !*** or ESMF_SETFINAL. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set Entry Point for Solver Initialize" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompSetEntryPoint(GRID_COMP & !<-- The gridded component ,ESMF_METHOD_INITIALIZE & !<-- Predefined subroutine type ,SOLVER_INITIALIZE & !<-- User's subroutineName ,phase=1 & ,rc=RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_REG) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Register the Solver Run subroutine. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set Entry Point for Solver Run" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompSetEntryPoint(GRID_COMP & !<-- gridcomp ,ESMF_METHOD_RUN & !<-- subroutineType ,SOLVER_RUN & !<-- user's subroutineName ,phase=1 & ,rc=RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_REG) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Register the Solver Finalize subroutine. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set Entry Point for Solver Finalize" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompSetEntryPoint(GRID_COMP & !<-- gridcomp ,ESMF_METHOD_FINALIZE & !<-- subroutineType ,SOLVER_FINALIZE & !<-- user's subroutineName ,phase=1 & ,rc=RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_REG) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Check the error signal variable. !----------------------------------------------------------------------- ! IF(RC_REG==ESMF_SUCCESS)THEN ! WRITE(0,*)" SOLVER_REGISTER SUCCEEDED" ELSE WRITE(0,*)" SOLVER_REGISTER FAILED" ENDIF ! !----------------------------------------------------------------------- ! END SUBROUTINE SOLVER_REGISTER ! !----------------------------------------------------------------------- !####################################################################### !----------------------------------------------------------------------- ! SUBROUTINE SOLVER_INITIALIZE (GRID_COMP & ,IMP_STATE & ,EXP_STATE & ,CLOCK_ATM & ,RC_INIT) ! !----------------------------------------------------------------------- !*** Carry out all necessary setups for the model Solver. !----------------------------------------------------------------------- ! USE MODULE_CONTROL,ONLY : CONSTS ! USE MODULE_INIT_READ_BIN,ONLY : READ_BINARY USE MODULE_INIT_READ_NEMSIO,ONLY : READ_NEMSIO ! USE MODULE_FLTBNDS,ONLY : PREFFT, PRESMUD USE MODULE_TRACKER !------------------------ !*** Argument variables !------------------------ ! TYPE(ESMF_GridComp) :: GRID_COMP !<-- The Solver gridded component ! TYPE(ESMF_State) :: IMP_STATE & !<-- The Solver Initialize step's import state ,EXP_STATE !<-- The Solver Initialize step's export state ! TYPE(ESMF_Clock) :: CLOCK_ATM !<-- The ATM's ESMF Clock ! INTEGER,INTENT(OUT) :: RC_INIT ! !--------------------- !*** Local variables !--------------------- ! INTEGER(kind=KINT),SAVE :: N8=8 ! INTEGER(kind=KINT) :: IDE,IDS,IME,IMS,ITE,ITS & ,JDE,JDS,JME,JMS,JTE,JTS ! INTEGER(kind=KINT) :: IHALO,JHALO,MPI_COMM_COMP,MY_DOMAIN_ID & ,MY_DOMAIN_ID_LOC,MYPE,NUM_PES,UBOUND_VARS ! INTEGER(kind=KINT) :: I,I_INC,I_SW,IDENOMINATOR_DT & ,IEND,IERR,IM_1,INTEGER_DT & ,J,J_INC,J_SW,JEND,JM_1 & ,KK,KOUNT,KSE,KSS & ,L,LL,LMP1,LNSH,LNSV & ,N,NUMERATOR_DT,NV,RC,SPACE_RATIO ! INTEGER(kind=KINT) :: ITE_H2,ITS_H2,JTE_H2,JTS_H2 ! INTEGER(kind=KINT),DIMENSION(1:8) :: MY_NEB ! INTEGER(ESMF_KIND_I4),DIMENSION(:,:),POINTER :: SEA_MASK_PTR ! REAL(kind=KFPT) :: DPH,DLM,DT,GLATX,GLONX,SB_1,SBD_1,TLATX,TLONX & ,TPH0_1,TLM0_1,WB_1,WBD_1 & ,X,Y,Z ! REAL(kind=KFPT),DIMENSION(1:2) :: SW_X ! REAL(kind=DOUBLE) :: D2R,D_ONE,D_180,PI,RAD2DEG ! REAL(ESMF_KIND_R8),DIMENSION(:,:),POINTER :: GLAT_PTR, GLON_PTR ! LOGICAL(kind=KLOG) :: RUN_LOCAL ! CHARACTER(12) :: GRID_NAME CHARACTER(17) :: CONFIG_FILE_NAME CHARACTER(20) :: FIELD_NAME ! TYPE(WRAP_SOLVER_INT_STATE) :: WRAP ! <-- This wrap is a derived type which contains ! only a pointer to the internal state. It is needed ! for using different architectures or compilers. ! TYPE(ESMF_Grid) :: GRID !<-- The ESMF Grid ! TYPE(ESMF_VM) :: VM !<-- The ESMF Virtual Machine ! TYPE(ESMF_Field) :: FIELD ! TYPE(ESMF_FieldBundle) :: BUNDLE_NESTBC ! TYPE(ESMF_TimeInterval) :: DT_ESMF !<-- The ESMF fundamental timestep (s) ! TYPE(ESMF_Config) :: CF,CF_1 !<-- ESMF configure object ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! btim0=timef() ! !----------------------------------------------------------------------- !*** Initialize the error signal variables. !----------------------------------------------------------------------- ! RC =ESMF_SUCCESS RC_INIT=ESMF_SUCCESS ! !----------------------------------------------------------------------- !*** Allocate the Solver internal state pointer. !----------------------------------------------------------------------- ! ALLOCATE(INT_STATE,STAT=RC) ! !----------------------------------------------------------------------- !*** Attach the internal state to the Solver gridded component. !----------------------------------------------------------------------- ! WRAP%INT_STATE=>INT_STATE ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Attach Solver Internal State to the Gridded Component" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompSetInternalState(GRID_COMP & !<-- The Solver gridded component ,WRAP & !<-- Pointer to the Solver internal state ,RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Retrieve fundamental domain characteristics from the Solver !*** import state and set them in the internal state so they will !*** always be available to this component. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Domain Dimensions from Solver Import State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='ITS' & !<-- Name of variable to get from Solver import state ,value=int_state%ITS & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='ITE' & !<-- Name of variable to get from Solver import state ,value=int_state%ITE & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='JTS' & !<-- Name of variable to get from Solver import state ,value=int_state%JTS & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='JTE' & !<-- Name of variable to get from Solver import state ,value=int_state%JTE & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='IMS' & !<-- Name of variable to get from Solver import state ,value=int_state%IMS & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='IME' & !<-- Name of variable to get from Solver import state ,value=int_state%IME & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='JMS' & !<-- Name of variable to get from Solver import state ,value=int_state%JMS & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='JME' & !<-- Name of variable to get from Solver import state ,value=int_state%JME & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='IDS' & !<-- Name of variable to get from Solver import state ,value=int_state%IDS & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='IDE' & !<-- Name of variable to get from Solver import state ,value=int_state%IDE & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='JDS' & !<-- Name of variable to get from Solver import state ,value=int_state%JDS & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='JDE' & !<-- Name of variable to get from Solver import state ,value=int_state%JDE & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Halo Widths from Solver Import State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='IHALO' & !<-- Name of variable to get from Solver import state ,value=int_state%IHALO & !<-- Put extracted value here ,rc =RC) ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='JHALO' & !<-- Name of variable to get from Solver import state ,value=int_state%JHALO & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Fcst/Quilt Task Intracomm from Solver Imp State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='Fcst/Quilt Intracommunicators' & !<-- Name of variable to get from Solver import state ,value=int_state%MPI_COMM_COMP & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract Task Neighbors from Solver Import State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- The Solver import state ,name ='MY_NEB' & !<-- Name of the attribute to extract ,valueList=int_state%MY_NEB & !<-- Insert Attribute into Solver internal state ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Insert the local domain starting limits and the halo width into !*** the Solver internal state. !----------------------------------------------------------------------- ! ITS=int_state%ITS ITE=int_state%ITE IMS=int_state%IMS IME=int_state%IME IDS=int_state%IDS IDE=int_state%IDE ! JTS=int_state%JTS JTE=int_state%JTE JMS=int_state%JMS JME=int_state%JME JDS=int_state%JDS JDE=int_state%JDE ! int_state%ITS_B1=MAX(ITS,IDS+1) int_state%ITE_B1=MIN(ITE,IDE-1) int_state%ITS_B2=MAX(ITS,IDS+2) int_state%ITE_B2=MIN(ITE,IDE-2) int_state%ITS_B1_H1=MAX(ITS-1,IDS+1) int_state%ITE_B1_H1=MIN(ITE+1,IDE-1) int_state%ITE_B1_H2=MIN(ITE+2,IDE-1) int_state%ITS_H1=MAX(ITS-1,IDS) int_state%ITE_H1=MIN(ITE+1,IDE) int_state%ITS_H2=MAX(ITS-2,IDS) int_state%ITE_H2=MIN(ITE+2,IDE) int_state%JTS_B1=MAX(JTS,JDS+1) int_state%JTE_B1=MIN(JTE,JDE-1) int_state%JTS_B2=MAX(JTS,JDS+2) int_state%JTE_B2=MIN(JTE,JDE-2) int_state%JTS_B1_H1=MAX(JTS-1,JDS+1) int_state%JTE_B1_H1=MIN(JTE+1,JDE-1) int_state%JTE_B1_H2=MIN(JTE+2,JDE-1) int_state%JTS_H1=MAX(JTS-1,JDS) int_state%JTE_H1=MIN(JTE+1,JDE) int_state%JTS_H2=MAX(JTS-2,JDS) int_state%JTE_H2=MIN(JTE+2,JDE) ! IHALO=int_state%IHALO JHALO=int_state%JHALO ! ! Disable the tracker by default. This may be overridden below ! when reading the configure file. int_state%NTRACK_trigger=0 ! IF(IHALO==JHALO)THEN int_state%NHALO=IHALO ELSE RC_INIT=ESMF_FAILURE WRITE(0,*)'Error due to ihalo /= jhalo' ENDIF ! !----------------------------------------------------------------------- !*** Use ESMF utilities to get information from the configuration file. !*** The function is similar to reading a namelist. The GET_CONFIG !*** routine is the user's. It extracts values from the config file !*** and places them in the namelist components of the internal state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Configure File Parameters for Solver" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL GET_CONFIG_DIMS (GRID_COMP & ,int_state%INPES,int_state%JNPES & ,LM & ,int_state%NUM_TRACERS_CHEM & ,int_state%PCPHR & ,int_state%GFS & ,int_state%MICROPHYSICS & ,int_state%SHORTWAVE & ,int_state%LONGWAVE & ,int_state%LMPRATE & ,int_state%LNSH, int_state%LNSV & ,RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! LNSH=int_state%LNSH LNSV=int_state%LNSV ! !----------------------------------------------------------------------- !*** We must know whether or not this is a global domain. Get the !*** configure object from the Solver component and extract the !*** value of 'global'. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver_Init: Retrieve Config Object from Solver Component" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompGet(gridcomp=GRID_COMP & !<--- The Solver component ,config =CF & !<--- The configure (namelist) object ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver_Init: Extract GLOBAL from Config File" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_ConfigGetAttribute(config=CF & !<-- The configure file object ,value =int_state%GLOBAL & !<-- Put extracted quantity here ,label ='global:' & !<-- The quantity's label in the configure file ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! Is the tracker enabled? Triggers allocations later on. (Or, rather, ! it would do that if such a thing was supported by the current ! framework.) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ESMF_ConfigGetAttribute(config=CF & !<-- The configure file object ,value =int_state%NTRACK_TRIGGER & !<-- Put extracted quantity here ,label ='ntrack:' & !<-- The quantity's label in the configure file ,rc =RC) if(RC/=0) then print '(A)','Disabling tracker and tracker vars for domain.' int_state%NTRACK_TRIGGER=0 endif int_state%HIFREQ_file=' ' int_state%PATCF_file=' ' if(int_state%NTRACK_TRIGGER /= 0) then ! Check for additional tracker options. ! Per-timestep output. call ESMF_ConfigGetAttribute(config=CF,value=int_state%HIFREQ_file,label='hifreq:',rc=RC) if(RC/=0) then print '(A)','Disabling per-timestep output because "hifreq:" was not specified.' int_state%HIFREQ_file=' ' endif ! Per-tracker-step output. call ESMF_ConfigGetAttribute(config=CF,value=int_state%PATCF_file,label='patcf:',rc=RC) if(RC/=0) then print '(A)','Disabling tracker output because "patcf:" was not specified.' int_state%PATCF_file=' ' endif endif ! !----------------------------------------------------------------------- !*** Retrieve the VM to obtain the task ID and total number of tasks !*** for the internal state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get VM from the Solver Gridded Component" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompGet(gridcomp=GRID_COMP & !<-- The Solver gridded component ,vm =VM & !<-- The ESMF Virtual Machine ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Task IDs and Number of MPI Tasks from VM" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_VMGet(vm =VM & !<-- The ESMF virtual machine ,localpet=int_state%MYPE & !<-- My task's local rank on this domain ,petcount=int_state%NUM_PES & !<-- Total number of MPI tasks ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** int_state%NUM_PES taken from VM is the total number of tasks !*** on this domain including Write/Quilt tasks. We want only the !*** number of forecast tasks. !----------------------------------------------------------------------- ! int_state%NUM_PES=int_state%INPES*int_state%JNPES ! NUM_PES=int_state%NUM_PES !<-- The number of forecast tasks MYPE=int_state%MYPE !<-- The local task ID ! !----------------------------------------------------------------------- !*** Only forecast tasks are needed for the remaining !*** initialization process. !----------------------------------------------------------------------- ! fcst_tasks: IF(MYPE<NUM_PES)THEN !<-- Select only forecast tasks ! !----------------------------------------------------------------------- !*** Allocate all necessary internal state variables. Those that !*** are owned/exported are pointed into allocated memory within !*** the Solver's composite VARS array. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver_Init: Allocate internal state variables" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL SET_INTERNAL_STATE_SOLVER(INT_STATE & ,LM & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDS,IDE,JDS,JDE & ,IHALO,JHALO & ,MYPE & ,RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract the ESMF Grid from the Solver Component" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompGet(gridcomp=GRID_COMP & !<-- The Solver gridded component ,grid =GRID & !<-- The ESMF Grid ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Put the allocated pointers of all export/import variables !*** into the Solver export/import states. !----------------------------------------------------------------------- ! CALL PUT_VARS_IN_STATE(int_state%VARS,int_state%NUM_VARS,'X',GRID,EXP_STATE) ! CALL PUT_VARS_IN_STATE(int_state%VARS,int_state%NUM_VARS,'I',GRID,IMP_STATE) ! !----------------------------------------------------------------------- ! ENDIF fcst_tasks ! !----------------------------------------------------------------------- !*** Use ESMF utilities to get information from the configuration file. !*** The function is similar to reading a namelist. The GET_CONFIG !*** routine is the user's. It extracts values from the config file !*** and places them in the namelist components of the internal state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Configure File Parameters for Solver" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL GET_CONFIG(GRID_COMP,INT_STATE,RC) !<-- User's routine to extract config file information ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Only forecast tasks are needed for the remaining !*** initialization process. !----------------------------------------------------------------------- ! fcst_tasks2: IF(int_state%MYPE<int_state%NUM_PES)THEN !<-- Select only forecast tasks ! !----------------------------------------------------------------------- !*** Assign the fundamental timestep retrieved from the clock. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract Fundamental Timestep from ATM's Clock" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_ClockGet(clock =CLOCK_ATM & !<-- The ATM Clock ,timeStep=DT_ESMF & !<-- Fundamental timestep (s) (ESMF) ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Real Timestep from ESMF Timestep" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_TimeIntervalGet(timeinterval=DT_ESMF & !<-- the ESMF timestep ,s =INTEGER_DT & !<-- the integer part of the timestep in seconds ,sN =NUMERATOR_DT & !<-- the numerator of the fractional second ,sD =IDENOMINATOR_DT & !<-- the denominator of the fractional second ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! int_state%DT=REAL(INTEGER_DT)+REAL(NUMERATOR_DT) & !<-- Fundamental tiemstep (s) (REAL) /REAL(IDENOMINATOR_DT) DT=int_state%DT ! int_state%NSTEPS_PER_HOUR=NINT(3600./DT) int_state%NSTEPS_PER_RESET=NINT(int_state%AVGMAXLEN/DT) int_state%NSTEPS_PER_CHECK=MAX(2,NINT(40/DT)) ! !----------------------------------------------------------------------- !*** Save fundamental timestep to distinguish from filter timestep !*** which may be shorter !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set Dyn Timestep to Distinguish from Filter DT" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=IMP_STATE & !<-- The Solver import state ,name ='FUND_DT' & !<-- Name of variable to get from Solver import state ,value=DT & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! int_state%FIRST_NMM=.TRUE. ! int_state%DT_LAST=0. !<-- For use in digital filtering in SOLVE_RUN int_state%DT_TEST_RATIO=0. !<-- For use in digital filtering in SOLVE_RUN ! !----------------------------------------------------------------------- !*** Retrieve the domain ID from the Solver import state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Domain ID from Solver Import State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='DOMAIN_ID' & !<-- Name of variable to get from Solver import state ,value=MY_DOMAIN_ID_LOC & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! int_state%MY_DOMAIN_ID=MY_DOMAIN_ID_LOC ! int_state%MY_DOMAIN_MOVES=.FALSE. ! !----------------------------------------------------------------------- !*** Was quilting specified by the user? !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver_Init: Was Quilting Specified?" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='Quilting' & !<-- Name of variable to get from Solver import state ,value=QUILTING & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Initialize allocated arrays. !----------------------------------------------------------------------- ! DO J=JMS,JME DO I=IMS,IME int_state%PD(I,J)=0. int_state%PDO(I,J)=0. ENDDO ENDDO ! DO L=1,LM-1 DO J=JMS,JME DO I=IMS,IME int_state%PSGDT(I,J,L)=0. ENDDO ENDDO ENDDO ! !-- Initialize 4D microphysics rates (diagnostic arrays) ! DO KK=1,int_state%d_ss DO L=1,LM DO J=JMS,JME DO I=IMS,IME int_state%MPRATES(I,J,L,KK)=0. ENDDO ENDDO ENDDO ENDDO ! !-- Initialize all tracer-related arrays to zero. Water vapor mixing ! ratio array (int_state%QV) is no longer in solver_run but is ! calculated when needed in the physics drivers. ! DO N=1,int_state%NUM_TRACERS_TOTAL DO L=1,LM DO J=JMS,JME DO I=IMS,IME int_state%TRACERS (I,J,L,N)=1.E-20 int_state%TRACERS_SQRT(I,J,L,N)=1.E-20 int_state%TRACERS_PREV(I,J,L,N)=1.E-20 int_state%TRACERS_TEND(I,J,L,N)=1.E-20 ENDDO ENDDO ENDDO ENDDO ! !-- Initialize all "normal" 3D arrays ! DO L=1,LM DO J=JMS,JME DO I=IMS,IME int_state%Told(I,J,L)=0. int_state%Tadj(I,J,L)=0. int_state%F_ICE(I,J,L)=0. int_state%F_RAIN(I,J,L)=0. int_state%F_RIMEF(I,J,L)=0. int_state%refl_10cm(I,J,L)=DBZmin int_state%Q2(I,J,L)=0.02 !=> int_state%TRACERS(:,:,:,INDX_Q2) int_state%OMGALF(I,J,L)=0. int_state%T(I,J,L)=-1.E6 int_state%U(I,J,L)=-1.E6 int_state%V(I,J,L)=-1.E6 int_state%RLWTT(I,J,L)=0. int_state%RSWTT(I,J,L)=0. int_state%EXCH_H(I,J,L)=0. int_state%XLEN_MIX(I,J,L)=0. int_state%CLDFRA(I,J,L)=0. int_state%TRAIN(I,J,L) =0. int_state%TCUCN(I,J,L) =0. int_state%TCT(I,J,L) =-1.E6 int_state%TCU(I,J,L) =-1.E6 int_state%TCV(I,J,L) =-1.E6 int_state%W_TOT(I,J,L)=0. ENDDO ENDDO ENDDO ! int_state%I_PAR_STA=0 int_state%J_PAR_STA=0 int_state%NMTS=-999 ! DO L=1,NUM_SOIL_LAYERS int_state%SLDPTH(L)=SLDPTH(L) DO J=JMS,JME DO I=IMS,IME int_state%SMC(I,J,L)=-1.E6 int_state%STC(I,J,L)=-1.E6 int_state%SH2O(I,J,L)=-1.E6 ENDDO ENDDO ENDDO ! DO L=1,MICRO_RESTART int_state%MP_RESTART_STATE(L)=0. int_state%TBPVS_STATE(L)=0. int_state%TBPVS0_STATE(L)=0. ENDDO DO L=1, int_state%MDRMAXout-int_state%MDRMINout+1 int_state%MASSRout(L)=0. ENDDO DO L=1, int_state%MDIMAXout-int_state%MDIMINout+1 int_state%MASSIout(L)=0. ENDDO ! int_state%NSOIL=NUM_SOIL_LAYERS ! DO J=JMS,JME DO I=IMS,IME int_state%LPBL(I,J) =-999 int_state%NCFRCV(I,J) =-999 int_state%NCFRST(I,J) =-999 int_state%ACFRCV(I,J) =-1.E6 int_state%ACFRST(I,J) =-1.E6 int_state%AKHS(I,J) = 0. int_state%AKHS_OUT(I,J)= 0. int_state%AKMS(I,J) = 0. int_state%AKMS_OUT(I,J)= 0. int_state%ALBASE(I,J) =-1.E6 int_state%ALBEDO(I,J) =-1.E6 int_state%ALWIN(I,J) =-1.E6 int_state%ALWOUT(I,J) =-1.E6 int_state%ALWTOA(I,J) =-1.E6 int_state%ASWIN(I,J) =-1.E6 int_state%ASWOUT(I,J) =-1.E6 int_state%ASWTOA(I,J) =-1.E6 int_state%BGROFF(I,J) =-1.E6 int_state%CFRACH(I,J) =-1.E6 int_state%CFRACM(I,J) =-1.E6 int_state%CFRACL(I,J) =-1.E6 int_state%CNVBOT(I,J) =0.0 int_state%CNVTOP(I,J) =0.0 int_state%CMC(I,J) =-1.E6 int_state%CPRATE(I,J) =0.0 int_state%CUPPT(I,J) =-1.E6 int_state%CZMEAN(I,J) =-1.E6 int_state%CZEN(I,J) =-1.E6 int_state%LSPA(I,J) =-1.E6 int_state%EPSR(I,J) =-1.E6 int_state%FIS(I,J) =-1.E6 int_state%HBOT(I,J) =-1.E6 int_state%HBOTD(I,J) =-1.E6 int_state%HBOTS(I,J) =-1.E6 int_state%HTOP(I,J) =-1.E6 int_state%HTOPD(I,J) =-1.E6 int_state%HTOPS(I,J) =-1.E6 int_state%GRNFLX(I,J) = 0. int_state%MAVAIL(I,J) = 1. int_state%MXSNAL(I,J) =-1.E6 int_state%PBLH(I,J) =-1.E6 int_state%MIXHT(I,J) =0. int_state%PD(I,J) =-1.E6 int_state%POTEVP(I,J) = 0. int_state%POTFLX(I,J) =-1.E6 int_state%QSH(I,J) = 0. int_state%QWBS(I,J) =-1.E6 int_state%QZ0(I,J) = 0. int_state%RADOT(I,J) = 0. int_state%RLWIN(I,J) = 0. int_state%RMOL(I,J) =-1.E6 int_state%RSWIN(I,J) = 0. int_state%RSWINC(I,J) = 0. int_state%RSWOUT(I,J) = 0. int_state%RLWTOA(I,J) = 0. int_state%RSWTOA(I,J) = 0. int_state%SFCEVP(I,J) = 0. int_state%SFCEXC(I,J) = 0. int_state%SFCLHX(I,J) =-1.E6 int_state%SFCSHX(I,J) =-1.E6 int_state%SICE(I,J) =-1.E6 int_state%SIGT4(I,J) =-1.E6 int_state%SM(I,J) =-1.E6 int_state%SMSTAV(I,J) = 0. int_state%SMSTOT(I,J) = 0. int_state%SNO(I,J) = 0. int_state%SNOWC(I,J) = 0. int_state%SNOPCX(I,J) =-1.E6 int_state%SOILTB(I,J) = 273. int_state%SR(I,J) =-1.E6 int_state%SSROFF(I,J) = 0. int_state%SST(I,J) = 273. int_state%SUBSHX(I,J) =-1.E6 int_state%TAUX(I,J) = 0. int_state%TAUY(I,J) = 0. int_state%THS(I,J) =-1.E6 int_state%THZ0(I,J) = 273. int_state%TSKIN(I,J) =-1.E6 int_state%TWBS(I,J) =-1.E6 int_state%USTAR(I,J) = 0.1 int_state%UZ0(I,J) = 0. int_state%VEGFRC(I,J) =-1.E6 int_state%VZ0(I,J) = 0. int_state%Z0(I,J) =-1.E6 int_state%Z0BASE(I,J) =-1.E6 int_state%STDH(I,J) =-1.E6 int_state%CROT(I,J) = 0. int_state%SROT(I,J) = 0. int_state%HSTDV(I,J) = 0. int_state%HCNVX(I,J) = 0. int_state%HASYW(I,J) = 0. int_state%HASYS(I,J) = 0. int_state%HASYSW(I,J) = 0. int_state%HASYNW(I,J) = 0. int_state%HLENW(I,J) = 0. int_state%HLENS(I,J) = 0. int_state%HLENSW(I,J) = 0. int_state%HLENNW(I,J) = 0. int_state%HANGL(I,J) = 0. int_state%HANIS(I,J) = 0. int_state%HSLOP(I,J) = 0. int_state%HZMAX(I,J) = 0. ENDDO ENDDO ! DO J=JMS,JME DO I=IMS,IME int_state%ACSNOM(I,J)= 0. int_state%ACSNOW(I,J)= 0. int_state%ACPREC(I,J)= 0. int_state%ACPREC_TOT(I,J)= 0. int_state%acpcp_ra(I,J)= 0. int_state%acpcp_sn(I,J)= 0. int_state%acpcp_gr(I,J)= 0. int_state%CUPREC(I,J)= 0. int_state%PREC(I,J) = 0. int_state%CLDEFI(I,J)= 0. int_state%PSHLTR(I,J)= 1.E5 int_state%P10(I,J) = 1.E5 int_state%PSFC(I,J) = 1.E5 int_state%Q02(I,J) = 0. int_state%Q10(I,J) = 0. int_state%QSHLTR(I,J)= 0. int_state%T2(I,J) = 273. int_state%TH02(I,J) = 0. int_state%TH10(I,J) = 273. int_state%TSHLTR(I,J)= 273. int_state%U10(I,J) = 0. int_state%V10(I,J) = 0. int_state%TLMIN(I,J) = 0. int_state%TLMAX(I,J) = 0. int_state%ACUTIM(I,J)= 0. int_state%APHTIM(I,J)= 0. int_state%ARDLW(I,J) = 0. int_state%ARDSW(I,J) = 0. int_state%ASRFC(I,J) = 0. int_state%AVRAIN(I,J)= 0. int_state%AVCNVC(I,J)= 0. ENDDO ENDDO ! IF (int_state%has_reqc.eq.1 .and. int_state%has_reqi.eq.1 .and. int_state%has_reqs.eq.1) THEN DO L=1,LM DO J=JMS,JME DO I=IMS,IME int_state%re_cloud(I,J,L)=2.51E-6 int_state%re_ice(I,J,L)=10.1E-6 int_state%re_snow(I,J,L)=20.1E-6 ENDDO ENDDO ENDDO ENDIF ! DO J=JMS,JME DO I=IMS,IME int_state%TLMAX(I,J)=-999. int_state%TLMIN(I,J)=999. int_state%T02MAX(I,J)=-999. int_state%T02MIN(I,J)=999. int_state%RH02MAX(I,J)=-999. int_state%RH02MIN(I,J)=999. int_state%SPD10MAX(I,J)=-999. int_state%UPHLMAX(I,J)=0. int_state%U10MAX(I,J)=-999. int_state%V10MAX(I,J)=-999. int_state%UPVVELMAX(I,J)=-999. int_state%DNVVELMAX(I,J)=999. int_state%T10AVG(I,J)=0. int_state%T10(I,J)=0. int_state%PSFCAVG(I,J)=0. int_state%AKHSAVG(I,J)=0. int_state%AKMSAVG(I,J)=0. int_state%SNOAVG(I,J)=0. int_state%REFDMAX(I,J)=DBZmin int_state%UPHLMAX(I,J)=-999. ENDDO ENDDO int_state%NCOUNT=0 ! DO N=1,NUM_DOMAINS_MAX int_state%NTSCM(N)=-999 ENDDO ! int_state%BDY_WAS_READ=.FALSE. ! !! End of tracker variables !### Tracker scalar integer ! int_state%NTRACK=0 int_state%TRACK_HAVE_GUESS=0 int_state%TRACK_N_OLD=0 int_state%TRACKER_HAVEFIX=0 int_state%TRACKER_GAVE_UP=0 !### Tracker scalar real int_state%TRACK_LAST_HOUR=0. int_state%TRACK_GUESS_LAT=0. int_state%TRACK_GUESS_LON=0. int_state%TRACK_EDGE_DIST=0. int_state%TRACK_STDERR_M1=0. int_state%TRACK_STDERR_M2=0. int_state%TRACK_STDERR_M3=0. int_state%TRACKER_FIXLAT=0. int_state%TRACKER_FIXLON=0. int_state%TRACKER_IFIX=0. int_state%TRACKER_JFIX=0. int_state%TRACKER_RMW=0. int_state%TRACKER_PMIN=0. int_state%TRACKER_VMAX=0. !### Tracker 1D integer DO I=1,TRACK_MAX_OLD int_state%TRACK_OLD_NTSD(I)=0 ENDDO !### Tracker 1D real DO I=1,TRACK_MAX_OLD int_state%TRACK_OLD_LAT(I)=0. int_state%TRACK_OLD_LON(I)=0. ENDDO !### Tracker 2D integer DO J=JMS,JME DO I=IMS,IME int_state%TRACKER_FIXES(I,J)=-999. ENDDO ENDDO !### Tracker 2D real DO J=JMS,JME DO I=IMS,IME int_state%MEMBRANE_MSLP(I,J)=0. int_state%P850RV(I,J)=0. int_state%P700RV(I,J)=0. int_state%P850WIND(I,J)=0. int_state%P700WIND(I,J)=0. int_state%P500U(I,J)=0. int_state%P500V(I,J)=0. int_state%P700U(I,J)=0. int_state%P700V(I,J)=0. int_state%P850U(I,J)=0. int_state%P850V(I,J)=0. int_state%P850Z(I,J)=0. int_state%P700Z(I,J)=0. int_state%M10WIND(I,J)=0. int_state%M10RV(I,J)=0. int_state%SP850RV(I,J)=0. int_state%SP700RV(I,J)=0. int_state%SP850WIND(I,J)=0. int_state%SP700WIND(I,J)=0. int_state%SP850Z(I,J)=0. int_state%SP700Z(I,J)=0. int_state%SM10WIND(I,J)=0. int_state%SM10RV(I,J)=0. int_state%SMSLP(I,J)=0. int_state%TRACKER_ANGLE(I,J)=0. int_state%TRACKER_DISTSQ(I,J)=0. ENDDO ENDDO !! End of tracker variables ! !----------------------------------------------------------------------- !*** Initialize the timer variables now. !----------------------------------------------------------------------- ! TD=>TIMERS(MY_DOMAIN_ID_LOC) !<-- Abbreviate the name of this domain's timers ! td%adv1_tim=0. td%adv2_tim=0. td%bocoh_tim=0. td%bocov_tim=0. td%cdwdt_tim=0. td%cdzdt_tim=0. td%consts_tim=0. td%ddamp_tim=0. td%dht_tim=0. td%exch_dyn=0. td%exch_phy=0. td%exch_tim=0. td%fftfhn_tim=0. td%fftfwn_tim=0. td%hdiff_tim=0. td%mono_tim=0. td%pdtsdt_tim=0. td%pgforce_tim=0. td%poavhn_tim=0. td%polehn_tim=0. td%pole_swap_tim=0. td%polewn_tim=0. td%prefft_tim=0. td%presmud_tim=0. td%solver_init_tim=0. td%solver_dyn_tim=0. td%solver_phy_tim=0. td%swaphn_tim=0. td%swapwn_tim=0. td%updatet_tim=0. td%updateuv_tim=0. td%updates_tim=0. td%vsound_tim=0. td%vtoa_tim=0. ! td%cucnvc_tim=0. td%gsmdrive_tim=0. td%cltend_tim=0. td%rfupdate_tim=0. td%tqadjust_tim=0. td%h_to_v_tim=0. td%radiation_tim=0. td%rdtemp_tim=0. td%turbl_tim=0. td%adjppt_tim=0. td%gfs_phy_tim=0. ! !----------------------------------------------------------------------- ! ITS=int_state%ITS ITE=int_state%ITE JTS=int_state%JTS JTE=int_state%JTE IMS=int_state%IMS IME=int_state%IME JMS=int_state%JMS JME=int_state%JME IDS=int_state%IDS IDE=int_state%IDE JDS=int_state%JDS JDE=int_state%JDE ! IHALO=int_state%IHALO JHALO=int_state%JHALO ! MYPE=int_state%MYPE MY_DOMAIN_ID=int_state%MY_DOMAIN_ID MPI_COMM_COMP=int_state%MPI_COMM_COMP NUM_PES=int_state%NUM_PES ! DO N=1,8 MY_NEB(N)=int_state%MY_NEB(N) ENDDO ! !----------------------------------------------------------------------- !*** Extract all forecast tasks' horizontal subdomain limits !*** from the Solver import state and give them to the !*** Solver internal state. !*** This is necessary if quilting is selected because these !*** limits will be taken from the Solver internal state, !*** placed into the Write components' import states and !*** used for the combining of local domain data onto the !*** global domain. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Local Domain Limits to Solver Internal State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- The Solver import state ,name ='LOCAL_ISTART' & !<-- Name of the attribute to extract ,valueList=int_state%LOCAL_ISTART & !<-- Insert Attribute into Solver internal state ,rc =RC) ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- The Solver import state ,name ='LOCAL_IEND' & !<-- Name of the attribute to extract ,valueList=int_state%LOCAL_IEND & !<-- Insert Attribute into Solver internal state ,rc =RC) ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- The Solver import state ,name ='LOCAL_JSTART' & !<-- Name of the attribute to extract ,valueList=int_state%LOCAL_JSTART & !<-- Insert Attribute into Solver internal state ,rc =RC) ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- The Solver import state ,name ='LOCAL_JEND' & !<-- Name of the attribute to extract ,valueList=int_state%LOCAL_JEND & !<-- Insert Attribute into Solver internal state ,rc =RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Fill the ESMF Bundle with the user-selected boundary variables !*** and also the generalized boundary object that Solver must use !*** when handling those boundary variables. This must take place !*** here because it must follow the creation of the Solver's !*** internal state but precede the call to the read routine. For !*** restarted runs the read routine must allocate an object to !*** hold special boundary data from the restart files and the size !*** of tha object depends on values determined when the ESMF Bundle !*** is filled. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver Init Extracts BC Bundle" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateGet(state =IMP_STATE & !<-- The Solver component import state ,itemname ='Bundle_nestbc' & !<-- Name of Bundle of selected BC variables ,fieldbundle=BUNDLE_NESTBC & !<-- The Bundle ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! UBOUND_VARS=SIZE(int_state%VARS) ! CALL BUILD_BC_BUNDLE(GRID & !<-- Add Solver int state variables to the nest BC Bundle ,LNSH,LNSV & ,IHALO,JHALO & ,UBOUND_VARS & ,int_state%VARS & ,MY_DOMAIN_ID & ,BUNDLE_NESTBC & ,int_state%BND_VARS_H & ,int_state%BND_VARS_V & ,int_state%NVARS_BC_2D_H & ,int_state%NVARS_BC_3D_H & ,int_state%NVARS_BC_4D_H & ,int_state%NVARS_BC_2D_V & ,int_state%NVARS_BC_3D_V & ,int_state%NLEV_H & ,int_state%NLEV_V & ,int_state%N_BC_3D_H & ) ! !----------------------------------------------------------------------- !*** The input file is about to be read and halo exchanges will be !*** done in conjunction with that process. The halo exchange !*** routines require 15 domain-related variables so set them now. !----------------------------------------------------------------------- ! CALL SET_DOMAIN_SPECS(int_state%ITS,int_state%ITE & ,int_state%JTS,int_state%JTE & ,int_state%IMS,int_state%IME & ,int_state%JMS,int_state%JME & ,int_state%IDS,int_state%IDE & ,int_state%JDS,int_state%JDE & ,int_state%IHALO,int_state%JHALO & ,int_state%MY_DOMAIN_ID & ,int_state%MYPE & ,int_state%MY_NEB & ,int_state%MPI_COMM_COMP & ,int_state%NUM_PES & ,LOCAL_ISTART_IN=int_state%LOCAL_ISTART & ,LOCAL_IEND_IN=int_state%LOCAL_IEND & ,LOCAL_JSTART_IN=int_state%LOCAL_JSTART & ,LOCAL_JEND_IN=int_state%LOCAL_JEND & ) ! !----------------------------------------------------------------------- !*** Read the input file. !----------------------------------------------------------------------- ! KSS=1 KSE=int_state%NUM_TRACERS_MET ! ITS_H2=MAX(ITS-2,int_state%IDS) ITE_H2=MIN(ITE+2,int_state%IDE) JTS_H2=MAX(JTS-2,int_state%JDS) JTE_H2=MIN(JTE+2,int_state%JDE) ! btim=timef() ! ! write(0,*)'int_state%NEMSIO_INPUT=',int_state%NEMSIO_INPUT !wang IF(.NOT.int_state%NEMSIO_INPUT)THEN ! CALL READ_BINARY(INT_STATE & ,MY_DOMAIN_ID & ,MPI_COMM_COMP & ,int_state%MYPE & ,int_state%ITS,int_state%ITE & ,int_state%JTS,int_state%JTE & ,int_state%IMS,int_state%IME & ,int_state%JMS,int_state%JME & ,int_state%IDS,int_state%IDE & ,int_state%JDS,int_state%JDE & ,ITS_H2,ITE_H2,JTS_H2,JTE_H2 & ,LM & ,RC) ! IF (RC /= 0) THEN RC_INIT = RC RETURN END IF ! ELSE ! ! write(0,*) 'mype=',mype,'call read_nemsio' CALL READ_NEMSIO(int_state,MY_DOMAIN_ID,RC) ! IF (RC /= 0) THEN RC_INIT = RC RETURN END IF ! ENDIF ! ! Use this (OPER) for operational run, for having vertical velocity ! in history file (00hr) when starting from restart file ! IF(int_state%OPER) THEN DO L=1,LM DO J=JMS,JME DO I=IMS,IME int_state%W_TOT(I,J,L)=int_state%W(I,J,L) ENDDO ENDDO ENDDO ENDIF ! if (mype==-9999) then write(0,*)'solver' write(0,*)'ihr,ihrst,lpt2,ntstm=',int_state%ihr,int_state%ihrst,int_state%lpt2,int_state%ntstm write(0,*)'idat=',int_state%idat(1),int_state%idat(2),int_state%idat(3) write(0,*)'dsg1=',minval(int_state%dsg1),maxval(int_state%dsg1) write(0,*)'pdsg1=',minval(int_state%pdsg1),maxval(int_state%pdsg1) write(0,*)'psgml1=',minval(int_state%psgml1),maxval(int_state%psgml1) write(0,*)'sgml1=',minval(int_state%sgml1),maxval(int_state%sgml1) write(0,*)'sgml2=',minval(int_state%sgml2),maxval(int_state%sgml2) write(0,*)'psg1=',minval(int_state%psg1),maxval(int_state%psg1) write(0,*)'sg1=',minval(int_state%sg1),maxval(int_state%sg1) write(0,*)'sg2=',minval(int_state%sg2),maxval(int_state%sg2) write(0,*)'fis=',minval(int_state%fis),maxval(int_state%fis) write(0,*)'pd=',minval(int_state%pd),maxval(int_state%pd) write(0,*)'pdo=',minval(int_state%pdo),maxval(int_state%pdo) write(0,*)'sice=',minval(int_state%sice),maxval(int_state%sice) write(0,*)'sm=',minval(int_state%sm),maxval(int_state%sm) write(0,*)'cw=',minval(int_state%cw),maxval(int_state%cw) write(0,*)'dwdt=',minval(int_state%dwdt),maxval(int_state%dwdt) write(0,*)'q=',minval(int_state%q),maxval(int_state%q) write(0,*)'q2=',minval(int_state%q2),maxval(int_state%q2) write(0,*)'o3=',minval(int_state%o3),maxval(int_state%o3) write(0,*)'omgalf=',minval(int_state%omgalf),maxval(int_state%omgalf) write(0,*)'div=',minval(int_state%div),maxval(int_state%div) write(0,*)'z=',minval(int_state%z),maxval(int_state%z) write(0,*)'rtop=',minval(int_state%rtop),maxval(int_state%rtop) write(0,*)'tcu=',minval(int_state%tcu),maxval(int_state%tcu) write(0,*)'tcv=',minval(int_state%tcv),maxval(int_state%tcv) write(0,*)'tct=',minval(int_state%tct),maxval(int_state%tct) write(0,*)'t=',minval(int_state%t),maxval(int_state%t) write(0,*)'tp=',minval(int_state%tp),maxval(int_state%tp) write(0,*)'u=',minval(int_state%u),maxval(int_state%u) write(0,*)'up=',minval(int_state%up),maxval(int_state%up) write(0,*)'v=',minval(int_state%v),maxval(int_state%v) write(0,*)'vp=',minval(int_state%vp),maxval(int_state%vp) write(0,*)'w=',minval(int_state%w),maxval(int_state%w) write(0,*)'w_tot=',minval(int_state%w_tot),maxval(int_state%w_tot) write(0,*)'pint=',minval(int_state%pint),maxval(int_state%pint) write(0,*)'tracers=',minval(int_state%tracers),maxval(int_state%tracers) ! write(0,*)'sp=',minval(int_state%sp),maxval(int_state%sp) write(0,*)'run=',int_state%run endif ! !----------------------------------------------------------------------- !*** Check if starting Date/Time in input data file agrees with !*** the configure file. !----------------------------------------------------------------------- ! IF(.NOT.int_state%RESTART.AND.MYPE==0)THEN IF(int_state%START_HOUR /=int_state%IHRST.OR. & int_state%START_DAY /=int_state%IDAT(1).OR. & int_state%START_MONTH/=int_state%IDAT(2).OR. & int_state%START_YEAR /=int_state%IDAT(3))THEN WRITE(0,*)' *** WARNING *** WARNING *** WARNING *** ' WRITE(0,*)' *** WARNING *** WARNING *** WARNING *** ' WRITE(0,*)' DATES IN INPUT AND CONFIGURE FILES DISAGREE!!' WRITE(0,*)' INPUT: HOUR=',int_state%IHRST & , ' DAY=',int_state%IDAT(1) & , ' MONTH=',int_state%IDAT(2) & , ' YEAR=',int_state%IDAT(3) WRITE(0,*)' CONFIG: HOUR=',int_state%START_HOUR & , ' DAY=',int_state%START_DAY & , ' MONTH=',int_state%START_MONTH & , ' YEAR=',int_state%START_YEAR WRITE(0,*)' *** WARNING *** WARNING *** WARNING *** ' WRITE(0,*)' *** WARNING *** WARNING *** WARNING *** ' ENDIF ENDIF ! !----------------------------------------------------------------------- ! td%solver_init_tim=td%solver_init_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Nested domains do not have boundary condition files since the !*** boundary values come from their parents. However the boundary !*** variable arrays need to contain initial values before tendencies !*** from the parent can be added. !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** Retrieve the Nest/Not_A_Nest flag from the Solver import state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Nest/Not-a-Nest Flag from Solver Import State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='I-Am-A-Nest Flag' & !<-- Name of variable to get from Solver import state ,value=I_AM_A_NEST & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! int_state%I_AM_A_NEST=I_AM_A_NEST ! IF(I_AM_A_NEST)THEN ! !----------------------------------------------------------------------- !*** Also we need to retrieve the Parent-Child timestep ratio in order !*** to know how often to update the boundary tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Parent-Child Time Ratio from Solver Import State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='Parent-Child Time Ratio' & !<-- Name of variable to get from Solver import state ,value=int_state%PARENT_CHILD_TIME_RATIO & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Does this nested domain move? !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Nest Move Flag from Solver Import State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='My Domain Moves' & !<-- Name of variable to get from Solver import state ,value=int_state%MY_DOMAIN_MOVES & !<-- Put extracted value here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Currently moving nests are not allowed to use gravity wave drag. !*** One quantity used in that parameterization is the mountains' !*** angle with respect to east. From the moving nest's perspective !*** the mountains are moving and thus that angle would need to be !*** updated with each shift of the domain. That is not handled !*** yet in the code. !----------------------------------------------------------------------- ! IF(int_state%MY_DOMAIN_MOVES)THEN ! int_state%GWDFLG=.FALSE. ! ENDIF ! !----------------------------------------------------------------------- ! ENDIF ! !----------------------------------------------------------------------- !*** Assign grid-related constants after dereferencing needed variables. !----------------------------------------------------------------------- ! btim=timef() ! CALL CONSTS(int_state%GLOBAL & ,int_state%DT & ,int_state%SMAG2 & ,int_state%CODAMP,int_state%WCOR & ,int_state%PT & ,int_state%TPH0D,int_state%TLM0D & ,int_state%SBD,int_state%WBD & ,int_state%DPHD,int_state%DLMD & ,int_state%DXH,int_state%RDXH & ,int_state%DXV,int_state%RDXV & ,int_state%DYH,int_state%RDYH & ,int_state%DYV,int_state%RDYV & ,int_state%DDV,int_state%RDDV & ,int_state%DDMPU,int_state%DDMPV & ,int_state%EF4T,int_state%WPDAR & ,int_state%FCP,int_state%FDIV & ,int_state%CURV,int_state%F & ,int_state%FAD,int_state%FAH & ,int_state%DARE,int_state%RARE & ,int_state%GLAT,int_state%GLON & ,int_state%GLAT_SW,int_state%GLON_SW & ,int_state%VLAT,int_state%VLON & ,int_state%HDACX,int_state%HDACY & ,int_state%HDACVX,int_state%HDACVY & ,int_state%LNSH,int_state%LNSAD & ,int_state%ADV_STANDARD,int_state%ADV_UPSTREAM & ,int_state%E_BDY,int_state%N_BDY & ,int_state%S_BDY,int_state%W_BDY & ,int_state%NBOCO,int_state%TBOCO & ,MY_DOMAIN_ID,MYPE & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDS,IDE,JDS,JDE ) ! td%consts_tim=td%consts_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Exchange haloes for some grid-related arrays in case there are !*** moving nests. !----------------------------------------------------------------------- ! CALL HALO_EXCH & (int_state%GLAT,1 & ,int_state%GLON,1 & ,int_state%VLAT,1 & ,int_state%VLON,1 & ,3,3) ! CALL HALO_EXCH & (int_state%HDACX,1 & ,int_state%HDACY,1 & ,int_state%HDACVX,1 & ,int_state%HDACVY,1 & ,3,3) ! CALL HALO_EXCH & (int_state%F,1 & ,3,3) ! !----------------------------------------------------------------------- !*** Search for lat/lon min/max values and store it in file for !*** later use in creating GrADS ctl file !----------------------------------------------------------------------- ! CALL LAT_LON_BNDS(int_state%GLAT,int_state%GLON & ,mype,num_pes,mpi_comm_comp & ,ids,ide,jds,jde & ,ims,ime,jms,jme & ,its,ite,jts,jte & ,my_domain_id ) ! !----------------------------------------------------------------------- !*** Read in the geographic latitudes/longitudes (radians) !*** for all H and V points in double precision which is !*** needed for ocean coupling of the upper parent and the !*** outer nest. !----------------------------------------------------------------------- ! CONFIG_FILE_NAME='configure_file_01' ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver Init: Create the Upper Parent Configure Object" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CF_1=ESMF_ConfigCreate(rc=RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver Init: Load the Upper Parent Configure Object" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_ConfigLoadFile(config =CF_1 & ,filename=CONFIG_FILE_NAME & ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! IF(MY_DOMAIN_ID==2)THEN !<-- Outer nest must navigate external lat/lon netcdf file ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver Init: Extract Upper Parent Grid Limits" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_ConfigGetAttribute(config=CF_1 & !<-- The config object ,value =IM_1 & !<-- Upper parent grid's I extent ,label ='im:' & !<-- Give this label's value to the previous variable ,rc =RC) ! CALL ESMF_ConfigGetAttribute(config=CF_1 & !<-- The config object ,value =JM_1 & !<-- Upper parent grid's J extent ,label ='jm:' & !<-- Give this label's value to the previous variable ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver_Init: Extract Parent-Child Space Ratio" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_ConfigGetAttribute(config=CF & !<-- The configure file object ,value =SPACE_RATIO & !<-- The parent-child space ratio for this domain. ,label ='parent_child_space_ratio:' & !<-- The quantity's label in the configure file ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver_Init: Extract SW Corner Location on Parent" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_ConfigGetAttribute(config=CF & !<-- The configure file object ,value =I_SW & !<-- Parent I of SW corner of this nest ,label ='i_parent_start:' & !<-- The quantity's label in the configure file ,rc =RC) ! CALL ESMF_ConfigGetAttribute(config=CF & !<-- The configure file object ,value =J_SW & !<-- Parent J of SW corner of this nest ,label ='j_parent_start:' & !<-- The quantity's label in the configure file ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ENDIF ! IF(MY_DOMAIN_ID<=2)THEN IF(MY_DOMAIN_ID==1)THEN GRID_NAME='Upper_Parent' IM_1=IDE JM_1=JDE I_SW=1 J_SW=1 SPACE_RATIO=1 ELSEIF(MY_DOMAIN_ID==2)THEN GRID_NAME='Outer_Nest' ENDIF ! CALL READ_NETCDF_LATLON(GRID_NAME & ,IM_1,JM_1,I_SW,J_SW,SPACE_RATIO & ,int_state%GLAT_DBL,int_state%GLON_DBL & ,int_state%VLAT_DBL,int_state%VLON_DBL & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDS,IDE,JDS,JDE ) ENDIF ! !----------------------------------------------------------------------- !*** Initialize the FFT filters. !----------------------------------------------------------------------- ! IF(int_state%GLOBAL)THEN btim=timef() ! CALL PREFFT(int_state%DLMD,int_state%DPHD,int_state%SBD,LM & ,int_state%KHFILT,int_state%KVFILT & ,int_state%HFILT,int_state%VFILT & ,int_state%WFFTRH,int_state%NFFTRH & ,int_state%WFFTRW,int_state%NFFTRW & ,int_state%INPES,int_state%JNPES,int_state%MYPE) ! td%prefft_tim=td%prefft_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- !*** Initialize the physics schemes. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Initialize the Physics Schemes" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL PHYSICS_INITIALIZE(int_state%GFS & ,int_state%SHORTWAVE & ,int_state%LONGWAVE & ,int_state%CONVECTION & ,int_state%MICROPHYSICS & ,int_state%SFC_LAYER & ,int_state%TURBULENCE & ,int_state%LAND_SURFACE & ,int_state%CO2TF & ,int_state%NP3D & ,int_state%SBD & ,int_state%WBD & ,int_state%DPHD & ,int_state%DLMD & ,int_state%TPH0D & ,int_state%TLM0D & ,MY_DOMAIN_ID & ,MYPE & ,MPI_COMM_COMP & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE & ,RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- ! Initialize the storm tracker if needed. !----------------------------------------------------------------------- ! IF(int_state%MYPE<int_state%NUM_PES & .AND. & .NOT.int_state%RESTART)THEN ! CALL TRACKER_INIT(int_state) ! ENDIF ! !----------------------------------------------------------------------- !*** Retrieve the ESMF Grid then create the ESMF Fields on that Grid !*** for the Solver import/export states. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Retrieve ESMF Grid in Solver Initialize" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Insert the value of NUM_TRACERS_TOTAL into the export state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert NUM_TRACERS into Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='NUM_TRACERS_TOTAL' & !<-- The inserted quantity will have this name ,value=int_state%NUM_TRACERS_TOTAL & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Also insert the index values of the 4-D Tracers array where !*** Q and CW reside. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_Q into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_Q' & !<-- The inserted quantity will have this name ,value=int_state%INDX_Q & !<-- The location of Q in TRACERS ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_CW into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_CW' & !<-- The inserted quantity will have this name ,value=int_state%INDX_CW & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_QC into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_QC' & !<-- The inserted quantity will have this name ,value=int_state%INDX_QC & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_QI into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_QI' & !<-- The inserted quantity will have this name ,value=int_state%INDX_QI & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_QR into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_QR' & !<-- The inserted quantity will have this name ,value=int_state%INDX_QR & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_QS into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_QS' & !<-- The inserted quantity will have this name ,value=int_state%INDX_QS & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_QG into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_QG' & !<-- The inserted quantity will have this name ,value=int_state%INDX_QG & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_NI into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_NI' & !<-- The inserted quantity will have this name ,value=int_state%INDX_NI & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert INDX_NR into Physics Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Physics export state ,name ='INDX_NR' & !<-- The inserted quantity will have this name ,value=int_state%INDX_NR & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Insert this task's integration index limits into the !*** export state along with the full domain limits. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Add Task Integration Limits to Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='ITS' & !<-- The inserted quantity will have this name ,value=int_state%ITS & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='ITE' & !<-- The inserted quantity will have this name ,value=int_state%ITE & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='JTS' & !<-- The inserted quantity will have this name ,value=int_state%JTS & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='JTE' & !<-- The inserted quantity will have this name ,value=int_state%JTE & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='IMS' & !<-- The inserted quantity will have this name ,value=int_state%IMS & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='IME' & !<-- The inserted quantity will have this name ,value=int_state%IME & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='JMS' & !<-- The inserted quantity will have this name ,value=int_state%JMS & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='JME' & !<-- The inserted quantity will have this name ,value=int_state%JME & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='LM' & !<-- The inserted quantity will have this name ,value=int_state%LM & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='NHALO' & !<-- The inserted quantity will have this name ,value=int_state%NHALO & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='IDS' & !<-- The inserted quantity will have this name ,value=int_state%IDS & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='IDE' & !<-- The inserted quantity will have this name ,value=int_state%IDE & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='JDS' & !<-- The inserted quantity will have this name ,value=int_state%JDS & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='JDE' & !<-- The inserted quantity will have this name ,value=int_state%JDE & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Insert the domain's top pressure, the pressure thickness of the !*** pressure domain, the mid-layer pressures in the pressure domain !*** and the mid-layer sigmas in the sigma domain. !----------------------------------------------------------------------- ! LMP1=LM+1 ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert PT into Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='PT' & !<-- The inserted quantity will have this name ,value=int_state%PT & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='PDTOP' & !<-- The inserted quantity will have this name ,value=int_state%PDTOP & !<-- The value of this is associated with the preceding name ,rc =RC) CALL ESMF_AttributeSet(state =EXP_STATE & !<-- The Solver export state ,name ='PSGML1' & !<-- The inserted quantity will have this name ,itemCount=LM & !<-- The data has this many items ,valueList=int_state%PSGML1 & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state =EXP_STATE & !<-- The Solver export state ,name ='SGML2' & !<-- The inserted quantity will have this name ,itemCount=LM & !<-- The data has this many items ,valueList=int_state%SGML2 & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state =EXP_STATE & !<-- The Solver export state ,name ='SG1' & !<-- The inserted quantity will have this name ,itemCount=LMP1 & !<-- The data has this many items ,valueList=int_state%SG1 & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state =EXP_STATE & !<-- The Solver export state ,name ='SG2' & !<-- The inserted quantity will have this name ,itemCount=LMP1 & !<-- The data has this many items ,valueList=int_state%SG2 & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state =EXP_STATE & !<-- The Solver export state ,name ='DSG2' & !<-- The inserted quantity will have this name ,itemCount=LM & !<-- The data has this many items ,valueList=int_state%DSG2 & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state =EXP_STATE & !<-- The Solver export state ,name ='PDSG1' & !<-- The inserted quantity will have this name ,itemCount=LM & !<-- The data has this many items ,valueList=int_state%PDSG1 & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Insert DXH and DYH into the Solver export state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert DYH into the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='DYH' & !<-- The inserted quantity will have this name ,value=int_state%DYH & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=SIZE(int_state%DXH) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert DXH into the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state =EXP_STATE & !<-- The Solver export state ,name ='DXH' & !<-- The inserted quantity will have this name ,itemCount=KOUNT & !<-- The data has this many items ,valueList=int_state%DXH & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Insert DPHD and JM into the export state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert DPHD,DLMD,JM into the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='DLMD' & !<-- The inserted quantity will have this name ,value=int_state%DLMD & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='DPHD' & !<-- The inserted quantity will have this name ,value=int_state%DPHD & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='JM' & !<-- The inserted quantity will have this name ,value=int_state%JM & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Insert the value of LNSH and LNSV (the width of the !*** blending region along the boundaries for H and V points). !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert LNSH, LNSV into Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='LNSH' & !<-- The inserted quantity will have this name ,value=int_state%LNSH & !<-- The value of this is associated with the preceding name ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='LNSV' & !<-- The inserted quantity will have this name ,value=int_state%LNSV & !<-- The value of this is associated with the preceding name ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Add the geographic lats/lons of the H points to the ESMF Grid. !----------------------------------------------------------------------- ! CALL ESMF_GridAddCoord(grid =GRID & ,staggerLoc=ESMF_STAGGERLOC_CENTER & ,rc =rc) CALL ERR_MSG(RC,'Solver_Init: Add Coord',RC_INIT) ! CALl ESMF_GridAddItem (grid =GRID & ,itemflag =ESMF_GRIDITEM_MASK & ,staggerLoc=ESMF_STAGGERLOC_CENTER & ,rc =RC) CALL ERR_MSG(RC,'Solver_Init: Add GRIDITEM_MASK',RC_INIT) ! CALL ESMF_GridGetCoord(grid=GRID & ,coordDim =1 & ,staggerLoc=ESMF_STAGGERLOC_CENTER & ,farrayPtr =GLON_PTR & ,rc =RC) CALL ERR_MSG(RC,'Solver_Init: Get Longitude Ptr',RC_INIT) call ESMF_GridGetCoord(grid =GRID & ,coordDim =2 & ,staggerLoc=ESMF_STAGGERLOC_CENTER & ,farrayPtr =GLAT_PTR & ,rc =RC) CALL ERR_MSG(RC,'Solver_Init: Get Latitude Ptr',RC_INIT) ! CALl ESMF_GridGetItem(grid =GRID & ,itemflag =ESMF_GRIDITEM_MASK & ,staggerLoc=ESMF_STAGGERLOC_CENTER & ,localDe =0 & ,farrayPtr =SEA_MASK_PTR & ,rc =RC) CALL ERR_MSG(RC,'Solver_Init: Get Sea Mask Ptr',RC_INIT) ! !----------------------------------------------------------------------- !*** Store the coordinates and sea mask. Convert the lats/lons to !*** degrees since they will be used on the Grids for regridding !*** where ESMF requires degrees. !----------------------------------------------------------------------- ! RAD2DEG=180._kdbl/ACOS(-1._kdbl) ! DO J=JTS,JTE DO I=ITS,ITE GLAT_PTR(I,J)=int_state%GLAT(I,J)*RAD2DEG GLON_PTR(I,J)=int_state%GLON(I,J)*RAD2DEG SEA_MASK_PTR(I,J)=NINT(int_state%SM(I,J)) ENDDO ENDDO ! !----------------------------------------------------------------------- !*** Insert the geographic latitude and longitude of the grid points !*** into the export state. From there they will be updated in !*** DOMAIN_RUN when a moving nest moves. The central lat/lon !*** of the nest's rotated system and the angular grid increments !*** are also needed. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Create Field from H-pt Geographic Latitude" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! FIELD=ESMF_FieldCreate( GRID & !<-- The ESMF Grid , int_state%GLAT & !<-- The geographic latitude on H points ,totalUWidth=(/IHALO,JHALO/) & !<-- Upper bound of halo region ,totalLWidth=(/IHALO,JHALO/) & !<-- Lower bound of halo region ,name ='GLAT' & !<-- Name of Field ,indexFlag =ESMF_INDEX_GLOBAL & ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Add GLAT to the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateAddReplace(EXP_STATE & !<-- The Solver export state ,(/FIELD/) & !<-- Field with H-pt geographic lat ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Create Field from H-pt Geographic Longitude" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! FIELD=ESMF_FieldCreate( GRID & !<-- The ESMF Grid , int_state%GLON & !<-- The geographic longitude on H points ,totalUWidth=(/IHALO,JHALO/) & !<-- Upper bound of halo region ,totalLWidth=(/IHALO,JHALO/) & !<-- Lower bound of halo region ,name ='GLON' & !<-- Name of Field ,indexFlag =ESMF_INDEX_GLOBAL & ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Add GLON to the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateAddReplace(EXP_STATE & !<-- The Solver export state ,(/FIELD/) & !<-- Field with H-pt geographic lon ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Create Field from V-pt Geographic Latitude" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! FIELD=ESMF_FieldCreate( GRID & !<-- The ESMF Grid , int_state%VLAT & !<-- The geographic latitude on V points ,totalUWidth=(/IHALO,JHALO/) & !<-- Upper bound of halo region ,totalLWidth=(/IHALO,JHALO/) & !<-- Lower bound of halo region ,name ='VLAT' & !<-- Name of Field ,indexFlag =ESMF_INDEX_GLOBAL & ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Add VLAT to the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateAddReplace(EXP_STATE & !<-- The Solver export state ,(/FIELD/) & !<-- Field with V-pt geographic lat ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Create Field from V-pt Geographic Longitude" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! FIELD=ESMF_FieldCreate( GRID & !<-- The ESMF Grid , int_state%VLON & !<-- The geographic longitude on V points ,totalUWidth=(/IHALO,JHALO/) & !<-- Upper bound of halo region ,totalLWidth=(/IHALO,JHALO/) & !<-- Lower bound of halo region ,name ='VLON' & !<-- Name of Field ,indexFlag =ESMF_INDEX_GLOBAL & ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Add VLON to the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateAddReplace(EXP_STATE & !<-- The Solver export state ,(/FIELD/) & !<-- Field with V-pt geographic lon ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert TPH0D, TLM0D into the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='TPH0D' & !<-- Name of the Attribute ,value=int_state%TPH0D & !<-- The central geo lat of the rotated system ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='TLM0D' & !<-- Name of the Attribute ,value=int_state%TLM0D & !<-- The central geo lon of the rotated system ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert Restart Flag into the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='RESTART' & !<-- Name of the Attribute ,value=int_state%RESTART & !<-- Is this a restarted run? ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** If this is a nested domain being restarted then it will have !*** read in the latest values for its SW corner on its parent grid. !*** Load those into the export state to transfer to the Parent- !*** Child coupler. They are only relevant for nests in restarted !*** runs. If this is not a nest the values will be dummies and are !*** never used. Likewise a moving nest's next move timestep will !*** have been read from the restart file for a restarted run. !*** If this is a parent being restarted then it will have read in !*** the latest value of the next timestep that its moving children !*** will move. Add those to the export state to transfer to the !*** parent-Child coupler. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert SW Corner of Nest into the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='I_PAR_STA' & !<-- Name of the Attribute ,value=int_state%I_PAR_STA & !<-- Parent I of SW corner of this nest ,rc =RC) ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='J_PAR_STA' & !<-- Name of the Attribute ,value=int_state%J_PAR_STA & !<-- Parent J of SW corner of this nest ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Insert Next Move Timestep into the Solver Export State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(state=EXP_STATE & !<-- The Solver export state ,name ='NEXT_MOVE_TIMESTEP' & !<-- Name of the Attribute ,value=int_state%NMTS & !<-- Timestep of the nest's next move ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_INIT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Let SOLVER_RUN know that the first timestep is special as well !*** as the first time SOLVER_RUN is executed (which might not be the !*** first timestep). !----------------------------------------------------------------------- ! int_state%FIRST_STEP=.TRUE. int_state%FIRST_PASS=.TRUE. ! !----------------------------------------------------------------------- !*** Set flag for the operational physics suite. !*** This will be used to save clocktime by skipping !*** frequent updates of the moist array and instead !*** update it only when it is needed for physics. !----------------------------------------------------------------------- ! int_state%OPERATIONAL_PHYSICS=.FALSE. ! IF((int_state%SHORTWAVE =='gfdl' .OR. & int_state%SHORTWAVE =='rrtm').AND. & (int_state%LONGWAVE =='gfdl' .OR. & int_state%LONGWAVE =='rrtm').AND. & int_state%SFC_LAYER =='myj' .AND. & int_state%TURBULENCE =='myj' .AND. & (int_state%CONVECTION =='bmj' .OR. & int_state%CONVECTION =='none').AND. & (int_state%MICROPHYSICS=='fer' .OR. & int_state%MICROPHYSICS=='fer_hires') ) THEN ! int_state%OPERATIONAL_PHYSICS=.TRUE. ! ENDIF ! !----------------------------------------------------------------------- ! ENDIF fcst_tasks2 ! !----------------------------------------------------------------------- ! td%solver_init_tim=td%solver_init_tim+(timef()-btim0) ! !----------------------------------------------------------------------- ! IF(RC_INIT==ESMF_SUCCESS)THEN ! WRITE(0,*)'SOLVER INITIALIZE STEP SUCCEEDED' ELSE WRITE(0,*)'SOLVER INITIALIZE STEP FAILED RC_INIT=',RC_INIT ENDIF ! !----------------------------------------------------------------------- ! END SUBROUTINE SOLVER_INITIALIZE ! !----------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- ! SUBROUTINE SOLVER_RUN (GRID_COMP & ,IMP_STATE & ,EXP_STATE & ,CLOCK_ATM & ,RC_RUN) ! !----------------------------------------------------------------------- !*** The integration of each timestep of the model Solver is done !*** through this routine. !----------------------------------------------------------------------- ! USE MODULE_CONSTANTS,ONLY : CP,G,R,RHOWATER,STBOLT,XLV,R_D,R_V,PI ! USE MODULE_DYNAMICS_ROUTINES,ONLY: ADV1,ADV2 & ,CDWDT,CDZDT,DDAMP,DHT & ,HDIFF & ,MONO,PDTSDT,PGFORCE & ,UPDATES,UPDATET,UPDATEUV & ,VSOUND,VTOA ! USE MODULE_FLTBNDS,ONLY: BOCOH,BOCOV,FFTFHN,FFTFUVN & ,POAVHN,READ_BC & ,WRITE_BC ! !----------------------------------------------------------------------- !*** The following USEs are needed only for GFS physics: !----------------------------------------------------------------------- ! USE N_NAMELIST_PHYSICS_DEF, ONLY: FHSWR, FDAER & ,IAER,IALB,ICO2,IEMS,ICTM & ,IOVR_LW,IOVR_SW,ISOL & ,LDIAG3D,LSCCA,LGGFS3D & ,LSLWR,LSM,LSSAV,LSSWR & ,PRE_RAD,RAS,SASHAL & ,SHAL_CNV & ,GEN_COORD_HYBRID & ,CDMBGWD,DLQF,CTEI_RM & ,BKGD_VDIF_M & ,BKGD_VDIF_H,BKGD_VDIF_S & ,PSAUTCO,PRAUTCO,EVPCO & ,CAL_PRE,MOM4ICE,MSTRAT & ,TRANS_TRAC,NST_FCST & ,MOIST_ADJ,WMINCO USE N_LAYOUT1, ONLY : IPT_LATS_NODE_R & ,LATS_NODE_R ! USE MODULE_TRACKER USE MODULE_QUASIPOST !*** Ocean coupling module ! real :: dtc_ ! !----------------------------------------------------------------------- ! !------------------------ !*** Argument variables !------------------------ ! TYPE(ESMF_GridComp) :: GRID_COMP !<-- The Solver gridded component ! TYPE(ESMF_State) :: IMP_STATE & !<-- The Solver import state ,EXP_STATE !<-- The Solver export state ! TYPE(ESMF_Clock) :: CLOCK_ATM !<-- The ATM's ESMF Clock ! INTEGER,INTENT(OUT) :: RC_RUN ! !--------------------- !*** Local variables !--------------------- ! INTEGER(kind=KINT) :: IDE,IDS,IME,IMS,ITE,ITS & ,JDE,JDS,JME,JMS,JTE,JTS ! INTEGER(kind=KINT) :: ITE_B1,ITE_B2,ITE_B1_H1,ITE_B1_H2 & ,ITE_H1,ITE_H2 & ,ITS_B1,ITS_B2,ITS_B1_H1,ITS_B1_H2 & ,ITS_H1,ITS_H2 & ,JTE_B1,JTE_B2,JTE_B1_H1,JTE_B1_H2 & ,JTE_H1,JTE_H2 & ,JTS_B1,JTS_B2,JTS_B1_H1,JTS_B1_H2 & ,JTS_H1,JTS_H2 ! INTEGER(kind=KINT) :: IHALO,JHALO,MPI_COMM_COMP,MY_DOMAIN_ID & ,MYPE,NUM_PES ! INTEGER(kind=KINT) :: DFIHR,I,IER,INPES,IRTN,ISTAT,J,JNPES & ,K,KFLIP,KS,KSE1,L,N,NSTEPS_HISTORY & ,NTIMESTEP,NTIMESTEP_BC,NTIMESTEP_RAD & ,RC,ICLTEND & ,WRITE_BC_FLAG,WRITE_BC_FLAG_NEST ! INTEGER(kind=KINT) :: FILTER_METHOD,FILTER_METHOD_LAST & ,JULDAY,JULYR & ,NPRECIP,NSTEPS_PER_CHECK,NSTEPS_PER_HOUR & ,NSTEPS_PER_RESET !rh_hold ,USE_RADAR_FIRST ! LOGICAL(kind=KLOG) :: USE_RADAR ! INTEGER(kind=KINT),SAVE :: HDIFF_ON & ,PARENT_CHILD_TIME_RATIO ! INTEGER(kind=ESMF_KIND_I8) :: NTIMESTEP_ESMF ! LOGICAL(kind=KLOG) :: READBC & ,E_BDY,N_BDY,S_BDY,W_BDY ! TYPE(ESMF_TimeInterval) :: DT_ESMF !<-- The ESMF fundamental timestep (s) ! TYPE(SOLVER_INTERNAL_STATE),POINTER :: INT_STATE !<-- The Solver internal state pointer ! TYPE(WRAP_SOLVER_INT_STATE) :: WRAP !<-- The F90 'wrap' for the Solver internal state ! !----------------------------------------------------------------------- !*** SAVEs are for dereferenced constant variables. !----------------------------------------------------------------------- ! INTEGER(kind=KINT),SAVE :: IDTADT,IDTADTQ,IFACT,IHRSTBC & ,INTEGER_DT & ,KSE,KSS & ,LNSAD,LNSH,LNSV,LPT2,NBOCO & ,N_PRINT_STATS & !<--- Timesteps between statistics prints ,NUMERATOR_DT & ,IDENOMINATOR_DT,IFLAG ! INTEGER(kind=KINT),DIMENSION(3),SAVE :: IDATBC ! INTEGER(kind=KINT),DIMENSION(8) :: IDAT,JDAT INTEGER(kind=KINT),DIMENSION(13) :: DAYS ! REAL(kind=KFPT) :: FICE,FRAIN,QI,QR,QW,SECONDS_TOTAL,WC ! REAL(kind=KFPT) :: DT,DT_TEST,DT_TEST_RATIO,DTPHY ! REAL(kind=KFPT),SAVE :: DDMPV & ,DYH,DYV,EF4T,PDTOP,PT & ,RDYH,RDYV,TBOCO ! !rh_hold REAL(kind=KFPT),DIMENSION(:,:,:),ALLOCATABLE,SAVE :: RH_HOLD ! LOGICAL(kind=KLOG),SAVE :: GLOBAL,HYDRO,RUNBC,SECADV ! REAL(kind=KFPT),DIMENSION(:,:),ALLOCATABLE,SAVE :: HDACX_SV & , HDACY_SV & , HDACVX_SV & , HDACVY_SV ! CHARACTER(256) :: SWATH_FNAME INTEGER(kind=KINT) :: NR_SWATH,SWATH_UNIT=520 INTEGER(kind=KINT),dimension(3) :: NSWTH=0 REAL(kind=KFPT) :: FREQ_SWATH=3600. !<--- SWATH output frequency in seconds REAL(kind=KFPT),DIMENSION(:,:,:),ALLOCATABLE,save :: GLAT_SWATH_2 & , GLON_SWATH_2 & , PREC_SWATH_2 & , W10M_SWATH_2 REAL(kind=KFPT),DIMENSION(:,:,:),ALLOCATABLE,save :: GLAT_SWATH_3 & , GLON_SWATH_3 & , PREC_SWATH_3 & , W10M_SWATH_3 ! REAL(kind=KFPT),DIMENSION(:),ALLOCATABLE,SAVE :: DDMPU_SV,FAD_SV, & FAH_SV,FCP_SV ! REAL(kind=KFPT),SAVE :: DDMPV_SV,EF4T_SV ! LOGICAL(kind=KLOG) :: COMPUTE_BC,FIRST_PASS ! REAL(kind=KFPT) :: JULIAN,XTIME, FILT_DT, FUND_DT, DTRATIO ! INTEGER :: KK ! LOGICAL(kind=KLOG) :: CALL_LONGWAVE & ,CALL_SHORTWAVE & ,CALL_TURBULENCE & ,CALL_PRECIP & ,CALL_GFS_PHY & !aligo ,RIME_FACTOR_ADVECT & ,RIME_FACTOR_INPUT & !aligo ,LOC_PCPFLG ! TYPE(ESMF_Time) :: STARTTIME,CURRTIME,SIMULATION_START_TIME ! TYPE(ESMF_TimeInterval),SAVE:: REST_OFFSET ! TYPE(ESMF_Field) :: HOLD_FIELD ! DATA DAYS / 31,28,31,30,31,30,31,31,30,31,30,31,30 / ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! btim0=timef() ! !----------------------------------------------------------------------- ! RC_RUN=ESMF_SUCCESS ! !----------------------------------------------------------------------- !*** Extract the Solver internal state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="SOLVER_RUN: Extract Solver Internal State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompGetInternalState(GRID_COMP & !<-- The Solver component ,WRAP & ,RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_RUN) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! INT_STATE=>wrap%INT_STATE ! !----------------------------------------------------------------------- !*** The total number of forecast tasks. !----------------------------------------------------------------------- ! INPES=int_state%INPES !<-- I fcst tasks JNPES=int_state%JNPES !<-- J fcst tasks NUM_PES=INPES*JNPES !<-- # of fcst tasks ! !----------------------------------------------------------------------- !*** Is this task on a domain boundary? !----------------------------------------------------------------------- ! S_BDY=int_state%S_BDY N_BDY=int_state%N_BDY W_BDY=int_state%W_BDY E_BDY=int_state%E_BDY ! !----------------------------------------------------------------------- !*** Dereference fundamental variables for the dynamics routines. !----------------------------------------------------------------------- ! ITS=int_state%ITS ITE=int_state%ITE JTS=int_state%JTS JTE=int_state%JTE IMS=int_state%IMS IME=int_state%IME JMS=int_state%JMS JME=int_state%JME IDS=int_state%IDS IDE=int_state%IDE JDS=int_state%JDS JDE=int_state%JDE ! ITS_B1=int_state%ITS_B1 ITE_B1=int_state%ITE_B1 ITS_B2=int_state%ITS_B2 ITE_B2=int_state%ITE_B2 ITS_B1_H1=int_state%ITS_B1_H1 ITE_B1_H1=int_state%ITE_B1_H1 ITE_B1_H2=int_state%ITE_B1_H2 ITS_H1=int_state%ITS_H1 ITE_H1=int_state%ITE_H1 ITS_H2=int_state%ITS_H2 ITE_H2=int_state%ITE_H2 JTS_B1=int_state%JTS_B1 JTE_B1=int_state%JTE_B1 JTS_B2=int_state%JTS_B2 JTE_B2=int_state%JTE_B2 JTS_B1_H1=int_state%JTS_B1_H1 JTE_B1_H1=int_state%JTE_B1_H1 JTE_B1_H2=int_state%JTE_B1_H2 JTS_H1=int_state%JTS_H1 JTE_H1=int_state%JTE_H1 JTS_H2=int_state%JTS_H2 JTE_H2=int_state%JTE_H2 ! LM=int_state%LM ! IHALO=int_state%IHALO JHALO=int_state%JHALO ! MYPE=int_state%MYPE !<-- The local task rank on this domain MY_DOMAIN_ID=int_state%MY_DOMAIN_ID MPI_COMM_COMP=int_state%MPI_COMM_COMP ! !----------------------------------------------------------------------- !*** Nested domains !----------------------------------------------------------------------- ! I_AM_A_NEST=int_state%I_AM_A_NEST ! !----------------------------------------------------------------------- !*** Dereference more variables for shorter names. !----------------------------------------------------------------------- ! ! firstpass: IF(FIRST_PASS)THEN ! DDMPV=int_state%DDMPV DT=int_state%DT DYH=int_state%DYH DYV=int_state%DYV EF4T=int_state%EF4T GLOBAL=int_state%GLOBAL ! HYDRO=int_state%HYDRO IDTADT=int_state%IDTADT IF(GLOBAL) THEN IDTADTQ=IDTADT !global ELSE IDTADTQ=1 !regional ENDIF IHRSTBC=int_state%IHRSTBC KSE=int_state%NUM_TRACERS_MET KSS=1 LNSAD=int_state%LNSAD LNSH=int_state%LNSH LNSV=int_state%LNSV LPT2=int_state%LPT2 NBOCO=int_state%NBOCO NSTEPS_PER_CHECK=int_state%NSTEPS_PER_CHECK NSTEPS_PER_HOUR=int_state%NSTEPS_PER_HOUR NSTEPS_PER_RESET=int_state%NSTEPS_PER_RESET PDTOP=int_state%PDTOP PT=int_state%PT RDYH=int_state%RDYH RDYV=int_state%RDYV RUNBC=int_state%RUNBC SECADV=int_state%SECADV TBOCO=int_state%TBOCO FILTER_METHOD=int_state%FILTER_METHOD FILTER_METHOD_LAST=int_state%FILTER_METHOD_LAST ! RIME_FACTOR_ADVECT=.FALSE. RIME_FACTOR_INPUT=.FALSE. IF (TRIM(int_state%MICROPHYSICS) == 'fer_hires' .AND. & int_state%F_QG .AND. int_state%SPEC_ADV) THEN RIME_FACTOR_ADVECT=.TRUE. ENDIF ! PARENT_CHILD_TIME_RATIO=int_state%PARENT_CHILD_TIME_RATIO ! DO N=1,3 IDATBC(N)=int_state%IDATBC(N) ENDDO ! CALL SET_DOMAIN_SPECS(int_state%ITS,int_state%ITE & ,int_state%JTS,int_state%JTE & ,int_state%IMS,int_state%IME & ,int_state%JMS,int_state%JME & ,int_state%IDS,int_state%IDE & ,int_state%JDS,int_state%JDE & ,int_state%IHALO,int_state%JHALO & ,int_state%MY_DOMAIN_ID & ,int_state%MYPE & ,int_state%MY_NEB & ,int_state%MPI_COMM_COMP & ,int_state%NUM_PES & ! ,LOCAL_ISTART_IN=int_state%LOCAL_ISTART & ,LOCAL_IEND_IN=int_state%LOCAL_IEND & ,LOCAL_JSTART_IN=int_state%LOCAL_JSTART & ,LOCAL_JEND_IN=int_state%LOCAL_JEND & ,ADV_STANDARD_IN=int_state%ADV_STANDARD & ,ADV_UPSTREAM_IN=int_state%ADV_UPSTREAM & ,S_BDY_IN=int_state%S_BDY & ,N_BDY_IN=int_state%N_BDY & ,W_BDY_IN=int_state%W_BDY & ,E_BDY_IN=int_state%E_BDY & ) ! !----------------------------------------------------------------------- !*** Extract the timestep count from the Clock. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver Run Gets Timestep from the ATM Clock" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_ClockGet(clock =CLOCK_ATM & !<-- The ESMF Clock ,timeStep =DT_ESMF & !<-- Fundamental timestep (s) (ESMF) ,currtime =CURRTIME & !<-- current time ,advanceCount=NTIMESTEP_ESMF & !<-- The number of times the clock has been advanced ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_RUN) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_TimeIntervalGet(timeinterval=DT_ESMF & !<-- the ESMF timestep ,s =INTEGER_DT & !<-- the integer part of the timestep in seconds ,sN =NUMERATOR_DT & !<-- the numerator of the fractional second ,sD =IDENOMINATOR_DT & !<-- the denominator of the fractional second ,rc =RC) ! int_state%DT=REAL(INTEGER_DT)+REAL(NUMERATOR_DT) & !<-- Fundamental timestep (s) (REAL) /REAL(IDENOMINATOR_DT) DT=int_state%DT ! CALL ESMF_AttributeGet(state=IMP_STATE & ,name ='FUND_DT' & ,value=FUND_DT & ,rc =RC) ! DTRATIO=ABS(DT/FUND_DT) ! NTIMESTEP=NTIMESTEP_ESMF int_state%NTSD=NTIMESTEP !---------------------- if (int_state%RADAR_INIT==0) then USE_RADAR=.false. else if(filter_method==0) then USE_RADAR=.false. else USE_RADAR=.true. end if endif !---------------------- ! write(6,*)'filter method::',NTIMESTEP,int_state%RADAR_INIT,FILTER_METHOD,FILTER_METHOD_LAST,USE_RADAR if (DT .lt. 0 .and. FILTER_METHOD .ge. 2 .and. & (int(NTIMESTEP*DT) .le. int_state%DFIHR_BOCO/2.)) then HYDRO=.true. else HYDRO=int_state%HYDRO endif ! FIRST_PASS=int_state%FIRST_PASS ! NSTEPS_PER_HOUR=NINT(3600./DT) ! N_PRINT_STATS=NINT(3600./DT) !<-- Print layer statistics once per forecast hour ! !----------------------------------------------------------------------- !*** Extract the horizontal diffusion flag from the import state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver Run Extracts Horizontal Diffusion Flag " ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & ,name ='HDIFF' & ,value=HDIFF_ON & ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_RUN) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** Extract the digital filter method from the import state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! MESSAGE_CHECK="Solver Run Extracts Horizontal Diffusion Flag " ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ! ,name ='Filter_Method' & !<-- Name of the attribute to extract ! ,value=int_state%FILTER_METHOD & !<-- The scalar being extracted from the import state ! ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_RUN) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! FILTER_METHOD=int_state%FILTER_METHOD ! FILTER_METHOD_LAST=int_state%FILTER_METHOD_LAST ! !----------------------------------------------------------------------- !rh_hold IF (USE_RADAR_FIRST == 1 .and. FIRST_PASS ) THEN !rh_hold ALLOCATE(RH_HOLD(IMS:IME,JMS:JME,1:LM)) !rh_hold IFLAG=1 ! <---- IFLAG=1 takes T,Q,P and returns RH_HOLD !rh_hold CALL CALC_RH_RADAR_DFI(int_state%T,int_state%Q,int_state%PD & !rh_hold ,int_state%PSGML1,int_state%SGML2 & !rh_hold ,R_D,R_V,RH_HOLD & !rh_hold ,IMS,IME,JMS,JME,LM & !rh_hold ,IFLAG) !rh_hold ENDIF ! !----------------------------------------------------------------------- !*** Open SWATH files. !*** Allocate SWATH accumuators. !----------------------------------------------------------------------- IF((MY_DOMAIN_ID==2 .OR. MY_DOMAIN_ID==3) .AND. NTIMESTEP==0) THEN NR_SWATH=INT((int_state%NTSTM-1)*DT/FREQ_SWATH)+1 IF(MYPE==0) THEN WRITE(SWATH_FNAME,'(a,i2.2)')'swath_d',MY_DOMAIN_ID OPEN(unit=SWATH_UNIT+MY_DOMAIN_ID,file=SWATH_FNAME & ,form='unformatted') WRITE(SWATH_UNIT+MY_DOMAIN_ID)int_state%IDE,int_state%JDE,NR_SWATH ENDIF ENDIF IF(MY_DOMAIN_ID==2 .AND. NTIMESTEP==0) THEN ALLOCATE(GLAT_SWATH_2(ITS:ITE,JTS:JTE,1:NR_SWATH) & ,GLON_SWATH_2(ITS:ITE,JTS:JTE,1:NR_SWATH) & ,PREC_SWATH_2(ITS:ITE,JTS:JTE,1:NR_SWATH) & ,W10M_SWATH_2(ITS:ITE,JTS:JTE,1:NR_SWATH)) ENDIF IF(MY_DOMAIN_ID==3 .AND. NTIMESTEP==0) THEN ALLOCATE(GLAT_SWATH_3(ITS:ITE,JTS:JTE,1:NR_SWATH) & ,GLON_SWATH_3(ITS:ITE,JTS:JTE,1:NR_SWATH) & ,PREC_SWATH_3(ITS:ITE,JTS:JTE,1:NR_SWATH) & ,W10M_SWATH_3(ITS:ITE,JTS:JTE,1:NR_SWATH)) ENDIF ! ! ENDIF firstpass ! !----------------------------------------------------------------------- !*** The following set of internal state arrays never changes unless !*** the domain moves in which case they must be dereferenced again. !----------------------------------------------------------------------- ! MOVE_NOW=.FALSE. IF(int_state%MY_DOMAIN_MOVES)THEN ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract the MOVE_NOW flag in SOLVER_RUN" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- Solver import state ,name ='MOVE_NOW' & !<-- Name of the flag for current domain motion ,value=MOVE_NOW & !<-- Did the nest move this timestep? ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_RUN) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ENDIF ! !----------------------------------------------------------------------- !*** If this is a moving nest and it moved this timestep then we !*** need to update the haloes of the geographic lat/lon and the !*** HDAC variables because like all variables they are updated !*** only in the integration region when a nest shifts. !----------------------------------------------------------------------- ! IF(MOVE_NOW)THEN ! btim=timef() CALL HALO_EXCH & (int_state%GLAT,1 & ,int_state%GLON,1 & ,int_state%VLAT,1 & ,int_state%VLAT,1 & ,2,2) ! CALL HALO_EXCH & (int_state%HDACX,1 & ,int_state%HDACY,1 & ,int_state%HDACVX,1 & ,int_state%HDACVY,1 & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Also the geography information for the gravity wave drag !*** must be updated to account for the domain's new position. ! !*** NOTE: Currently the gravity wave drag is turned off in !*** moving nests. A quantity used by the parameterization !*** is mountains' angle with respect to east. From the !*** moving nest's perspective the mountains are moving !*** and thus those angles would need to be updated. !*** Such updating is not yet included. !----------------------------------------------------------------------- ! IF(int_state%GWDFLG)THEN ! DTPHY=int_state%DT*int_state%NPHS ! CALL GWD_init(DTPHY,int_state%RESTART & ,int_state%CLEFFAMP,int_state%DPHD & ,int_state%CLEFF & ,int_state%TPH0D,int_state%TLM0D & ,int_state%GLAT,int_state%GLON & ,int_state%CROT,int_state%SROT,int_state%HANGL & ,IDS,IDE,JDS,JDE & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE,LM) ENDIF ! IF(int_state%NTRACK>0 .AND. int_state%MYPE<int_state%NUM_PES) THEN CALL UPDATE_TRACKER_POST_MOVE(INT_STATE) ENDIF ! !----------------------------------------------------------------------- ! ENDIF ! !----------------------------------------------------------------------- ! IF (INTEGER_DT >= 0) IFACT=1 IF (INTEGER_DT < 0) IFACT=-1 ! IF(FIRST_PASS)THEN ! IF (FILTER_METHOD /= 0) THEN ! !*** Save copies of the internal state variables scaled by !*** DTRATIO below so we can restore them precisely after the filter !*** (*_SV variables). Needed for bit-wise identical restarts ! ALLOCATE(HDACX_SV(ITS:ITE,JTS:JTE),HDACY_SV(ITS:ITE,JTS:JTE), & HDACVX_SV(ITS:ITE,JTS:JTE),HDACVY_SV(ITS:ITE,JTS:JTE)) ALLOCATE(DDMPU_SV(JDS:JDE),FAD_SV(JDS:JDE),FAH_SV(JDS:JDE), & FCP_SV(JDS:JDE)) DDMPV_SV=int_state%DDMPV EF4T_SV=int_state%EF4T END IF int_state%DDMPV=IFACT*DTRATIO*int_state%DDMPV int_state%EF4T=IFACT*DTRATIO*int_state%EF4T ! DO J=JDS,JDE IF (FILTER_METHOD /= 0) THEN DDMPU_SV(J) = int_state%DDMPU(J) FAD_SV(J) = int_state%FAD(J) FAH_SV(J) = int_state%FAH(J) FCP_SV(J) = int_state%FCP(J) END IF int_state%DDMPU(J)=IFACT*int_state%DDMPU(J) int_state%FAD(J)=IFACT*DTRATIO*int_state%FAD(J) int_state%FAH(J)=IFACT*DTRATIO*int_state%FAH(J) int_state%FCP(J)=IFACT*DTRATIO*int_state%FCP(J) int_state%WPDAR(J)=IFACT*int_state%WPDAR(J) ENDDO ! DO J=JTS,JTE DO I=ITS,ITE IF (FILTER_METHOD /= 0) THEN HDACX_SV(I,J)=int_state%HDACX(I,J) HDACY_SV(I,J)=int_state%HDACY(I,J) HDACVX_SV(I,J)=int_state%HDACVX(I,J) HDACVY_SV(I,J)=int_state%HDACVY(I,J) END IF int_state%HDACX(I,J)=IFACT*DTRATIO*int_state%HDACX(I,J) int_state%HDACY(I,J)=IFACT*DTRATIO*int_state%HDACY(I,J) int_state%HDACVX(I,J)=IFACT*DTRATIO*int_state%HDACVX(I,J) int_state%HDACVY(I,J)=IFACT*DTRATIO*int_state%HDACVY(I,J) ENDDO ENDDO ENDIF ! DDMPV=int_state%DDMPV EF4T=int_state%EF4T ! NBOCO=int(0.5+NBOCO/DTRATIO) ! IF (MYPE == 0) WRITE(0,*) 'NBOCO reset to : ', NBOCO ! !----------------------------------------------------------------------- !*** Now we need to do some things related to digital filtering !*** that are only relevant after the first pass through the !*** Run step. !----------------------------------------------------------------------- ! DT_TEST=INTEGER_DT DT_TEST_RATIO=int_state%DT_TEST_RATIO ! !----------------------------------------------------------------------- ! not_firstpass: IF (.NOT. FIRST_PASS) THEN ! !----------------------------------------------------------------------- ! changedir: IF (int_state%DT_LAST /= DT_TEST & .AND. & ABS(int_state%DT_LAST) == ABS(DT_TEST) ) THEN ! !----------------------------------------------------------------------- ! IF(MYPE == 0)WRITE(0,*)' Change in integration direction...' & ,' dt_last=',int_state%dt_last & ,' dt_test=',dt_test ! !----------------------------------------------------------------------- !*** Setting previous time level variables (Adams-Bashforth scheme) !*** to the current time level. Seems safer than potentially leaving them !*** defined as values at a very different point in the time integration. !----------------------------------------------------------------------- ! int_state%FIRST_STEP=.TRUE. ! int_state%TP=int_state%T int_state%UP=int_state%U int_state%VP=int_state%V ! IFACT=-1 ! int_state%DDMPV=IFACT*int_state%DDMPV int_state%EF4T=IFACT*int_state%EF4T DDMPV=int_state%DDMPV EF4T=int_state%EF4T ! DO J=JDS,JDE int_state%DDMPU(J)=IFACT*int_state%DDMPU(J) int_state%FAD(J)=IFACT*int_state%FAD(J) int_state%FAH(J)=IFACT*int_state%FAH(J) int_state%FCP(J)=IFACT*int_state%FCP(J) int_state%WPDAR(J)=IFACT*int_state%WPDAR(J) ENDDO ! DO J=JTS,JTE DO I=ITS,ITE int_state%HDACX(I,J)=IFACT*int_state%HDACX(I,J) int_state%HDACY(I,J)=IFACT*int_state%HDACY(I,J) int_state%HDACVX(I,J)=IFACT*int_state%HDACVX(I,J) int_state%HDACVY(I,J)=IFACT*int_state%HDACVY(I,J) ENDDO ENDDO ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Solver Run Gets HDIFF from Import State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state=IMP_STATE & !<-- The Solver import state ,name ='HDIFF' & !<-- Name of the Attribute to extract ,value=HDIFF_ON & !<-- Put the Attribute here ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_RUN) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! btim=timef() CALL HALO_EXCH & (int_state%T,LM & ,int_state%Q,LM & ,int_state%CW,LM & ,2,2) !..What about other items in the TRACER array? ! CALL HALO_EXCH & (int_state%U,LM & ,int_state%V,LM & ,2,2) ! CALL HALO_EXCH & (int_state%PD,1 & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! IF(.NOT.int_state%GLOBAL)THEN CALL WRITE_BC(LM,LNSH,LNSV,NTIMESTEP,DT & ,RUNBC & ,TBOCO+int_state%DFIHR_BOCO/2. & ,int_state%NVARS_BC_2D_H & ,int_state%NVARS_BC_3D_H & ,int_state%NVARS_BC_4D_H & ,int_state%NVARS_BC_2D_V & ,int_state%NVARS_BC_3D_V & ,int_state%BND_VARS_H & ,int_state%BND_VARS_V & ,.TRUE.) !<-- Recompute tendencies at this stage? ENDIF ! !----------------------------------------------------------------------- ! ENDIF changedir ! !----------------------------------------------------------------------- ! end_filt: IF (FILTER_METHOD /= FILTER_METHOD_LAST) THEN ! !----------------------------------------------------------------------- ! DTRATIO=ABS(FUND_DT/DT_TEST_RATIO) IF(MYPE == 0) WRITE(0,*) ' RESTORING PRE-FILTER CONSTANTS with DTRATIO: ', DTRATIO ! !----------------------------------------------------------------------- !*** Setting previous time level variables (Adams-Bashforth scheme) !*** to the current time level. Seems safer than potentially leaving them !*** defined as values at a very different point in the time integration. !----------------------------------------------------------------------- ! int_state%TP=int_state%T int_state%UP=int_state%U int_state%VP=int_state%V ! IFACT=1 ! int_state%DDMPV=DDMPV_SV int_state%EF4T=EF4T_SV DDMPV=int_state%DDMPV EF4T=int_state%EF4T DDMPV=int_state%DDMPV EF4T=int_state%EF4T NBOCO=int(0.5+NBOCO/DTRATIO) ! ! IF (MYPE == 0) WRITE(0,*) 'NBOCO reset to : ', NBOCO ! DO J=JDS,JDE int_state%DDMPU(J)=DDMPU_SV(J) int_state%FAD(J)=FAD_SV(J) int_state%FAH(J)=FAH_SV(J) int_state%FCP(J)=FCP_SV(J) int_state%WPDAR(J)=IFACT*int_state%WPDAR(J) ENDDO ! DO J=JTS,JTE DO I=ITS,ITE int_state%HDACX(I,J)=HDACX_SV(I,J) int_state%HDACY(I,J)=HDACY_SV(I,J) int_state%HDACVX(I,J)=HDACVX_SV(I,J) int_state%HDACVY(I,J)=HDACVY_SV(I,J) ENDDO ENDDO ! !----------------------------------------------------------------------- ! DEALLOCATE(HDACX_SV,HDACY_SV,HDACVX_SV,HDACVY_SV) DEALLOCATE(DDMPU_SV,FAD_SV,FAH_SV,FCP_SV) ! int_state%FIRST_STEP=.TRUE. ! ENDIF end_filt ! !----------------------------------------------------------------------- ! ENDIF not_firstpass ! !----------------------------------------------------------------------- ! IF(FIRST_PASS)THEN int_state%FIRST_PASS=.FALSE. FIRST_PASS=int_state%FIRST_PASS ENDIF ! !----------------------------------------------------------------------- ! TD=>TIMERS(MY_DOMAIN_ID) !<-- Abbreviate the name of this domain's timers. ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** Begin the Solver calling sequence. !*** Note that the first timestep begins differently !*** than all subsequent timesteps. !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! !*** NMMB-HYCOM !*** First call in each timestep. ! ! CALL ATM_TSTEP_INIT(NTIMESTEP,int_state%NPHS, & MY_DOMAIN_ID,int_state%NPHS*DT, & mype,num_pes,mpi_comm_comp, & ids,ide,jds,jde,its,ite,jts,jte,ims,ime,jms,jme, & 1,lm,1,lm,1,lm, & int_state%GLON_DBL,int_state%GLAT_DBL, & int_state%VLON_DBL,int_state%VLAT_DBL, & int_state%SM, & int_state%I_PAR_STA,int_state%J_PAR_STA, & 3*int_state%NPHS*DT,dtc_) ! guessdtc,dtc) ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! firststep: IF(int_state%FIRST_STEP.AND. & !<-- The following block is used only for .NOT.int_state%RESTART)THEN ! the first timestep and cold start ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL SWAPHN & (int_state%T,IMS,IME,JMS,JME,LM & ,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN & (int_state%T & ,IMS,IME,JMS,JME,LM & ,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! ENDIF ! btim=timef() CALL HALO_EXCH(int_state%T,LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** The pressure gradient routine. !----------------------------------------------------------------------- ! btim=timef() ! CALL PGFORCE & (int_state%FIRST_STEP,int_state%GLOBAL,int_state%RESTART & ,LM,DT,NTIMESTEP & ,RDYV,int_state%DSG2,int_state%PDSG1,int_state%RDXV & ,int_state%WPDAR,int_state%FIS & ,int_state%PD & ,int_state%T,int_state%Q,int_state%CW & ! And how about other TRACER elements? ,int_state%PINT & ,int_state%RTOP & ,int_state%DIV & ,int_state%PCNE,int_state%PCNW & ,int_state%PCX,int_state%PCY & ,int_state%TCU,int_state%TCV ) ! td%pgforce_tim=td%pgforce_tim+(timef()-btim) ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%DIV,LM & ,2,2) CALL HALO_EXCH(int_state%U,LM & ,int_state%V,LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Divergence and horizontal pressure advection in thermo eqn !----------------------------------------------------------------------- ! btim=timef() ! CALL DHT & (GLOBAL,LM,DYV,int_state%DSG2,int_state%PDSG1,int_state%DXV & ,int_state%FCP,int_state%FDIV & ,int_state%PD,int_state%PDO & ,int_state%U,int_state%V & ,int_state%OMGALF & ,int_state%PCNE,int_state%PCNW,int_state%PCX,int_state%PCY & ,int_state%PFNE,int_state%PFNW,int_state%PFX,int_state%PFY & ,int_state%DIV,int_state%TDIV) ! td%dht_tim=td%dht_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for the global forecast. !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL FFTFHN & (LM & ,int_state%KHFILT & ,int_state%HFILT & ,int_state%DIV & ,int_state%WFFTRH,int_state%NFFTRH & ,NUM_PES,MYPE,MPI_COMM_COMP) td%fftfhn_tim=td%fftfhn_tim+(timef()-btim) ! btim=timef() CALL SWAPHN & (int_state%DIV & ,IMS,IME,JMS,JME,LM & ,INPES) ! CALL SWAPHN & (int_state%OMGALF & ,IMS,IME,JMS,JME,LM & ,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN & (int_state%DIV & ,IMS,IME,JMS,JME,LM & ,INPES,JNPES) ! CALL POLEHN & (int_state%OMGALF & ,IMS,IME,JMS,JME,LM & ,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! btim=timef() CALL SWAPWN & (int_state%U & ,IMS,IME,JMS,JME,LM & ,INPES) ! CALL SWAPWN & (int_state%V & ,IMS,IME,JMS,JME,LM & ,INPES) td%swapwn_tim=td%swapwn_tim+(timef()-btim) ! btim=timef() CALL POLEWN & (int_state%U,int_state%V & ,IMS,IME,JMS,JME,LM & ,INPES,JNPES) td%polewn_tim=td%polewn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH & (int_state%T,LM & ,int_state%U,LM & ,int_state%V,LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- ! ENDIF firststep ! !----------------------------------------------------------------------- ! not_firststep: IF(.NOT.int_state%FIRST_STEP & !<-- The following block is for all timesteps after .OR.int_state%RESTART)THEN ! the first or all steps in restart case ! !rh_hold IF(FILTER_METHOD==0.and.USE_RADAR_FIRST==1.and.USE_RADAR==0)THEN !rh_hold IFLAG=-1 ! <---- IFLAG=-1 takes RH_HOLD, and filtered !rh_hold ! T,P, to restore Q to be consistent with !rh_hold ! prefiltered humidity level !rh_hold !rh_hold!!! NOTE: restoring down here means they are restored AFTER the 00 h !rh_hold!!! output is written. Any way to restore them before the output !rh_hold!!! is written? !rh_hold !rh_hold CALL CALC_RH_RADAR_DFI(int_state%T,int_state%Q,int_state%PD & !rh_hold ,int_state%PSGML1,int_state%SGML2 & !rh_hold ,R_D,R_V,RH_HOLD & !rh_hold ,IMS,IME,JMS,JME,LM & !rh_hold ,IFLAG) !rh_hold !rh_hold USE_RADAR_FIRST=0 !rh_hold !rh_hold ENDIF !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** Horizontal diffusion (internal halo exchange for 4th order) !----------------------------------------------------------------------- ! btim=timef() ! IF(HDIFF_ON>0)THEN CALL HDIFF & (GLOBAL,HYDRO & ,INPES,JNPES,LM,LPT2 & ,DYH,RDYH & ,int_state%EPSQ2 & ,int_state%DXV,int_state%RARE,int_state%RDXH & ,int_state%SICE,int_state%SM & ,int_state%HDACX,int_state%HDACY & ,int_state%HDACVX,int_state%HDACVY & ,int_state%W,int_state%Z & ,int_state%CW,int_state%Q,int_state%Q2 & ! And how about other TRACER elements? ,int_state%T,int_state%U,int_state%V,int_state%DEF) ENDIF ! td%hdiff_tim=td%hdiff_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for the global forecast. !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() ! CALL POAVHN & (IMS,IME,JMS,JME,LM & ,int_state%T & ,INPES,JNPES & ,int_state%USE_ALLREDUCE) ! CALL POAVHN & (IMS,IME,JMS,JME,LM & ,int_state%Q & ,INPES,JNPES & ,int_state%USE_ALLREDUCE) ! CALL POAVHN & (IMS,IME,JMS,JME,LM & ,int_state%CW & ,INPES,JNPES & ,int_state%USE_ALLREDUCE) ! CALL POAVHN & (IMS,IME,JMS,JME,LM & ,int_state%Q2 & ,INPES,JNPES & ,int_state%USE_ALLREDUCE) ! td%poavhn_tim=td%poavhn_tim+(timef()-btim) ! btim=timef() CALL SWAPHN(int_state%T,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%Q,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%CW,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%Q2,IMS,IME,JMS,JME,LM,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN(int_state%T,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%Q,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%CW,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%Q2,IMS,IME,JMS,JME,LM,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! btim=timef() CALL SWAPWN(int_state%U,IMS,IME,JMS,JME,LM,INPES) CALL SWAPWN(int_state%V,IMS,IME,JMS,JME,LM,INPES) td%swapwn_tim=td%swapwn_tim+(timef()-btim) ! btim=timef() CALL POLEWN(int_state%U,int_state%V & ,IMS,IME,JMS,JME,LM,INPES,JNPES) td%polewn_tim=td%polewn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%T,LM & ,int_state%Q,LM & ,int_state%CW,LM & ,int_state%Q2,LM & ! And how about other TRACER elements? ,2,2) CALL HALO_EXCH(int_state%U,LM & ,int_state%V,LM & ,1,1) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Regional domains that have no children or are uppermost parents !*** need to set a digital filter flag and exchange haloes. !----------------------------------------------------------------------- ! IF(.NOT.I_AM_A_NEST.AND..NOT.GLOBAL)THEN !<-- For single domains or uppermost parents ! READBC=(NTIMESTEP==1.OR.MOD(NTIMESTEP,NBOCO)==0) ! bc_check: IF(READBC)THEN !<-- Is it time to read BCs? ! IF(MYPE==0)THEN WRITE_BC_FLAG=0 ! IF(FILTER_METHOD>0)THEN IF(NTIMESTEP<=1.AND.int_state%BDY_WAS_READ)THEN WRITE_BC_FLAG=1 ELSE WRITE_BC_FLAG=0 ENDIF ENDIF ! ENDIF ! CALL MPI_BCAST(WRITE_BC_FLAG,1,MPI_INTEGER,0 & ,MPI_COMM_COMP,IRTN) ! IF(WRITE_BC_FLAG==1)THEN CALL HALO_EXCH & (int_state%T,LM & ,int_state%Q,LM & ,int_state%CW,LM & ! And how about other TRACER elements? ,2,2) ! CALL HALO_EXCH & (int_state%U,LM & ,int_state%V,LM & ,2,2) ! CALL HALO_EXCH & (int_state%PD,1 & ,2,2) ! ENDIF ! ENDIF bc_check ! ENDIF ! !----------------------------------------------------------------------- !*** Update the boundary mass points. ! !*** For non-nested regional domains, read new boundary tendencies !*** at the appropriate times. ! !*** If this is a nested domain then unload the new boundary data !*** from the Solver import state and compute the time tendencies. !----------------------------------------------------------------------- ! bc_update: IF(.NOT.GLOBAL)THEN ! !----------------------------------------------------------------------- !*** The following block is for digital filtering. !----------------------------------------------------------------------- ! IF(I_AM_A_NEST)THEN ! IF(MYPE==0)THEN WRITE_BC_FLAG_NEST=0 ! IF(FILTER_METHOD>0)THEN IF (S_BDY.AND.W_BDY & .AND. & NTIMESTEP <= 1 & .AND. & int_state%BDY_WAS_READ) THEN ! WRITE_BC_FLAG_NEST=1 ENDIF ENDIF ! ENDIF ! CALL MPI_BCAST(WRITE_BC_FLAG_NEST,1,MPI_INTEGER & ,0,MPI_COMM_COMP,IRTN) ! IF (WRITE_BC_FLAG_NEST == 1) THEN CALL HALO_EXCH & (int_state%T,LM & ,int_state%Q,LM & ,int_state%CW,LM & ! And how about other TRACER elements? ,2,2) ! CALL HALO_EXCH & (int_state%U,LM & ,int_state%V,LM & ,2,2) ! CALL HALO_EXCH & (int_state%PD,1 & ,2,2) ENDIF ENDIF ! !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set SIMULATION_START_TIME for Filter in Solver Run" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_TimeSet(time=SIMULATION_START_TIME & ,yy =START_YEAR & ,mm =START_MONTH & ,dd =START_DAY & ,h =START_HOUR & ,calkindflag=ESMF_CALKIND_GREGORIAN & ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_RUN) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! IF (FILTER_METHOD == 1 .and. NTIMESTEP == 0) THEN ! REST_OFFSET=CURRTIME-SIMULATION_START_TIME ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Get Time Offset for Filter in Solver Run" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_TimeIntervalGet(timeinterval=REST_OFFSET & ,s =JDAT(7) & ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_RUN) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! RESTVAL=JDAT(7) IF (MYPE == 0) WRITE(0,*) 'set RESTVAL to: ', RESTVAL ! ENDIF ! !----------------------------------------------------------------------- ! boundary_tendencies: IF(S_BDY.OR.N_BDY.OR.W_BDY.OR.E_BDY)THEN ! !----------------------------------------------------------------------- !*** Nests update boundary tendencies based on data from parent. !----------------------------------------------------------------------- ! nest_or_parent: IF(I_AM_A_NEST)THEN ! !----------------------------------------------------------------------- !*** The following block is for digital filtering. !----------------------------------------------------------------------- ! IF(NTIMESTEP<=1.AND.WRITE_BC_FLAG_NEST==1)THEN ! TBOCO=PARENT_CHILD_TIME_RATIO*DT CALL WRITE_BC(LM,LNSH,LNSV,NTIMESTEP,DT & ,RUNBC,TBOCO & ,int_state%NVARS_BC_2D_H & ,int_state%NVARS_BC_3D_H & ,int_state%NVARS_BC_4D_H & ,int_state%NVARS_BC_2D_V & ,int_state%NVARS_BC_3D_V & ,int_state%BND_VARS_H & ,int_state%BND_VARS_V & ,.FALSE.) !<-- Are tendencies recomputed? ! ENDIF ! !----------------------------------------------------------------------- ! COMPUTE_BC=(NTIMESTEP==1.OR. & MOD(NTIMESTEP,PARENT_CHILD_TIME_RATIO)==0) ! IF(COMPUTE_BC)THEN ! CALL UPDATE_BC_TENDS(IMP_STATE & ,LM,LNSH,LNSV & ,PARENT_CHILD_TIME_RATIO,DT & ,S_BDY,N_BDY,W_BDY,E_BDY & ,int_state%NLEV_H & ,int_state%NLEV_V & ,int_state%NVARS_BC_2D_H & ,int_state%NVARS_BC_3D_H & ,int_state%NVARS_BC_4D_H & ,int_state%NVARS_BC_2D_V & ,int_state%NVARS_BC_3D_V & ,int_state%BND_VARS_H & ,int_state%BND_VARS_V & ,int_state%ITS,int_state%ITE & ,int_state%JTS,int_state%JTE & ,int_state%IMS,int_state%IME & ,int_state%JMS,int_state%JME & ,int_state%IDS,int_state%IDE & ,int_state%JDS,int_state%JDE & ) ! ENDIF ! !----------------------------------------------------------------------- !*** Single/uppermost domain reads its own boundary input data !----------------------------------------------------------------------- ! ELSE nest_or_parent ! CALL ESMF_TimeSet(time=SIMULATION_START_TIME & ,yy =START_YEAR & ,mm =START_MONTH & ,dd =START_DAY & ,h =START_HOUR) ! IF (FILTER_METHOD > 0 .and. NTIMESTEP == 0) THEN REST_OFFSET=CURRTIME-SIMULATION_START_TIME CALL ESMF_TimeIntervalGet(timeinterval=REST_OFFSET, s=JDAT(7)) NTIMESTEP_BC=(NTIMESTEP)+NINT(JDAT(7)/abs(DT)) ELSE NTIMESTEP_BC=NTIMESTEP ENDIF ! !----------------------------------------------------------------------- !*** Set logical flag to read the BCs !----------------------------------------------------------------------- ! READBC=( (NTIMESTEP==0 .AND. MOD(NTIMESTEP_BC,NBOCO)==0) & !<-- Filter related? ! .OR. & ! NTIMESTEP_BC==1 & !<-- First timestep ! .OR. & ! ((MOD(NTIMESTEP_BC,NBOCO)==0) .AND. FILTER_METHOD==0) ) !<-- Non-filter, NBOCO coincident time ! !----------------------------------------------------------------------- ! bc_read: IF(READBC)THEN ! bc_flag: IF(WRITE_BC_FLAG==0)THEN ! CALL READ_BC(LM,LNSH,LNSV,NTIMESTEP_BC,DT & ,RUNBC,IDATBC,IHRSTBC,TBOCO & ! ,int_state%NVARS_BC_2D_H & ,int_state%NVARS_BC_3D_H & ,int_state%NVARS_BC_4D_H & ,int_state%NVARS_BC_2D_V & ,int_state%NVARS_BC_3D_V & ! ,int_state%BND_VARS_H & ,int_state%BND_VARS_V & ,int_state%N_BC_3D_H & ) ! ELSE ! IF (NTIMESTEP==0) THEN CALL WRITE_BC(LM,LNSH,LNSV,NTIMESTEP,DT & ,RUNBC,TBOCO & ,int_state%NVARS_BC_2D_H & ,int_state%NVARS_BC_3D_H & ,int_state%NVARS_BC_4D_H & ,int_state%NVARS_BC_2D_V & ,int_state%NVARS_BC_3D_V & ,int_state%BND_VARS_H & ,int_state%BND_VARS_V & ,.TRUE.) !<-- Are tendencies recomputed? ENDIF ! ENDIF bc_flag ! ENDIF bc_read ! ENDIF nest_or_parent ! !----------------------------------------------------------------------- ! ENDIF boundary_tendencies ! !----------------------------------------------------------------------- ! IF(.NOT.int_state%BDY_WAS_READ) THEN int_state%BDY_WAS_READ=.TRUE. ENDIF ! !----------------------------------------------------------------------- ! btim=timef() ! CALL BOCOH & (LM,LNSH,DT,PT & ,int_state%PD,int_state%DSG2,int_state%PDSG1 & ,int_state%NVARS_BC_2D_H & ,int_state%NVARS_BC_3D_H & ,int_state%NVARS_BC_4D_H & ,int_state%LBND_4D & ,int_state%UBND_4D & ,int_state%BND_VARS_H & ,int_state%PINT) ! td%bocoh_tim=td%bocoh_tim+(timef()-btim) ! ENDIF bc_update ! !----------------------------------------------------------------------- !*** The pressure gradient routine. !----------------------------------------------------------------------- ! btim=timef() ! CALL PGFORCE & (int_state%FIRST_STEP,int_state%GLOBAL,int_state%RESTART & ,LM,DT,NTIMESTEP & ,RDYV,int_state%DSG2,int_state%PDSG1,int_state%RDXV & ,int_state%WPDAR,int_state%FIS & ,int_state%PD & ,int_state%T,int_state%Q,int_state%CW & ! And how about other TRACER elements? ,int_state%PINT & ,int_state%RTOP & ,int_state%DIV & ,int_state%PCNE,int_state%PCNW & ,int_state%PCX,int_state%PCY & ,int_state%TCU,int_state%TCV ) ! td%pgforce_tim=td%pgforce_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for the global forecast. !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL FFTFUVN & (LM & ,int_state%KVFILT,int_state%VFILT & ,int_state%TCU,int_state%TCV & ,int_state%WFFTRW,int_state%NFFTRW & ,NUM_PES,MYPE,MPI_COMM_COMP) td%fftfwn_tim=td%fftfwn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- !*** Update the wind field. !----------------------------------------------------------------------- ! btim=timef() CALL UPDATEUV & (LM & ,int_state%U,int_state%V & ,int_state%TCU,int_state%TCV ) ! td%updateuv_tim=td%updateuv_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for the global forecast. !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL SWAPWN(int_state%U,IMS,IME,JMS,JME,LM,INPES) CALL SWAPWN(int_state%V,IMS,IME,JMS,JME,LM,INPES) td%swapwn_tim=td%swapwn_tim+(timef()-btim) ! btim=timef() CALL POLEWN(int_state%U,int_state%V & ,IMS,IME,JMS,JME,LM,INPES,JNPES) td%polewn_tim=td%polewn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%DIV,LM & ,2,2) CALL HALO_EXCH(int_state%U,LM & ,int_state%V,LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Update the boundary velocity points for the regional forecast. !----------------------------------------------------------------------- ! IF(.NOT.GLOBAL)THEN ! btim=timef() CALL BOCOV & (LM,LNSV,DT & ,int_state%NVARS_BC_2D_V & ,int_state%NVARS_BC_3D_V & ,int_state%BND_VARS_V ) td%bocov_tim=td%bocov_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- !*** The boundary winds have just been updated. In order to replicate !*** the integration of a restarted run compared to its free-forecast !*** counterpart then we must save the wind data in the boundary !*** arrays for the restart files at this place in the runstream. !----------------------------------------------------------------------- ! IF(QUILTING)THEN IF(MOD(NTIMESTEP+1,int_state%NSTEPS_BC_RESTART)==0)THEN !<-- Look ahead to the end of this timestep CALL SAVE_BC_DATA & (LM,LNSH,LNSV & ,int_state%NVARS_BC_2D_H & ,int_state%NVARS_BC_3D_H & ,int_state%NVARS_BC_4D_H & ,int_state%NVARS_BC_2D_V & ,int_state%NVARS_BC_3D_V & ,int_state%BND_VARS_H & ,int_state%BND_VARS_V & ,int_state%NUM_WORDS_BC_SOUTH,int_state%RST_BC_DATA_SOUTH & ,int_state%NUM_WORDS_BC_NORTH,int_state%RST_BC_DATA_NORTH & ,int_state%NUM_WORDS_BC_WEST ,int_state%RST_BC_DATA_WEST & ,int_state%NUM_WORDS_BC_EAST ,int_state%RST_BC_DATA_EAST & ,EXP_STATE & ,int_state%ITS,int_state%ITE,int_state%JTS,int_state%JTE & ,int_state%IMS,int_state%IME,int_state%JMS,int_state%JME & ,int_state%IDS,int_state%IDE,int_state%JDS,int_state%JDE & ) ! ENDIF ENDIF ! !----------------------------------------------------------------------- !*** Divergence and horizontal pressure advection in thermo eqn !----------------------------------------------------------------------- ! btim=timef() ! CALL DHT & (GLOBAL,LM,DYV,int_state%DSG2,int_state%PDSG1,int_state%DXV & ,int_state%FCP,int_state%FDIV & ,int_state%PD,int_state%PDO & ,int_state%U,int_state%V & ,int_state%OMGALF & ,int_state%PCNE,int_state%PCNW,int_state%PCX,int_state%PCY & ,int_state%PFNE,int_state%PFNW,int_state%PFX,int_state%PFY & ,int_state%DIV,int_state%TDIV) ! td%dht_tim=td%dht_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for the global forecast. !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL FFTFHN & (LM & ,int_state%KHFILT & ,int_state%HFILT & ,int_state%DIV & ,int_state%WFFTRH,int_state%NFFTRH & ,NUM_PES,MYPE,MPI_COMM_COMP) td%fftfhn_tim=td%fftfhn_tim+(timef()-btim) ! btim=timef() CALL SWAPHN & (int_state%DIV & ,IMS,IME,JMS,JME,LM & ,INPES) ! CALL SWAPHN & (int_state%OMGALF & ,IMS,IME,JMS,JME,LM & ,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN & (int_state%DIV & ,IMS,IME,JMS,JME,LM & ,INPES,JNPES) ! CALL POLEHN & (int_state%OMGALF & ,IMS,IME,JMS,JME,LM & ,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%DIV,LM & ,int_state%OMGALF,LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Divergence damping !----------------------------------------------------------------------- ! btim=timef() ! IF(HDIFF_ON>0)THEN CALL DDAMP & (LM & ,DDMPV,PDTOP & ,int_state%DSG2,int_state%PDSG1 & ,int_state%SG1,int_state%SG2 & ,int_state%DDMPU & ,int_state%FREERUN & ,int_state%PD,int_state%PDO & ,int_state%U,int_state%V & ,int_state%DIV) ENDIF ! td%ddamp_tim=td%ddamp_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for the global forecast. !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL SWAPWN & (int_state%U & ,IMS,IME,JMS,JME,LM & ,INPES) ! CALL SWAPWN & (int_state%V & ,IMS,IME,JMS,JME,LM & ,INPES) td%swapwn_tim=td%swapwn_tim+(timef()-btim) ! btim=timef() CALL POLEWN & (int_state%U,int_state%V & ,IMS,IME,JMS,JME,LM & ,INPES,JNPES) td%polewn_tim=td%polewn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%U,int_state%LM & ,int_state%V,int_state%LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- ! ENDIF not_firststep ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** The remainder of the Solver integration call sequence !*** is the same for all timesteps. !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! int_state%FIRST_STEP=.FALSE. ! !----------------------------------------------------------------------- !*** Update the surface pressure. !----------------------------------------------------------------------- ! btim=timef() ! CALL PDTSDT & (LM,DT,int_state%SG2 & ,int_state%PD & ,int_state%PDO,int_state%PSDT & ,int_state%PSGDT & ! !*** Temporary argument ! ,int_state%DIV,int_state%TDIV) ! td%pdtsdt_tim=td%pdtsdt_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions !----------------------------------------------------------------------- ! IF(GLOBAL)THEN btim=timef() CALL SWAPHN(int_state%PD,IMS,IME,JMS,JME,1,INPES) CALL SWAPHN(int_state%PSDT,IMS,IME,JMS,JME,1,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN(int_state%PD,IMS,IME,JMS,JME,1,INPES,JNPES) CALL POLEHN(int_state%PSDT,IMS,IME,JMS,JME,1,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! btim=timef() CALL SWAPHN(int_state%PSGDT,IMS,IME,JMS,JME,LM-1,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN(int_state%PSGDT,IMS,IME,JMS,JME,LM-1,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%PD,1 & ,int_state%PSDT,1 & ,int_state%PSGDT,LM-1 & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Advection of T, U, and V !----------------------------------------------------------------------- ! btim=timef() ! CALL ADV1 & (GLOBAL,SECADV & ,LM,LNSAD,INPES,JNPES & ,DT,DYV,RDYH,RDYV & ,int_state%DSG2,int_state%PDSG1 & ,int_state%CURV,int_state%DXV,int_state%FAD,int_state%FAH & ,int_state%RDXH,int_state%RDXV,int_state%F & ,int_state%PD,int_state%PDO & ,int_state%OMGALF,int_state%PSGDT & ,int_state%T,int_state%U,int_state%V & ,int_state%TP,int_state%UP,int_state%VP & ! !*** Temporary arguments ! ,int_state%PFNE,int_state%PFNW & ,int_state%PFX,int_state%PFY & ,int_state%TCT,int_state%TCU,int_state%TCV) ! td%adv1_tim=td%adv1_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Advect specific humidity IDTADTQ time steps !----------------------------------------------------------------------- ! q_tracer: IF(MOD(ABS(NTIMESTEP),IDTADTQ)==0)THEN KSS=int_state%INDX_Q KSE1=KSS ! btim=timef() CALL ADV2 & (GLOBAL & ,IDTADTQ,KSS,KSE1,LM,LNSAD & ,DT,RDYH & ,int_state%DSG2,int_state%PDSG1 & ,int_state%EPSQ2 & ,int_state%FAH,int_state%RDXH & ,int_state%PD,int_state%PDO & ,int_state%PSGDT & ,int_state%UP,int_state%VP & ,int_state%INDX_Q2 & ,int_state%TRACERS & ,int_state%TRACERS_PREV & ! !*** Temporary arguments ! ,int_state%PFNE,int_state%PFNW & ,int_state%PFX,int_state%PFY & ,int_state%TRACERS_SQRT & ,int_state%TRACERS_TEND) td%adv2_tim=td%adv2_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for global forecasts of specific humidity !----------------------------------------------------------------------- ! IF(GLOBAL)THEN btim=timef() DO KS=KSS,KSE1 CALL FFTFHN & (LM & ,int_state%KHFILT & ,int_state%HFILT & ,int_state%TRACERS_TEND(IMS:IME,JMS:JME,1:LM,KS) & ,int_state%WFFTRH,int_state%NFFTRH & ,NUM_PES,MYPE,MPI_COMM_COMP) ENDDO td%fftfhn_tim=td%fftfhn_tim+(timef()-btim) ENDIF ! !----------------------------------------------------------------------- !*** Tracer monotonization for specific humidity !----------------------------------------------------------------------- ! btim=timef() CALL MONO & (IDTADTQ,KSS,KSE1,LM & ,int_state%DSG2,int_state%PDSG1 & ,int_state%EPSQ2 & ,int_state%DARE & ,int_state%PD & ,int_state%INDX_Q2 & ,int_state%TRACERS & ,INPES,JNPES & ,int_state%USE_ALLREDUCE & ! !*** Temporary arguments ! ,int_state%TRACERS_SQRT & ,int_state%TRACERS_TEND) td%mono_tim=td%mono_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Update specific humidity !----------------------------------------------------------------------- ! btim=timef() CALL UPDATES & (LM,int_state%NUM_TRACERS_TOTAL,KSS,KSE1 & ,int_state%TRACERS,int_state%TRACERS_TEND) td%updates_tim=td%updates_tim+(timef()-btim) ! !----------------------------------------------------------------------- ! IF(GLOBAL)THEN btim=timef() CALL SWAPHN(int_state%Q,IMS,IME,JMS,JME,LM,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) btim=timef() CALL POLEHN(int_state%Q,IMS,IME,JMS,JME,LM,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ENDIF ! btim=timef() CALL HALO_EXCH(int_state%Q,LM,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ENDIF q_tracer ! !----------------------------------------------------------------------- !*** Advection of tracers *other* than specific humidity !----------------------------------------------------------------------- ! not_q_tracers: IF(MOD(ABS(NTIMESTEP),IDTADT)==0)THEN ! !----------------------------------------------------------------------- ! !-- Water vapor *mixing ratio* is not considered below, it will be ! calculated from specific humidity before entering the physics block ! IF(int_state%SPEC_ADV)THEN ! !-- Separate species advection (SPEC_ADV=T): advect Q2 (TKE) and ! individual *condensate* species (QC,QI,QR,QS,QG,etc) ! !-- At the initial time step (NTIMESTEP=0), subroutine UPDATE_WATER has not ! been called yet, so the initial individual hydrometeor species (QC,QI,etc.) ! have not been calculated from the int_state%CW/F_ice/F_rain arrays when ! initialized from NPS-generated input files. In the trunk code, the total ! condensate is advected along with the individual species, so this leads to ! an initial discrepancy in the values for int_state%CW, which are passed in ! as input to the radiation code. ! ! IF(NTIMESTEP<=0) THEN ! KSS=int_state%INDX_CW ! ELSE ! KSS=int_state%INDX_Q2 ! ENDIF KSS=int_state%INDX_CW KSE1=int_state%NUM_TRACERS_TOTAL IF (RIME_FACTOR_ADVECT) THEN btim=timef() !----------- QG(:,:,:)=F_RIMEF(:,:,:)*QS(:,:,:) for advection RIME_FACTOR_INPUT=.TRUE. CALL RIME_FACTOR_UPDATE (RIME_FACTOR_INPUT & ,int_state%QS,int_state%QG & ,int_state%F_RIMEF & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) td%rfupdate_tim=td%rfupdate_tim+(timef()-btim) ENDIF ELSE ! !-- Total condensate advection (SPEC_ADV=F): advect Q2 (TKE) & total condensate (CW) ! KSS=int_state%INDX_CW KSE1=int_state%INDX_Q2 ENDIF ! write(6,*) 'DEBUG-GT: 2nd call to ADV2, kss,kse=',kss,kse1 ! btim=timef() ! CALL ADV2 & (GLOBAL & ,IDTADT,KSS,KSE1,LM,LNSAD & ,DT,RDYH & ,int_state%DSG2,int_state%PDSG1 & ,int_state%EPSQ2 & ,int_state%FAH,int_state%RDXH & ,int_state%PD,int_state%PDO & ,int_state%PSGDT & ,int_state%UP,int_state%VP & ,int_state%INDX_Q2 & ,int_state%TRACERS & ,int_state%TRACERS_PREV & ! !*** Temporary arguments ! ,int_state%PFNE,int_state%PFNW & ,int_state%PFX,int_state%PFY & ,int_state%TRACERS_SQRT & ,int_state%TRACERS_TEND) ! td%adv2_tim=td%adv2_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for global forecasts !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() ! DO KS=KSS,KSE1 CALL FFTFHN & (LM & ,int_state%KHFILT & ,int_state%HFILT & ,int_state%TRACERS_TEND(IMS:IME,JMS:JME,1:LM,KS) & ,int_state%WFFTRH,int_state%NFFTRH & ,NUM_PES,MYPE,MPI_COMM_COMP) ENDDO ! td%fftfhn_tim=td%fftfhn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- !*** Tracer monotonization !----------------------------------------------------------------------- ! btim=timef() ! CALL MONO & (IDTADT,KSS,KSE1,LM & ,int_state%DSG2,int_state%PDSG1 & ,int_state%EPSQ2 & ,int_state%DARE & ,int_state%PD & ,int_state%INDX_Q2 & ,int_state%TRACERS & ,INPES,JNPES & ,int_state%USE_ALLREDUCE & ! !*** Temporary arguments ! ,int_state%TRACERS_SQRT & ,int_state%TRACERS_TEND) ! td%mono_tim=td%mono_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Update tracers !----------------------------------------------------------------------- ! btim=timef() ! CALL UPDATES & (LM,int_state%NUM_TRACERS_TOTAL,KSS,KSE1 & ,int_state%TRACERS,int_state%TRACERS_TEND) ! td%updates_tim=td%updates_tim+(timef()-btim) ! !----------------------------------------------------------------------- ! if_global: IF(GLOBAL)THEN !-- Global NMMB ! btim=timef() CALL SWAPHN(int_state%CW,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%O3,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%Q2,IMS,IME,JMS,JME,LM,INPES) !..Need a similar set of lines for the TRACERS array at some point. ! td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN(int_state%CW,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%O3,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%Q2,IMS,IME,JMS,JME,LM,INPES,JNPES) !..Need a similar set of lines for the TRACERS array at some point. ! td%polehn_tim=td%polehn_tim+(timef()-btim) ! btim=timef() CALL HALO_EXCH(int_state%CW,LM & ,int_state%O3,LM & ,int_state%Q2,LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! ELSE if_global !-- Regional NMMB ! btim=timef() DO KS=KSS,KSE1 CALL HALO_EXCH( & int_state%TRACERS(IMS:IME,JMS:JME,1:LM,KS),LM & ,2,2) ENDDO td%exch_dyn=td%exch_dyn+(timef()-btim) ! IF (RIME_FACTOR_ADVECT) THEN btim=timef() !--------------- F_RIMEF(:,:,:)=QG(:,:,:)/QS(:,:,:) for physics (after advection) RIME_FACTOR_INPUT=.FALSE. CALL RIME_FACTOR_UPDATE (RIME_FACTOR_INPUT & ,int_state%QS,int_state%QG & ,int_state%F_RIMEF & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) td%rfupdate_tim=td%rfupdate_tim+(timef()-btim) ENDIF ! ENDIF if_global ! !----------------------------------------------------------------------- ! ENDIF not_q_tracers ! !----------------------------------------------------------------------- !*** Interface pressures and horizontal part of Omega-Alpha term !----------------------------------------------------------------------- ! btim=timef() ! CALL VTOA & (LM,DT,EF4T,PT,int_state%SG2 & ,int_state%PSDT & ,int_state%DWDT,int_state%RTOP & ,int_state%OMGALF & ,int_state%PINT & ! !*** Temporary arguments ! ,int_state%TDIV,int_state%TCT) ! td%vtoa_tim=td%vtoa_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for global forecasts !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL FFTFHN & (LM & ,int_state%KHFILT & ,int_state%HFILT & ,int_state%TCT & ,int_state%WFFTRH,int_state%NFFTRH & ,NUM_PES,MYPE,MPI_COMM_COMP) td%fftfhn_tim=td%fftfhn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- !*** Update the temperature field. !----------------------------------------------------------------------- ! btim=timef() ! CALL UPDATET & (LM & ,int_state%T & ! !*** Temporary argument ! ,int_state%TCT) ! td%updatet_tim=td%updatet_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for global forecasts !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL SWAPHN(int_state%OMGALF,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%PINT,IMS,IME,JMS,JME,LM+1,INPES) CALL SWAPHN(int_state%T,IMS,IME,JMS,JME,LM,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN(int_state%OMGALF,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%PINT,IMS,IME,JMS,JME,LM+1,INPES,JNPES) CALL POLEHN(int_state%T,IMS,IME,JMS,JME,LM,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%OMGALF,LM & ,int_state%PINT,LM+1 & ,2,2) CALL HALO_EXCH(int_state%T,LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Nonhydrostatic advection of height !----------------------------------------------------------------------- ! btim=timef() ! CALL CDZDT & (GLOBAL,HYDRO & ,LM,DT,int_state%DSG2,int_state%PDSG1 & ,int_state%FAH,int_state%FIS & ,int_state%PD,int_state%PDO & ,int_state%PSGDT & ,int_state%CW,int_state%Q,int_state%RTOP,int_state%T & ,int_state%PINT & ,int_state%DWDT,int_state%PDWDT,int_state%W,int_state%BARO & ,int_state%Z & ! !*** temporary arguments ! ,int_state%PFNE,int_state%PFNW,int_state%PFX,int_state%PFY) ! td%cdzdt_tim=td%cdzdt_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for global forecasts !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL FFTFHN & (LM & ,int_state%KHFILT & ,int_state%HFILT & ,int_state%W & ,int_state%WFFTRH,int_state%NFFTRH & ,NUM_PES,MYPE,MPI_COMM_COMP) td%fftfhn_tim=td%fftfhn_tim+(timef()-btim) ! btim=timef() CALL SWAPHN(int_state%W,IMS,IME,JMS,JME,LM,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN(int_state%W,IMS,IME,JMS,JME,LM,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%W,LM & ,3,3) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Advection of W (with internal halo exchange) !----------------------------------------------------------------------- ! btim=timef() ! CALL CDWDT & (GLOBAL,HYDRO,int_state%RESTART & ,INPES,JNPES,LM,ABS(NTIMESTEP) & ,DT,G,int_state%DSG2,int_state%PDSG1,int_state%PSGML1 & ,int_state%FAH & ,int_state%HDACX,int_state%HDACY & ,int_state%PD,int_state%PDO & ,int_state%PSGDT & ,int_state%DWDT,int_state%PDWDT,int_state%W & ,int_state%PINT & ! !*** External scratch areas ! ,int_state%DEF,int_state%PFX,int_state%PFY & ,int_state%PFNE,int_state%PFNW) ! td%cdwdt_tim=td%cdwdt_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for global forecasts !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL FFTFHN & (LM & ,int_state%KHFILT & ,int_state%HFILT & ,int_state%DWDT & ,int_state%WFFTRH,int_state%NFFTRH & ,NUM_PES,MYPE,MPI_COMM_COMP) td%fftfhn_tim=td%fftfhn_tim+(timef()-btim) ! btim=timef() CALL SWAPHN(int_state%DWDT,IMS,IME,JMS,JME,LM,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN(int_state%DWDT,IMS,IME,JMS,JME,LM,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%DWDT,LM & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Vertically propagating fast waves !----------------------------------------------------------------------- ! btim=timef() ! CALL VSOUND & (GLOBAL,HYDRO,int_state%RESTART & ,LM,ABS(NTIMESTEP) & ,CP,DT,PT,int_state%DSG2,int_state%PDSG1 & ,int_state%PD & ,int_state%CW,int_state%Q,int_state%RTOP & ,int_state%DWDT,int_state%T,int_state%W,int_state%W_TOT & ,int_state%BARO & ,int_state%PINT) ! td%vsound_tim=td%vsound_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Filtering and boundary conditions for global forecasts !----------------------------------------------------------------------- ! IF(GLOBAL)THEN ! btim=timef() CALL POAVHN & (IMS,IME,JMS,JME,LM & ,int_state%DWDT & ,INPES,JNPES & ,int_state%USE_ALLREDUCE) CALL POAVHN & (IMS,IME,JMS,JME,LM & ,int_state%W & ,INPES,JNPES & ,int_state%USE_ALLREDUCE) CALL POAVHN & (IMS,IME,JMS,JME,LM & ,int_state%PINT & ,INPES,JNPES & ,int_state%USE_ALLREDUCE) td%poavhn_tim=td%poavhn_tim+(timef()-btim) ! btim=timef() CALL SWAPHN(int_state%DWDT,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%T,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%W,IMS,IME,JMS,JME,LM,INPES) CALL SWAPHN(int_state%PINT,IMS,IME,JMS,JME,LM+1,INPES) td%swaphn_tim=td%swaphn_tim+(timef()-btim) ! btim=timef() CALL POLEHN(int_state%DWDT,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%T,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%W,IMS,IME,JMS,JME,LM,INPES,JNPES) CALL POLEHN(int_state%PINT,IMS,IME,JMS,JME,LM+1,INPES,JNPES) td%polehn_tim=td%polehn_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%DWDT,LM & ,int_state%T,LM & ,2,2) CALL HALO_EXCH(int_state%W,LM & ,int_state%PINT,LM+1 & ,2,2) td%exch_dyn=td%exch_dyn+(timef()-btim) ! !----------------------------------------------------------------------- !*** Save DT to compare and see if sign has changed for filtering. !----------------------------------------------------------------------- ! int_state%DT_LAST=DT_TEST int_state%DT_TEST_RATIO=REAL(INTEGER_DT)+REAL(NUMERATOR_DT) & /REAL(IDENOMINATOR_DT) int_state%FILTER_METHOD_LAST=FILTER_METHOD ! !----------------------------------------------------------------------- !*** NOTE: The Solver export state is fully updated now !*** because subroutine SOLVER_INITIALIZE inserted the !*** appropriate ESMF Fields into it. Those Fields !*** contain pointers to the actual data and those !*** pointers are never re-directed, i.e., no explicit !*** action is needed to update the Solver export state. !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** Write the layer statistics for temperature. !----------------------------------------------------------------------- ! IF(MOD(ABS(NTIMESTEP)+1,N_PRINT_STATS)==0)THEN ! IF(int_state%PRINT_DIAG .OR. int_state%PRINT_ALL) & CALL FIELD_STATS(INT_STATE%T,MYPE,MPI_COMM_COMP,LM & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDS,IDE,JDS,JDE) ENDIF ! td%solver_dyn_tim=td%solver_dyn_tim+(timef()-btim0) ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !----PHY_RUN START ----------------------------------------------------- !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! - please do not remove this template call: ! call exit('dyn',int_state%pint,int_state%t,int_state%q & ! ,int_state%u,int_state%v,int_state%q2,int_state%w & ! ,ntimestep,mype,my_domain_id,mpi_comm_comp & ! ,ids,ide,jds,jde,lm & ! ,ims,ime,jms,jme & ! ,its,ite,jts,jte) ! if(mod(nint(dt*ntimestep),3600)==0)then ! call twr(int_state%t,lm,'tphy',ntimestep,mype,num_pes,mpi_comm_comp & ! ,ids,ide,jds,jde & ! ,ims,ime,jms,jme & ! ,its,ite,jts,jte & ! ,my_domain_id ) ! call vwr(int_state%u,lm,'uphy',ntimestep,mype,num_pes,mpi_comm_comp & ! ,ids,ide,jds,jde & ! ,ims,ime,jms,jme & ! ,its,ite,jts,jte & ! ,my_domain_id ) ! endif ! physics: IF(INTEGER_DT>0)THEN !<-- Physics is active ! btim0=timef() ! !----------------------------------------------------------------------- !*** Call radiation so that updated fields are written to the !*** history files after 0 hours. !----------------------------------------------------------------------- ! IF(NTIMESTEP==0)THEN NTIMESTEP_RAD=NTIMESTEP ELSE NTIMESTEP_RAD=NTIMESTEP+1 ENDIF ! !----------------------------------------------------------------------- !*** Dereference some internal state components for convenience. !----------------------------------------------------------------------- ! NPRECIP=int_state%NPRECIP PDTOP=int_state%PDTOP PT=int_state%PT ! !----------------------------------------------------------------------- ! gfs_phys_test: IF(.NOT.int_state%GFS)THEN !<-- NMM-B physics is NOT the GFS package ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** At the appropriate times, reset the various min/max/average !*** diagnostic fields to begin accumulating for the next period !----------------------------------------------------------------------- ! IF(NTIMESTEP == 0 .or. MOD(NTIMESTEP,NSTEPS_PER_RESET)==0) THEN DO J=JTS,JTE DO I=ITS,ITE int_state%TLMAX(I,J)=-999. int_state%TLMIN(I,J)=999. int_state%T02MAX(I,J)=-999. int_state%T02MIN(I,J)=999. int_state%RH02MAX(I,J)=-999. int_state%RH02MIN(I,J)=999. int_state%SPD10MAX(I,J)=-999. int_state%UPHLMAX(I,J)=0. int_state%U10MAX(I,J)=-999. int_state%V10MAX(I,J)=-999. int_state%UPVVELMAX(I,J)=-999. int_state%DNVVELMAX(I,J)=999. int_state%T10AVG(I,J)=0. int_state%T10(I,J)=0. int_state%PSFCAVG(I,J)=0. int_state%AKHSAVG(I,J)=0. int_state%AKMSAVG(I,J)=0. int_state%SNOAVG(I,J)=0. int_state%REFDMAX(I,J)=DBZmin int_state%PRATEMAX(I,J)=0 int_state%FPRATEMAX(I,J)=0 int_state%UPHLMAX(I,J)=-999. ENDDO ENDDO ! int_state%NCOUNT=0 ENDIF ! ! IF (mod(int_state%NTSD,NSTEPS_PER_CHECK) == 0) THEN IF (mod(int_state%NTSD,NSTEPS_PER_CHECK) == 0 .and. FILTER_METHOD==0 ) THEN ! max_hrly: IF (TRIM(int_state%MICROPHYSICS) == 'fer') THEN ! CALL MAX_FIELDS(int_state%T,int_state%Q,int_state%U & ,int_state%V,int_state%CW & ,int_state%F_RAIN,int_state%F_ICE & ,int_state%F_RIMEF,int_state%Z & ,int_state%W_TOT,int_state%PINT & ,int_state%PD,int_state%PREC & ,int_state%CPRATE,int_state%HTOP & ,int_state%T2,int_state%U10,int_state%V10 & ,int_state%PSHLTR,int_state%TSHLTR & ,int_state%QSHLTR & ,int_state%SGML2,int_state%PSGML1 & ,int_state%REFDMAX,int_state%PRATEMAX & ,int_state%FPRATEMAX,int_state%SR & ,int_state%UPVVELMAX,int_state%DNVVELMAX & ,int_state%TLMAX,int_state%TLMIN & ,int_state%T02MAX,int_state%T02MIN & ,int_state%RH02MAX,int_state%RH02MIN & ,int_state%U10MAX,int_state%V10MAX & ,int_state%TH10,int_state%T10 & ,int_state%SPD10MAX,int_state%T10AVG & ,int_state%PSFCAVG & ,int_state%AKHS,int_state%AKMS & ,int_state%AKHSAVG,int_state%AKMSAVG & ,int_state%SNO,int_state%SNOAVG & ,int_state%UPHLMAX & ,int_state%DT,int_state%NPHS,int_state%NTSD & ,int_state%DXH,int_state%DYH & ,int_state%FIS & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDE,JDE & ,ITS_B1,ITE_B1,JTS_B1,JTE_B1 & ,LM,int_state%NCOUNT,int_state%FIRST_NMM & ,MY_DOMAIN_ID & ) ! ELSEIF (TRIM(int_state%MICROPHYSICS) == 'fer_hires') THEN max_hrly ! CALL MAX_FIELDS_HR(int_state%T,int_state%Q,int_state%U & ,int_state%V,int_state%CW & ,int_state%F_RAIN,int_state%F_ICE & ,int_state%F_RIMEF,int_state%Z & ,int_state%W_TOT,int_state%refl_10cm & ,int_state%PINT,int_state%PD,int_state%PREC & ,int_state%CPRATE,int_state%HTOP & ,int_state%T2,int_state%U10,int_state%V10 & ,int_state%PSHLTR,int_state%TSHLTR & ,int_state%QSHLTR & ,int_state%SGML2,int_state%PSGML1 & ,int_state%REFDMAX,int_state%PRATEMAX & ,int_state%FPRATEMAX,int_state%SR & ,int_state%UPVVELMAX,int_state%DNVVELMAX & ,int_state%TLMAX,int_state%TLMIN & ,int_state%T02MAX,int_state%T02MIN & ,int_state%RH02MAX,int_state%RH02MIN & ,int_state%U10MAX,int_state%V10MAX & ,int_state%TH10,int_state%T10 & ,int_state%SPD10MAX,int_state%T10AVG & ,int_state%PSFCAVG & ,int_state%AKHS,int_state%AKMS & ,int_state%AKHSAVG,int_state%AKMSAVG & ,int_state%SNO,int_state%SNOAVG & ,int_state%UPHLMAX & ,int_state%DT,int_state%NPHS,int_state%NTSD & ,int_state%DXH,int_state%DYH & ,int_state%FIS & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDE,JDE & ,ITS_B1,ITE_B1,JTS_B1,JTE_B1 & ,LM,int_state%NCOUNT,int_state%FIRST_NMM & ,MY_DOMAIN_ID & ) ! ELSEIF (TRIM(int_state%MICROPHYSICS) == 'wsm6') THEN max_hrly ! CALL MAX_FIELDS_W6(int_state%T,int_state%Q,int_state%U & ,int_state%V,int_state%Z,int_state%W_TOT & ,int_state%QR,int_state%QS,int_state%QG & ,int_state%PINT,int_state%PD,int_state%PREC & ,int_state%CPRATE,int_state%HTOP & ,int_state%T2,int_state%U10,int_state%V10 & ,int_state%PSHLTR,int_state%TSHLTR & ,int_state%QSHLTR & ,int_state%SGML2,int_state%PSGML1 & ,int_state%REFDMAX,int_state%PRATEMAX & ,int_state%FPRATEMAX,int_state%SR & ,int_state%UPVVELMAX,int_state%DNVVELMAX & ,int_state%TLMAX,int_state%TLMIN & ,int_state%T02MAX,int_state%T02MIN & ,int_state%RH02MAX,int_state%RH02MIN & ,int_state%U10MAX,int_state%V10MAX & ,int_state%TH10,int_state%T10 & ,int_state%SPD10MAX,int_state%T10AVG & ,int_state%PSFCAVG & ,int_state%AKHS,int_state%AKMS & ,int_state%AKHSAVG,int_state%AKMSAVG & ,int_state%SNO,int_state%SNOAVG & ,int_state%UPHLMAX & ,int_state%DT,int_state%NPHS,int_state%NTSD & ,int_state%DXH,int_state%DYH & ,int_state%FIS & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDE,JDE & ,ITS_B1,ITE_B1,JTS_B1,JTE_B1 & ,LM & ,int_state%NCOUNT,int_state%FIRST_NMM & ,MY_DOMAIN_ID & ) ! ELSEIF (TRIM(int_state%MICROPHYSICS) == 'thompson') THEN max_hrly ! CALL MAX_FIELDS_THO(int_state%T,int_state%Q,int_state%U & ,int_state%V,int_state%Z,int_state%W_TOT & ,int_state%refl_10cm & ,int_state%PINT,int_state%PD,int_state%PREC & ,int_state%CPRATE,int_state%HTOP & ,int_state%T2,int_state%U10,int_state%V10 & ,int_state%PSHLTR,int_state%TSHLTR & ,int_state%QSHLTR & ,int_state%SGML2,int_state%PSGML1 & ,int_state%REFDMAX,int_state%PRATEMAX & ,int_state%FPRATEMAX,int_state%SR & ,int_state%UPVVELMAX,int_state%DNVVELMAX & ,int_state%TLMAX,int_state%TLMIN & ,int_state%T02MAX,int_state%T02MIN & ,int_state%RH02MAX,int_state%RH02MIN & ,int_state%U10MAX,int_state%V10MAX & ,int_state%TH10,int_state%T10 & ,int_state%SPD10MAX,int_state%T10AVG & ,int_state%PSFCAVG & ,int_state%AKHS,int_state%AKMS & ,int_state%AKHSAVG,int_state%AKMSAVG & ,int_state%SNO,int_state%SNOAVG & ,int_state%UPHLMAX & ,int_state%DT,int_state%NPHS,int_state%NTSD & ,int_state%DXH,int_state%DYH & ,int_state%FIS & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDE,JDE & ,ITS_B1,ITE_B1,JTS_B1,JTE_B1 & ,LM & ,int_state%NCOUNT,int_state%FIRST_NMM & ,MY_DOMAIN_ID & ) ! ENDIF max_hrly ! ENDIF ! !----------------------------------------------------------------------- !*** Set logical switches for calling each of the Physics schemes. !----------------------------------------------------------------------- ! CALL_SHORTWAVE=MOD(NTIMESTEP_RAD,int_state%NRADS)==0 CALL_LONGWAVE=MOD(NTIMESTEP_RAD,int_state%NRADL)==0 CALL_TURBULENCE=MOD(NTIMESTEP,int_state%NPHS)==0 CALL_PRECIP=MOD(NTIMESTEP,NPRECIP)==0 ! !----------------------------------------------------------------------- !*** Update WATER array from CWM, F_ICE, F_RAIN for Ferrier !*** microphysics but only if any of the Physics subroutines !*** are called (subroutine UPDATE_WATER is after subroutine !*** PHYSICS_INITIALIZE in this module). ! !*** Expanded to also update CWM, F_ICE, F_RAIN, F_RIMEF for non-Ferrier !*** microphysics. !----------------------------------------------------------------------- ! update_wtr: IF((int_state%MICROPHYSICS=='fer' & .OR. & int_state%MICROPHYSICS=='fer_hires' & .OR. & int_state%MICROPHYSICS=='gfs' & .OR. & int_state%MICROPHYSICS=='wsm6' & .OR. & int_state%MICROPHYSICS=='thompson') & .AND. & (CALL_SHORTWAVE .OR. CALL_LONGWAVE .OR. & CALL_TURBULENCE .OR. CALL_PRECIP) ) THEN ! ! write(*,*) 'DEBUG-GT, now calling UPDATE_WATER' CALL UPDATE_WATER(int_state%CW & ,int_state%F_ICE & ,int_state%F_RAIN & ,int_state%F_RIMEF & ,int_state%T & ,int_state%QC & ,int_state%QR & ,int_state%QS & ,int_state%QI & ,int_state%QG & ,int_state%MICROPHYSICS & ,int_state%SPEC_ADV & ,NTIMESTEP & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) ! ENDIF update_wtr ! !--------------------------------------------------------------------- !*** Precipitation Adjustment !----------------------------------------------------------------------- ! !*** !*** Call READPCP to !*** 1) READ IN PRECIPITATION FOR HOURS 1, 2 and 3; !*** 2) Initialize DDATA to 999. (this is the amount !*** of input precip allocated to each physics time step !*** in ADJPPT; TURBL/SURFCE, which uses DDATA, is called !*** before ADJPPT) !*** 3) Initialize LSPA to zero !*** !----------------------------------------------------------------------- ! IF(int_state%NTSD==0)THEN IF(int_state%PCPFLG .and. FILTER_METHOD == 0)THEN CALL READPCP(MYPE,MPI_COMM_COMP & ,int_state%PPTDAT & ,int_state%DDATA & ,int_state%LSPA & ,int_state%PCPHR & ,MY_DOMAIN_ID & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE & ,ITS_B1,ITE_B1,JTS_B2,JTE_B2) ENDIF ENDIF ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** Call the individual physical processes. !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! !!! wang CHECK QC, QR QI, F_ICE F_RAIN to make sure all reasaonble !!! in some cases, after moving/interpolatioon, some very small values !(or negative) !IF(int_state%MY_DOMAIN_MOVES)THEN !! double correction IF(MOVE_NOW)THEN !! double correction write(0,*)'MOVE_NOW=',MOVE_NOW DO L=1,LM DO J=JMS,JME DO I=IMS,IME int_state%F_RAIN(I,J,L)=max(0.0,min(1.0,int_state%F_RAIN(I,J,L) ) ) int_state%F_ICE(I,J,L)=max(0.0,min(1.0,int_state%F_RAIN(I,J,L) ) ) int_state%F_RIMEF(I,J,L)=max(1.0, int_state%F_RIMEF(I,J,L) ) if ( int_state%MICROPHYSICS=='fer_hires' .or. & int_state%MICROPHYSICS=='fer' ) Then if( int_state%QC(I,J,L) < 1.0e-12) int_state%QC(I,J,L)=0.0 if( int_state%QR(I,J,L) < 1.0e-12) then int_state%QR(I,J,L)=0.0 int_state%F_RAIN(I,J,L)=0.0 endif if( int_state%QS(I,J,L) < 1.0e-12) then int_state%QS(I,J,L)=0.0 int_state%F_ICE(I,J,L)=0.0 int_state%F_RIMEF(I,J,L)=1.0 endif int_state%CW(I,J,L)=int_state%QC(I,J,L) + int_state%QR(I,J,L) + & int_state%QS(I,J,L) if( int_state%CW(I,J,L) < 1.0e-12) then int_state%CW(I,J,L)=0.0 int_state%F_RAIN(I,J,L)=0.0 int_state%F_ICE(I,J,L)=0.0 int_state%F_RIMEF(I,J,L)=1.0 else int_state%F_ICE(I,J,L)=int_state%QS(I,J,L)/int_state%CW(I,J,L) endif endif ! fer fer_hires if ( int_state%MICROPHYSICS=='wsm6') Then if( int_state%QR(I,J,L) < 1.0e-12) then int_state%QR(I,J,L)=0.0 int_state%F_RAIN(I,J,L)=0.0 endif if( int_state%QS(I,J,L) < 1.0e-12) int_state%QS(I,J,L)=0.0 if( int_state%QG(I,J,L) < 1.0e-12) int_state%QG(I,J,L)=0.0 if( int_state%QI(I,J,L) < 1.0e-12) int_state%QI(I,J,L)=0.0 if( int_state%QC(I,J,L) < 1.0e-12) int_state%QC(I,J,L)=0.0 if( int_state%QG(I,J,L) < 1.0e-12) int_state%F_RIMEF(I,J,L)=1.0 int_state%CW(I,J,L)=int_state%QC(I,J,L) + int_state%QR(I,J,L) + & int_state%QI(I,J,L)+int_state%QS(I,J,L)+int_state%QG(I,J,L) if( int_state%CW(I,J,L) < 1.0e-12) then int_state%CW(I,J,L)=0.0 int_state%F_RAIN(I,J,L)=0.0 int_state%F_ICE(I,J,L)=0.0 int_state%F_RIMEF(I,J,L)=1.0 else int_state%F_ICE(I,J,L)= & (int_state%QI(I,J,L)+int_state%QS(I,J,L)+int_state%QG(I,J,L)) & /int_state%CW(I,J,L) endif endif ! wsm6 ENDDO ENDDO ENDDO ENDIF ! if moving double correction/check !!wang !! 2019-10-24 !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** Radiation !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! !*** Radiation needs some specific time quantities. Use NTIMESTEP_rad !*** for the next time step ahead of the current time so that the !*** radiation fields can be updated prior to being written to !*** output (BSF 10/6/2010). ! CALL TIME_MEASURE(START_YEAR,START_MONTH,START_DAY,START_HOUR & ,START_MINUTE,START_SECOND & ,NTIMESTEP_rad,int_state%DT & ,JULDAY,JULYR,JULIAN,XTIME) ! !----------------------------------------------------------------------- radiatn: IF(CALL_SHORTWAVE.OR.CALL_LONGWAVE)THEN !----------------------------------------------------------------------- ! btim=timef() ! write(*,*) 'DEBUG-GT, now calling RADIATION ', btim ! !----------------------------------------------------------------------- !*** Temporary switch between radiation schemes placed in SOLVER_RUN !*** rather than inside RADIATION_DRIVER (will be done later) !----------------------------------------------------------------------- ! CALL ESMF_ClockGet(clock =CLOCK_ATM & !<-- The ESMF Clock ,startTime =STARTTIME & !<-- The start time (ESMF) on the clock ,currTime =CURRTIME & !<-- The current time (ESMF) on the clock ,rc =RC) ! CALL ESMF_TimeGet(time=STARTTIME & !<-- The start forecast time (ESMF) ,yy =IDAT(1) & !<-- The start forecast year (integer) ,mm =IDAT(2) & !<-- The start forecast month (integer) ,dd =IDAT(3) & !<-- The start forecast day (integer) ,h =IDAT(5) & !<-- The start forecast hour (integer) ,m =IDAT(6) & !<-- The start forecast minute (integer) ,s =IDAT(7) & !<-- The start forecast second (integer) ,rc =RC) IDAT(4)=0 IDAT(8)=0 ! CALL ESMF_TimeGet(time=CURRTIME & !<-- The cuurent forecast time (ESMF) ,yy =JDAT(1) & !<-- The current forecast year (integer) ,mm =JDAT(2) & !<-- The current forecast month (integer) ,dd =JDAT(3) & !<-- The current forecast day (integer) ,h =JDAT(5) & !<-- The current forecast hour (integer) ,m =JDAT(6) & !<-- The current forecast minute (integer) ,s =JDAT(7) & !<-- The current forecast second (integer) ,rc =RC) JDAT(4)=0 JDAT(8)=0 ! CALL RADIATION(NTIMESTEP_RAD & ,int_state%DT,JULDAY,JULYR,XTIME,JULIAN & ,START_HOUR,int_state%NPHS & ,int_state%GLAT,int_state%GLON & ,int_state%NRADS,int_state%NRADL & ,int_state%DSG2,int_state%SGML2,int_state%SG2 & ,int_state%PDSG1,int_state%PSGML1 & ,int_state%PSG1 & ,int_state%PT,int_state%PD & ,int_state%T,int_state%Q & ,int_state%THS,int_state%ALBEDO & ,int_state%QC,int_state%QR & ,int_state%QI,int_state%QS,int_state%QG & ,int_state%NI & ,int_state%F_QC,int_state%F_QR & ,int_state%F_QI,int_state%F_QS,int_state%F_QG & ,int_state%F_NI & ,int_state%NUM_WATER & ,int_state%SM,int_state%CLDFRA & ,int_state%RLWTT,int_state%RSWTT & ,int_state%RLWIN,int_state%RSWIN & ,int_state%RSWINC,int_state%RSWOUT & ,int_state%RLWTOA,int_state%RSWTOA & ,int_state%CZMEAN,int_state%SIGT4 & ,int_state%CFRACL,int_state%CFRACM & ,int_state%CFRACH & ,int_state%ACFRST,int_state%NCFRST & ,int_state%ACFRCV,int_state%NCFRCV & ,int_state%CUPPT,int_state%SNO & ,int_state%HTOP,int_state%HBOT & ,int_state%SHORTWAVE,int_state%LONGWAVE & ,int_state%CLDFRACTION & ,int_state%DYH & !---- RRTM part --------------------------------------------------------- ,int_state%DT_INT,JDAT & ,int_state%CW,int_state%O3 & ,int_state%F_ICE,int_state%F_RAIN & ,int_state%F_RIMEF & ,int_state%SI,int_state%TSKIN & ,int_state%Z0,int_state%SICE & ,int_state%MXSNAL,int_state%SGM & ,int_state%STDH,int_state%OMGALF & ,int_state%SNOWC & !------------------------------------------------------------------------ ,LM) ! td%radiation_tim=td%radiation_tim+(timef()-btim) ! ENDIF radiatn ! !----------------------------------------------------------------------- !*** Empty the ACFRST and ACFRCV accumulation arrays if it is time !*** to do so prior to their being updated by the radiation. !----------------------------------------------------------------------- ! IF(MOD(NTIMESTEP,int_state%NCLOD)==0)THEN DO J=JTS,JTE DO I=ITS,ITE int_state%ACFRST(I,J)=0. int_state%ACFRCV(I,J)=0. int_state%NCFRST(I,J)=0 int_state%NCFRCV(I,J)=0 ENDDO ENDDO ENDIF ! !----------------------------------------------------------------------- !*** Update the temperature with the radiative tendency. !----------------------------------------------------------------------- ! btim=timef() ! CALL RDTEMP(NTIMESTEP,int_state%DT,JULDAY,JULYR,START_HOUR & ,int_state%GLAT,int_state%GLON & ,int_state%CZEN,int_state%CZMEAN,int_state%T & ,int_state%RSWTT,int_state%RLWTT & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE & ,ITS_B1,ITE_B1,JTS_B1,JTE_B1) ! td%rdtemp_tim=td%rdtemp_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Poles and East-West boundary. !----------------------------------------------------------------------- ! IF(int_state%GLOBAL)THEN btim=timef() ! CALL SWAPHN(int_state%RSWIN,IMS,IME,JMS,JME,1,int_state%INPES) CALL POLEHN(int_state%RSWIN,IMS,IME,JMS,JME,1 & ,int_state%INPES,int_state%JNPES) ! CALL SWAPHN(int_state%T,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%T,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! td%pole_swap_tim=td%pole_swap_tim+(timef()-btim) ENDIF ! !----------------------------------------------------------------------- !*** Empty the accumulators of sfc energy flux and sfc hydrology if !*** it is time to do so prior to their being updated by turbulence. !----------------------------------------------------------------------- ! IF(MOD(NTIMESTEP,int_state%NRDLW)==0)THEN DO J=JTS,JTE DO I=ITS,ITE int_state%ALWIN(I,J) =0. int_state%ALWOUT(I,J)=0. int_state%ALWTOA(I,J)=0. int_state%ARDLW(I,J) =0. !<-- An artificial 2-D array ! (ESMF cannot have an evolving scalar Attribute) ENDDO ENDDO ENDIF ! IF(MOD(NTIMESTEP,int_state%NRDSW)==0)THEN DO J=JTS,JTE DO I=ITS,ITE int_state%ASWIN(I,J)=0. int_state%ASWOUT(I,J)=0. int_state%ASWTOA(I,J)=0. int_state%ARDSW(I,J) =0. !<-- An artificial 2-D array ! (ESMF cannot have an evolving scalar Attribute) ENDDO ENDDO ENDIF ! IF(MOD(NTIMESTEP,int_state%NSRFC)==0)THEN DO J=JTS,JTE DO I=ITS,ITE int_state%SFCSHX(I,J)=0. int_state%SFCLHX(I,J)=0. int_state%SUBSHX(I,J)=0. int_state%SNOPCX(I,J)=0. int_state%POTFLX(I,J)=0. int_state%ASRFC(I,J) =0. !<-- An artificial 2-D array ! (ESMF cannot have an evolving scalar Attribute) ENDDO ENDDO ENDIF ! IF(MOD(NTIMESTEP,int_state%NPREC)==0)THEN DO J=JTS,JTE DO I=ITS,ITE int_state%ACSNOW(I,J)=0. int_state%ACSNOM(I,J)=0. int_state%SSROFF(I,J)=0. int_state%BGROFF(I,J)=0. int_state%SFCEVP(I,J)=0. int_state%POTEVP(I,J)=0. ENDDO ENDDO ENDIF ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** Get SST from coupled ocean (HYCOM) !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! CALL ATM_GETSST(mype,num_pes,mpi_comm_comp,int_state%SST,int_state%SM) ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** Turbulence, Sfc Layer, and Land Surface !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! turbulence: IF(CALL_TURBULENCE)THEN ! btim=timef() ! write(*,*) 'DEBUG-GT, now calling TURBL ', btim ! DO L=1,NUM_SOIL_LAYERS DZSOIL(L)=SLDPTH(L) ENDDO ! IF(int_state%PCPFLG .and. FILTER_METHOD == 0)THEN LOC_PCPFLG=int_state%PCPFLG ELSE LOC_PCPFLG=.FALSE. ENDIF ! CALL TURBL(NTIMESTEP,int_state%DT,int_state%NPHS & ,NUM_SOIL_LAYERS,SLDPTH,DZSOIL & ,int_state%DSG2,int_state%SGML2,int_state%SG2 & ,int_state%PDSG1,int_state%PSGML1,int_state%PSG1,PT & ,int_state%EPSL,int_state%EPSQ2 & ,int_state%SM,int_state%CZEN,int_state%CZMEAN & ,int_state%SIGT4,int_state%RLWIN,int_state%RSWIN & ,int_state%RADOT & ,int_state%RLWTT,int_state%RSWTT & ,int_state%PD,int_state%T & ,int_state%Q,int_state%CW & ,int_state%F_ICE,int_state%F_RAIN,int_state%F_RIMEF & ,int_state%SR,int_state%Q2,int_state%U,int_state%V & ,int_state%DUDT,int_state%DVDT & ,int_state%THS,int_state%TSKIN,int_state%SST & ,int_state%PREC,int_state%SNO & ,int_state%SNOWC & ,int_state%QC,int_state%QR & ,int_state%QI,int_state%QS,int_state%QG & ,int_state%F_QC,int_state%F_QR & ,int_state%F_QI,int_state%F_QS,int_state%F_QG & ,int_state%FIS,int_state%Z0,int_state%Z0BASE & ,int_state%USTAR,int_state%PBLH,int_state%LPBL & ,int_state%XLEN_MIX,int_state%RMOL & ,int_state%EXCH_H,int_state%AKHS,int_state%AKMS & ,int_state%AKHS_OUT,int_state%AKMS_OUT & ,int_state%THZ0,int_state%QZ0 & ,int_state%UZ0,int_state%VZ0 & ,int_state%QSH,int_state%MAVAIL & ,int_state%STC,int_state%SMC,int_state%CMC & ,int_state%SMSTAV,int_state%SMSTOT & ,int_state%SSROFF,int_state%BGROFF & ,int_state%IVGTYP,int_state%ISLTYP,int_state%VEGFRC & ,int_state%GRNFLX & ,int_state%SFCEXC,int_state%ACSNOW,int_state%ACSNOM & ,int_state%SNOPCX,int_state%SICE & ,int_state%TG,int_state%SOILTB & ,int_state%ALBASE,int_state%MXSNAL,int_state%ALBEDO & ,int_state%SH2O,int_state%SI,int_state%EPSR & ,int_state%U10,int_state%V10 & ,int_state%TH10,int_state%Q10 & ,int_state%TSHLTR,int_state%QSHLTR,int_state%PSHLTR & ,int_state%PSFC,int_state%T2 & ,int_state%TWBS,int_state%QWBS & ,int_state%SFCSHX,int_state%SFCLHX,int_state%SFCEVP & ,int_state%POTEVP,int_state%POTFLX,int_state%SUBSHX & ,int_state%APHTIM & ,int_state%ARDSW,int_state%ARDLW & ,int_state%ASRFC & ,int_state%CROT,int_state%SROT,int_state%MIXHT & ,int_state%TAUX,int_state%TAUY & ,int_state%HSTDV,int_state%HCNVX,int_state%HASYW & ,int_state%HASYS,int_state%HASYSW,int_state%HASYNW & ,int_state%HLENW,int_state%HLENS,int_state%HLENSW & ,int_state%HLENNW,int_state%HANGL,int_state%HANIS & ,int_state%HSLOP,int_state%HZMAX & ,int_state%CDMB,int_state%CLEFF,int_state%SIGFAC & ,int_state%FACTOP,int_state%RLOLEV & ,int_state%DPMIN & ,int_state%RSWOUT,int_state%RSWTOA,int_state%RLWTOA & ,int_state%ASWIN,int_state%ASWOUT,int_state%ASWTOA & ,int_state%ALWIN,int_state%ALWOUT,int_state%ALWTOA & ,int_state%GWDFLG,LOC_PCPFLG & ,int_state%DDATA,int_state%UCMCALL,int_state%IVEGSRC& ,int_state%TURBULENCE,int_state%SFC_LAYER & ,int_state%LAND_SURFACE & ,int_state%MICROPHYSICS & ,int_state%LISS_RESTART & ,int_state%GLOBAL & !!! HURRICANE PBL/SFCLAY ,int_state%VAR_RIC,int_state%COEF_RIC_L & ,int_state%COEF_RIC_S,int_state%DISHEAT & ,int_state%ALPHA,int_state%SFENTH & ,int_state%ICOEF_SF & ,int_state%R_SEED & ,int_state%PERT_HPBL & ,int_state%PERT_Z0 & !!! HURRICANE ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) ! td%turbl_tim=td%turbl_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Exchange wind tendencies. !----------------------------------------------------------------------- ! btim=timef() ! CALL HALO_EXCH(int_state%DUDT,LM,int_state%DVDT,LM,1,1) ! td%exch_phy=td%exch_phy+(timef()-btim) ! !----------------------------------------------------------------------- !*** Now interpolate wind tendencies from H to V points. !----------------------------------------------------------------------- ! btim=timef() ! CALL H_TO_V_TEND(int_state%DUDT,int_state%DT,int_state%NPHS,LM & ,int_state%U) CALL H_TO_V_TEND(int_state%DVDT,int_state%DT,int_state%NPHS,LM & ,int_state%V) ! td%h_to_v_tim=td%h_to_v_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Poles and East-West boundary. !----------------------------------------------------------------------- ! IF(int_state%GLOBAL)THEN btim=timef() ! CALL SWAPHN(int_state%T,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%T,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! CALL SWAPHN(int_state%Q,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%Q,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! CALL SWAPHN(int_state%CW,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%CW,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! CALL SWAPHN(int_state%Q2,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%Q2,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! CALL SWAPWN(int_state%U,IMS,IME,JMS,JME,LM,int_state%INPES) CALL SWAPWN(int_state%V,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEWN(int_state%U,int_state%V,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! td%pole_swap_tim=td%pole_swap_tim+(timef()-btim) ENDIF ! !----------------------------------------------------------------------- !*** Exchange wind components and TKE. !----------------------------------------------------------------------- ! btim=timef() ! CALL HALO_EXCH(int_state%U,LM,int_state%V,LM & ,2,2) ! CALL HALO_EXCH(int_state%UZ0,1,int_state%VZ0,1 & ,int_state%Q2,LM & ,1,1) ! !----------------------------------------------------------------------- !*** Exchange other variables that are needed for parents' !*** interpolations to interior points of moving nests. !----------------------------------------------------------------------- ! CALL HALO_EXCH(int_state%ALBEDO,1 & ,int_state%EPSR,1 & ,int_state%QSH,1 & ,int_state%QWBS,1,1,1) CALL HALO_EXCH(int_state%QZ0,1 & ,int_state%SOILTB,1 & ,int_state%THS,1 & ,int_state%THZ0,1,1,1) CALL HALO_EXCH(int_state%USTAR,1 & ,int_state%UZ0,1 & ,int_state%VZ0,1 & ,int_state%Z0,1,1,1) CALL HALO_EXCH(int_state%TSKIN,1 & ,int_state%CMC,1,1,1) CALL HALO_EXCH(int_state%SMC,NUM_SOIL_LAYERS & ,int_state%SH2O,NUM_SOIL_LAYERS & ,int_state%STC,NUM_SOIL_LAYERS,1,1) ! td%exch_phy=td%exch_phy+(timef()-btim) ! !----------------------------------------------------------------------- ! ENDIF turbulence ! !----------------------------------------------------------------------- !*** Empty the accumulators of precipitation and latent heating if is !*** is time prior to their being updated by convection/microphysics. !----------------------------------------------------------------------- ! IF(MOD(NTIMESTEP,int_state%NPREC)==0)THEN DO J=JTS,JTE DO I=ITS,ITE int_state%ACPREC(I,J)=0. int_state%CUPREC(I,J)=0. ENDDO ENDDO ENDIF ! IF(MOD(NTIMESTEP,int_state%NHEAT)==0)THEN DO J=JTS,JTE DO I=ITS,ITE int_state%AVCNVC(I,J)=0. !- was a scalar, now 2D for ESMF int_state%AVRAIN(I,J)=0. !- was a scalar, now 2D for ESMF ENDDO ENDDO ! DO L=1,LM DO J=JTS,JTE DO I=ITS,ITE int_state%TRAIN(I,J,L)=0. int_state%TCUCN(I,J,L)=0. do KK=1,int_state%d_ss int_state%MPRATES(I,J,L,KK)=0. enddo ENDDO ENDDO ENDDO ENDIF !-- IF(MOD(NTSD_BUCKET,NHEAT)==0)THEN ! !----------------------------------------------------------------------- !*** 1 of 3 calls to CLTEND, save Told array before convection & microphysics !----------------------------------------------------------------------- ! cld_tend1: IF(CALL_PRECIP .AND. int_state%NPRECIP>1) THEN btim=timef() ICLTEND=-1 CALL CLTEND(ICLTEND,int_state%NPRECIP,int_state%T & ,int_state%Told,int_state%Tadj & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) td%cltend_tim=td%cltend_tim+(timef()-btim) ENDIF cld_tend1 ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** Convection !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! convection: IF(CALL_PRECIP.AND.int_state%CONVECTION/='none')THEN ! btim=timef() ! write(*,*) 'DEBUG-GT, now calling CUCNVC ', btim ! !----------------------------------------------------------------------- IF(int_state%CONVECTION=='bmj' .OR. & int_state%CONVECTION=='sas' .OR. & int_state%CONVECTION=='scalecu' .OR. & int_state%CONVECTION=='sashur') THEN ! CALL CUCNVC(NTIMESTEP,int_state%DT,int_state%NPRECIP & ,int_state%NRADS,int_state%NRADL & ,int_state%MINUTES_HISTORY & ,int_state%ENTRAIN,int_state%NEWALL & ,int_state%NEWSWAP,int_state%NEWUPUP & ,int_state%NODEEP & ,int_state%FRES,int_state%FR & ,int_state%FSL,int_state%FSS & ,int_state%DYH,int_state%RESTART,int_state%HYDRO & ,int_state%CLDEFI & ,int_state%F_ICE,int_state%F_RAIN & ,int_state%QC,int_state%QR & ,int_state%QI,int_state%QS,int_state%QG & ,int_state%F_QC,int_state%F_QR & ,int_state%F_QI,int_state%F_QS,int_state%F_QG & ,int_state%DSG2,int_state%SGML2,int_state%SG2 & ,int_state%PDSG1,int_state%PSGML1,int_state%PSG1 & ,int_state%DXH & ,int_state%PT,int_state%PD & ,int_state%T,int_state%Q & ,int_state%CW,int_state%TCUCN & ,int_state%OMGALF & ,int_state%U,int_state%V & ,int_state%FIS,int_state%W0AVG & ,int_state%PREC,int_state%ACPREC & ,int_state%CUPREC,int_state%ACPREC_TOT & ,int_state%CUPPT,int_state%CPRATE & ,int_state%CNVBOT,int_state%CNVTOP & ,int_state%SM,int_state%LPBL & ,int_state%HTOP,int_state%HTOPD,int_state%HTOPS & ,int_state%HBOT,int_state%HBOTD,int_state%HBOTS & ,int_state%AVCNVC,int_state%ACUTIM & ,int_state%RSWIN,int_state%RSWOUT & ,int_state%CONVECTION,int_state%CU_PHYSICS & ,int_state%MICROPHYSICS & ,int_state%SICE,int_state%QWBS,int_state%TWBS & ,int_state%PBLH,int_state%DUDT,int_state%DVDT & !!! added for SAS-hurricane ,int_state%SAS_MOMMIX,int_state%SAS_PGCON & !hwrf,namelist ,int_state%SAS_MASS_FLUX & !hwrf,namelist ,int_state%SAS_SHALCONV,int_state%SAS_SHAL_PGCON & !hwrf,namelist ,int_state%W_TOT,int_state%PSGDT & ,int_state%R_SEED & !namelist ,int_state%PERT_SAS & !namelist !!! SAS-huricane ,A2,A3,A4,CAPPA,CP,ELIV,ELWV,EPSQ,G & ,P608,PQ0,R_D,TIW & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE & ,ITS_B1,ITE_B1,JTS_B1,JTE_B1) ! ELSE ! ! write(0,*)' Invalid selection for convection scheme' STOP ! ENDIF ! td%cucnvc_tim=td%cucnvc_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Poles and East-West boundary. !----------------------------------------------------------------------- ! IF(int_state%GLOBAL)THEN btim=timef() ! CALL SWAPHN(int_state%T,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%T,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! CALL SWAPHN(int_state%Q,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%Q,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! td%pole_swap_tim=td%pole_swap_tim+(timef()-btim) ENDIF ! !----------------------------------------------------------------------- !*** Exchange wind tendencies for SAS and bmj schemes. !----------------------------------------------------------------------- ! wind: IF (int_state%CONVECTION=='sas' .or. & int_state%CONVECTION=='sashur' .OR. & !wang 20180719 int_state%CONVECTION=='scalecu' .OR. & !wang 20180719 int_state%CONVECTION=='bmj') THEN !zj ! !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%DUDT,LM,int_state%DVDT,LM,1,1) td%exch_phy=td%exch_phy+(timef()-btim) ! !----------------------------------------------------------------------- !*** Now interpolate wind tendencies from H to V points. !----------------------------------------------------------------------- ! btim=timef() CALL H_TO_V_TEND(int_state%DUDT,int_state%DT & ,int_state%NPRECIP,LM & ,int_state%U) CALL H_TO_V_TEND(int_state%DVDT,int_state%DT & ,int_state%NPRECIP,LM & ,int_state%V) td%h_to_v_tim=td%h_to_v_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** Poles and East-West boundary. !----------------------------------------------------------------------- ! IF(int_state%GLOBAL)THEN btim=timef() ! CALL SWAPWN(int_state%U,IMS,IME,JMS,JME,LM & ,int_state%INPES) CALL SWAPWN(int_state%V,IMS,IME,JMS,JME,LM & ,int_state%INPES) CALL POLEWN(int_state%U,int_state%V,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! td%pole_swap_tim=td%pole_swap_tim+(timef()-btim) ENDIF ! !----------------------------------------------------------------------- !*** Exchange wind components. !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%U,LM,int_state%V,LM & ,2,2) td%exch_phy=td%exch_phy+(timef()-btim) ! !----------------------------------------------------------------------- ! ENDIF wind ! !----------------------------------------------------------------------- ! ENDIF convection ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !*** Microphysics !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! microphysics: IF(CALL_PRECIP)THEN ! btim=timef() ! write(*,*) 'DEBUG-GT, now calling GSMDRIVE ', btim ! CALL GSMDRIVE(NTIMESTEP,int_state%DT & ,NPRECIP & ,int_state%DXH(JC),int_state%DYH & ,int_state%SM,int_state%FIS & ,int_state%DSG2,int_state%SGML2 & ,int_state%PDSG1,int_state%PSGML1 & ,int_state%PT,int_state%PD & ,int_state%T,int_state%Q & ,int_state%CW,int_state%OMGALF & ,int_state%TRAIN,int_state%SR & ,int_state%F_ICE,int_state%F_RAIN,int_state%F_RIMEF & ,int_state%QC,int_state%QR & ,int_state%QI,int_state%QS,int_state%QG & ,int_state%NI,int_state%NR & ! G. Thompson ,int_state%F_QC,int_state%F_QR & ,int_state%F_QI,int_state%F_QS,int_state%F_QG & ,int_state%F_NI,int_state%F_NR & ! G. Thompson ,int_state%PREC,int_state%ACPREC & ,int_state%AVRAIN,int_state%ACPREC_TOT & ,int_state%acpcp_ra,int_state%acpcp_sn,int_state%acpcp_gr & ! G. Thompson ,int_state%refl_10cm & ! G. Thompson ,int_state%re_cloud,int_state%re_ice,int_state%re_snow & ! G. Thompson ,int_state%has_reqc,int_state%has_reqi,int_state%has_reqs & ! G. Thompson ,int_state%MP_RESTART_STATE & ,int_state%TBPVS_STATE,int_state%TBPVS0_STATE & ,int_state%SPECIFIED,int_state%NESTED & ,int_state%MICROPHYSICS & ,int_state%RHGRD & ! fer_hires only ,int_state%TP1 & !gfs mod-brad ,int_state%QP1 & !gfs mod-brad ,int_state%PSP1 & !gfs mod-brad ,USE_RADAR & ,int_state%DFI_TTEN & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE & ,ITS_B1,ITE_B1,JTS_B1,JTE_B1,int_state%MPRATES & ,int_state%D_SS) ! td%gsmdrive_tim=td%gsmdrive_tim+(timef()-btim) ! !----------------------------------------------------------------------- !*** 2 of 3 calls to CLTEND, calculate Tadj and replace T with Told !----------------------------------------------------------------------- ! cld_tend2: IF(int_state%NPRECIP>1) THEN btim=timef() ICLTEND=0 CALL CLTEND(ICLTEND,int_state%NPRECIP,int_state%T & ,int_state%Told,int_state%Tadj & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) td%cltend_tim=td%cltend_tim+(timef()-btim) ENDIF cld_tend2 ! !----------------------------------------------------------------------- !*** Precipitation Assimilation !----------------------------------------------------------------------- ! IF (int_state%PCPFLG .and. FILTER_METHOD == 0) THEN ! btim=timef() CALL CHKSNOW(MYPE & ,int_state%NTSD & ,int_state%DT & ,int_state%NPHS & ,int_state%SR & ,int_state%PPTDAT & ,int_state%PCPHR & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE & ,ITS_B1,ITE_B1,JTS_B2,JTE_B2) ! CALL ADJPPT(MYPE & ,int_state%NTSD & ,int_state%DT & ,int_state%NPHS & ,int_state%PREC & ,int_state%LSPA & ,int_state%PPTDAT & ,int_state%DDATA & ,int_state%PCPHR & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE & ,ITS_B1,ITE_B1,JTS_B2,JTE_B2) ! td%adjppt_tim=td%adjppt_tim+(timef()-btim) ! ENDIF ! !----------------------------------------------------------------------- !*** Poles and East-West boundary. !----------------------------------------------------------------------- ! IF(int_state%GLOBAL)THEN btim=timef() ! !bsf: Apply these after last (3rd) call to CLTEND below ! ! CALL SWAPHN(int_state%T,IMS,IME,JMS,JME,LM,int_state%INPES) ! CALL POLEHN(int_state%T,IMS,IME,JMS,JME,LM & ! ,int_state%INPES,int_state%JNPES) ! CALL SWAPHN(int_state%Q,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%Q,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! CALL SWAPHN(int_state%CW,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%CW,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) ! td%pole_swap_tim=td%pole_swap_tim+(timef()-btim) ENDIF ! !----------------------------------------------------------------------- ! ENDIF microphysics ! !----------------------------------------------------------------------- !*** 3 of 3 calls to CLTEND, incremental updates of T using Told & Tadj !----------------------------------------------------------------------- ! cld_tend3: IF(int_state%NPRECIP>1) THEN btim=timef() ICLTEND=1 CALL CLTEND(ICLTEND,int_state%NPRECIP,int_state%T & ,int_state%Told,int_state%Tadj & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) td%cltend_tim=td%cltend_tim+(timef()-btim) ENDIF cld_tend3 ! !----------------------------------------------------------------------- !*** Prevent supersaturation w/r/t water and smooth temperature profiles ! if lapse rates are steeper than dry adiabatic above lowest levels. !----------------------------------------------------------------------- ! btim=timef() CALL TQADJUST(int_state%T,int_state%Q,int_state%QC & ,int_state%CW,int_state%F_ICE,int_state%F_RAIN & ,int_state%PD,int_state%DSG2,int_state%PDSG1 & ,int_state%PSGML1,int_state%SGML2 & ,int_state%SPEC_ADV,int_state%RHGRD & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) td%tqadjust_tim=td%tqadjust_tim+(timef()-btim) ! !bsf: Call SWAPHN & POLEHN for temperature here after temperature update ! IF(int_state%GLOBAL)THEN btim=timef() ! CALL SWAPHN(int_state%T,IMS,IME,JMS,JME,LM,int_state%INPES) CALL POLEHN(int_state%T,IMS,IME,JMS,JME,LM & ,int_state%INPES,int_state%JNPES) td%pole_swap_tim=td%pole_swap_tim+(timef()-btim) ENDIF ! !----------------------------------------------------------------------- !*** Exchange T, Q, CW now every timestep; also QC for species advection !----------------------------------------------------------------------- ! btim=timef() CALL HALO_EXCH(int_state%T,LM,2,2) CALL HALO_EXCH(int_state%Q,LM,int_state%CW,LM,2,2) IF(int_state%SPEC_ADV) THEN CALL HALO_EXCH(int_state%QC,LM,2,2) ! !----------------------------------------------------------------------- !*** Exchange various cloud species for separate species advection !----------------------------------------------------------------------- ! IF(CALL_PRECIP .OR. CALL_TURBULENCE) THEN IF(int_state%F_QR) CALL HALO_EXCH(int_state%QR,LM,2,2) IF(int_state%F_QS) CALL HALO_EXCH(int_state%QS,LM,2,2) IF(int_state%F_QI) CALL HALO_EXCH(int_state%QI,LM,2,2) IF(int_state%F_QG) CALL HALO_EXCH(int_state%QG,LM,2,2) IF(int_state%F_NI) CALL HALO_EXCH(int_state%NI,LM,2,2) IF(int_state%F_NR) CALL HALO_EXCH(int_state%NR,LM,2,2) ENDIF ENDIF td%exch_phy=td%exch_phy+(timef()-btim) ! !----------------------------------------------------------------------- !*** ATMOSPHERIC MODEL OUTPUTS FOR COUPLER !----------------------------------------------------------------------- !-- int_state%TWBS : surface sensible heat flux, positive downward (w/m2) !-- int_state%QWBS : surface latent heat flux, positive downward (w/m2) !-- int_state%RLWIN : downward long wave flux at ground surface,positive downward (w/m2) !-- int_state%RSWIN : downward short wave flux at ground surface, positive downward (w/m2) !-- int_state%RADOT : outgoing long wave flux at ground surface, positive upward (w/m2) !-- int_state%RSWOUT: outgoing short wave flux at ground surface, positive upward (w/m2) !-- int_state%TAUX : x component of surface stress, int_state%u positive Eastward !-- int_state%TAUY : y component of surface stress, int_state%v positive Northward !-- int_state%PINT : 3d array of interface pressure (pascals) !-- int_state%PREC : int_state%prec (m/timestep) !----------------------------------------------------------------------- ! CALL ATM_DOFLUXES(int_state%TWBS & ,int_state%QWBS & ,int_state%RLWIN & ,int_state%RSWIN & ,int_state%RADOT & ,int_state%RSWOUT & ,int_state%TAUX & ,int_state%TAUY & ,int_state%PINT & ,int_state%PREC & ,int_state%U10 & ,int_state%V10 ) IF(CALL_PRECIP .OR. CALL_TURBULENCE) THEN IF(int_state%F_QR) CALL HALO_EXCH(int_state%QR,LM,2,2) IF(int_state%F_QS) CALL HALO_EXCH(int_state%QS,LM,2,2) IF(int_state%F_QI) CALL HALO_EXCH(int_state%QI,LM,2,2) IF(int_state%F_QG) CALL HALO_EXCH(int_state%QG,LM,2,2) IF(int_state%F_NI) CALL HALO_EXCH(int_state%NI,LM,2,2) IF(int_state%F_NR) CALL HALO_EXCH(int_state%NR,LM,2,2) ENDIF td%exch_phy=td%exch_phy+(timef()-btim) ! !----------------------------------------------------------------------- !*** ACCUMULATED ATMOSPHERIC MODEL FLUXES FOR DMITRYs COUPLER !----------------------------------------------------------------------- ! CALL ATM_SENDFLUXES(mype,num_pes,mpi_comm_comp) ! !----------------------------------------------------------------------- !*** NOTE: The Physics export state is fully updated now !*** because subroutine PHY_INITIALIZE inserted the !*** appropriate ESMF Fields into it. Those Fields !*** contain pointers to the actual data and those !*** pointers are never re-directed. !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! ELSE gfs_phys_test !<-- Use GFS physics package WRITE(0,*)'Init of GFS phys in NMMB disabled, 20140812, jm' CALL ESMF_FINALIZE(endflag=ESMF_END_ABORT & ,rc =RC) ENDIF gfs_phys_test ! !----------------------------------------------------------------------- !*** Write precipitation files for ADJPPT regression test !----------------------------------------------------------------------- ! IF( int_state%WRITE_PREC_ADJ .AND. & MOD(XTIME,60.) <= 0.001 .AND. & INT(XTIME/60.) <= int_state%PCPHR ) THEN CALL WRT_PCP(int_state%PREC & ,MYPE,NUM_PES,MPI_COMM_COMP,MY_DOMAIN_ID & ,INT(XTIME/60.)+1 & ,IDS,IDE,JDS,JDE & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) ENDIF ! ENDIF physics ! !----------------------------------------------------------------------- !*** Run the tracker !----------------------------------------------------------------------- ! IF(int_state%NTRACK>0 .AND. int_state%MYPE<int_state%NUM_PES .and. & (int_state%NTSD==0 .or. & MOD(int_state%NTSD+1,int_state%NTRACK*int_state%NPHS)==0)) THEN CALL QUASIPOST(INT_STATE) CALL TRACKER_CENTER(INT_STATE) ENDIF ! !----------------------------------------------------------------------- !*** Populate SWATH arrays every FREQ_SWATH seconds (1hr or 30min) !*** and write file at the end of the forecast. !*** Only for domains 2 and 3. !----------------------------------------------------------------------- ! IF(MY_DOMAIN_ID==2) THEN ! IF(MOD(NTIMESTEP*int_state%DT,FREQ_SWATH)==0) THEN NSWTH(MY_DOMAIN_ID)=NSWTH(MY_DOMAIN_ID)+1 DO J=JTS,JTE DO I=ITS,ITE GLAT_SWATH_2(I,J,NSWTH(MY_DOMAIN_ID))=int_state%GLAT(I,J) GLON_SWATH_2(I,J,NSWTH(MY_DOMAIN_ID))=int_state%GLON(I,J) PREC_SWATH_2(I,J,NSWTH(MY_DOMAIN_ID))=int_state%ACPREC_TOT(I,J) W10M_SWATH_2(I,J,NSWTH(MY_DOMAIN_ID))=SQRT(int_state%U10(I,J)*int_state%U10(I,J) & +int_state%V10(I,J)*int_state%V10(I,J)) ENDDO ENDDO ENDIF ! IF(NTIMESTEP==int_state%NTSTM-2) THEN NSWTH(MY_DOMAIN_ID)=NSWTH(MY_DOMAIN_ID)+1 DO J=JTS,JTE DO I=ITS,ITE GLAT_SWATH_2(I,J,NSWTH(MY_DOMAIN_ID))=int_state%GLAT(I,J) GLON_SWATH_2(I,J,NSWTH(MY_DOMAIN_ID))=int_state%GLON(I,J) PREC_SWATH_2(I,J,NSWTH(MY_DOMAIN_ID))=int_state%ACPREC_TOT(I,J) W10M_SWATH_2(I,J,NSWTH(MY_DOMAIN_ID))=SQRT(int_state%U10(I,J)*int_state%U10(I,J) & +int_state%V10(I,J)*int_state%V10(I,J)) ENDDO ENDDO CALL WRT_SWATH(GLAT_SWATH_2,NR_SWATH,MYPE,NUM_PES,MPI_COMM_COMP & ,IDE,JDE,ITS,ITE,JTS,JTE,SWATH_UNIT+MY_DOMAIN_ID) CALL WRT_SWATH(GLON_SWATH_2,NR_SWATH,MYPE,NUM_PES,MPI_COMM_COMP & ,IDE,JDE,ITS,ITE,JTS,JTE,SWATH_UNIT+MY_DOMAIN_ID) CALL WRT_SWATH(PREC_SWATH_2,NR_SWATH,MYPE,NUM_PES,MPI_COMM_COMP & ,IDE,JDE,ITS,ITE,JTS,JTE,SWATH_UNIT+MY_DOMAIN_ID) CALL WRT_SWATH(W10M_SWATH_2,NR_SWATH,MYPE,NUM_PES,MPI_COMM_COMP & ,IDE,JDE,ITS,ITE,JTS,JTE,SWATH_UNIT+MY_DOMAIN_ID) ENDIF ! ELSE IF(MY_DOMAIN_ID==3) THEN ! IF(MOD(NTIMESTEP*int_state%DT,FREQ_SWATH)==0) THEN NSWTH(MY_DOMAIN_ID)=NSWTH(MY_DOMAIN_ID)+1 DO J=JTS,JTE DO I=ITS,ITE GLAT_SWATH_3(I,J,NSWTH(MY_DOMAIN_ID))=int_state%GLAT(I,J) GLON_SWATH_3(I,J,NSWTH(MY_DOMAIN_ID))=int_state%GLON(I,J) PREC_SWATH_3(I,J,NSWTH(MY_DOMAIN_ID))=int_state%ACPREC_TOT(I,J) W10M_SWATH_3(I,J,NSWTH(MY_DOMAIN_ID))=SQRT(int_state%U10(I,J)*int_state%U10(I,J) & +int_state%V10(I,J)*int_state%V10(I,J)) ENDDO ENDDO ENDIF ! IF(NTIMESTEP==int_state%NTSTM-2) THEN NSWTH(MY_DOMAIN_ID)=NSWTH(MY_DOMAIN_ID)+1 DO J=JTS,JTE DO I=ITS,ITE GLAT_SWATH_3(I,J,NSWTH(MY_DOMAIN_ID))=int_state%GLAT(I,J) GLON_SWATH_3(I,J,NSWTH(MY_DOMAIN_ID))=int_state%GLON(I,J) PREC_SWATH_3(I,J,NSWTH(MY_DOMAIN_ID))=int_state%ACPREC_TOT(I,J) W10M_SWATH_3(I,J,NSWTH(MY_DOMAIN_ID))=SQRT(int_state%U10(I,J)*int_state%U10(I,J) & +int_state%V10(I,J)*int_state%V10(I,J)) ENDDO ENDDO CALL WRT_SWATH(GLAT_SWATH_3,NR_SWATH,MYPE,NUM_PES,MPI_COMM_COMP & ,IDE,JDE,ITS,ITE,JTS,JTE,SWATH_UNIT+MY_DOMAIN_ID) CALL WRT_SWATH(GLON_SWATH_3,NR_SWATH,MYPE,NUM_PES,MPI_COMM_COMP & ,IDE,JDE,ITS,ITE,JTS,JTE,SWATH_UNIT+MY_DOMAIN_ID) CALL WRT_SWATH(PREC_SWATH_3,NR_SWATH,MYPE,NUM_PES,MPI_COMM_COMP & ,IDE,JDE,ITS,ITE,JTS,JTE,SWATH_UNIT+MY_DOMAIN_ID) CALL WRT_SWATH(W10M_SWATH_3,NR_SWATH,MYPE,NUM_PES,MPI_COMM_COMP & ,IDE,JDE,ITS,ITE,JTS,JTE,SWATH_UNIT+MY_DOMAIN_ID) ENDIF ! ENDIF ! !----------------------------------------------------------------------- !----------------------------------------------------------------------- !---- PHY_RUN END ------------------------------------------------------ !----------------------------------------------------------------------- !----------------------------------------------------------------------- ! RC=0 ! IF(RC_RUN==ESMF_SUCCESS)THEN ! WRITE(0,*)'SOLVER RUN STEP SUCCEEDED' ELSE WRITE(0,*)'SOLVER RUN STEP FAILED RC_RUN=',RC_RUN ENDIF ! !----------------------------------------------------------------------- ! td%solver_phy_tim=td%solver_phy_tim+(timef()-btim0) ! write(*,*) 'DEBUG-GT, ending SOLVER_RUN' ! !----------------------------------------------------------------------- ! END SUBROUTINE SOLVER_RUN ! !----------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- ! SUBROUTINE SOLVER_FINALIZE (GRID_COMP & ,IMP_STATE & ,EXP_STATE & ,CLOCK_ATM & ,RC_FINALIZE) ! !----------------------------------------------------------------------- !*** Finalize the Solver component. !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! !------------------------ !*** Argument Variables !------------------------ ! TYPE(ESMF_GridComp) :: GRID_COMP !<-- The Solver gridded component ! TYPE(ESMF_State) :: IMP_STATE & !<-- The Solver import state ,EXP_STATE !<-- The Solver export state ! TYPE(ESMF_Clock) :: CLOCK_ATM !<-- The ATM component's ESMF Clock. ! INTEGER,INTENT(OUT) :: RC_FINALIZE ! !--------------------- !*** Local Variables !--------------------- ! TYPE(SOLVER_INTERNAL_STATE),POINTER :: INT_STATE !<-- The Solver internal state pointer ! TYPE(WRAP_SOLVER_INT_STATE) :: WRAP !<-- The F90 'wrap' for the Solver internal state ! INTEGER(kind=KINT) :: MYPE,RC,RC_FINAL ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! RC =ESMF_SUCCESS RC_FINAL=ESMF_SUCCESS ! !----------------------------------------------------------------------- !*** Extract the Solver internal state. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="SOLVER_FINALIZE: Extract Solver Internal State" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_GridCompGetInternalState(GRID_COMP & !<-- The Solver component ,WRAP & ,RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_FINAL) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! INT_STATE=>wrap%INT_STATE ! MYPE=int_state%MYPE !<-- The local task rank ! IF(MYPE==0)THEN WRITE(0,*)' Solver Completed Normally.' ENDIF ! !----------------------------------------------------------------------- !*** DO NOT DEALLOCATE THE SOLVER INTERNAL STATE POINTER !*** WITHOUT DEALLOCATING ITS CONTENTS. !----------------------------------------------------------------------- ! !!! DEALLOCATE(INT_STATE,stat=RC) ! !----------------------------------------------------------------------- ! IF(RC_FINAL==ESMF_SUCCESS)THEN WRITE(0,*)'SOLVER FINALIZE STEP SUCCEEDED' ELSE WRITE(0,*)'SOLVER FINALIZE STEP FAILED' ENDIF ! ! IF(PRESENT(RC_FINALIZE))THEN RC_FINALIZE=RC_FINAL ! ENDIF ! !----------------------------------------------------------------------- ! END SUBROUTINE SOLVER_FINALIZE ! !----------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- ! SUBROUTINE BUILD_BC_BUNDLE(GRID & ,LNSH,LNSV & ,IHALO,JHALO & ,UBOUND_VARS & ,VARS & ,MY_DOMAIN_ID & ,BUNDLE_NESTBC & ,BND_VARS_H & ,BND_VARS_V & ,NVARS_BC_2D_H & ,NVARS_BC_3D_H & ,NVARS_BC_4D_H & ,NVARS_BC_2D_V & ,NVARS_BC_3D_V & ,NLEV_H & ,NLEV_V & ,N_BC_3D_H & ) ! !----------------------------------------------------------------------- !*** This routine builds an ESMF Bundle for holding groups of pointers !*** to Solver internal state variables that are updated on the !*** domain boundaries during the integration. !*** In addition the object that holds primary boundary information !*** is partially allocated and pointed at the relevant variables. !----------------------------------------------------------------------- ! !------------------------ !*** Argument Variables !------------------------ ! INTEGER(kind=KINT),INTENT(IN) :: IHALO,JHALO & !<-- Subdomain halo widths ,LNSH,LNSV !<-- Domain boundary blending width INTEGER(kind=KINT),INTENT(IN) :: MY_DOMAIN_ID & !<-- This domain's ID ,UBOUND_VARS !<-- Upper dimension of the VARS array ! INTEGER(kind=KINT),DIMENSION(1:3),INTENT(OUT) :: N_BC_3D_H !<-- Hold order of domain #1's BC vbls from boco files ! TYPE(ESMF_Grid),INTENT(IN) :: GRID !<-- The ESMF Grid for this domain ! TYPE(VAR),DIMENSION(1:UBOUND_VARS),INTENT(INOUT) :: VARS !<-- Variables in the Solver internal state ! TYPE(ESMF_FieldBundle),INTENT(INOUT) :: BUNDLE_NESTBC !<-- The Bundle of Solver internal state vbls to be ! ! updated on the nest boundaries INTEGER(kind=KINT),INTENT(OUT) :: NVARS_BC_2D_H & !<-- # of 2-D,3-D,4-D H-pt variables ,NVARS_BC_3D_H & ! that are inserted ,NVARS_BC_4D_H ! into the Bundle. ! INTEGER(kind=KINT),INTENT(OUT) :: NVARS_BC_2D_V & !<-- # of 2-D,3-D V-pt variables ,NVARS_BC_3D_V ! that are inserted into the Bundle. ! INTEGER(kind=KINT),INTENT(OUT) :: NLEV_H,NLEV_V !<-- # of model levels in all H-pt,V-pt variables used ! TYPE(BC_H_ALL),INTENT(OUT) :: BND_VARS_H !<-- Object holding H-pt variable info on domain boundaries TYPE(BC_V_ALL),INTENT(OUT) :: BND_VARS_V !<-- Object holding V-pt variable info on domain boundaries ! !--------------------- !*** Local Variables !--------------------- ! INTEGER(kind=KINT) :: H_OR_V_INT,IOS,LB3,LB4 & ,N,NSIZE,NUM_DIMS,NUM_FIELDS & ,UB3,UB4 ! INTEGER(kind=KINT) :: IMS,IME,JMS,JME ! INTEGER(kind=KINT) :: KNT_2D_H,KNT_3D_H,KNT_4D_H & ,KNT_2D_V,KNT_3D_V ! INTEGER(kind=KINT) :: KNT_3D_DOM_01 ! INTEGER(kind=KINT) :: ISTAT,RC,RC_CMB ! REAL(kind=KFPT),DIMENSION(:,:),POINTER :: ARRAY_2D=>NULL() REAL(kind=KFPT),DIMENSION(:,:,:),POINTER :: ARRAY_3D=>NULL() REAL(kind=KFPT),DIMENSION(:,:,:,:),POINTER :: ARRAY_4D=>NULL() ! CHARACTER(len=1) :: CH_2,CH_B,H_OR_V ! CHARACTER(len=2) :: CH_M ! CHARACTER(len=9),SAVE :: FNAME='nests.txt' ! CHARACTER(len=99) :: BUNDLE_NAME,FIELD_NAME,VBL_NAME ! CHARACTER(len=256) :: STRING ! LOGICAL(kind=KLOG) :: CASE_2WAY,CASE_NESTBC ! TYPE(ESMF_Field) :: FIELD_X ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! IMS=int_state%IMS IME=int_state%IME JMS=int_state%JMS JME=int_state%JME ! NVARS_BC_2D_H=0 NVARS_BC_3D_H=0 NVARS_BC_4D_H=0 ! NVARS_BC_2D_V=0 NVARS_BC_3D_V=0 ! KNT_3D_DOM_01=0 ! DO N=1,3 N_BC_3D_H(N)=-1 ENDDO ! !----------------------------------------------------------------------- !*** Loop through all Solver internal state variables. !----------------------------------------------------------------------- ! OPEN(unit=10,file=FNAME,status='OLD',action='READ' & !<-- Open the text file with user specifications ,iostat=IOS) ! IF(IOS/=0)THEN WRITE(0,*)' Failed to open ',FNAME,' so ABORT!' CALL ESMF_FINALIZE(endflag=ESMF_END_ABORT & ,rc =RC) ENDIF ! NLEV_H=0 !<-- Counter for total # of levels in all 2-way vbls NLEV_V=0 !<-- Counter for total # of levels in all 2-way vbls ! !----------------------------------------------------------------------- bundle_loop: DO !----------------------------------------------------------------------- ! READ(UNIT=10,FMT='(A)',iostat=IOS)STRING !<-- Read in the next specification line IF(IOS/=0)THEN !<-- Finished reading the specification lines CLOSE(10) EXIT ENDIF ! IF(STRING(1:1)=='#'.OR.TRIM(STRING)=='')THEN CYCLE !<-- Read past comments and blanks. ENDIF ! !----------------------------------------------------------------------- !*** Read the text line containing the H or V specification for !*** variable N then find that variable's place within the VARS !*** object. !----------------------------------------------------------------------- ! READ(UNIT=STRING,FMT=*,iostat=IOS)VBL_NAME & !<-- The variable's name in the text file. ,CH_B & !<-- The flag for nest BC vbls in the text file. ,CH_M & !<-- Not relevant here (flag for moving nests) ,CH_2 !<-- The flag for 2-way vbls in the text file. ! CALL FIND_VAR_INDX(VBL_NAME,VARS,UBOUND_VARS,N) ! FIELD_NAME=TRIM(VARS(N)%VBL_NAME)//TRIM(SUFFIX_NESTBC) !<-- Append the BC suffix to the Field ! !----------------------------------------------------------------------- !*** Check the Bundle's name to determine which column of user !*** specifications to read from the text file. !----------------------------------------------------------------------- ! H_OR_V=CH_B !<-- H-V flag for this nest BC variable ! !----------------------------------------------------------------------- !*** Find the variables in the Solver internal state that have been !*** selected to be placed into the Bundle. The user has specified !*** whether the variable lies on H points or V points. !*** Currently ESMF will not allow the use of Attributes that are !*** characters therefore we must translate the character codes from !*** the txt file into something that ESMF can use. In this case !*** we will use integers: H-->1 and V-->2 . !----------------------------------------------------------------------- ! IF(H_OR_V=='H')THEN H_OR_V_INT=1 !<-- H-pt variable ELSEIF(H_OR_V=='V')THEN H_OR_V_INT=2 !<-- V-pt variable ELSE H_OR_V_INT=-999 !<-- Variable not specified for use. ENDIF ! !----------------------------------------------------------------------- ! build_bundle: IF(H_OR_V=='H' & .OR. & H_OR_V=='V' & )THEN ! !----------------------------------------------------------------------- ! !------------------- !*** 2-D Variables !------------------- ! !------------- !*** Integer !------------- ! IF(ASSOCIATED(VARS(N)%I2D))THEN !<-- 2-D integer array on mass points ! ! FIELD_X=ESMF_FieldCreate(grid =GRID & !<-- The ESMF Grid for this domain ! ,farray =VARS(N)%I2D & !<-- Nth variable in the VARS array ! ,totalUWidth=(/IHALO,JHALO/) & !<-- Upper bound of halo region ! ,totalLWidth=(/IHALO,JHALO/) & !<-- Lower bound of halo region ! ,name =FIELD_NAME & !<-- The name of this variable ! ,indexFlag =ESMF_INDEX_GLOBAL & !<-- The variable uses global indexing ! ,rc =RC) WRITE(0,*)' MUST ADD THE CAPABILITY TO USE 2-D INTEGERS IN 2WAY/BC UPDATES!!' WRITE(0,*)' Variable name is ',VARS(N)%VBL_NAME,' for variable #',N WRITE(0,*)' H_OR_V_INT=',H_OR_V_INT WRITE(0,*)' ABORT!!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ! ! !---------- !*** Real !---------- ! ELSEIF(ASSOCIATED(VARS(N)%R2D))THEN !<-- 2-D real array on mass points ! FIELD_X=ESMF_FieldCreate(grid =GRID & !<-- The ESMF Grid for this domain ,farray =VARS(N)%R2D & !<-- Nth variable in the VARS array ,totalUWidth=(/IHALO,JHALO/) & !<-- Upper bound of halo region ,totalLWidth=(/IHALO,JHALO/) & !<-- Lower bound of halo region ,name =FIELD_NAME & !<-- The name of this variable ,indexFlag =ESMF_INDEX_GLOBAL & !<-- The variable uses global indexing ,rc =RC) ! IF(H_OR_V=='H')THEN NVARS_BC_2D_H=NVARS_BC_2D_H+1 !<-- Count # of 2-D H-pt variables NLEV_H=NLEV_H+1 !<-- Sum all levels for H-pt variables ELSEIF(H_OR_V=='V')THEN NVARS_BC_2D_V=NVARS_BC_2D_V+1 !<-- Count # of 2-D V-pt variables NLEV_V=NLEV_V+1 !<-- Sum all levels for V-pt variables ENDIF ! !------------------- !*** 3-D Variables !------------------- ! !---------- !*** Real !---------- ! ELSEIF(ASSOCIATED(VARS(N)%R3D))THEN !<-- 3-D real array on mass points ! FIELD_X=ESMF_FieldCreate(grid =GRID & !<-- The ESMF Grid for this domain ,farray =VARS(N)%R3D & !<-- Nth variable in the VARS array ,totalUWidth =(/IHALO,JHALO/) & !<-- Upper bound of halo region ,totalLWidth =(/IHALO,JHALO/) & !<-- Lower bound of halo region ,ungriddedLBound=(/lbound(VARS(N)%R3D,dim=3)/) & ,ungriddedUBound=(/ubound(VARS(N)%R3D,dim=3)/) & ,name =FIELD_NAME & !<-- The name of this variable ,indexFlag =ESMF_INDEX_GLOBAL & !<-- The variable uses global indexing ,rc =RC) ! LB3=LBOUND(VARS(N)%R3D,3) UB3=UBOUND(VARS(N)%R3D,3) ! IF(H_OR_V=='H')THEN NVARS_BC_3D_H=NVARS_BC_3D_H+1 !<-- Count # of 3-D H-pt variables NLEV_H=NLEV_H+(UB3-LB3+1) !<-- Sum all levels for H-pt variables ELSEIF(H_OR_V=='V')THEN NVARS_BC_3D_V=NVARS_BC_3D_V+1 !<-- Count # of 3-D V-pt variables NLEV_V=NLEV_V+(UB3-LB3+1) !<-- Sum all levels for V-pt variables ENDIF ! !------------------- !*** 4-D Variables !------------------- ! !---------- !*** Real !---------- ! ELSEIF(ASSOCIATED(VARS(N)%R4D))THEN !<-- 4-D real array on mass points ! LB4=LBOUND(VARS(N)%R4D,dim=4) UB4=UBOUND(VARS(N)%R4D,dim=4) ! FIELD_X=ESMF_FieldCreate(grid =GRID & !<-- The ESMF Grid for this domain ,farray =VARS(N)%R4D & !<-- Nth variable in the VARS array ,totalUWidth =(/IHALO,JHALO/) & !<-- Upper bound of halo region ,totalLWidth =(/IHALO,JHALO/) & !<-- Lower bound of halo region ,ungriddedLBound =(/ LBOUND(VARS(N)%R4D,dim=3),LB4 /) & ,ungriddedUBound =(/ UBOUND(VARS(N)%R4D,dim=3),UB4 /) & ,name =FIELD_NAME & !<-- The name of this variable ,indexFlag =ESMF_INDEX_GLOBAL & !<-- The variable uses global indexing ,rc =RC) ! LB3=LBOUND(VARS(N)%R4D,3) UB3=UBOUND(VARS(N)%R4D,3) ! IF(H_OR_V=='H')THEN NVARS_BC_4D_H=NVARS_BC_4D_H+1 !<-- Count # of 4-D H-pt variables NLEV_H=NLEV_H+(UB3-LB3+1)*(UB4-LB4+1) !<-- Sum all levels for H-pt variables ENDIF ! !---------------- !*** All Others !---------------- ! ELSE WRITE(0,*)' SELECTED UPDATE H VARIABLE IS NOT 2,3,4-D REAL.' WRITE(0,*)' Variable name is ',VARS(N)%VBL_NAME,' for variable #',N WRITE(0,*)' H_OR_V_INT=',H_OR_V_INT WRITE(0,*)' ABORT!!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ! ENDIF ! !----------------------------------------------------------------------- !*** Attach the index of this variable within the Solver internal !*** state so it can be referenced w/r to the boundary objects. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Add Solver Int State Indx to Bundle Field" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(field=FIELD_X & !<-- The Field to be added to the Bundle ,name ='Solver Int State Indx' & !<-- The name of the Attribute to set ,value=N & !<-- The index of the Solver internal state vbl ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Attach the specification flag to this Field that indicates !*** whether it is an H-pt or a V-pt variable. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Add H-or-V Specification Flag to Bundle Field" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeSet(field=FIELD_X & !<-- The Field to be added to the Bundle ,name ='H_OR_V_INT' & !<-- The name of the Attribute to set ,value=H_OR_V_INT & !<-- H-pt or V-pt flag ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- !*** Add this Field to the Bundle that holds pointers to all !*** variables in the Solver internal state that have been !*** selected. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Add Desired Field to the Bundle" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_FieldBundleAdd( BUNDLE_NESTBC & !<-- The Bundle of Solver internal state BC variables , (/FIELD_X/) & !<-- Add this Field to the Bundle ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------------------------------------------------- ! ENDIF build_bundle ! !----------------------------------------------------------------------- ! ENDDO bundle_loop ! !----------------------------------------------------------------------- !*** Allocate the appropriate pieces of the boundary variable !*** objects. All nests use the same set of boundary variables !*** that are specified by the user in the external text file. ! !*** The upper parent domain uses its own set of boundary variables !*** updated from the BC files generated during preprocessing. !*** They are currently hardwired to PD,T,Q,CW,U,V. !----------------------------------------------------------------------- ! IF(MY_DOMAIN_ID==1)THEN !<-- The uppermost parent will hardwire its BC vbls ! NVARS_BC_2D_H=1 !<-- PD NVARS_BC_3D_H=3 !<-- T,Q,CW NVARS_BC_4D_H=0 NVARS_BC_2D_V=0 NVARS_BC_3D_V=2 !<-- U,V ! ENDIF ! IF(NVARS_BC_2D_H>0)THEN ALLOCATE(BND_VARS_H%VAR_2D(1:NVARS_BC_2D_H)) !<-- All 2-D H-pt nest boundary variables ENDIF ! IF(NVARS_BC_3D_H>0)THEN ALLOCATE(BND_VARS_H%VAR_3D(1:NVARS_BC_3D_H)) !<-- All 3-D H-pt nest boundary variables ENDIF ! IF(NVARS_BC_4D_H>0)THEN ALLOCATE(BND_VARS_H%VAR_4D(1:NVARS_BC_4D_H)) !<-- All 4-D H-pt nest boundary variables ENDIF ! IF(NVARS_BC_2D_V>0)THEN ALLOCATE(BND_VARS_V%VAR_2D(1:NVARS_BC_2D_V)) !<-- All 2-D V-pt nest boundary variables ENDIF ! IF(NVARS_BC_3D_V>0)THEN ALLOCATE(BND_VARS_V%VAR_3D(1:NVARS_BC_3D_V)) !<-- All 3-D V-pt nest boundary variables ENDIF ! !----------------------------------------------------------------------- !*** Now go through the boundary Bundle's variables and point the !*** full variable pointer of the appropriate boundary object that !*** was allocated immediately above at that variable in the Bundle !*** in order to associate each piece of the boundary object with !*** the actual boundary variable. !----------------------------------------------------------------------- ! CALL ESMF_FieldBundleGet(FIELDBUNDLE=BUNDLE_NESTBC & !<-- Bundle holding the arrays for BC updates ,fieldCount =NUM_FIELDS & !<-- Number of Fields in the Bundle ,rc =RC ) ! !----------------------------------------------------------------------- ! KNT_2D_H=0 KNT_3D_H=0 KNT_4D_H=0 KNT_2D_V=0 KNT_3D_V=0 ! !----------------------------------------------------------------------- ! bc_fields: DO N=1,NUM_FIELDS ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract Field N from the Bundle" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_FieldBundleGet(FIELDBUNDLE=BUNDLE_NESTBC & !<-- Bundle holding the arrays for BC updates ,fieldIndex =N & !<-- Index of the Field in the Bundle ,field =FIELD_X & !<-- Field N in the Bundle ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract H_OR_V Flag from the Field" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(field=FIELD_X & !<-- The Domain import state ,name ='H_OR_V_INT' & !<-- Name of the Attribute ,value=H_OR_V_INT & !<-- Is the Field on H or V points? (1 is H; 2 is V) ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! !----------------------------- !*** H-pt boundary variables !----------------------------- ! h_v: IF(H_OR_V_INT==1)THEN !<-- If true, it is an H-pt variable ! CALL ESMF_FieldGet(field =FIELD_X & !<-- Field N in the Bundle ,dimCount=NUM_DIMS & !<-- How many dimensions? ,rc =RC ) ! !-------------- !*** 2-D Real !-------------- ! IF(NUM_DIMS==2)THEN ! KNT_2D_H=KNT_2D_H+1 ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract the 2-D H-pt Array from the Field" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_FieldGet(field =FIELD_X & !<-- Field N in the Bundle ,localDe =0 & ,farrayPtr=ARRAY_2D & !<-- Dummy 2-D array with Field's Real data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! BND_VARS_H%VAR_2D(KNT_2D_H)%FULL_VAR=>ARRAY_2D !<-- This variable becomes a boundary variable ! ALLOCATE(BND_VARS_H%VAR_2D(KNT_2D_H)%SOUTH(IMS:IME,1:LNSH,1:2) & !<-- 2-D H-pt boundary variable N on domain's south side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45001)ISTAT 45001 FORMAT(' Failed to allocate BND_VARS_H%VAR_2D(N)%SOUTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_2D(KNT_2D_H)%NORTH(IMS:IME,1:LNSH,1:2) & !<-- 2-D H-pt boundary variable N on domain's north side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45002)ISTAT 45002 FORMAT(' Failed to allocate BND_VARS_H%VAR_2D(N)%NORTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_2D(KNT_2D_H)%WEST(1:LNSH,JMS:JME,1:2) & !<-- 2-D H-pt boundary variable N on domain's west side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45003)ISTAT 45003 FORMAT(' Failed to allocate BND_VARS_H%VAR_2D(N)%WEST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_2D(KNT_2D_H)%EAST(1:LNSH,JMS:JME,1:2) & !<-- 2-D H-pt boundary variable N on domain's east side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45004)ISTAT 45004 FORMAT(' Failed to allocate BND_VARS_H%VAR_2D(N)%EasT istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! BND_VARS_H%VAR_2D(KNT_2D_H)%SOUTH=R4_IN BND_VARS_H%VAR_2D(KNT_2D_H)%NORTH=R4_IN BND_VARS_H%VAR_2D(KNT_2D_H)%WEST=R4_IN BND_VARS_H%VAR_2D(KNT_2D_H)%EAST=R4_IN ! !-------------- !*** 3-D Real !-------------- ! ELSEIF(NUM_DIMS==3)THEN ! KNT_3D_H=KNT_3D_H+1 ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract the 3-D H-pt Array from the Field" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_FieldGet(field =FIELD_X & !<-- Field N in the Bundle ,localDe =0 & ,farrayPtr=ARRAY_3D & !<-- Dummy 3-D array with Field's Real data ,rc =RC ) ! CALL ESMF_FieldGet(field=FIELD_X & !<-- Field N in the Bundle ,name =FIELD_NAME & !<-- This Field's name ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! BND_VARS_H%VAR_3D(KNT_3D_H)%FULL_VAR=>ARRAY_3D !<-- This variable becomes a boundary variable ! LB3=LBOUND(ARRAY_3D,3) UB3=UBOUND(ARRAY_3D,3) ! ALLOCATE(BND_VARS_H%VAR_3D(KNT_3D_H)%SOUTH(IMS:IME,1:LNSH,LB3:UB3,1:2) & !<-- 3-D H-pt bndry vbl N on domain's south side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45011)ISTAT 45011 FORMAT(' Failed to allocate BND_VARS_H%VAR_3D(N)%SOUTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_3D(KNT_3D_H)%NORTH(IMS:IME,1:LNSH,LB3:UB3,1:2) & !<-- 3-D H-pt bndry vbl N on domain's north side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45012)ISTAT 45012 FORMAT(' Failed to allocate BND_VARS_H%VAR_3D(N)%NORTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_3D(KNT_3D_H)%WEST(1:LNSH,JMS:JME,LB3:UB3,1:2) & !<-- 3-D H-pt bndry vbl N on domain's west side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45013)ISTAT 45013 FORMAT(' Failed to allocate BND_VARS_H%VAR_3D(N)%WEST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_3D(KNT_3D_H)%EAST(1:LNSH,JMS:JME,LB3:UB3,1:2) & !<-- 3-D H-pt bndry vbl N on domain's east side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45014)ISTAT 45014 FORMAT(' Failed to allocate BND_VARS_H%VAR_3D(N)%EAST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! BND_VARS_H%VAR_3D(KNT_3D_H)%SOUTH=R4_IN BND_VARS_H%VAR_3D(KNT_3D_H)%NORTH=R4_IN BND_VARS_H%VAR_3D(KNT_3D_H)%WEST=R4_IN BND_VARS_H%VAR_3D(KNT_3D_H)%EAST=R4_IN ! !----------------------------------------------------------------------- !*** Now some hardwiring is required. The same boundary objects !*** are of course used by all domains but the arrays for the !*** upper domain will be read in from the external boco files !*** when that domain is not global. The boundary objects store !*** the arrays in the order they are encountered in the nests.txt !*** file and in general that order will be different than the !*** order they are read from the boco files. Therefore we now !*** save the order of the three 3-D H-pt boundary arrays used !*** by the upper parent so they can be saved in the proper order !*** when they are read in subroutine READ_BC. The order in which !*** READ_BC reads them from the boco files is T,Q,CW. !*** REGRETTABLY THIS IS DIRTY but is needed since all domains !*** must use the same boundary objects but the dataread in !*** READ_BC is fixed in its order in NPS. !----------------------------------------------------------------------- ! IF(FIELD_NAME(1:1)=='T' & .OR. & FIELD_NAME(1:1)=='Q' & .OR. & FIELD_NAME(1:2)=='CW')THEN ! KNT_3D_DOM_01=KNT_3D_DOM_01+1 ! IF(FIELD_NAME(1:1)=='T')THEN N_BC_3D_H(1)=KNT_3D_DOM_01 ELSEIF(FIELD_NAME(1:1)=='Q')THEN N_BC_3D_H(2)=KNT_3D_DOM_01 ELSEIF(FIELD_NAME(1:2)=='CW')THEN N_BC_3D_H(3)=KNT_3D_DOM_01 ENDIF ! ENDIF ! !-------------- !*** 4-D Real !-------------- ! ELSEIF(NUM_DIMS==4)THEN ! KNT_4D_H=KNT_4D_H+1 ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract the 4-D H-pt Array from the Field" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_FieldGet(field =FIELD_X & !<-- Field N in the Bundle ,localDe =0 & ,farrayPtr=ARRAY_4D & !<-- Dummy 4-D array with Field's Real data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! BND_VARS_H%VAR_4D(KNT_4D_H)%FULL_VAR=>ARRAY_4D !<-- This variable becomes a boundary variable ! LB3=LBOUND(ARRAY_4D,3) UB3=UBOUND(ARRAY_4D,3) LB4=LBOUND(ARRAY_4D,4) UB4=UBOUND(ARRAY_4D,4) ! ALLOCATE(BND_VARS_H%VAR_4D(KNT_4D_H)%SOUTH(IMS:IME,1:LNSH,LB4:UB4,1:2,LB4:UB4) & !<-- 4-D H-pt bndry vbl N on domain's south side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45021)ISTAT 45021 FORMAT(' Failed to allocate BND_VARS_H%VAR_4D(N)%SOUTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_4D(KNT_4D_H)%NORTH(IMS:IME,1:LNSH,LB3:UB3,1:2,LB4:UB4) & !<-- 4-D H-pt bndry vbl N on domain's north side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45022)ISTAT 45022 FORMAT(' Failed to allocate BND_VARS_H%VAR_4D(N)%NORTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_4D(KNT_4D_H)%WEST(1:LNSH,JMS:JME,LB3:UB3,1:2,LB4:UB4) & !<-- 4-D H-pt bndry vbl N on domain's west side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45023)ISTAT 45023 FORMAT(' Failed to allocate BND_VARS_H%VAR_4D(N)%WEST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_H%VAR_4D(KNT_4D_H)%EAST(1:LNSH,JMS:JME,LB3:UB3,1:2,LB4:UB4) & !<-- 4-D H-pt bndry vbl N on domain's east side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45024)ISTAT 45024 FORMAT(' Failed to allocate BND_VARS_H%VAR_4D(N)%EAST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! BND_VARS_H%VAR_4D(KNT_4D_H)%SOUTH=R4_IN BND_VARS_H%VAR_4D(KNT_4D_H)%NORTH=R4_IN BND_VARS_H%VAR_4D(KNT_4D_H)%WEST=R4_IN BND_VARS_H%VAR_4D(KNT_4D_H)%EAST=R4_IN ! ENDIF ! !----------------------------- !*** V-pt boundary variables !----------------------------- ! ELSEIF(H_OR_V_INT==2)THEN ! CALL ESMF_FieldGet(field =FIELD_X & !<-- Field N in the Bundle ,dimCount=NUM_DIMS & !<-- How many dimensions? ,rc =RC ) ! !-------------- !*** 2-D Real !-------------- ! IF(NUM_DIMS==2)THEN ! KNT_2D_V=KNT_2D_V+1 ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract the 2-D V-pt Array from the Field" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_FieldGet(field =FIELD_X & !<-- Field N in the Bundle ,localDe =0 & ,farrayPtr=ARRAY_2D & !<-- Dummy 2-D array with Field's Real data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! BND_VARS_V%VAR_2D(KNT_2D_V)%FULL_VAR=>ARRAY_2D !<-- This variable becomes a boundary variable ! ALLOCATE(BND_VARS_V%VAR_2D(KNT_2D_V)%SOUTH(IMS:IME,1:LNSV,1:2) & !<-- 2-D V-pt bndry vbl N on domain's south side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45041)ISTAT 45041 FORMAT(' Failed to allocate BND_VARS_V%VAR_2D(N)%SOUTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_V%VAR_2D(KNT_2D_V)%NORTH(IMS:IME,1:LNSV,1:2) & !<-- 2-D V-pt bndry vbl N on domain's north side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45042)ISTAT 45042 FORMAT(' Failed to allocate BND_VARS_V%VAR_2D(N)%NORTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_V%VAR_2D(KNT_2D_V)%WEST(1:LNSV,JMS:JME,1:2) & !<-- 2-D V-pt bndry vbl N on domain's west side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45043)ISTAT 45043 FORMAT(' Failed to allocate BND_VARS_V%VAR_2D(N)%WEST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_V%VAR_2D(KNT_2D_V)%EAST(1:LNSV,JMS:JME,1:2) & !<-- 2-D V-pt bndry vbl N on domain's east side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45044)ISTAT 45044 FORMAT(' Failed to allocate BND_VARS_V%VAR_2D(N)%EAST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! BND_VARS_V%VAR_2D(KNT_2D_V)%SOUTH=R4_IN BND_VARS_V%VAR_2D(KNT_2D_V)%NORTH=R4_IN BND_VARS_V%VAR_2D(KNT_2D_V)%WEST=R4_IN BND_VARS_V%VAR_2D(KNT_2D_V)%EAST=R4_IN ! !-------------- !*** 3-D Real !-------------- ! ELSEIF(NUM_DIMS==3)THEN ! KNT_3D_V=KNT_3D_V+1 ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract the 3-D V-pt Array from the Field" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_FieldGet(field =FIELD_X & !<-- Field N in the Bundle ,localDe =0 & ,farrayPtr=ARRAY_3D & !<-- Dummy 3-D array with Field's Real data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_CMB) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! BND_VARS_V%VAR_3D(KNT_3D_V)%FULL_VAR=>ARRAY_3D !<-- This variable becomes a boundary variable ! LB3=LBOUND(ARRAY_3D,3) UB3=UBOUND(ARRAY_3D,3) ! ALLOCATE(BND_VARS_V%VAR_3D(KNT_3D_V)%SOUTH(IMS:IME,1:LNSV,LB3:UB3,1:2) & !<-- 3-D V-pt bndry vbl N on domain's south side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45051)ISTAT 45051 FORMAT(' Failed to allocate BND_VARS_V%VAR_3D(N)%SOUTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_V%VAR_3D(KNT_3D_V)%NORTH(IMS:IME,1:LNSV,LB3:UB3,1:2) & !<-- 3-D V-pt bndry vbl N on domain's north side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45052)ISTAT 45052 FORMAT(' Failed to allocate BND_VARS_V%VAR_3D(N)%NORTH istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_V%VAR_3D(KNT_3D_V)%WEST(1:LNSV,JMS:JME,LB3:UB3,1:2) & !<-- 3-D V-pt bndry vbl N on domain's west side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45053)ISTAT 45053 FORMAT(' Failed to allocate BND_VARS_V%VAR_3D(N)%WEST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! ALLOCATE(BND_VARS_V%VAR_3D(KNT_3D_V)%EAST(1:LNSV,JMS:JME,LB3:UB3,1:2) & !<-- 3-D V-pt bndry vbl N on domain's east side ,stat=ISTAT) IF(ISTAT/=0)THEN WRITE(0,45054)ISTAT 45054 FORMAT(' Failed to allocate BND_VARS_V%VAR_3D(N)%EAST istat=',i5) WRITE(0,*)' Aborting!' CALL ESMF_Finalize(endflag=ESMF_END_ABORT) ENDIF ! BND_VARS_V%VAR_3D(KNT_3D_V)%SOUTH=R4_IN BND_VARS_V%VAR_3D(KNT_3D_V)%NORTH=R4_IN BND_VARS_V%VAR_3D(KNT_3D_V)%WEST=R4_IN BND_VARS_V%VAR_3D(KNT_3D_V)%EAST=R4_IN ! ENDIF ! !----------------------------------------------------------------------- ! ENDIF h_v ! !----------------------------------------------------------------------- ! ENDDO bc_fields ! !----------------------------------------------------------------------- ! END SUBROUTINE BUILD_BC_BUNDLE ! !----------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- ! SUBROUTINE UPDATE_BC_TENDS(IMP_STATE & ,LM,LNSH,LNSV & ,PARENT_CHILD_TIME_RATIO,DT & ,S_BDY,N_BDY,W_BDY,E_BDY & ,NLEV_H,NLEV_V & ,NVARS_BC_2D_H & ,NVARS_BC_3D_H & ,NVARS_BC_4D_H & ,NVARS_BC_2D_V & ,NVARS_BC_3D_V & ,BND_VARS_H & ,BND_VARS_V & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDS,IDE,JDS,JDE ) ! !----------------------------------------------------------------------- !*** This routine extracts boundary data from the Solver import !*** state of nested domains that was received from their parents. !*** This data is then used to update the time tendencies of the !*** boundary variables. Those tendencies are valid through each !*** timestep of the nested domain's parent. !*** Note that this data was first loaded into the export state of !*** the Parent-Child coupler in subroutine EXPORT_CHILD_BOUNDARY. !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! !------------------------ !*** Argument Variables !------------------------ ! INTEGER,INTENT(IN) :: LNSH & !<-- # of boundary blending rows for H points ,LNSV & !<-- # of boundary blending rows for V points ,NLEV_H,NLEV_V & !<-- Total # of levels in H-pt,V-pt BC vbls ,NVARS_BC_2D_H,NVARS_BC_3D_H,NVARS_BC_4D_H & !<-- # of multi-dim H-pt boundary variables ,NVARS_BC_2D_V,NVARS_BC_3D_V & !<-- # of multi-dim V-pt boundary variables ,PARENT_CHILD_TIME_RATIO !<-- # of child timesteps per parent timestep ! INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE & ! ,IMS,IME,JMS,JME & !<-- Array dimensions ,ITS,ITE,JTS,JTE & ! ,LM ! ! REAL,INTENT(IN) :: DT !<-- This domain's fundamental timestep ! LOGICAL(kind=KLOG),INTENT(IN) :: E_BDY,N_BDY,S_BDY,W_BDY !<-- Is this task on any side of its domain boundary? ! TYPE(ESMF_State),INTENT(INOUT) :: IMP_STATE !<-- Solver import state ! TYPE(BC_H_ALL),INTENT(INOUT) :: BND_VARS_H !<-- All H-pt boundary data/tendencies ! TYPE(BC_V_ALL),INTENT(INOUT) :: BND_VARS_V !<-- All V-pt boundary data/tendencies ! !--------------------- !*** Local Variables !--------------------- ! INTEGER(kind=KINT) :: I1,I2_H,I2_V,J1,J2_H,J2_V ! INTEGER(kind=KINT) :: KOUNT_S_H,KOUNT_S_V,KOUNT_N_H,KOUNT_N_V & ,KOUNT_W_H,KOUNT_W_V,KOUNT_E_H,KOUNT_E_V ! INTEGER(kind=KINT) :: I,J,K,KOUNT,LBND,NL,NV,UBND INTEGER(kind=KINT) :: ISTAT,RC,RC_BCT ! REAL,SAVE :: RECIP ! REAL,DIMENSION(:),ALLOCATABLE :: BND_DATA_S_H & ,BND_DATA_S_V & ,BND_DATA_N_H & ,BND_DATA_N_V & ,BND_DATA_W_H & ,BND_DATA_W_V & ,BND_DATA_E_H & ,BND_DATA_E_V ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! RC =ESMF_SUCCESS RC_BCT=ESMF_SUCCESS ! !----------------------------------------------------------------------- !*** Gridpoint index limits along the South/North and West/East !*** boundaries for mass (H) and velocity (V) points. Note that !*** the boundary data goes two points into the halo. !----------------------------------------------------------------------- ! I1 =MAX(ITS-2,IDS) I2_H=MIN(ITE+2,IDE) I2_V=MIN(ITE+2,IDE-1) J1 =MAX(JTS-2,JDS) J2_H=MIN(JTE+2,JDE) J2_V=MIN(JTE+2,JDE-1) ! !----------------------------------------------------------------------- !*** The following 'KOUNT' variables are the number of gridpoints !*** on the given task subdomain's South/North/West/East boundaries !*** for all 2-D,3-D,4-D quantities on mass and velocity points. !----------------------------------------------------------------------- ! KOUNT_S_H=NLEV_H*(I2_H-I1+1)*LNSH KOUNT_N_H=NLEV_H*(I2_H-I1+1)*LNSH KOUNT_S_V=NLEV_V*(I2_V-I1+1)*LNSV KOUNT_N_V=NLEV_V*(I2_V-I1+1)*LNSV KOUNT_W_H=NLEV_H*(J2_H-J1+1)*LNSH KOUNT_E_H=NLEV_H*(J2_H-J1+1)*LNSH KOUNT_W_V=NLEV_V*(J2_V-J1+1)*LNSV KOUNT_E_V=NLEV_V*(J2_V-J1+1)*LNSV ! !----------------------------------------------------------------------- !*** Compute RECIP every time in case the sign of DT has changed !*** due to digital filtering. !----------------------------------------------------------------------- ! RECIP=1./(DT*PARENT_CHILD_TIME_RATIO) ! !----------------------------------------------------------------------- !*** Unload the boundary data from the import state and compute !*** the time tendencies for the time period spanning the number !*** of this nest's timesteps needed to reach the end of its !*** parent's timestep (from which the data was sent). !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** If this is a moving nest SOLVER_RUN already knows if it moved at !*** the beginning of this timestep. If it has then the import state !*** not only contains the usual boundary data from one parent timestep !*** in the future but it also contains boundary data for the current !*** timestep for the domain's new location. We would then need to !*** fill the current time level of the boundary variable arrays !*** before differencing with the values from the future to obtain !*** the tendencies. !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! south: IF(S_BDY)THEN ! !----------------------------------------------------------------------- ! !------------- !*** South H !------------- ! ALLOCATE(BND_DATA_S_H(1:KOUNT_S_H)) !<-- For south boundary H-pt data from Solver import state ! move_now_south_h: IF(MOVE_NOW)THEN ! !----------------------------------------------------------------------- !*** Time level 1 (current) south boundary H values for new location !*** of this nest. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract South Boundary H Data in UPDATE_BC_TENDS for Time N" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='SOUTH_H_Current' & !<-- Name of south boundary H data at time N ,valueList=BND_DATA_S_H & !<-- The south boundary H data at time N ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_2D(NV)%SOUTH(I,J,1)=BND_DATA_S_H(KOUNT) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO K=1,LM DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_3D(NV)%SOUTH(I,J,K,1)=BND_DATA_S_H(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO K=1,LM DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_4D(NV)%SOUTH(I,J,K,1,NL)=BND_DATA_S_H(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! ENDIF move_now_south_h ! !----------------------------------------------------------------------- !*** Use time level 2 (future) south boundary H values to compute !*** new tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract South Boundary H Data in UPDATE_BC_TENDS for Time N+1" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='SOUTH_H_Future' & !<-- Name of south boundary H data at time N+1 ,valueList=BND_DATA_S_H & !<-- The boundary data ,rc =RC ) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_2D(NV)%SOUTH(I,J,2)= & (BND_DATA_S_H(KOUNT)-BND_VARS_H%VAR_2D(NV)%SOUTH(I,J,1))*RECIP ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO K=1,LM DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_3D(NV)%SOUTH(I,J,K,2)= & (BND_DATA_S_H(KOUNT)-BND_VARS_H%VAR_3D(NV)%SOUTH(I,J,K,1))*RECIP ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO K=1,LM DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_4D(NV)%SOUTH(I,J,K,2,NL)= & (BND_DATA_S_H(KOUNT)-BND_VARS_H%VAR_4D(NV)%SOUTH(I,J,K,1,NL))*RECIP ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! DEALLOCATE(BND_DATA_S_H) ! !------------- !*** South V !------------- ! ALLOCATE(BND_DATA_S_V(1:KOUNT_S_V)) !<-- For south boundary V-pt data from Solver import state ! move_now_south_v: IF(MOVE_NOW)THEN ! !----------------------------------------------------------------------- !*** Time level 1 (current) south boundary V values for new location !*** of this nest. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract South Boundary V Data in UPDATE_BC_TENDS for Time N" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='SOUTH_V_Current' & !<-- Name of south boundary V data at time N ,valueList=BND_DATA_S_V & !<-- The south boundary V data at time N ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO J=1,LNSV DO I=I1,I2_V KOUNT=KOUNT+1 BND_VARS_V%VAR_2D(NV)%SOUTH(I,J,1)=BND_DATA_S_V(KOUNT) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO K=1,LM DO J=1,LNSV DO I=I1,I2_V KOUNT=KOUNT+1 BND_VARS_V%VAR_3D(NV)%SOUTH(I,J,K,1)=BND_DATA_S_V(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDIF ! ENDIF move_now_south_v ! !----------------------------------------------------------------------- !*** Use time level 2 (future) south boundary V values to compute !*** new tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract South Boundary V Data in UPDATE_BC_TENDS" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='SOUTH_V_Future' & !<-- Name of south boundary V data at time N+1 ,valueList=BND_DATA_S_V & !<-- The boundary data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO J=1,LNSV DO I=I1,I2_V KOUNT=KOUNT+1 BND_VARS_V%VAR_2D(NV)%SOUTH(I,J,2)= & (BND_DATA_S_V(KOUNT)-BND_VARS_V%VAR_2D(NV)%SOUTH(I,J,1))*RECIP ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO K=1,LM DO J=1,LNSV DO I=I1,I2_V KOUNT=KOUNT+1 BND_VARS_V%VAR_3D(NV)%SOUTH(I,J,K,2)= & (BND_DATA_S_V(KOUNT)-BND_VARS_V%VAR_3D(NV)%SOUTH(I,J,K,1))*RECIP ENDDO ENDDO ENDDO ENDDO ENDIF ! DEALLOCATE(BND_DATA_S_V) ! ENDIF south ! !----------------------------------------------------------------------- ! north: IF(N_BDY)THEN ! !----------------------------------------------------------------------- ! !------------- !*** North H !------------- ! ALLOCATE(BND_DATA_N_H(1:KOUNT_N_H),stat=ISTAT) !<-- For north boundary H-pt data from Solver import state ! move_now_north_h: IF(MOVE_NOW)THEN ! !----------------------------------------------------------------------- !*** Time level 1 (current) north boundary H values for new location !*** of this nest. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract North Boundary H Data in UPDATE_BC_TENDS for Time N" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='NORTH_H_Current' & !<-- Name of north boundary H data at time N ,valueList=BND_DATA_N_H & !<-- The north boundary H data at time N ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_2D(NV)%NORTH(I,J,1)=BND_DATA_N_H(KOUNT) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO K=1,LM DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_3D(NV)%NORTH(I,J,K,1)=BND_DATA_N_H(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO K=1,LM DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_4D(NV)%NORTH(I,J,K,1,NL)=BND_DATA_N_H(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! ENDIF move_now_north_h ! !----------------------------------------------------------------------- !*** Use time level 2 (future) north boundary H values to compute !*** new tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract North Boundary H Data in UPDATE_BC_TENDS for time N+1" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='NORTH_H_Future' & !<-- Name of north boundary H data for time N+1 ,valueList=BND_DATA_N_H & !<-- The boundary data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_2D(NV)%NORTH(I,J,2)= & (BND_DATA_N_H(KOUNT)-BND_VARS_H%VAR_2D(NV)%NORTH(I,J,1))*RECIP ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO K=1,LM DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_3D(NV)%NORTH(I,J,K,2)= & (BND_DATA_N_H(KOUNT)-BND_VARS_H%VAR_3D(NV)%NORTH(I,J,K,1))*RECIP ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO K=1,LM DO J=1,LNSH DO I=I1,I2_H KOUNT=KOUNT+1 BND_VARS_H%VAR_4D(NV)%NORTH(I,J,K,2,NL)= & (BND_DATA_N_H(KOUNT)-BND_VARS_H%VAR_4D(NV)%NORTH(I,J,K,1,NL))*RECIP ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! DEALLOCATE(BND_DATA_N_H) ! !------------- !*** North V !------------- ! ALLOCATE(BND_DATA_N_V(1:KOUNT_N_V)) !<-- For north boundary V-pt data from Solver import state ! move_now_north_v: IF(MOVE_NOW)THEN ! !----------------------------------------------------------------------- !*** Time level 1 (current) north boundary V values for new location !*** of this nest. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract North Boundary V Data in UPDATE_BC_TENDS for Time N" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='NORTH_V_Current' & !<-- Name of north boundary V data at time N ,valueList=BND_DATA_N_V & !<-- The north boundary V data at time N ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO J=1,LNSV DO I=I1,I2_V KOUNT=KOUNT+1 BND_VARS_V%VAR_2D(NV)%NORTH(I,J,1)=BND_DATA_S_V(KOUNT) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO K=1,LM DO J=1,LNSV DO I=I1,I2_V KOUNT=KOUNT+1 BND_VARS_V%VAR_3D(NV)%NORTH(I,J,K,1)=BND_DATA_N_V(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDIF ! ENDIF move_now_north_v ! !----------------------------------------------------------------------- !*** Use time level 2 (future) north boundary H values to compute !*** new tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract North Boundary V Data in UPDATE_BC_TENDS for Time N+1" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='NORTH_V_Future' & !<-- Name of north boundary V data at time N+1 ,valueList=BND_DATA_N_V & !<-- The boundary data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO J=1,LNSV DO I=I1,I2_V KOUNT=KOUNT+1 BND_VARS_V%VAR_2D(NV)%NORTH(I,J,2)= & (BND_DATA_N_V(KOUNT)-BND_VARS_V%VAR_2D(NV)%NORTH(I,J,1))*RECIP ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO K=1,LM DO J=1,LNSV DO I=I1,I2_V KOUNT=KOUNT+1 BND_VARS_V%VAR_3D(NV)%NORTH(I,J,K,2)= & (BND_DATA_N_V(KOUNT)-BND_VARS_V%VAR_3D(NV)%NORTH(I,J,K,1))*RECIP ENDDO ENDDO ENDDO ENDDO ENDIF ! DEALLOCATE(BND_DATA_N_V) ! ENDIF north ! !----------------------------------------------------------------------- ! west: IF(W_BDY)THEN ! !----------------------------------------------------------------------- ! !------------ !*** West H !------------ ! ALLOCATE(BND_DATA_W_H(1:KOUNT_W_H)) !<-- For west boundary H-pt data from Solver import state ! move_now_west_h: IF(MOVE_NOW)THEN ! !----------------------------------------------------------------------- !*** Time level 1 (current) west boundary H values for new location !*** of this nest. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract West Boundary H Data in UPDATE_BC_TENDS for Time N" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='WEST_H_Current' & !<-- Name of west boundary H data at time N ,valueList=BND_DATA_W_H & !<-- The west boundary H data at time N ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_2D(NV)%WEST(I,J,1)=BND_DATA_W_H(KOUNT) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO K=1,LM DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_3D(NV)%WEST(I,J,K,1)=BND_DATA_W_H(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO K=1,LM DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_4D(NV)%WEST(I,J,K,1,NL)=BND_DATA_W_H(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! ENDIF move_now_west_h ! !----------------------------------------------------------------------- !*** Use time level 2 (future) west boundary H values to compute !*** new tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract West Boundary H Data in UPDATE_BC_TENDS at Time N+1" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='WEST_H_Future' & !<-- Name of west boundary H data at time N+1 ,valueList=BND_DATA_W_H & !<-- The boundary data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_2D(NV)%WEST(I,J,2)= & (BND_DATA_W_H(KOUNT)-BND_VARS_H%VAR_2D(NV)%WEST(I,J,1))*RECIP ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO K=1,LM DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_3D(NV)%WEST(I,J,K,2)= & (BND_DATA_W_H(KOUNT)-BND_VARS_H%VAR_3D(NV)%WEST(I,J,K,1))*RECIP ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO K=1,LM DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_4D(NV)%WEST(I,J,K,2,NL)= & (BND_DATA_W_H(KOUNT)-BND_VARS_H%VAR_4D(NV)%WEST(I,J,K,1,NL))*RECIP ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! DEALLOCATE(BND_DATA_W_H) ! !------------ !*** West V !------------ ! ALLOCATE(BND_DATA_W_V(1:KOUNT_W_V)) !<-- For west boundary V-pt data from Solver import state ! move_now_west_v: IF(MOVE_NOW)THEN ! !----------------------------------------------------------------------- !*** Time level 1 (current) west boundary V values for new location !*** of this nest. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract West Boundary V Data in UPDATE_BC_TENDS for Time N" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='WEST_V_Current' & !<-- Name of west boundary V data at time N ,valueList=BND_DATA_W_V & !<-- The west boundary V data at time N ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO J=J1,J2_V DO I=1,LNSV KOUNT=KOUNT+1 BND_VARS_V%VAR_2D(NV)%WEST(I,J,1)=BND_DATA_W_V(KOUNT) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO K=1,LM DO J=J1,J2_V DO I=1,LNSV KOUNT=KOUNT+1 BND_VARS_V%VAR_3D(NV)%WEST(I,J,K,1)=BND_DATA_W_V(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDIF ! ENDIF move_now_west_v ! !----------------------------------------------------------------------- !*** Use time level 2 (future) west boundary V values to compute !*** new tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract West Boundary V Data in UPDATE_BC_TENDS at Time N+1" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='WEST_V_Future' & !<-- Name of west boundary V data at time N+1 ,valueList=BND_DATA_W_V & !<-- The boundary data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO J=J1,J2_V DO I=1,LNSV KOUNT=KOUNT+1 BND_VARS_V%VAR_2D(NV)%WEST(I,J,2)= & (BND_DATA_W_V(KOUNT)-BND_VARS_V%VAR_2D(NV)%WEST(I,J,1))*RECIP ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO K=1,LM DO J=J1,J2_V DO I=1,LNSV KOUNT=KOUNT+1 BND_VARS_V%VAR_3D(NV)%WEST(I,J,K,2)= & (BND_DATA_W_V(KOUNT)-BND_VARS_V%VAR_3D(NV)%WEST(I,J,K,1))*RECIP ENDDO ENDDO ENDDO ENDDO ENDIF ! DEALLOCATE(BND_DATA_W_V) ! ENDIF west ! !----------------------------------------------------------------------- ! east: IF(E_BDY)THEN ! !----------------------------------------------------------------------- ! !------------ !*** East H !------------ ! ALLOCATE(BND_DATA_E_H(1:KOUNT_E_H)) !<-- For east boundary H-pt data from Solver import state ! move_now_east_h: IF(MOVE_NOW)THEN ! !----------------------------------------------------------------------- !*** Time level 1 (current) east boundary H values for new location !*** of this nest. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract East Boundary H Data in UPDATE_BC_TENDS for Time N" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='EAST_H_Current' & !<-- Name of east boundary H data at time N ,valueList=BND_DATA_E_H & !<-- The east boundary H data at time N ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_2D(NV)%EAST(I,J,1)=BND_DATA_E_H(KOUNT) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO K=1,LM DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_3D(NV)%EAST(I,J,K,1)=BND_DATA_E_H(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO K=1,LM DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_4D(NV)%EAST(I,J,K,1,NL)=BND_DATA_E_H(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! ENDIF move_now_east_h ! !----------------------------------------------------------------------- !*** Use time level 2 (future) east boundary H values to compute !*** new tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract East Boundary H Data in UPDATE_BC_TENDS at Time N+1" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='EAST_H_Future' & !<-- Name of east boundary H data at time N+1 ,valueList=BND_DATA_E_H & !<-- The boundary data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_2D(NV)%EAST(I,J,2)= & (BND_DATA_E_H(KOUNT)-BND_VARS_H%VAR_2D(NV)%EAST(I,J,1))*RECIP ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO K=1,LM DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_3D(NV)%EAST(I,J,K,2)= & (BND_DATA_E_H(KOUNT)-BND_VARS_H%VAR_3D(NV)%EAST(I,J,K,1))*RECIP ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO K=1,LM DO J=J1,J2_H DO I=1,LNSH KOUNT=KOUNT+1 BND_VARS_H%VAR_4D(NV)%EAST(I,J,K,2,NL)= & (BND_DATA_E_H(KOUNT)-BND_VARS_H%VAR_4D(NV)%EAST(I,J,K,1,NL))*RECIP ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! DEALLOCATE(BND_DATA_E_H) ! !------------ !*** East V !------------ ! ALLOCATE(BND_DATA_E_V(1:KOUNT_E_V)) !<-- For east boundary V-pt data from Solver import state ! move_now_east_v: IF(MOVE_NOW)THEN ! !----------------------------------------------------------------------- !*** Time level 1 (current) east boundary V values for new location !*** of this nest. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract East Boundary V Data in UPDATE_BC_TENDS for Time N" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='EAST_V_Current' & !<-- Name of esat boundary V data at time N ,valueList=BND_DATA_E_V & !<-- The east boundary V data at time N ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO J=J1,J2_V DO I=1,LNSV KOUNT=KOUNT+1 BND_VARS_V%VAR_2D(NV)%EAST(I,J,1)=BND_DATA_E_V(KOUNT) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO K=1,LM DO J=J1,J2_V DO I=1,LNSV KOUNT=KOUNT+1 BND_VARS_V%VAR_3D(NV)%EAST(I,J,K,1)=BND_DATA_E_V(KOUNT) ENDDO ENDDO ENDDO ENDDO ENDIF ! ENDIF move_now_east_v ! !----------------------------------------------------------------------- !*** Use time level 2 (future) east boundary V values to compute !*** new tendencies. !----------------------------------------------------------------------- ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract East Boundary V Data in UPDATE_BC_TENDS for Time N+1" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_AttributeGet(state =IMP_STATE & !<-- Solver import state ,name ='EAST_V_Future' & !<-- Name of east boundary V data at time N+1 ,valueList=BND_DATA_E_V & !<-- The boundary data ,rc =RC ) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_BCT) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! KOUNT=0 ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO J=J1,J2_V DO I=1,LNSV KOUNT=KOUNT+1 BND_VARS_V%VAR_2D(NV)%EAST(I,J,2)= & (BND_DATA_E_V(KOUNT)-BND_VARS_V%VAR_2D(NV)%EAST(I,J,1))*RECIP ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO K=1,LM DO J=J1,J2_V DO I=1,LNSV KOUNT=KOUNT+1 BND_VARS_V%VAR_3D(NV)%EAST(I,J,K,2)= & (BND_DATA_E_V(KOUNT)-BND_VARS_V%VAR_3D(NV)%EAST(I,J,K,1))*RECIP ENDDO ENDDO ENDDO ENDDO ENDIF ! DEALLOCATE(BND_DATA_E_V) ! ENDIF east ! !----------------------------------------------------------------------- ! END SUBROUTINE UPDATE_BC_TENDS ! !----------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- ! SUBROUTINE SAVE_BC_DATA(LM,LNSH,LNSV & ,NVARS_BC_2D_H & ,NVARS_BC_3D_H & ,NVARS_BC_4D_H & ,NVARS_BC_2D_V & ,NVARS_BC_3D_V & ,BND_VARS_H & ,BND_VARS_V & ,NUM_WORDS_BC_SOUTH,RST_BC_DATA_SOUTH & ,NUM_WORDS_BC_NORTH,RST_BC_DATA_NORTH & ,NUM_WORDS_BC_WEST ,RST_BC_DATA_WEST & ,NUM_WORDS_BC_EAST ,RST_BC_DATA_EAST & ,EXP_STATE_SOLVER & ,ITS,ITE,JTS,JTE & ,IMS,IME,JMS,JME & ,IDS,IDE,JDS,JDE & ) ! !----------------------------------------------------------------------- !*** Boundary array winds are needed in the restart file in order to !*** achieve bit identical answers between restarted runs and their !*** free-forecast analogs. The boundary arrays do not span the !*** integration grid thus they can only be transmitted through !*** ESMF States as Attributes. Non-scalar Attributes can only !*** contain one dimension therefore the boundary data is moved !*** into 1-D arrays in this routine then inserted into the !*** Write component's import state. !----------------------------------------------------------------------- ! !--------------------- !*** Input Arguments !--------------------- ! INTEGER(kind=KINT),INTENT(IN) :: LNSH & !<-- # of boundary blending rows for H points ,LNSV & !<-- # of boundary blending rows for V points ,NUM_WORDS_BC_SOUTH & !<-- Total # of words in south bndry winds, this fcst task ,NUM_WORDS_BC_NORTH & !<-- Total # of words in north bndry winds, this fcst task ,NUM_WORDS_BC_WEST & !<-- Total # of words in west bndry winds, this fcst task ,NUM_WORDS_BC_EAST !<-- Total # of words in east bndry winds, this fcst task ! INTEGER(kind=KINT),INTENT(IN) :: NVARS_BC_2D_H & ,NVARS_BC_3D_H & ,NVARS_BC_4D_H & ,NVARS_BC_2D_V & ,NVARS_BC_3D_V ! INTEGER(kind=KINT),INTENT(IN) :: IDS,IDE,JDS,JDE & !<-- ,IMS,IME,JMS,JME & !<-- Array dimensions ,ITS,ITE,JTS,JTE & !<-- ,LM !<-- ! TYPE(BC_H_ALL),INTENT(IN) :: BND_VARS_H !<-- All H-pt boundary data/tendencies ! TYPE(BC_V_ALL),INTENT(IN) :: BND_VARS_V !<-- All V-pt boundary data/tendencies ! !--------------------- !*** Inout Arguments !--------------------- ! TYPE(ESMF_State),INTENT(INOUT) :: EXP_STATE_SOLVER !<-- The Solver export state ! !---------------------- !*** Output Arguments !---------------------- ! REAL(kind=KFPT),DIMENSION(1:NUM_WORDS_BC_SOUTH),INTENT(OUT) :: & RST_BC_DATA_SOUTH !<-- All south bndry wind data on this fcst task REAL(kind=KFPT),DIMENSION(1:NUM_WORDS_BC_NORTH),INTENT(OUT) :: & RST_BC_DATA_NORTH !<-- All north bndry wind data on this fcst task REAL(kind=KFPT),DIMENSION(1:NUM_WORDS_BC_WEST ),INTENT(OUT) :: & RST_BC_DATA_WEST !<-- All west bndry wind data on this fcst task REAL(kind=KFPT),DIMENSION(1:NUM_WORDS_BC_EAST ),INTENT(OUT) :: & RST_BC_DATA_EAST !<-- All east bndry wind data on this fcst task ! !----------------------------------------------------------------------- ! !--------------------- !*** Local Variables !--------------------- ! INTEGER(kind=KINT) :: IB,JB,KOUNT,L,LBND,NL,NT,NV,UBND ! INTEGER(kind=KINT) :: RC,RC_SAVE ! TYPE(ESMF_State) :: IMP_STATE_WRITE ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** Southern boundary data to 1-D !----------------------------------------------------------------------- ! IF(JTS==JDS)THEN !<-- Tasks on south boundary ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO NT=1,2 DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_SOUTH(KOUNT)=BND_VARS_H%VAR_2D(NV)%SOUTH(IB,JB,NT) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO NT=1,2 DO L=1,LM DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_SOUTH(KOUNT)=BND_VARS_H%VAR_3D(NV)%SOUTH(IB,JB,L,NT) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO NT=1,2 DO L=1,LM DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_SOUTH(KOUNT)=BND_VARS_H%VAR_4D(NV)%SOUTH(IB,JB,L,NT,NL) ENDDO ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO NT=1,2 DO JB=1,LNSV DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_SOUTH(KOUNT)=BND_VARS_V%VAR_2D(NV)%SOUTH(IB,JB,NT) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO NT=1,2 DO L=1,LM DO JB=1,LNSV DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_SOUTH(KOUNT)=BND_VARS_V%VAR_3D(NV)%SOUTH(IB,JB,L,NT) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract Write Import State in SAVE_BC_DATA" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateGet(state =EXP_STATE_SOLVER & !<-- The Solver export state ,itemName ='Write Import State' & !<-- Name of the state to get from Solver export state ,nestedState=IMP_STATE_WRITE & !<-- Extract Write Component import state from Solver export ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_SAVE) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set BC South Data Attribute in SAVE_BC_DATA" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ESMF_AttributeSet(state =IMP_STATE_WRITE & !<-- The Write component import state ,name ='RST_BC_DATA_SOUTH' & !<-- Name of 1-D string of south boundary values ,itemCount=NUM_WORDS_BC_SOUTH & !<-- # of south boundary words on this fcst task ,valueList=RST_BC_DATA_SOUTH & !<-- The 1-D data being inserted into the Write import state ,rc =RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_SAVE) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ENDIF ! !----------------------------------------------------------------------- !*** Northern boundary data to 1-D !----------------------------------------------------------------------- ! IF(JTE==JDE)THEN !<-- Tasks on north boundary ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_H%VAR_2D(NV)%NORTH(IB,JB,1) ENDDO ENDDO DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_H%VAR_2D(NV)%NORTH(IB,JB,2) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO L=1,LM DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_H%VAR_3D(NV)%NORTH(IB,JB,L,1) ENDDO ENDDO ENDDO DO L=1,LM DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_H%VAR_3D(NV)%NORTH(IB,JB,L,2) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO L=1,LM DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_H%VAR_4D(NV)%NORTH(IB,JB,L,1,NL) ENDDO ENDDO ENDDO DO L=1,LM DO JB=1,LNSH DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_H%VAR_4D(NV)%NORTH(IB,JB,L,2,NL) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO JB=1,LNSV DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_V%VAR_2D(NV)%NORTH(IB,JB,1) ENDDO ENDDO DO JB=1,LNSV DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_V%VAR_2D(NV)%NORTH(IB,JB,2) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO L=1,LM DO JB=1,LNSV DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_V%VAR_3D(NV)%NORTH(IB,JB,L,1) ENDDO ENDDO ENDDO DO L=1,LM DO JB=1,LNSV DO IB=ITS,ITE KOUNT=KOUNT+1 RST_BC_DATA_NORTH(KOUNT)=BND_VARS_V%VAR_3D(NV)%NORTH(IB,JB,L,2) ENDDO ENDDO ENDDO ENDDO ENDIF ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract Write Import State in SAVE_BC_DATA" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateGet(state =EXP_STATE_SOLVER & !<-- The Solver export state ,itemName ='Write Import State' & !<-- Name of the state to get from Solver export state ,nestedState=IMP_STATE_WRITE & !<-- Extract Write Component import state from Solver export ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_SAVE) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set BC North Data Attribute in SAVE_BC_DATA" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ESMF_AttributeSet(state =IMP_STATE_WRITE & !<-- The Write component import state ,name ='RST_BC_DATA_NORTH' & !<-- Name of 1-D string of north boundary values ,itemCount=NUM_WORDS_BC_NORTH & !<-- # of north boundary words on this fcst task ,valueList=RST_BC_DATA_NORTH & !<-- The 1-D data being inserted into the Write import state ,rc =RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_SAVE) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ENDIF ! !----------------------------------------------------------------------- !*** Western boundary data to 1-D !----------------------------------------------------------------------- ! IF(ITS==IDS)THEN !<-- Tasks on west boundary ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_H%VAR_2D(NV)%WEST(IB,JB,1) ENDDO ENDDO DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_H%VAR_2D(NV)%WEST(IB,JB,2) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_H%VAR_3D(NV)%WEST(IB,JB,L,1) ENDDO ENDDO ENDDO DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_H%VAR_3D(NV)%WEST(IB,JB,L,2) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_H%VAR_4D(NV)%WEST(IB,JB,L,1,NL) ENDDO ENDDO ENDDO DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_H%VAR_4D(NV)%WEST(IB,JB,L,2,NL) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO JB=JTS,JTE DO IB=1,LNSV KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_V%VAR_2D(NV)%WEST(IB,JB,1) ENDDO ENDDO DO JB=JTS,JTE DO IB=1,LNSV KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_V%VAR_2D(NV)%WEST(IB,JB,2) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSV KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_V%VAR_3D(NV)%WEST(IB,JB,L,1) ENDDO ENDDO ENDDO DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSV KOUNT=KOUNT+1 RST_BC_DATA_WEST(KOUNT)=BND_VARS_V%VAR_3D(NV)%WEST(IB,JB,L,2) ENDDO ENDDO ENDDO ENDDO ENDIF ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract Write Import State in SAVE_BC_DATA" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateGet(state =EXP_STATE_SOLVER & !<-- The Solver export state ,itemName ='Write Import State' & !<-- Name of the state to get from Solver export state ,nestedState=IMP_STATE_WRITE & !<-- Extract Write Component import state from Solver export ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_SAVE) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set BC West Data Attribute in SAVE_BC_DATA" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ESMF_AttributeSet(state =IMP_STATE_WRITE & !<-- The Write component import state ,name ='RST_BC_DATA_WEST' & !<-- Name of 1-D string of west boundary values ,itemCount=NUM_WORDS_BC_WEST & !<-- # of west boundary words on this fcst task ,valueList=RST_BC_DATA_WEST & !<-- The 1-D data being inserted into the Write import state ,rc =RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_SAVE) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ENDIF ! !----------------------------------------------------------------------- !*** Eastern boundary data to 1-D !----------------------------------------------------------------------- ! IF(ITE==IDE)THEN !<-- Tasks on east boundary ! KOUNT=0 ! IF(NVARS_BC_2D_H>0)THEN DO NV=1,NVARS_BC_2D_H DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_H%VAR_2D(NV)%EAST(IB,JB,1) ENDDO ENDDO DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_H%VAR_2D(NV)%EAST(IB,JB,2) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_H>0)THEN DO NV=1,NVARS_BC_3D_H DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_H%VAR_3D(NV)%EAST(IB,JB,L,1) ENDDO ENDDO ENDDO DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_H%VAR_3D(NV)%EAST(IB,JB,L,2) ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_4D_H>0)THEN DO NV=1,NVARS_BC_4D_H LBND=LBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) UBND=UBOUND(BND_VARS_H%VAR_4D(NV)%FULL_VAR,4) DO NL=LBND,UBND DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_H%VAR_4D(NV)%EAST(IB,JB,L,1,NL) ENDDO ENDDO ENDDO DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSH KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_H%VAR_4D(NV)%EAST(IB,JB,L,2,NL) ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_2D_V>0)THEN DO NV=1,NVARS_BC_2D_V DO JB=JTS,JTE DO IB=1,LNSV KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_V%VAR_2D(NV)%EAST(IB,JB,1) ENDDO ENDDO DO JB=JTS,JTE DO IB=1,LNSV KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_V%VAR_2D(NV)%EAST(IB,JB,2) ENDDO ENDDO ENDDO ENDIF ! IF(NVARS_BC_3D_V>0)THEN DO NV=1,NVARS_BC_3D_V DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSV KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_V%VAR_3D(NV)%EAST(IB,JB,L,1) ENDDO ENDDO ENDDO DO L=1,LM DO JB=JTS,JTE DO IB=1,LNSV KOUNT=KOUNT+1 RST_BC_DATA_EAST(KOUNT)=BND_VARS_V%VAR_3D(NV)%EAST(IB,JB,L,2) ENDDO ENDDO ENDDO ENDDO ENDIF ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Extract Write Import State in SAVE_BC_DATA" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! CALL ESMF_StateGet(state =EXP_STATE_SOLVER & !<-- The Solver export state ,itemName ='Write Import State' & !<-- Name of the state to get from Solver export state ,nestedState=IMP_STATE_WRITE & !<-- Extract Write Component import state from Solver export ,rc =RC) ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_SAVE) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ MESSAGE_CHECK="Set BC East Data Attribute in SAVE_BC_DATA" ! CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOGMSG_INFO,rc=RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ESMF_AttributeSet(state =IMP_STATE_WRITE & !<-- The Write component import state ,name ='RST_BC_DATA_EAST' & !<-- Name of 1-D string of east boundary values ,itemCount=NUM_WORDS_BC_EAST & !<-- # of east boundary words on this fcst task ,valueList=RST_BC_DATA_EAST & !<-- The 1-D data being inserted into the Write import state ,rc =RC) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ CALL ERR_MSG(RC,MESSAGE_CHECK,RC_SAVE) ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ! ENDIF ! !----------------------------------------------------------------------- ! END SUBROUTINE SAVE_BC_DATA ! !----------------------------------------------------------------------- !####################################################################### !----------------------------------------------------------------------- ! SUBROUTINE PHYSICS_INITIALIZE(GFS & ,SHORTWAVE & ,LONGWAVE & ,CONVECTION & ,MICROPHYSICS & ,SFC_LAYER & ,TURBULENCE & ,LAND_SURFACE & ,CO2TF & ,NP3D & ,SBD,WBD & ,DPHD,DLMD & ,TPH0D,TLM0D & ,MY_DOMAIN_ID & ,MYPE & ,MPI_COMM_COMP & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE & ,RC) ! !----------------------------------------------------------------------- ! USE MODULE_CONSTANTS,ONLY : A,CLIQ,CV,DTR,PI & ,RHOAIR0,RHOWATER,RHOSNOW ! USE MODULE_INIT_READ_BIN,ONLY : physics_read_gwd ! !----------------------------------------------------------------------- !*** Only for GFS physics !----------------------------------------------------------------------- ! USE FUNCPHYS USE MODULE_MP_FER_HIRES, ONLY : GPVS_HR USE MERSENNE_TWISTER USE N_LAYOUT1, ONLY : LATS_NODE_R,IPT_LATS_NODE_R ! USE TRACER_CONST, ONLY : SET_TRACER_CONST ! USE DATE_DEF, ONLY : FHOUR USE N_RESOL_DEF, ONLY : LSOIL,LEVR,NXPT,JCAP,LEVS,NYPT & ,JINTMX,THERMODYN_ID,SFCPRESS_ID & ,NUM_P3D,NUM_P2D,NTOZ,NTCW,NCLD & ,NMTVR,NFXR,LONR,LATR ! USE OZNE_DEF, ONLY: LEVOZC,LATSOZP,BLATC,TIMEOZC,TIMEOZ & ,KOZPL,LEVOZP,PL_TIME,PL_LAT,PL_PRES & ,KOZC,DPHIOZC,LATSOZC,PL_COEFF USE N_NAMELIST_PHYSICS_DEF, ONLY: ISOL,ICO2,IALB,IEMS,IAER,ICTM & ,IOVR_SW,IOVR_LW,LSSAV,LDIAG3D & ,FHCYC,SASHAL,PRE_RAD,RAS,LSM & ,CDMBGWD,DLQF,CTEI_RM,LGGFS3D & ,BKGD_VDIF_M, SHAL_CNV & ,BKGD_VDIF_H,BKGD_VDIF_S & ,PSAUTCO,PRAUTCO,EVPCO & ,CAL_PRE,MOM4ICE,MSTRAT & ,TRANS_TRAC,NST_FCST & ,MOIST_ADJ USE MODULE_CONTROL,ONLY : NMMB_FINALIZE ! !----------------------------------------------------------------------- ! !------------------------ !*** Argument variables !------------------------ ! INTEGER(kind=KINT),INTENT(IN) :: CO2TF & ,MPI_COMM_COMP & ,MY_DOMAIN_ID & ,MYPE, NP3D ! INTEGER(kind=KINT),INTENT(IN) :: IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE ! REAL(kind=KFPT),INTENT(INOUT) :: DLMD,DPHD & ,TPH0D,TLM0D & ,SBD,WBD ! LOGICAL,INTENT(IN) :: GFS ! CHARACTER(99),INTENT(IN) :: CONVECTION,LONGWAVE,MICROPHYSICS & ,SFC_LAYER,SHORTWAVE,TURBULENCE & ,LAND_SURFACE ! INTEGER(kind=KINT),INTENT(OUT) :: RC ! !--------------------- !*** Local variables !--------------------- ! INTEGER :: I,I_HI,I_LO,IHRST,IRTN,J,J_HI,J_LO,JULDAY,JULYR & ,K,KFLIP,L,LPT2,N,NFCST,NRECS_SKIP_FOR_PT & ,NSOIL,NSTEPS_PER_HOUR,NTIMESTEP ! INTEGER :: LDIM1,LDIM2,UDIM1,UDIM2 ! INTEGER :: IAER_MDL, ISUBCSW, ISUBCLW, IFLIP, & ICLIQ_SW, ICICE_SW, ICLIQ_LW, ICICE_LW ! INTEGER,DIMENSION(3) :: IDAT ! INTEGER,DIMENSION(:,:),ALLOCATABLE :: ITEMP,LOWLYR ! REAL :: SECOND_FCST ! REAL :: SWRAD_SCAT=1. ! REAL :: DELX,DELY,DPH,DT,DT_MICRO,DTPHS & ,GMT,JULIAN,PDBOT,PDTOP,PDTOT,PT_CB,RELM,RPDTOT & ,SB,THETA_HALF,TPV,XTIME ! REAL,DIMENSION(LM) :: DSG1,PDSG1,PSGML1,SGML1,SGML2 REAL,DIMENSION(LM+1) :: PSG1,SG1,SG2,SGM & ,SFULL,SFULL_FLIP,SMID,SMID_FLIP REAL(KIND=KDBL),DIMENSION(LM+1) :: SFULLD ! REAL,DIMENSION(IMS:IME,JMS:JME) :: EMISS REAL,DIMENSION(:,:),ALLOCATABLE :: TEMP1,TEMP_GWD REAL,DIMENSION(:,:,:),ALLOCATABLE :: TEMPSOIL REAL,DIMENSION(NUM_SOIL_LAYERS) :: SOIL1DIN ! CHARACTER(LEN=256) :: INFILE ! LOGICAL,SAVE :: ALLOWED_TO_READ=.TRUE. LOGICAL :: OPENED LOGICAL :: LSASHAL LOGICAL :: CRICK_PROOF, CCNORM, NORAD_PRECIP ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** Initialize allocated arrays !----------------------------------------------------------------------- ! NSOIL=NUM_SOIL_LAYERS !<-- From Landsurface module ! !----------------------------------------------------------------------- !*** Dereference the start time. !----------------------------------------------------------------------- ! START_YEAR=int_state%START_YEAR START_MONTH=int_state%START_MONTH START_DAY=int_state%START_DAY START_HOUR=int_state%START_HOUR START_MINUTE=int_state%START_MINUTE START_SECOND=int_state%START_SECOND DT=int_state%DT ! !----------------------------------------------------------------------- !*** Radiation needs some specific time quantities. !----------------------------------------------------------------------- ! CALL TIME_MEASURE(START_YEAR,START_MONTH,START_DAY,START_HOUR & ,START_MINUTE,START_SECOND & ,NTIMESTEP,DT & ,JULDAY,JULYR,JULIAN,XTIME) ! !----------------------------------------------------------------------- !*** Open and read GWD data file (14 orography fields) !----------------------------------------------------------------------- ! gwd_read: IF(int_state%GWDFLG) THEN ! select_GWD_unit: DO N=51,59 INQUIRE(N,OPENED=OPENED) IF(.NOT.OPENED)THEN NFCST=N EXIT select_GWD_unit ENDIF ENDDO select_GWD_unit ! WRITE(INFILE,'(A,I2.2)')'GWD_bin_',MY_DOMAIN_ID ! !----------------------------------------------------------------------- ! CALL PHYSICS_READ_GWD(INFILE,NFCST,INT_STATE & ,MYPE,MPI_COMM_COMP & ,IDS,IDE,JDS,JDE,RC) ! IF (RC /= 0) THEN RETURN ENDIF ! !----------------------------------------------------------------------- ! ENDIF gwd_read ! !----------------------------------------------------------------------- ! PT_CB=int_state%PT*1.0E-3 !<-- Convert pascals to centibars for GFDL initialization ! !----------------------------------------------------------------------- !*** Make up a potential skin temperature. !----------------------------------------------------------------------- ! IF(.NOT.int_state%RESTART) THEN ! DO J=JTS,JTE DO I=ITS,ITE int_state%THS(I,J)=int_state%TSKIN(I,J) & *(100000./(int_state%SG2(LM+1)*int_state%PD(I,J) & +int_state%PSG1(LM+1)))**CAPPA ENDDO ENDDO ! ENDIF ! !----------------------------------------------------------------------- !*** Initializing TLMAX, TLMIN !----------------------------------------------------------------------- ! DO J=JTS,JTE DO I=ITS,ITE int_state%TLMAX(I,J)=int_state%T(I,J,1) int_state%TLMIN(I,J)=int_state%T(I,J,1) ENDDO ENDDO ! !----------------------------------------------------------------------- !*** Recreate sigma values at layer interfaces for the full vertical !*** domain. !----------------------------------------------------------------------- ! DO L=1,LM+1 SFULL(L)=int_state%SGM(L) ENDDO ! DO L=1,LM SMID(L)=(SFULL(L)+SFULL(L+1))*0.5 ENDDO ! SMID(LM+1)=-9999999. ! !----------------------------------------------------------------------- !*** The radiative emissivity !----------------------------------------------------------------------- ! DO J=JMS,JME DO I=IMS,IME EMISS(I,J)=1. ENDDO ENDDO ! !----------------------------------------------------------------------- !*** Choose a J index for an "average" DX. !*** Select the J that divides the domain's area in half. !----------------------------------------------------------------------- ! SB=int_state%SBD*DTR DPH=int_state%DPHD*DTR !!! THETA_HALF=ASIN(0.5*SIN(-SB)) THETA_HALF=0. JC=NINT(0.5*(JDE-JDS+1)+THETA_HALF/DPH) ! !----------------------------------------------------------------------- !*** Set time variables needed for history output. !----------------------------------------------------------------------- ! NSTEPS_PER_HOUR=NINT(3600./int_state%DT) int_state%NPREC=NSTEPS_PER_HOUR*int_state%NHRS_PREC int_state%NCLOD=NSTEPS_PER_HOUR*int_state%NHRS_CLOD int_state%NHEAT=NSTEPS_PER_HOUR*int_state%NHRS_HEAT int_state%NRDLW=NSTEPS_PER_HOUR*int_state%NHRS_RDLW int_state%NRDSW=NSTEPS_PER_HOUR*int_state%NHRS_RDSW int_state%NSRFC=NSTEPS_PER_HOUR*int_state%NHRS_SRFC ! !----------------------------------------------------------------------- !*** If this is a restarted run from timestep 0 then zero out !*** the accumulated precip since they pass through the analysis !*** with nonzero values from the first guess. !----------------------------------------------------------------------- ! IF(int_state%RST_OUT_00)THEN DO J=JMS,JME DO I=IMS,IME int_state%ACPREC(I,J)=0. int_state%ACPREC_TOT(I,J)=0. int_state%CUPREC(I,J)=0. ENDDO ENDDO ENDIF ! !----------------------------------------------------------------------- !*** Finally initialize individual schemes. !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !*** The GFS physics suite is considered a single package here. !---------------------------------------------------------------------- ! package: IF(GFS)THEN ! ! ELSE ! !---------------------------------------------------------------------- !*** If not selecting the GFS suite, each of the physics groups is !*** treated individually. !---------------------------------------------------------------------- ! !---------------------------------------------------------------------- !*** Longwave radiation !---------------------------------------------------------------------- ! SELECT CASE (longwave) CASE ('gfdl') ! !*** We are calling a WRF routine thus flip the vertical. ! DO K=1,LM KFLIP=LM+1-K SFULL_FLIP(KFLIP)=SFULL(K+1) SMID_FLIP(KFLIP)=SMID(K) ENDDO SFULL_FLIP(LM+1)=SFULL(1) ! GMT=REAL(START_HOUR) CALL GFDL_INIT(EMISS,SFULL_FLIP,SMID_FLIP,PT_CB & ,JULYR,START_MONTH,START_DAY,GMT & ,CO2TF & ,IDS,IDE,JDS,JDE,1,LM+1 & ,IMS,IME,JMS,JME,1,LM+1 & ,ITS,ITE,JTS,JTE,1,LM) CASE ('rrtm') CALL GPKAP ! for ozone by using the unified RRTM from GFS CALL GPVS ! for aerosol by using the unified RRTM from GFS CALL GPVS_HR !- Initialize regional version of FPVS, FPVS0 functions ! !----------------------------------------------------------------------- !*** For threading safe (rad_initialize). Default value !----------------------------------------------------------------------- ! ICTM=1 ! 0: use data at initial cond time, if not available, use latest, no extrapolation. ! 1: use data at the forecast time, if not available, use latest and extrapolation. ! -1: use user provided external data for the fcst time, no extrapolation. ! -2: same as ictm=0, but add seasonal cycle from climatology. no extrapolation. ! yyyy0: use yyyy data for the forecast time, no further data extrapolation. ! yyyy1: use yyyy data for the fcst. if needed, do extrapolation to match the fcst time. ISOL=0 ! 0: use a fixed solar constant value 1.3660e+3 (default) !10: use a fixed solar constant value 1.3608e+3 ! 1: use 11-year cycle solar constant table ICO2=1 ! 0: use prescribed global mean co2 (default) ! 1: use observed co2 annual mean value only ! 2: use obs co2 monthly data with 2-d variation IAER=11 ! flag for aerosols scheme selection (all options work for NMMB) ! - 3-digit aerosol flag (volc,lw,sw) ! 0: turn all aeros effects off (sw,lw,volc) ! 1: use clim tropspheric aerosol for sw only ! 10: use clim tropspheric aerosol for lw only ! 11: use clim tropspheric aerosol for both sw and lw ! 100: volc aerosol only for both sw and lw ! 101: volc and clim trops aerosol for sw only ! 110: volc and clim trops aerosol for lw only ! 111: volc and clim trops aerosol for both sw and lw ! 2: gocart/BSC-Dust tropspheric aerosol for sw only ! 20: gocart/BSC-Dust tropspheric aerosol for lw only ! 22: gocart/BSC-Dust tropspheric aerosol for both sw and lw ! 102: volc and gocart trops aerosol for sw only ! 120: volc and gocart trops aerosol for lw only ! 122: volc and gocart trops aerosol for both sw and lw IAER_MDL=0 ! default aerosol model is opac-climatology ! > 0, future gocart-clim/prog scheme (not ready) IALB=2 ! control flag for surface albedo schemes ! 0: climatology, based on surface veg types ! ONLY THIS ONE WORKS (GFS) ! 1: modis retrieval based surface albedo scheme ! 2: use externally provided albedoes directly. ! ONLY THIS ONE WORKS for regional ! (CALCULATES ALBEDO FROM NMMB MONTHLY CLIMATOLOGY AS IN GFDL RADIATION) IEMS=0 ! control flag for surface emissivity schemes ! 0: fixed value of 1.0 (default) ! 1: varying value based on surface veg types NTCW=3 ! 0: no cloud condensate calculated ! >0: array index location for cloud condensate ! NP3D=3 ! 3: ferrier's microphysics cloud scheme (only stratiform cloud) ! (set iflagliq>0 in radsw_param.f and radlw_param.f) ! 4: zhao/carr/sundqvist microphysics cloud (now available in the NMMB) ! 5: NAM stratiform + convective cloud optical depth and fraction ! (set iflagliq=0 in radsw_param.f and radlw_param.f) NTOZ=0 ! 0: climatological ozone profile ! >0: interactive ozone profile IOVR_SW=1 ! 0 sw: random overlap clouds ! 1 sw: max-random overlap clouds IOVR_LW=1 ! 0 lw: random overlap clouds ! 1 lw: max-random overlap clouds ISUBCSW=0 ! isubcsw/isubclw ! sub-column cloud approx control flag (sw/lw rad) ! 0: with out sub-column cloud approximation ! 1: mcica sub-col approx. prescribed random seed ! 2: mcica sub-col approx. provided random seed ISUBCLW=0 !---------------------------------------------------------- ! --- check physparam for detail of the following --------- ICLIQ_SW=1 ! sw optical property for liquid clouds ICICE_SW=3 ! sw optical property for ice clouds (only iswcliq>0) ICLIQ_LW=1 ! lw optical property for liquid clouds ICICE_LW=1 ! lw optical property for ice clouds (only ilwcliq>0) !---------------------------------------------------------- IFLIP=0 ! 0: input data from toa to sfc ! 1: input data from sfc to toa SASHAL=0 ! New Massflux based shallow convection (Not in use for NMMB) LSASHAL=.false. if (SASHAL>0 .and. .not.RAS) LSASHAL=.true. CRICK_PROOF=.false. ! flag for eliminating CRICK (smooths profiles) CCNORM=.true. ! flag for incloud condensate mixing ratio NORAD_PRECIP=.false. ! flag for precip in radiation ! .true. snow/rain has no impact on radiation !----------------------------------------------------------------------- !*** Initialize ozone !----------------------------------------------------------------------- !OZONE CLIMATOLOGY ! ! there is no header in global_o3clim.txt file IF (NTOZ .LE. 0) THEN ! DIAGNOSTIC OZONE, ONLY THIS ONE WORKS LEVOZC = 17 LATSOZC = 18 BLATC = -85.0 TIMEOZC = 12 !!! this is not in header LATSOZP = 2 LEVOZP = 1 TIMEOZ = 1 PL_COEFF = 0 ENDIF DPHIOZC = -(BLATC+BLATC)/(LATSOZC-1) !----------------------------------------------------------------------- !*** End initialization of ozone !----------------------------------------------------------------------- DO L=1,LM+1 SFULLD(L)=SFULL(L) !-- double precision ENDDO !========================================================================== ! Similar to GFS "GFS_Initialize_ESMFMod.f" line #1103 !========================================================================== !..Special case for altering microphysics coupling with RRTM radiation !.. based on namelist settings. The NP3Dx variable is incredibly convoluted !.. and renamed many times, including icmphys, np3d, and num_p3d. Extremely !.. confusing and hard-wired and needs help to adapt to new physics couplings !.. and choices for full flexibility. G. Thompson 06Feb2013 !..SPECIAL TEST FOR THOMPSON MICROPHYSICS AND RRTM RADIATION. It is strongly !.. advised against using GFDL or other radiation in combination with Thompson !.. microphysics because other schemes are not properly using the cloud data. IF (TRIM(int_state%SHORTWAVE)=='rrtm' .AND. & & TRIM(int_state%MICROPHYSICS)=='thompson' ) THEN IF (NP3D /=8) THEN WRITE(0,*)' User selected np3d=',NP3D WRITE(0,*)' NP3D=8 for RRTM & THOMPSON MICROPHYSICS' CALL NMMB_FINALIZE ENDIF ICICE_SW=4 ICICE_LW=4 ENDIF !========================================================================== !..For GFDL type diagnostic !========================================================================== IF (NP3D == 5) THEN ICLIQ_SW=0 ICLIQ_LW=0 ENDIF IF(MYPE==0)THEN WRITE(0,*)' Model Proces np3d=',NP3D ENDIF !========================================================================== call rad_initialize_nmmb & ! --- inputs: & ( SFULLD,LM,ICTM,ISOL,ICO2,IAER,IAER_MDL,IALB,IEMS,NTCW, & & NP3D,NTOZ,IOVR_SW,IOVR_LW,ISUBCSW,ISUBCLW, & & ICLIQ_SW,ICICE_SW,ICLIQ_LW,ICICE_LW, & & LSASHAL,CRICK_PROOF,CCNORM,NORAD_PRECIP,IFLIP,MYPE ) ! --- outputs: ! ( none ) !========================================================================== !========================================================================== DO K=1,LM KFLIP=LM+1-K SFULL_FLIP(KFLIP)=SFULL(K+1) SMID_FLIP(KFLIP)=SMID(K) ENDDO SFULL_FLIP(LM+1)=SFULL(1) ! GMT=REAL(START_HOUR) !========================================================================== ! This following "RRTM_INIT" is only a L,M,H DIAGNOSTIC cloud. ! It is not a real RRTM initialization !========================================================================== CALL RRTM_INIT(EMISS,SFULL_FLIP,SMID_FLIP,PT_CB & ,JULYR,START_MONTH,START_DAY,GMT & ,CO2TF & ,IDS,IDE,JDS,JDE,1,LM+1 & ,IMS,IME,JMS,JME,1,LM+1 & ,ITS,ITE,JTS,JTE,1,LM) ! CASE DEFAULT WRITE(0,*)' BAD SELECTION OF LONGWAVE SCHEME: INIT ' END SELECT ! !---------------------------------------------------------------------- !*** Shortwave radiation !---------------------------------------------------------------------- ! SELECT CASE (shortwave) CASE ('gfdl') ! WRITE(0,*)' Already called GFDL_INIT from LONGWAVE' CASE ('rrtm') ! WRITE(0,*)' Already called RRTM_INIT from LONGWAVE' !!! CASE ('gsfc') !!! CALL GSFC_INIT CASE ('dudh') !!! CALL SWINIT(SWRAD_SCAT,int_state%RESTART & !!! ,ALLOWED_TO_READ & !!! ,IDS,IDE,JDS,JDE,1,LM+1 & !!! ,IMS,IME,JMS,JME,1,LM+1 & !!! ,ITS,ITE,JTS,JTE,1,LM) CASE DEFAULT WRITE(0,*)' BAD SELECTION OF SHORTWAVE SCHEME: INIT' END SELECT ! !---------------------------------------------------------------------- !*** Surface layer !---------------------------------------------------------------------- ! ALLOCATE(LOWLYR(IMS:IME,JMS:JME),STAT=I) ! SELECT CASE (sfc_layer) CASE ('myj') CALL JSFC_INIT(LOWLYR & !<-- Placeholder (computed in TURBULENCE) ,int_state%USTAR,int_state%Z0 & ,int_state%SM,int_state%SICE & ,int_state%IVGTYP,int_state%RESTART & ,ALLOWED_TO_READ & ,IDS,IDE,JDS,JDE,1,LM+1 & ,IMS,IME,JMS,JME,1,LM+1 & ,ITS,ITE,JTS,JTE,1,LM & ,MPI_COMM_COMP ) CASE ('gfdl') CALL JSFC_INIT4GFDL(LOWLYR & !<-- Placeholder (computed in TURBULENCE) ,int_state%USTAR,int_state%Z0 & ,int_state%SM,int_state%SICE & ,int_state%IVGTYP,int_state%RESTART & ,ALLOWED_TO_READ & ,IDS,IDE,JDS,JDE,1,LM+1 & ,IMS,IME,JMS,JME,1,LM+1 & ,ITS,ITE,JTS,JTE,1,LM & ,MPI_COMM_COMP ) !!! CASE ('mm5') !!! CALL SFCLYR_INIT CASE DEFAULT WRITE(0,*)' BAD SELECTION OF SURFACE LAYER SCHEME: INIT' END SELECT ! !---------------------------------------------------------------------- !*** Turbulence !---------------------------------------------------------------------- ! SELECT CASE (turbulence) CASE ('myj') CALL MYJPBL_INIT(int_state%EXCH_H,int_state%RESTART & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) CASE ('gfs') !!! CASE ('ysu') !!! CALL YSU_INIT CASE ('gfshur') CASE ('gfsedmfhur') CASE DEFAULT WRITE(0,*)' BAD SELECTION OF TURBULENCE SCHEME: INIT' END SELECT ! !---------------------------------------------------------------------- !*** Land surface !---------------------------------------------------------------------- ! SELECT CASE (land_surface) CASE ('noah') int_state%LSM_PHYSICS=LSMSCHEME CALL NOAH_LSM_INIT(int_state%CMC, int_state%ISLTYP & ,int_state%STC, int_state%SMC & ,int_state%IVEGSRC & ,int_state%SH2O, NUM_SOIL_LAYERS & ,int_state%RESTART, ALLOWED_TO_READ & ,IDS,IDE, JDS,JDE & ,IMS,IME, JMS,JME & ,ITS,ITE, JTS,JTE & ,MYPE,MPI_COMM_COMP ) CASE ('liss') int_state%LSM_PHYSICS=LISSSCHEME CASE ('gfdlslab') int_state%LSM_PHYSICS=GFDLSLABSCHEME ! WRITE(0,*)'See GFDL Surface Layer SF_GFDL' CASE DEFAULT WRITE(0,*)' BAD SELECTION OF LAND SURFACE SCHEME: INIT' END SELECT ! !---------------------------------------------------------------------- !**** Convection !---------------------------------------------------------------------- ! SELECT CASE (convection) CASE ('bmj') int_state%CU_PHYSICS=BMJSCHEME CALL BMJ_INIT(int_state%CLDEFI,int_state%RESTART & ,a2,a3,a4,cappa,cp & ,pq0,r_d & ,IDS,IDE,JDS,JDE & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE,LM) CASE ('sas') int_state%CU_PHYSICS=SASSCHEME CALL SAS_INIT ! CASE ('sashur') int_state%CU_PHYSICS=SASHURSCHEME CALL SASHUR_INIT ! CASE ('scalecu') int_state%CU_PHYSICS=SCALECUSCHEME CALL SCALECU_INIT( IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE,lm & ,int_state%DUDT,int_state%DVDT & ) ! CASE ('none') ! WRITE(0,*)' User has chosen to run with no parameterized convection.' CASE DEFAULT WRITE(0,*)' BAD SELECTION OF CONVECTION SCHEME: INIT' WRITE(0,*)' User selected CONVECTION = ',TRIM(CONVECTION) CALL NMMB_FINALIZE END SELECT ! !---------------------------------------------------------------------- !*** Microphysics !---------------------------------------------------------------------- ! SELECT CASE (microphysics) ! CASE ('fer') int_state%MP_PHYSICS=95 DT_MICRO=int_state%NPRECIP*DT DELX=-2.*int_state%WBD*111.3/REAL(int_state%IM) !DX at rotated equator (km) DELY=-2.*int_state%SBD*111.3/REAL(int_state%JM) !DY at rotated equator (km) ! CALL FERRIER_INIT(DT_MICRO,DT,DELX,DELY,int_state%RESTART & ,int_state%F_ICE & ,int_state%F_RAIN & ,int_state%F_RIMEF & ,int_state%MP_RESTART_STATE & ,int_state%TBPVS_STATE & ,int_state%TBPVS0_STATE & ,ALLOWED_TO_READ & ,IDS,IDE,JDS,JDE,1,LM+1 & ,IMS,IME,JMS,JME,1,LM & ,ITS,ITE,JTS,JTE,1,LM & ,MPI_COMM_COMP,MYPE,int_state%MASSRout & ,int_state%MASSIout) ! CASE ('fer_hires') int_state%MP_PHYSICS=5 DT_MICRO=int_state%NPRECIP*DT DELX=-2.*int_state%WBD*111.3/REAL(int_state%IM) !DX at rotated equator (km) DELY=-2.*int_state%SBD*111.3/REAL(int_state%JM) !DY at rotated equator (km) ! CALL FERRIER_INIT_HR(DT_MICRO,DT,DELX,DELY,int_state%RESTART & ,int_state%F_ICE & ,int_state%F_RAIN & ,int_state%F_RIMEF & ,int_state%MP_RESTART_STATE & ,int_state%TBPVS_STATE & ,int_state%TBPVS0_STATE & ,ALLOWED_TO_READ & ,IDS,IDE,JDS,JDE,1,LM+1 & ,IMS,IME,JMS,JME,1,LM & ,ITS,ITE,JTS,JTE,1,LM & ,MPI_COMM_COMP,MYPE,int_state%MASSRout & ,int_state%MASSIout) ! CASE ('gfs') int_state%MP_PHYSICS=99 CALL GFSMP_INIT ! CASE ('wsm6') int_state%MP_PHYSICS=6 CALL WSM6INIT(RHOAIR0,RHOWATER,RHOSNOW,CLIQ,CV & ,ALLOWED_TO_READ ) ! CASE ('thompson') int_state%MP_PHYSICS=8 CALL thompson_init() ! CASE DEFAULT WRITE(0,*)' BAD SELECTION OF MICROPHYSICS SCHEME: INIT' WRITE(0,*)' User selected MICROPHYSICS = ',TRIM(MICROPHYSICS) CALL NMMB_FINALIZE END SELECT ! !---------------------------------------------------------------------- !**** Gravity wave drag (GWD) & mountain blocking (MB) initialization !---------------------------------------------------------------------- ! DTPHS=int_state%DT*int_state%NPHS ! CALL GWD_init(DTPHS,int_state%RESTART & ,int_state%CLEFFAMP,int_state%DPHD & ,int_state%CLEFF & ,int_state%TPH0D,int_state%TLM0D & ,int_state%GLAT,int_state%GLON & ,int_state%CROT,int_state%SROT,int_state%HANGL & ,IDS,IDE,JDS,JDE & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE,LM) ! ! uncomment this for output in future ! ! IF(.NOT.int_state%RESTART)THEN ! DO J=JMS,JME ! DO I=IMS,IME ! UGWDsfc(I,J)=0. ! VGWDsfc(I,J)=0. ! ENDDO ! ENDDO ! ENDIF ! ! !---------------------------------------------------------------------- ! ENDIF package ! !---------------------------------------------------------------------- ! END SUBROUTINE PHYSICS_INITIALIZE ! !----------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- ! SUBROUTINE UPDATE_WATER(CWM,F_ICE,F_RAIN,F_RIMEF & ,T,QC,QR,QS,QI,QG & ,MICROPHYSICS,SPEC_ADV,NTIMESTEP & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) !*********************************************************************** !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: UPDATE_WATER UPDATE WATER ARRAY ! PRGRMMR: FERRIER ORG: NP22 DATE: 3 AUG 2009 ! ! ABSTRACT: ! UPDATE WATER ARRAY FOR FERRIER MICROPHYSICS ! ! PROGRAM HISTORY LOG (with changes to called routines) : ! 2009-08 FERRIER - Synchronize WATER array with CWM, F_rain, F_ice arrays ! ! USAGE: CALL UPDATE_WATER FROM PHY_RUN ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 !----------------------------------------------------------------------- USE MODULE_CONSTANTS,ONLY : EPSQ,TIW !----------------------------------------------------------------------- IMPLICIT NONE !----------------------------------------------------------------------- ! !---------------------- !-- Argument Variables !---------------------- ! INTEGER,INTENT(IN) :: NTIMESTEP & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE ! CHARACTER(99),INTENT(IN) :: MICROPHYSICS ! LOGICAL,INTENT(IN) :: SPEC_ADV ! REAL,DIMENSION(IMS:IME,JMS:JME,1:LM),INTENT(INOUT) :: CWM & ,F_ICE & ,F_RAIN & ,F_RIMEF & ,T ! REAL,DIMENSION(:,:,:),POINTER,INTENT(INOUT) :: QC,QR,QS,QI,QG ! !-------------------- !-- Local Variables !-------------------- ! INTEGER :: I,J,K, NW REAL :: FRACTION, LIQW, OLDCWM LOGICAL :: CLD_INIT LOGICAL :: deep_ice ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! IF(NTIMESTEP<=1)THEN CLD_INIT=.TRUE. ELSE CLD_INIT=.FALSE. ENDIF ! !---------------------------------------------------------------------- !-- Couple 2 sets of condensed water arrays for different microphysics: ! QC,QR,QS, etc. arrays <=> CWM,F_ice,F_rain,F_RimeF 3D arrays !---------------------------------------------------------------------- ! SELECT CASE ( TRIM(MICROPHYSICS) ) ! !---------------------------------------------------------------------- CASE ('fer','fer_hires') !-- Update fields for Ferrier microphysics !---------------------------------------------------------------------- ! spec_adv_fer: IF (.NOT.SPEC_ADV .OR. CLD_INIT) THEN !-- Update WATER arrays when advecting only total condensate (spec_adv=F) ! or at the initial time step DO K=1,LM DO J=JMS,JME DO I=IMS,IME IF (CWM(I,J,K)>EPSQ) THEN LIQW=(1.-F_ice(I,J,K))*CWM(I,J,K) QC(I,J,K)=(1.-F_rain(I,J,K))*LIQW QR(I,J,K)=F_rain(I,J,K)*LIQW QS(I,J,K)=F_ice(I,J,K)*CWM(I,J,K) ELSE QC(I,J,K)=0. QR(I,J,K)=0. QS(I,J,K)=0. ENDIF ENDDO ENDDO ENDDO ! ELSE spec_adv_fer !-- Update CWM,F_ICE,F_RAIN arrays from separate species advection (spec_adv=T) DO K=1,LM DO J=JMS,JME DO I=IMS,IME CWM(I,J,K)=QC(I,J,K)+QR(I,J,K)+QS(I,J,K) IF (QS(I,J,K)>EPSQ) THEN F_ICE(I,J,K)=QS(I,J,K)/CWM(I,J,K) ELSE F_ICE(I,J,K)=0.0 ENDIF IF (QR(I,J,K)>EPSQ) THEN F_RAIN(I,J,K)=QR(I,J,K)/(QC(I,J,K)+QR(I,J,K)) ELSE F_RAIN(I,J,K)=0. ENDIF ENDDO ENDDO ENDDO ENDIF spec_adv_fer ! !---------------------------------------------------------------------- CASE ('gfs') !-- Update fields for GFS microphysics !---------------------------------------------------------------------- ! spec_adv_gfs: IF (.NOT.SPEC_ADV .OR. CLD_INIT) THEN cld_init_gfs: IF (CLD_INIT) THEN !-- Initialize F_ICE, F_RAIN, & F_RIMEF arrays IF (SPEC_ADV) THEN WRITE(0,*) 'Never ran GFS microphysics with SPEC_ADV=T.' & ,' Use at your own risk.' ENDIF DO K=1,LM DO J=JMS,JME DO I=IMS,IME F_RAIN(I,J,K)=0. F_RIMEF(I,J,K)=1. IF (CWM(I,J,K)>EPSQ .AND. T(I,J,K)<233.15) THEN F_ICE(I,J,K)=1. ELSE F_ICE(I,J,K)=0. ENDIF ENDDO ENDDO ENDDO ENDIF cld_init_gfs !-- Update WATER arrays (QC,QI) when advecting only total condensate (spec_adv=F) ! or initialize them at the start of the forecast (CLD_INIT=T). DO K=1,LM DO J=JMS,JME DO I=IMS,IME IF (CWM(I,J,K)>EPSQ) THEN QC(I,J,K)=(1.-F_ice(I,J,K))*CWM(I,J,K) QI(I,J,K)=F_ice(I,J,K)*CWM(I,J,K) ELSE QC(I,J,K)=0. QI(I,J,K)=0. ENDIF ENDDO ENDDO ENDDO ELSE spec_adv_gfs !-- Update CWM, F_ICE arrays from separate species advection (spec_adv=T) DO K=1,LM DO J=JMS,JME DO I=IMS,IME CWM(I,J,K)=QC(I,J,K)+QI(I,J,K) IF (CWM(I,J,K)>EPSQ) THEN F_ICE(I,J,K)=QI(I,J,K)/CWM(I,J,K) ELSE F_ICE(I,J,K)=0. ENDIF ENDDO ENDDO ENDDO ENDIF spec_adv_gfs ! !---------------------------------------------------------------------- CASE ('wsm6') !-- Update fields for WSM6 microphysics !---------------------------------------------------------------------- ! init_adv_wsm6: IF (CLD_INIT) THEN !-- Assume only cloud ice is present at initial time DO K=1,LM DO J=JMS,JME DO I=IMS,IME QS(I,J,K)=0.0 QG(I,J,K)=0.0 IF (CWM(I,J,K)>EPSQ) THEN LIQW=(1.-F_ice(I,J,K))*CWM(I,J,K) QC(I,J,K)=(1.-F_rain(I,J,K))*LIQW QR(I,J,K)=F_rain(I,J,K)*LIQW QI(I,J,K)=F_ice(I,J,K)*CWM(I,J,K) ELSE QC(I,J,K)=0. QR(I,J,K)=0. QI(I,J,K)=0. ENDIF ENDDO ENDDO ENDDO ELSE init_adv_wsm6 notspec_adv_wsm6: IF (.NOT.SPEC_ADV) THEN !-- Update WATER arrays (QC,QR,...) when advecting only total condensate (spec_adv=F). !-- Assume fraction of each water category is unchanged by advection. DO K=1,LM DO J=JMS,JME DO I=IMS,IME OLDCWM=QC(I,J,K)+QR(I,J,K) & +QI(I,J,K)+QS(I,J,K) & +QG(I,J,K) IF (OLDCWM>EPSQ) THEN FRACTION=CWM(I,J,K)/OLDCWM QC(I,J,K)=FRACTION*QC(I,J,K) QR(I,J,K)=FRACTION*QR(I,J,K) QI(I,J,K)=FRACTION*QI(I,J,K) QS(I,J,K)=FRACTION*QS(I,J,K) QG(I,J,K)=FRACTION*QG(I,J,K) ELSE QC(I,J,K)=0.0 QR(I,J,K)=0.0 QI(I,J,K)=0.0 QS(I,J,K)=0.0 QG(I,J,K)=0.0 IF (T(I,J,K)<233.15) THEN QI(I,J,K)=CWM(I,J,K) ELSE QC(I,J,K)=CWM(I,J,K) ENDIF ENDIF ENDDO ENDDO ENDDO ENDIF notspec_adv_wsm6 ! !-- Couple QC,QR,... <=> CWM,F_ice,F_rain,F_RimeF arrays !-- Update CWM,F_XXX arrays from separate species advection (spec_adv=T) ! DO K=1,LM DO J=JMS,JME DO I=IMS,IME CWM(I,J,K)=QC(I,J,K)+QR(I,J,K) & +QI(I,J,K)+QS(I,J,K) & +QG(I,J,K) IF (CWM(I,J,K)>EPSQ) THEN LIQW=QI(I,J,K)+QS(I,J,K)+QG(I,J,K) F_ICE(I,J,K)=LIQW/CWM(I,J,K) ELSE F_ICE(I,J,K)=0. ENDIF IF (QR(I,J,K)>EPSQ) THEN F_RAIN(I,J,K)=QR(I,J,K)/(QC(I,J,K)+QR(I,J,K)) ELSE F_RAIN(I,J,K)=0. ENDIF IF (QG(I,J,K)>EPSQ) THEN !-- Update F_RIMEF: assume 5x higher graupel density (500 kg/m**3) vs snow (100 kg/m**3) LIQW=5.*QG(I,J,K)+QS(I,J,K) F_RIMEF(I,J,K)=LIQW/(QS(I,J,K)+QG(I,J,K)) ELSE F_RIMEF(I,J,K)=1. ENDIF ENDDO ENDDO ENDDO ! ENDIF init_adv_wsm6 ! !---------------------------------------------------------------------- CASE ('thompson') !-- Update fields for Thompson microphysics !---------------------------------------------------------------------- ! !+---+-----------------------------------------------------------------+ !..The CLD_INIT test provides a way to translate initial values of CWM !.. into coomponent species of cloud water, rain, and ice, but not snow !.. or graupel. Thompson MP will pretty rapidly make snow from the !.. cloud ice field. Next IF-test is whether individual species !.. advection is enabled, which almost certainly should be the case when !.. picking this scheme. In this case, the separate species are summed !.. into the CWM and ice, rain, and rime variables are computed only for !.. consistency with other schemes. But, if single species advection is !.. not enabled, then each t-step the CWM array needs to be split into !.. component species to prepare MP routine to have some semblance of !.. proper individual species. Again, this is strongly discouraged. !+---+-----------------------------------------------------------------+ spec_adv_thompson: IF (CLD_INIT) THEN DO K=1,LM DO J=JMS,JME DO I=IMS,IME QS(I,J,K)=0.0 QG(I,J,K)=0.0 IF (CWM(I,J,K) .gt. EPSQ) THEN LIQW=(1.-F_ice(I,J,K))*CWM(I,J,K) QC(I,J,K)=(1.-F_rain(I,J,K))*LIQW QR(I,J,K)=F_rain(I,J,K)*LIQW QI(I,J,K)=F_ice(I,J,K)*CWM(I,J,K) ELSE QC(I,J,K)=0. QR(I,J,K)=0. QI(I,J,K)=0. ENDIF ENDDO ENDDO ENDDO ELSE IF(SPEC_ADV) THEN spec_adv_thompson DO K=1,LM DO J=JMS,JME DO I=IMS,IME CWM(I,J,K) = QC(I,J,K)+QR(I,J,K) & + QI(I,J,K) & + QS(I,J,K)+QG(I,J,K) IF (CWM(I,J,K) .gt. EPSQ) THEN LIQW = MAX(0., CWM(I,J,K) - QI(I,J,K) & - QS(I,J,K) & - QG(I,J,K)) F_ICE(I,J,K) = MAX(0., 1.0 - LIQW/CWM(I,J,K)) IF (QR(I,J,K) .gt. EPSQ) THEN F_RAIN(I,J,K) = QR(I,J,K) & / (QC(I,J,K)+QR(I,J,K)) ELSE F_RAIN(I,J,K)=0. ENDIF IF (QG(I,J,K) .gt. EPSQ) THEN F_RIMEF(I,J,K) = (5.*QG(I,J,K) & + QS(I,J,K)) & / (QS(I,J,K) & + QG(I,J,K)) ELSE F_RIMEF(I,J,K)=1. ENDIF ELSE F_ICE(I,J,K) = 0. F_RAIN(I,J,K)=0. F_RIMEF(I,J,K)=1. CWM(I,J,K) = 0. ENDIF ENDDO ENDDO ENDDO ELSE spec_adv_thompson ! write(0,*) 'WARNING: This option is STRONGLY DISCOURAGED' ! write(0,*) ' please consider using full advection of all' ! write(0,*) ' species when picking Thompson microphysics.' DO J=JMS,JME DO I=IMS,IME DO K=LM,1,-1 deep_ice = .false. IF (CWM(I,J,K) .gt. EPSQ) THEN OLDCWM = QC(I,J,K)+QR(I,J,K) & + QI(I,J,K) & + QS(I,J,K)+QG(I,J,K) IF (OLDCWM .gt. EPSQ) THEN LIQW = MAX(0., OLDCWM - QI(I,J,K) & - QS(I,J,K) & - QG(I,J,K)) F_ICE(I,J,K) = MAX(0., 1.0 - LIQW/OLDCWM) IF (QR(I,J,K) .gt. EPSQ) THEN F_RAIN(I,J,K) = QR(I,J,K) & / (QC(I,J,K)+QR(I,J,K)) ELSE F_RAIN(I,J,K)=0. ENDIF IF (QG(I,J,K) .gt. EPSQ) THEN F_RIMEF(I,J,K) = (5.*QG(I,J,K) & + QS(I,J,K)) & / (QS(I,J,K) & + QG(I,J,K)) ELSE F_RIMEF(I,J,K)=1. ENDIF LIQW = MAX(0., (1.-F_ICE(I,J,K))*CWM(I,J,K)) QR(I,J,K) = LIQW*F_RAIN(I,J,K)*CWM(I,J,K) QC(I,J,K) = LIQW*(1.-F_RAIN(I,J,K))*CWM(I,J,K) IF (QG(I,J,K) .gt. EPSQ) THEN FRACTION = MAX(0., MIN(QG(I,J,K) & / (QG(I,J,K)+QS(I,J,K)), 1.) ) ELSE FRACTION = 0. ENDIF QG(I,J,K) = FRACTION*F_ICE(I,J,K)*CWM(I,J,K) QI(I,J,K) = 0.1*(1.-FRACTION)*F_ICE(I,J,K)*CWM(I,J,K) QS(I,J,K) = 0.9*(1.-FRACTION)*F_ICE(I,J,K)*CWM(I,J,K) ELSE ! Below, the condensate is all new here QC(I,J,K) = 0.0 QI(I,J,K) = 0.0 QR(I,J,K) = 0.0 QS(I,J,K) = 0.0 QG(I,J,K) = 0.0 IF (T(I,J,K) .le. 235.15) THEN QI(I,J,K) = 0.5*CWM(I,J,K) QS(I,J,K) = 0.5*CWM(I,J,K) ELSEIF (T(I,J,K) .le. 258.15) THEN QI(I,J,K) = 0.1*CWM(I,J,K) QS(I,J,K) = 0.9*CWM(I,J,K) deep_ice = .true. ELSEIF (T(I,J,K) .le. 275.15) THEN if (deep_ice .and. T(I,J,K).lt.273.15) then QS(I,J,K) = CWM(I,J,K) elseif (deep_ice .and. T(I,J,K).lt.274.15) then QS(I,J,K) = 0.333*CWM(I,J,K) QR(I,J,K) = 0.667*CWM(I,J,K) elseif (deep_ice) then QS(I,J,K) = 0.1*CWM(I,J,K) QR(I,J,K) = 0.9*CWM(I,J,K) else QC(I,J,K) = CWM(I,J,K) endif ELSE QC(I,J,K) = CWM(I,J,K) ENDIF LIQW = MAX(0., CWM(I,J,K) - QI(I,J,K) & - QS(I,J,K) & - QG(I,J,K)) IF (CWM(I,J,K) .gt. EPSQ) THEN F_ICE(I,J,K) = (1.0-LIQW)/CWM(I,J,K) ELSE F_ICE(I,J,K) = 0. ENDIF IF (QR(I,J,K) .gt. EPSQ) THEN F_RAIN(I,J,K) = QR(I,J,K) & / (QC(I,J,K)+QR(I,J,K)) ELSE F_RAIN(I,J,K)=0. ENDIF IF (QG(I,J,K) .gt. EPSQ) THEN F_RIMEF(I,J,K) = (5.*QG(I,J,K) & + QS(I,J,K)) & / (QS(I,J,K) & + QG(I,J,K)) ELSE F_RIMEF(I,J,K)=1. ENDIF ENDIF ELSE QC(I,J,K) = 0.0 QR(I,J,K) = 0.0 QI(I,J,K) = 0.0 QS(I,J,K) = 0.0 QG(I,J,K) = 0.0 F_ICE(I,J,K) = 0.0 F_RAIN(I,J,K) = 0.0 F_RIMEF(I,J,K) = 1.0 ENDIF ENDDO ENDDO ENDDO ENDIF spec_adv_thompson ! !---------------------------------------------------------------------- CASE DEFAULT !---------------------------------------------------------------------- ! IF (CLD_INIT) THEN WRITE(0,*) 'Do nothing for default option' ENDIF ! END SELECT ! MICROPHYSICS ! !---------------------------------------------------------------------- ! END SUBROUTINE UPDATE_WATER !---------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- ! SUBROUTINE CALC_RH_RADAR_DFI(T,Q,PD,PSGML1,SGML2 & ,R_D,R_V,RH_HOLD & ,IMS,IME,JMS,JME,LM & ,IFLAG) USE MODULE_MP_ETANEW, ONLY : FERRIER_INIT,GPVS,FPVS & ,FPVS0,NX,RQR_DRmin & ,RQR_DRmax,MASSI,CN0R0 & ,CN0r_DMRmin,CN0r_DMRmax IMPLICIT NONE !tst INTEGER, INTENT(IN):: IMS,IME,JMS,JME, LM REAL :: T(IMS:IME,JMS:JME,1:LM) REAL :: Q(IMS:IME,JMS:JME,1:LM) REAL :: RH_HOLD(IMS:IME,JMS:JME,1:LM) REAL :: PD(IMS:IME,JMS:JME) REAL :: PSGML1(LM),SGML2(LM) REAL :: R_D,R_V,PMID,VPRES,SATVPRES, EPS, DEN INTEGER :: IFLAG,I,J,L EPS=R_D/R_V IF (IFLAG == 1) THEN DO L=1,LM DO J=JMS,JME DO I=IMS,IME PMID=SGML2(L)*PD(I,J)+PSGML1(L) DEN=EPS+Q(I,J,L)*(1.-EPS) VPRES=PMID*Q(I,J,L)/DEN SATVPRES=1.E3*FPVS0(T(I,J,L)) RH_HOLD(I,J,L)=VPRES/SATVPRES ENDDO ENDDO ENDDO ENDIF IF (IFLAG == -1) THEN DO L=1,LM DO J=JMS,JME DO I=IMS,IME SATVPRES=1.E3*FPVS0(T(I,J,L)) VPRES=SATVPRES*RH_HOLD(I,J,L) PMID=SGML2(L)*PD(I,J)+PSGML1(L) DEN=PMID-VPRES*(1.-EPS) Q(I,J,L)=VPRES*EPS/DEN ENDDO ENDDO ENDDO ENDIF END SUBROUTINE CALC_RH_RADAR_DFI !---------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- SUBROUTINE CLTEND (ICLTEND,NPRECIP, T,Told,Tadj & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) !---------------------------------------------------------------------- !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: CLTEND TEMPERATURE CHANGE BY CLOUD PROCESSES ! PRGRMMR: FERRIER ORG: W/NP22 DATE: 01-09-26 ! ! ABSTRACT: ! CLTEND GRADUALLY UPDATES TEMPERATURE TENDENCIES FROM CONVECTION ! AND GRID-SCALE MICROPHYSICS. ! ! USAGE: CALL CLTEND FROM SOLVER_RUN ! INPUT ARGUMENT LIST: ! ICLTEND - FLAG SET TO -1 PRIOR TO PHYSICS CALLS, 0 AFTER PHYSICS ! CALLS, AND 1 FOR UPDATING TEMPERATURES EVERY TIME STEP ! ! OUTPUT ARGUMENT LIST: NONE ! ! OUTPUT FILES: NONE ! ! SUBPROGRAMS CALLED: NONE ! ! UNIQUE: NONE ! ! LIBRARY: NONE ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 !$$$ !---------------------------------------------------------------------- ! IMPLICIT NONE ! !---------------------------------------------------------------------- ! INTEGER,INTENT(IN) :: ICLTEND,NPRECIP & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE ! REAL,DIMENSION(IMS:IME,JMS:JME,1:LM),INTENT(INOUT) :: T & ,Tadj & ,Told ! !*** LOCAL VARIABLES ! INTEGER :: I,J,K REAL :: RDTPH ! !---------------------------------------------------------------------- !---------------------------------------------------------------------- ! IF(ICLTEND<0)THEN DO K=1,LM DO J=JTS,JTE DO I=ITS,ITE Told(I,J,K)=T(I,J,K) ENDDO ENDDO ENDDO ELSE IF(ICLTEND==0)THEN RDTPH=1./REAL(NPRECIP) DO K=1,LM DO J=JTS,JTE DO I=ITS,ITE Tadj(I,J,K)=RDTPH*(T(I,J,K)-Told(I,J,K)) T(I,J,K)=Told(I,J,K) ENDDO ENDDO ENDDO ELSE DO K=1,LM DO J=JTS,JTE DO I=ITS,ITE T(I,J,K)=T(I,J,K)+Tadj(I,J,K) ENDDO ENDDO ENDDO ENDIF !---------------------------------------------------------------------- ! END SUBROUTINE CLTEND ! !----------------------------------------------------------------------- !---------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- SUBROUTINE RIME_FACTOR_UPDATE (RIME_FACTOR_INPUT & ,QS,QG,F_RIMEF & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) !---------------------------------------------------------------------- !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: RIME_FACTOR_UPDATE ! PRGRMMR: FERRIER ORG: W/NP22 DATE: 2013-06-14 ! ! ABSTRACT: ! ! UPDATES THE RIME FACTOR ARRAY AFTER 3D ADVECTION ! ! USAGE: CALL CLTEND FROM SOLVER_RUN ! INPUT ARGUMENT LIST: ! RIME_FACTOR_INPUT= TRUE BEFORE ADVECTION, RIME_FACTOR IS INPUT ! RIME_FACTOR_INPUT=FALSE BEFORE ADVECTION, RIME FACTOR IS OUTPUT ! ! OUTPUT ARGUMENT LIST: NONE ! ! OUTPUT FILES: NONE ! ! SUBPROGRAMS CALLED: NONE ! ! UNIQUE: NONE ! ! LIBRARY: NONE ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 ! MACHINE : IBM SP !$$$ !---------------------------------------------------------------------- ! IMPLICIT NONE ! !---------------------------------------------------------------------- ! LOGICAL,INTENT(IN) :: RIME_FACTOR_INPUT ! INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE ! REAL,DIMENSION(IMS:IME,JMS:JME,1:LM),INTENT(INOUT) :: F_RIMEF ! REAL,DIMENSION(IMS:IME,JMS:JME,1:LM),INTENT(INOUT) :: QS,QG ! !*** LOCAL VARIABLES ! INTEGER :: I,J,K REAL :: RIMEF ! !---------------------------------------------------------------------- IF (RIME_FACTOR_INPUT) THEN !-- Before advection DO K=1,LM DO J=JTS,JTE DO I=ITS,ITE QG(I,J,K)=QS(I,J,K)*F_RIMEF(I,J,K) ENDDO ENDDO ENDDO ! CALL HALO_EXCH(QG,LM,2,2) ! ELSE !-- After advection DO K=1,LM DO J=JMS,JME DO I=IMS,IME IF (QG(I,J,K)>EPSQ .AND. & QS(I,J,K)>EPSQ) THEN RIMEF=QG(I,J,K)/QS(I,J,K) F_RIMEF(I,J,K)=MIN(50., MAX(1.,RIMEF) ) ELSE F_RIMEF(I,J,K)=1. ENDIF ENDDO ENDDO ENDDO ENDIF END SUBROUTINE RIME_FACTOR_UPDATE ! !---------------------------------------------------------------------- !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !----------------------------------------------------------------------- SUBROUTINE TQADJUST(T,Q,QC,CWM,F_ICE,F_RAIN & ,PD,DSG2,PDSG1,PSGML1,SGML2 & ,SPEC_ADV,RHgrd & ,IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE) !*********************************************************************** !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: TQADJUST TQADJUST ! PRGRMMR: FERRIER ORG: NP22 DATE: 5 APR 2016 ! ! ABSTRACT: ! Smooth temperature profiles when lapse rates exceed dry adiabatic ! above PBL, prevent supersaturation with respect to water. ! ! PROGRAM HISTORY LOG (with changes to called routines) : ! 2016-04 FERRIER, JANJIC - Smooth T profiles, prevent supersaturation ! ! USAGE: CALL TQADJUST FROM PHY_RUN ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 !----------------------------------------------------------------------- ! USE MODULE_CONSTANTS,ONLY : CAPPA,CP,EP_2,EPSQ,R_d,R_v,CPV,CLIQ, & A2,A4,PSAT,XLV,TIW USE MODULE_MP_ETANEW, ONLY : FPVS0 ! !----------------------------------------------------------------------- IMPLICIT NONE !----------------------------------------------------------------------- ! !---------------------- !-- Input argument variables !---------------------- ! REAL,DIMENSION(IMS:IME,JMS:JME,1:LM),INTENT(INOUT) :: & T,Q,QC,CWM,F_ICE,F_RAIN REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: PD REAL,DIMENSION(1:LM),INTENT(IN) :: DSG2,PDSG1,PSGML1,SGML2 REAL,INTENT(IN) :: RHgrd LOGICAL,INTENT(IN) :: SPEC_ADV INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,LM & ,IMS,IME,JMS,JME & ,ITS,ITE,JTS,JTE ! !-- Local Variables ! INTEGER :: I,J,K,LM2,KMIX,KTHmin,KBOT,KTOP,ITmax,ITER,ITRmax REAL :: RCP,RRV,TK,PP,QV,QCW,TREF,ESW,QSW,DQsat,SSat,DTHmin,COND, & Qrain,Qice,Qliq REAL,DIMENSION(1:LM) :: Tcol,Pcol,QVcol,QCcol,EXNcol,THcol,DPcol, & DTHcol,Fcol LOGICAL :: LRFilt,SSFilt ! REAL,PARAMETER :: SupSat=0.001, SubSat=-SupSat, DTHthresh=-0.01, & TTP=TIW+0.01, XA=(CLIQ-CPV)/R_V, XB=XA+XLV/(R_V*TTP), & XLV1=XLV/CP, XLV2=XLV1*XLV/R_V ! !----------------------------------------------------------------------- ! ITmax=LM/5 LM2=LM-2 ! !----------------------------------------------------------------------- !-- Main loop through I, J, ------------------------------------------ !----------------------------------------------------------------------- ! DO J=JTS,JTE DO I=ITS,ITE ! LRFilt=.FALSE. ! Lapse rate flag (full column) SSFilt=.FALSE. ! Supersaturation flag IF(SPEC_ADV) THEN DO K=1,LM QCcol(K)=QC(I,J,K) ENDDO ELSE DO K=1,LM QCcol(K)=CWM(I,J,K)*(1.-F_ICE(I,J,K))*(1.-F_RAIN(I,J,K)) ENDDO ENDIF DO K=1,LM Tcol(K)=T(I,J,K) Pcol(K)=SGML2(K)*PD(I,J)+PSGML1(K) QVcol(K)=Q(I,J,K)/(1.-Q(I,J,K)) ! Water vapor mixing ratio EXNcol(K)=(1.E5/Pcol(K))**CAPPA ENDDO ! !----------------------------------------------------------------------- !-- Ferrier-Aligo condensation/evaporation algorithm - 1st of 2 times !----------------------------------------------------------------------- ! SSadj1: DO K=1,LM TK=Tcol(K) ! Temperature (deg K) PP=Pcol(K) ! Pressure (Pa) QV=QVcol(K) ! Water vapor mixing ratio QCW=QCcol(K) ! Cloud water mixing ratio ! TREF=TTP/TK ! WSM6 ! ESW=PSAT*EXP(LOG(TREF)*(XA))*EXP(XB*(1.-TREF)) ! WSM6 ! ESW=1000.*FPVS0(TK) ! Old global tables ESW=PSAT*EXP(A2*(TK-TTP)/(TK-A4)) ! Magnus Tetens ! TREF=TK-TIW ! Bolton (1980) ! ESW=611.2*EXP(17.67*TREF/(TREF+243.5)) ! Bolton (1980) ESW=MIN(ESW,0.99*PP) ! Saturation vapor pressure (water) QSW=RHgrd*EP_2*ESW/(PP-ESW) ! Saturation mixing ratio (water) DQsat=QV-QSW ! Excess QV above saturation SSat=DQsat/QSW ! Grid-scale supersaturation ratio SSrem1: IF(SSat>SupSat .OR. & ! Remove supersaturation if SSat>0.1% (QCW>EPSQ .AND. SSat<SubSat) ) THEN ! Adjust to saturation if SSat<0.1% w/ cloud water SSFilt=.TRUE. ! Supersaturation flag cond_iter1: DO ITER=1,10 ! Usually converges in <=3 iterations COND=DQsat/(1.+XLV2*QSW/(TK*TK)) ! Asai (1965, J. Japan) COND=MAX(COND, -QCW) ! Limit cloud water evaporation TK=TK+XLV1*COND ! Update temperature QV=QV-COND ! Update water vapor mixing ratio QCW=QCW+COND ! Update cloud water mixing ratio ! TREF=TTP/TK ! WSM6 ! ESW=PSAT*EXP(LOG(TREF)*(XA))*EXP(XB*(1.-TREF)) ! WSM6 ! ESW=1000.*FPVS0(TK) ! Old global tables ESW=PSAT*EXP(A2*(TK-TTP)/(TK-A4)) ! Magnus Tetens ! TREF=TK-TIW ! Bolton (1980) ! ESW=611.2*EXP(17.67*TREF/(TREF+243.5)) ! Bolton (1980) ESW=MIN(ESW,0.99*PP) ! Saturation vapor pressure (water) QSW=RHgrd*EP_2*ESW/(PP-ESW) ! Water saturation mixing ratio DQsat=QV-QSW ! Excess QV above saturation SSat=DQsat/QSW ! Grid-scale supersaturation ratio IF (SSat>=SubSat .AND. SSat<=SupSat) EXIT ! Exit if -0.1%<SSat<0.1% IF (SSat<SubSat .AND. QCW<=EPSQ) EXIT ! Exit if SSat<-0.1% & no cloud water ENDDO cond_iter1 ! 1st *cond*ensation *iter*ation IF (ITER<=10) THEN Tcol(K)=TK QVcol(K)=QV QCcol(K)=QCW ENDIF ENDIF SSrem1 ENDDO SSadj1 ! DO K=1,LM THcol(K)=Tcol(K)*EXNcol(K) ENDDO ! DTHcol(1)=1. DO K=2,LM DTHcol(K)=THcol(K-1)-THcol(K) ENDDO ! KMIX=0 DO K=LM2,2,-1 IF(DTHcol(K)>0.) THEN !-- Start above the well-mixed layer immediately above the ! surface where theta may decrease with height KMIX=K EXIT ENDIF ENDDO ! !************************* LRadjust: IF (KMIX>2) THEN !************************* ! KTOP=0 DO K=3,KMIX IF(DTHcol(K)<DTHthresh) THEN KTOP=K-1 !- Level at top of highest unstable layer EXIT ENDIF ENDDO ! !------------------------- Maybe_mix: IF(KTOP>0) THEN !------------------------- ! KBOT=0 DO K=KMIX,2,-1 IF(DTHcol(K)<DTHthresh) THEN KBOT=K !- Lowest unstable layer EXIT ENDIF ENDDO IF(KBOT>0) THEN LRFilt=.TRUE. !- For the full column (any layer) ITRmax=ITmax ELSE ITRmax=0 !- Do not mix ENDIF ! DO K=1,LM DPcol(K)=DSG2(K)*PD(I,J)+PDSG1(K) ! Hydrostatic pressure thickness Fcol(K)=THcol(K) !- Fcol, modified theta ENDDO ! !- - - - - - - - - - - - - Mix_lyrs: DO ITER=1,ITRmax !- - - - - - - - - - - - - DO K=KTOP,KBOT IF(DTHcol(K)<DTHthresh) THEN IF(DTHcol(K+1)<DTHthresh) THEN !-- Mix 3 layers if current layer and layers above and below are unstable Fcol(K)=(THcol(K-1)*DPcol(K-1)+THcol(K)*DPcol(K) & +THcol(K+1)*DPcol(K+1))/ & (DPcol(K-1)+DPcol(K)+DPcol(K+1)) ELSE !-- Mix with higher layer if current layer is unstable Fcol(K)=(THcol(K-1)*DPcol(K-1)+THcol(K)*DPcol(K))/ & (DPcol(K-1)+DPcol(K)) ENDIF ELSE IF(DTHcol(K+1)<DTHthresh) THEN !-- Mix with lower layer if it is unstable Fcol(K)=(THcol(K)*DPcol(K)+THcol(K+1)*DPcol(K+1))/ & (DPcol(K)+DPcol(K+1)) ENDIF !-- Do nothing if the current layer or the layer below is not unstable ENDDO ! DO K=KTOP,KBOT THcol(K)=Fcol(K) ENDDO DO K=KTOP,KBOT DTHcol(K)=THcol(K-1)-THcol(K) ENDDO ! KTOP=0 DO K=3,KMIX IF(DTHcol(K)<DTHthresh) THEN KTOP=K-1 !- Level at top of highest unstable layer EXIT ENDIF ENDDO ! IF(KTOP<=0) EXIT Mix_lyrs !- Exit with no unstable layer in column ! KBOT=0 DO K=KMIX,2,-1 IF(DTHcol(K)<DTHthresh) THEN KBOT=K !- Lowest unstable layer EXIT ENDIF ENDDO !- - - - - - - - - - - - - ENDDO Mix_lyrs !DO ITER !- - - - - - - - - - - - - DO K=1,LM Tcol(K)=THcol(K)/EXNcol(K) !-- Update T ENDDO !------------------------- ENDIF Maybe_mix !IF(KTOP>0) !------------------------- !************************* ENDIF LRadjust !************************* ! !----------------------------------------------------------------------- !-- Ferrier-Aligo condensation/evaporation algorithm - 2nd of 2 times !----------------------------------------------------------------------- ! SSadj2: DO K=1,LM TK=Tcol(K) ! Temperature (deg K) PP=Pcol(K) ! Pressure (Pa) QV=QVcol(K) ! Water vapor mixing ratio QCW=QCcol(K) ! Cloud water mixing ratio ! TREF=TTP/TK ! WSM6 ! ESW=PSAT*EXP(LOG(TREF)*(XA))*EXP(XB*(1.-TREF)) ! WSM6 ! ESW=1000.*FPVS0(TK) ! Old global tables ESW=PSAT*EXP(A2*(TK-TTP)/(TK-A4)) ! Magnus Tetens ! TREF=TK-TIW ! Bolton (1980) ! ESW=611.2*EXP(17.67*TREF/(TREF+243.5)) ! Bolton (1980) ESW=MIN(ESW,0.99*PP) ! Saturation vapor pressure (water) QSW=RHgrd*EP_2*ESW/(PP-ESW) ! Saturation mixing ratio (water) DQsat=QV-QSW ! Excess QV above saturation SSat=DQsat/QSW ! Grid-scale supersaturation ratio SSrem2: IF(SSat>SupSat .OR. & ! Remove supersaturation if SSat>0.1% (QCW>EPSQ .AND. SSat<SubSat) ) THEN ! Adjust to saturation if SSat<0.1% w/ cloud water SSFilt=.TRUE. ! Supersaturation flag cond_iter2: DO ITER=1,10 ! Usually converges in <=3 iterations COND=DQsat/(1.+XLV2*QSW/(TK*TK)) ! Asai (1965, J. Japan) COND=MAX(COND, -QCW) ! Limit cloud water evaporation TK=TK+XLV1*COND ! Update temperature QV=QV-COND ! Update water vapor mixing ratio QCW=QCW+COND ! Update cloud water mixing ratio ! TREF=TTP/TK ! WSM6 ! ESW=PSAT*EXP(LOG(TREF)*(XA))*EXP(XB*(1.-TREF)) ! WSM6 ! ESW=1000.*FPVS0(TK) ! Old global tables ESW=PSAT*EXP(A2*(TK-TTP)/(TK-A4)) ! Magnus Tetens ! TREF=TK-TIW ! Bolton (1980) ! ESW=611.2*EXP(17.67*TREF/(TREF+243.5)) ! Bolton (1980) ESW=MIN(ESW,0.99*PP) ! Saturation vapor pressure (water) QSW=RHgrd*EP_2*ESW/(PP-ESW) ! Water saturation mixing ratio DQsat=QV-QSW ! Excess QV above saturation SSat=DQsat/QSW ! Grid-scale supersaturation ratio IF (SSat>=SubSat .AND. SSat<=SupSat) EXIT ! Exit if -0.1%<SSat<0.1% IF (SSat<SubSat .AND. QCW<=EPSQ) EXIT ! Exit if SSat<-0.1% & no cloud water ENDDO cond_iter2 ! 2nd *cond*ensation *iter*ation IF (ITER<=10) THEN Tcol(K)=TK QVcol(K)=QV QCcol(K)=QCW ENDIF ENDIF SSrem2 ENDDO SSadj2 ! !####################################################################### !-- Update 3D arrays !####################################################################### ! adjust1: IF (LRFilt .OR. SSFilt) THEN DO K=1,LM T(I,J,K)=Tcol(K) !- Update T ENDDO ENDIF adjust1 ! adjust2: IF (SSFilt) THEN DO K=1,LM !- Update Q Q(I,J,K)=QVcol(K)/(1.+QVcol(K)) ENDDO IF(SPEC_ADV) THEN DO K=1,LM !- Update QC QC(I,J,K)=QCcol(K) ENDDO ELSE DO K=1,LM !- Update CWM, F_ICE, F_RAIN Qrain=CWM(I,J,K)*(1.-F_ICE(I,J,K))*F_RAIN(I,J,K) Qliq=QCcol(K)+Qrain Qice=CWM(I,J,K)*F_ICE(I,J,K) CWM(I,J,K)=Qliq+Qice IF(CWM(I,J,K)>EPSQ) F_ICE(I,J,K)=Qice/CWM(I,J,K) IF(Qliq>EPSQ) F_RAIN(I,J,K)=Qrain/Qliq ENDDO ENDIF ENDIF adjust2 ! ENDDO !- I ENDDO !- J !----------------------------------------------------------------------- ! END SUBROUTINE TQADJUST ! !---------------------------------------------------------------------- !###################################################################### !----------------------------------------------------------------------- END MODULE MODULE_SOLVER_GRID_COMP ! !-----------------------------------------------------------------------