! +-======-+ ! Copyright (c) 2003-2007 United States Government as represented by ! the Admistrator of the National Aeronautics and Space Administration. ! All Rights Reserved. ! ! THIS OPEN SOURCE AGREEMENT ("AGREEMENT") DEFINES THE RIGHTS OF USE, ! REPRODUCTION, DISTRIBUTION, MODIFICATION AND REDISTRIBUTION OF CERTAIN ! COMPUTER SOFTWARE ORIGINALLY RELEASED BY THE UNITED STATES GOVERNMENT AS ! REPRESENTED BY THE GOVERNMENT AGENCY LISTED BELOW ("GOVERNMENT AGENCY"). ! THE UNITED STATES GOVERNMENT, AS REPRESENTED BY GOVERNMENT AGENCY, IS AN ! INTENDED THIRD-PARTY BENEFICIARY OF ALL SUBSEQUENT DISTRIBUTIONS OR ! REDISTRIBUTIONS OF THE SUBJECT SOFTWARE. ANYONE WHO USES, REPRODUCES, ! DISTRIBUTES, MODIFIES OR REDISTRIBUTES THE SUBJECT SOFTWARE, AS DEFINED ! HEREIN, OR ANY PART THEREOF, IS, BY THAT ACTION, ACCEPTING IN FULL THE ! RESPONSIBILITIES AND OBLIGATIONS CONTAINED IN THIS AGREEMENT. ! ! Government Agency: National Aeronautics and Space Administration ! Government Agency Original Software Designation: GSC-15354-1 ! Government Agency Original Software Title: GEOS-5 GCM Modeling Software ! User Registration Requested. Please Visit http://opensource.gsfc.nasa.gov ! Government Agency Point of Contact for Original Software: ! Dale Hithon, SRA Assistant, (301) 286-2691 ! ! +-======-+ ! $Id: GEOS_GcmGridComp.F90,v 1.12.2.35.24.14 2013-09-24 14:49:56 ltakacs Exp $ #include "MAPL_Generic.h" !============================================================================= !BOP ! !MODULE: GEOS_GcmGridCompMod -- A Module to combine Agcm and Ogcm Gridded Components ! !INTERFACE: module GEOS_GcmGridCompMod ! !USES: use ESMF use MAPL_Mod #ifdef DATAATM use GEOS_dataatmGridCompMod, only: DATAATM_SetServices => SetServices #else use GEOS_AgcmGridCompMod, only: AGCM_SetServices => SetServices use GEOS_mkiauGridCompMod, only: AIAU_SetServices => SetServices use DFI_GridCompMod, only: ADFI_SetServices => SetServices #endif use GEOS_OgcmGridCompMod, only: OGCM_SetServices => SetServices implicit none private #ifdef USE_ODAS integer :: chdir, flag = 0 external chdir #endif ! !PUBLIC MEMBER FUNCTIONS: public SetServices integer, parameter :: NUM_ICE_CATEGORIES=5 integer, parameter :: NUM_ICE_LAYERS=4 integer, parameter :: NUM_SNOW_LAYERS=1 !============================================================================= ! !DESCRIPTION: This gridded component (GC) combines the Agcm GC, ! and Ogcm GC into a new composite Gcm GC. !EOP integer :: AGCM integer :: OGCM integer :: AIAU integer :: ADFI type T_GCM_STATE private type (MAPL_LocStreamXFORM) :: XFORM_A2O type (MAPL_LocStreamXFORM) :: XFORM_O2A type(ESMF_State) :: impSKIN ! Ocean thin layer type(ESMF_State) :: expSKIN type(ESMF_Alarm) :: alarmOcn type(ESMF_Alarm) :: replayStartAlarm type(ESMF_Alarm) :: replayStopAlarm type(ESMF_Alarm) :: replayShutoffAlarm end type T_GCM_STATE ! Wrapper for extracting internal state ! ------------------------------------- type GCM_WRAP type (T_GCM_STATE), pointer :: PTR end type GCM_WRAP contains !BOP ! !IROUTINE: SetServices -- Sets ESMF services for this component ! !INTERFACE: subroutine SetServices ( GC, RC ) ! !ARGUMENTS: type(ESMF_GridComp), intent(INOUT) :: GC ! gridded component integer, optional :: RC ! return code ! !DESCRIPTION: The SetServices for the PhysicsGcm GC needs to register its ! Initialize and Run. It uses the MAPL\_Generic construct for defining ! state specs and couplings among its children. In addition, it creates the ! children GCs (AGCM and OGCM) and runs their ! respective SetServices. !EOP !============================================================================= ! ! ErrLog Variables character(len=ESMF_MAXSTR) :: IAm integer :: STATUS character(len=ESMF_MAXSTR) :: COMP_NAME ! Locals integer :: I type (T_GCM_STATE), pointer :: gcm_internal_state type (GCM_wrap) :: wrap !============================================================================= ! Begin... ! Get my name and set-up traceback handle ! --------------------------------------- Iam = 'SetServices' call ESMF_GridCompGet( GC, NAME=COMP_NAME, RC=STATUS ) VERIFY_(STATUS) Iam = trim(COMP_NAME) // Iam ! Register services for this component ! ------------------------------------ call MAPL_GridCompSetEntryPoint ( GC, ESMF_METHOD_INITIALIZE, Initialize, RC=STATUS ) VERIFY_(STATUS) call MAPL_GridCompSetEntryPoint ( GC, ESMF_METHOD_RUN, Run, RC=STATUS ) VERIFY_(STATUS) #ifdef USE_ODAS call MAPL_GridCompSetEntryPoint ( GC, ESMF_METHOD_FINALIZE, Finalize, RC=STATUS ) VERIFY_(STATUS) call MAPL_GridCompSetEntryPoint ( GC, ESMF_METHOD_WRITERESTART, Record, RC=status) VERIFY_(STATUS) #endif ! Create childrens gridded components and invoke their SetServices ! ---------------------------------------------------------------- #ifdef DATAATM AGCM = MAPL_AddChild(GC, NAME='DATAATM', SS=DATAATM_SetServices, RC=STATUS) VERIFY_(STATUS) #else AGCM = MAPL_AddChild(GC, NAME='AGCM', SS=Agcm_SetServices, RC=STATUS) VERIFY_(STATUS) AIAU = MAPL_AddChild(GC, NAME='AIAU', SS=AIAU_SetServices, RC=STATUS) VERIFY_(STATUS) ADFI = MAPL_AddChild(GC, NAME='ADFI', SS=ADFI_SetServices, RC=STATUS) VERIFY_(STATUS) #endif OGCM = MAPL_AddChild(GC, NAME='OGCM', SS=Ogcm_SetServices, RC=STATUS) VERIFY_(STATUS) ! Borrow exports from children #ifdef USE_ODAS call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'MOM_3D_MASK', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'T', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'S', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'U', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'V', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'Z', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'RHO', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'SSH', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'TX', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'TY', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'MLD', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'PSI', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) #ifdef USE_CICE call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'AICE', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC , & SHORT_NAME = 'HICE', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'CICE_2D_MASK', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) #endif #ifdef USE_OBIO call MAPL_AddExportSpec(GC, & SHORT_NAME = 'CHLOROPHYLL', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'NITRATE', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'AMMON' , & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'SILICA', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec(GC, & SHORT_NAME = 'IRON', & CHILD_ID = OGCM, & RC=STATUS ) VERIFY_(STATUS) #endif #else ! Export for IAU and/or Analysis purposes ! --------------------------------------- #ifndef DATAATM call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'AK', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'BK', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'PS', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'TV', & CHILD_ID = AGCM, & RC = STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'U', & CHILD_ID = AGCM, & RC = STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'V', & CHILD_ID = AGCM, & RC = STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'PHIS', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'Q', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'QCTOT', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'QITOT', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'QLTOT', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'O3PPMV', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'U10N', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'V10N', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'SNOMAS', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'WET1', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'TSOIL1', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'LWI', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'TS', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'Z0', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'FRLAND', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'FRLANDICE',& CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'FRLAKE', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'FROCEAN', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddExportSpec ( GC, & SHORT_NAME = 'FRACI', & CHILD_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) #endif #endif #ifndef DATAATM call MAPL_AddConnectivity ( GC, & SHORT_NAME = (/'PHIS ','AK ','BK ','U ','V ','T ','PLE ','O3PPMV', 'TS ','AREA '/), & DST_ID = AIAU, & SRC_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddConnectivity ( GC, & SHORT_NAME = (/'DUDT ','DVDT ','DTDT ','DQVDT','DPEDT','DO3DT','DTSDT'/), & DST_ID = AGCM, & SRC_ID = AIAU, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddConnectivity ( GC, & SHORT_NAME = (/'TRANA'/), & DST_ID = AIAU, & SRC_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_AddConnectivity ( GC, & SHORT_NAME = (/'U_DGRID','V_DGRID','PT ', & 'PE ','Q ','OX ' /), & DST_ID = ADFI, & SRC_ID = AGCM, & RC=STATUS ) VERIFY_(STATUS) #endif ! Next 17 vars are explicitly connected through exchange grid transforms Run !--------------------------------------------------------------------------- call MAPL_TerminateImport ( GC, & SHORT_NAME = (/'TAUXW ','TAUYW ','TAUXI ','TAUYI ', & 'OUSTAR3','PS ', & 'HW ','TW ','SW ', & 'HI ','TI ','SI ' , & 'PENUVR ','PENUVF ','PENPAR ','PENPAF ', & 'DISCHRG'/), & CHILD = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_TerminateImport ( GC, & SHORT_NAME = (/'UU'/), & CHILD = OGCM, & RC=STATUS ) VERIFY_(STATUS) #ifndef DATAATM call MAPL_TerminateImport ( GC, & SHORT_NAME = (/'CO2SC'/), & CHILD = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_TerminateImport ( GC, & SHORT_NAME = (/'DUDP', 'DUWT', 'DUSD', & 'BCDP', 'BCWT', & 'OCDP', 'OCWT' /), & CHILD = OGCM, & RC=STATUS ) VERIFY_(STATUS) call MAPL_TerminateImport ( GC, & SHORT_NAME = (/'FSWBAND ', 'FSWBANDNA'/), & CHILD = OGCM, & RC=STATUS ) VERIFY_(STATUS) #endif #ifdef USE_CICE call MAPL_TerminateImport ( GC, & SHORT_NAME = (/ & #ifndef DATAATM 'DAIDTD ', 'DVIDTD ', & #endif 'FRACICE', 'VOLICE ', 'VOLSNO ', & 'ERGICE ', 'ERGSNO ', 'TAUAGE ', 'MPOND '/), & CHILD = OGCM, & RC=STATUS ) VERIFY_(STATUS) #endif #ifdef DATAATM call MAPL_TerminateImport ( GC, & #ifdef USE_CICE SHORT_NAME = (/'KPAR ','UW ','VW ','UI ', & 'VI ','TAUXBOT','TAUYBOT'/), & #else SHORT_NAME = (/'KPAR ','FRACICE','UW ','VW ',& 'UI ','VI '/), & #endif CHILD = AGCM, & RC=STATUS ) VERIFY_(STATUS) #endif ! Allocate this instance of the internal state and put it in wrapper. ! ------------------------------------------------------------------- allocate( gcm_internal_state, stat=status ) VERIFY_(STATUS) wrap%ptr => gcm_internal_state ! Save pointer to the wrapped internal state in the GC ! ---------------------------------------------------- call ESMF_UserCompSetInternalState ( GC, 'GCM_state',wrap,status ) VERIFY_(STATUS) call MAPL_GenericSetServices ( GC, RC=STATUS ) VERIFY_(STATUS) call MAPL_TimerAdd(GC, name="INITIALIZE" ,RC=STATUS) VERIFY_(STATUS) call MAPL_TimerAdd(GC, name="RUN" ,RC=STATUS) VERIFY_(STATUS) call MAPL_TimerAdd(GC, name="--OCEAN" ,RC=STATUS) VERIFY_(STATUS) call MAPL_TimerAdd(GC, name="--ATMOSPHERE" ,RC=STATUS) VERIFY_(STATUS) call MAPL_TimerAdd(GC, name="--REPLAY" ,RC=STATUS) VERIFY_(STATUS) call MAPL_TimerAdd(GC, name="--A2O" ,RC=STATUS) VERIFY_(STATUS) call MAPL_TimerAdd(GC, name="--O2A" ,RC=STATUS) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine SetServices !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !IROUTINE: Initialize -- Initialize method for the composite Gcm Gridded Component ! !INTERFACE: subroutine Initialize ( GC, IMPORT, EXPORT, CLOCK, RC ) ! !ARGUMENTS: type(ESMF_GridComp), intent(inout) :: GC ! Gridded component type(ESMF_State), intent(inout) :: IMPORT ! Import state type(ESMF_State), intent(inout) :: EXPORT ! Export state type(ESMF_Clock), intent(inout) :: CLOCK ! The clock integer, optional, intent( out) :: RC ! Error code ! !DESCRIPTION: !EOP ! ErrLog Variables character(len=ESMF_MAXSTR) :: IAm integer :: STATUS character(len=ESMF_MAXSTR) :: COMP_NAME ! Local derived type aliases type(ESMF_Grid) :: agrid type(ESMF_Grid) :: ogrid type(MAPL_LocStream):: exchA type(MAPL_LocStream):: exchO type(MAPL_LocStream):: locstA type(ESMF_DELayout) :: layout type(ESMF_Config) :: cf type (MAPL_MetaComp), pointer :: MAPL type (MAPL_MetaComp), pointer :: CMAPL type (ESMF_GridComp), pointer :: GCS(:) type (ESMF_State), pointer :: GIM(:) type (ESMF_State), pointer :: GEX(:) type (ESMF_FieldBundle) :: bundle character(len=ESMF_MAXSTR), pointer :: GCNAMES(:) character(len=ESMF_MAXSTR) :: skinname character(len=ESMF_MAXSTR) :: tilingfile character(len=ESMF_MAXSTR) :: replayMode type (T_GCM_STATE), pointer :: gcm_internal_state type (GCM_wrap) :: wrap type(ESMF_Time) :: currTime type(ESMF_Time) :: ringTime type(ESMF_TimeInterval) :: Frequency type(ESMF_TimeInterval) :: Duration type(ESMF_TimeInterval) :: Shutoff type(ESMF_Alarm) :: replayStartAlarm type(ESMF_Alarm) :: replayStopAlarm type(ESMF_Alarm) :: replayShutoffAlarm type(ESMF_Alarm) :: alarms(1) type(ESMF_DistGrid) :: distGRID integer :: rplfreq integer :: rpldur integer :: rplshut !============================================================================= ! Begin... ! Get the target components name and set-up traceback handle. ! ----------------------------------------------------------- call ESMF_GridCompGet ( GC, name=COMP_NAME, RC=STATUS ) VERIFY_(STATUS) Iam = trim(COMP_NAME) // "Initialize" ! Get my MAPL_Generic state !-------------------------- call MAPL_GetObjectFromGC ( GC, MAPL, RC=STATUS) VERIFY_(STATUS) call MAPL_TimerOn(MAPL,"INITIALIZE") call MAPL_TimerOn(MAPL,"TOTAL") ! Get my internal private state. This contains the transforms ! between the exchange grid and the atmos grid. !------------------------------------------------------------- call ESMF_UserCompGetInternalState(gc, 'GCM_state', wrap, status) VERIFY_(STATUS) gcm_internal_state => wrap%ptr ! Get children and their im/ex states from my generic state. !---------------------------------------------------------- call MAPL_Get ( MAPL, GCS=GCS, GIM=GIM, GEX=GEX, GCNAMES=GCNAMES,& RC=STATUS ) VERIFY_(STATUS) ! Create Atmospheric grid !------------------------ call MAPL_GridCreate(GCS(AGCM), rc=status) VERIFY_(STATUS) ! Create Ocean grid !------------------ call MAPL_GridCreate(GCS(OGCM), rc=status) VERIFY_(STATUS) call ESMF_GridCompGet(GCS(OGCM), grid=ogrid, rc=status) VERIFY_(STATUS) call ESMF_GridCompGet(GCS(AGCM), grid=agrid, rc=status) VERIFY_(STATUS) call ESMF_GridGet(agrid, DistGrid=distgrid, rc=status) VERIFY_(STATUS) call ESMF_DistGridGet(distGRID, deLayout=layout, RC=STATUS) VERIFY_(STATUS) ! Create exchange grids from tile file !------------------------------------- call MAPL_GetResource(MAPL, TILINGFILE, 'TILING_FILE:', & default="tile.data", RC=STATUS) VERIFY_(STATUS) call MAPL_LocStreamCreate(exchA, LAYOUT=layout, FILENAME=TILINGFILE, & NAME='MAIN_Atm', & grid=agrid, RC=STATUS) VERIFY_(STATUS) call MAPL_LocStreamCreate(exchO, LAYOUT=layout, FILENAME=TILINGFILE, & NAME='MAIN_Ocn', mask=(/ MAPL_OCEAN /), & grid=ogrid, RC=STATUS) VERIFY_(STATUS) ! ------------------------------------------------------ ! Add default exchange grid to both Atm and Ocn ! ------------------------------------------------------ call MAPL_ExchangeGridSet(GCS(AGCM), exchA, rc=status) VERIFY_(STATUS) call MAPL_ExchangeGridSet(GCS(OGCM), exchO, rc=status) VERIFY_(STATUS) ! Recursive setup of grids (should be disabled) call ESMF_GridCompSet(GCS(AGCM), grid=agrid, rc=status) VERIFY_(STATUS) call ESMF_GridCompSet(GCS(OGCM), grid=ogrid, rc=status) VERIFY_(STATUS) #ifndef DATAATM call ESMF_GridCompSet(GCS(AIAU), grid=agrid, rc=status) VERIFY_(STATUS) call ESMF_GridCompSet(GCS(ADFI), grid=agrid, rc=status) VERIFY_(STATUS) #endif !ALT we need a grid for GCM - we put either the Agrid or the Ogrid ! depending of what exports are we propagating up #ifdef USE_ODAS call ESMF_GridCompSet(GC, grid=ogrid, rc=status) VERIFY_(STATUS) #else call ESMF_GridCompSet(GC, grid=agrid, rc=status) VERIFY_(STATUS) #endif call MAPL_GetResource(MAPL, ReplayMode, 'REPLAY_MODE:', & default="NoReplay", RC=STATUS ) VERIFY_(STATUS) if(adjustl(ReplayMode)=="Regular") then ! ALT replay: create alarms call MAPL_GetResource(MAPL, rplfreq, Label="REPLAY_FREQUENCY:", default=21600, rc=status) VERIFY_(STATUS) call MAPL_GetResource(MAPL, rpldur, Label="REPLAY_DURATION:", default=10800, rc=status) VERIFY_(STATUS) call MAPL_GetResource(MAPL, rplshut, Label="REPLAY_SHUTOFF:", default=-3600, rc=status) VERIFY_(STATUS) call ESMF_ClockGet(clock, currTime=currTime, rc=status) VERIFY_(STATUS) call ESMF_TimeIntervalSet(Frequency, S=rplfreq, rc=status) VERIFY_(STATUS) call ESMF_TimeIntervalSet(Duration, S=rpldur, rc=status) VERIFY_(STATUS) call ESMF_TimeIntervalSet(Shutoff, S=abs(rplshut), rc=status) VERIFY_(STATUS) RingTime=currTime !ALT: this should be the middle of the first synoptic interval replayStartAlarm = ESMF_AlarmCreate( name="startReplay", clock=clock, & RingTime=ringTime, RingInterval=Frequency, sticky=.false., rc=status ) VERIFY_(STATUS) if(ringTime == currTime) then call ESMF_AlarmRingerOn(replayStartAlarm, rc=status) VERIFY_(STATUS) end if replayStopAlarm = ESMF_AlarmCreate(name="stopReplay", clock=clock, & RingTime=ringTime+Duration, RingInterval=Frequency, & sticky=.false., rc=status ) VERIFY_(STATUS) replayShutoffAlarm = ESMF_AlarmCreate(name='ReplayShutOff', & clock=clock, ringInterval=Shutoff, sticky=.TRUE., RC=STATUS ) VERIFY_(STATUS) if (rplshut <= 0) then ! this is a "flag" to never use Shutoff alarm call ESMF_AlarmDisable(replayShutoffAlarm, RC=STATUS) VERIFY_(STATUS) end if call MAPL_GetObjectFromGC ( GCS(AGCM), CMAPL, RC=STATUS) VERIFY_(STATUS) Alarms(1) = replayStartAlarm call MAPL_AddRecord(CMAPL, ALARMS, (/MAPL_Write2RAM/), rc=status) VERIFY_(STATUS) GCM_INTERNAL_STATE%replayStartAlarm = replayStartAlarm GCM_INTERNAL_STATE%replayStopAlarm = replayStopAlarm GCM_INTERNAL_STATE%replayShutoffAlarm = replayShutoffAlarm end if ! ********************************************************************** ! **** Initialize Gridded Components **** ! ********************************************************************** call MAPL_TimerOff(MAPL,"TOTAL") #ifdef USE_ODAS status = chdir("restarts." // comp_name(5:7)); VERIFY_(STATUS) #endif call MAPL_GenericInitialize ( GC, import, export, clock, rc=status ) VERIFY_(STATUS) #ifdef USE_ODAS status = chdir(".."); VERIFY_(STATUS) #endif call MAPL_TimerOn(MAPL,"TOTAL") ! Create XFORMs !-------------- #ifdef DATAATM skinname = 'DATAATM' #else skinname = 'SALTWATER' #endif call MAPL_GetChildLocstream(GCS(AGCM), locstA, skinname, rc=STATUS) VERIFY_(STATUS) call MAPL_LocStreamCreateXform ( XFORM=GCM_INTERNAL_STATE%XFORM_A2O, & LocStreamOut=exchO, & LocStreamIn=locstA, & NAME='XFORM_A2O', & RC=STATUS ) VERIFY_(STATUS) call MAPL_LocStreamCreateXform ( XFORM=GCM_INTERNAL_STATE%XFORM_O2A, & LocStreamOut=locstA, & LocStreamIn=exchO, & NAME='XFORM_O2A', & RC=STATUS ) VERIFY_(STATUS) ! This part has some explicit hierarchy build in... !-------------------------------------------------------------- call MAPL_ExportStateGet ( (/ GEX(AGCM) /), skinname, & GCM_INTERNAL_STATE%expSKIN, rc=status ) VERIFY_(STATUS) call MAPL_ImportStateGet ( GCS(AGCM) , GIM(AGCM), skinname, & GCM_INTERNAL_STATE%impSKIN, rc=status ) VERIFY_(STATUS) call AllocateExports(GCM_INTERNAL_STATE%expSKIN, & #ifdef USE_CICE (/'TAUXW ', 'TAUYW ','TAUXI ', 'TAUYI ', & #ifdef DATAATM 'DISCHARGE', & #endif #else (/'TAUXO ', 'TAUYO ','TAUXI ', 'TAUYI ', & #endif 'PENPAR ', 'PENPAF ','PENUVR ', 'PENUVF ', & 'OUSTAR3 ', 'PS '/), & RC=STATUS) VERIFY_(STATUS) #ifdef USE_OBIO call AllocateExports( GCM_INTERNAL_STATE%expSKIN, & (/'UU'/), & RC=STATUS ) VERIFY_(STATUS) #ifndef DATAATM call AllocateExports( GCM_INTERNAL_STATE%expSKIN, & (/'CO2SC'/), & RC=STATUS ) VERIFY_(STATUS) call AllocateExports_UGD( GCM_INTERNAL_STATE%expSKIN, & (/'DUDP', 'DUWT', 'DUSD', & 'BCDP', 'BCWT', & 'OCDP', 'OCWT' /), & RC=STATUS ) VERIFY_(STATUS) call AllocateExports_UGD( GCM_INTERNAL_STATE%expSKIN, & (/'FSWBAND ', 'FSWBANDNA'/), & RC=STATUS ) VERIFY_(STATUS) #endif #endif #ifdef USE_CICE call AllocateExports(GEX(OGCM), (/'UW ', 'VW ', & 'TAUXIBOT', 'TAUYIBOT', & #else call AllocateExports(GEX(OGCM), (/'UW ', 'VW ', 'FRACICE ',& #endif 'UI ', 'VI ', 'KPAR ', 'TS_FOUND' /), RC=STATUS) VERIFY_(STATUS) call ESMF_ClockGetAlarm(clock, alarmname=trim(GCNAMES(OGCM)) // '_Alarm', & alarm=GCM_INTERNAL_STATE%alarmOcn, rc=status) VERIFY_(STATUS) #ifdef PRINT_STATES call WRITE_PARALLEL ( trim(Iam)//": IMPORT State" ) if ( MAPL_am_I_root() ) call ESMF_StatePrint ( IMPORT, rc=STATUS ) call WRITE_PARALLEL ( trim(Iam)//": EXPORT State" ) if ( MAPL_am_I_root() ) call ESMF_StatePrint ( EXPORT, rc=STATUS ) #endif call MAPL_TimerOff(MAPL,"TOTAL") call MAPL_TimerOff(MAPL,"INITIALIZE") RETURN_(ESMF_SUCCESS) contains subroutine AllocateExports(STATE, NAMES, RC) type(ESMF_State) , intent(INOUT) :: STATE character(len=*) , intent(IN ) :: NAMES(:) integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="AllocateExports" integer :: STATUS real, pointer :: ptr(:) integer :: I DO I = 1, SIZE(NAMES) call MAPL_GetPointer(STATE, ptr, NAMES(I), alloc=.true., RC=STATUS) VERIFY_(STATUS) END DO RETURN_(ESMF_SUCCESS) end subroutine AllocateExports subroutine AllocateExports_UGD(STATE, NAMES, RC) type(ESMF_State) , intent(INOUT) :: STATE character(len=*) , intent(IN ) :: NAMES(:) integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="AllocateExports_UGD" integer :: STATUS real, pointer :: ptr(:,:) integer :: I DO I = 1, SIZE(NAMES) call MAPL_GetPointer(STATE, ptr, NAMES(I), alloc=.true., RC=STATUS) VERIFY_(STATUS) END DO RETURN_(ESMF_SUCCESS) end subroutine AllocateExports_UGD end subroutine Initialize !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !IROUTINE: Run -- Run method for the composite Gcm Gridded Component ! !INTERFACE: subroutine Run ( GC, IMPORT, EXPORT, CLOCK, RC ) ! !ARGUMENTS: type(ESMF_GridComp), intent(inout) :: GC ! Gridded component type(ESMF_State), intent(inout) :: IMPORT ! Import state type(ESMF_State), intent(inout) :: EXPORT ! Export state type(ESMF_Clock), intent(inout) :: CLOCK ! The clock integer, optional, intent( out) :: RC ! Error code ! !DESCRIPTION: !EOP ! ErrLog Variables character(len=ESMF_MAXSTR) :: IAm integer :: STATUS character(len=ESMF_MAXSTR) :: COMP_NAME ! Local derived type aliases type(ESMF_VM) :: VM type (MAPL_MetaComp), pointer :: MAPL type (ESMF_GridComp), pointer :: GCS(:) type (ESMF_State), pointer :: GIM(:) type (ESMF_State), pointer :: GEX(:) type (MAPL_LocStreamXFORM) :: XFORM_A2O type (MAPL_LocStreamXFORM) :: XFORM_O2A #ifdef USE_ODAS type(MAPL_LocStream) :: LOCSTREAM_O #endif type(ESMF_State) :: impSKIN type(ESMF_State) :: expSKIN type (T_GCM_STATE), pointer :: gcm_internal_state type (GCM_wrap) :: wrap type(ESMF_Alarm) :: alarm type(ESMF_Alarm), allocatable :: AlarmList(:) type(ESMF_Time), allocatable :: AlarmRingTime(:) type(ESMF_Time) :: ct, replayTime logical, allocatable :: ringingState(:) integer :: i, nalarms logical :: done logical :: shutoffRpl logical :: timeForRpl character(len=ESMF_MAXSTR) :: tmstr character(len=ESMF_MAXSTR) :: replayMode integer, dimension(NUM_ICE_CATEGORIES) :: SUBINDEXO, SUBINDEXA integer :: N !============================================================================= ! Begin... ! Get the target components name and set-up traceback handle. ! ----------------------------------------------------------- call ESMF_GridCompGet ( GC, name=COMP_NAME, RC=STATUS ) VERIFY_(STATUS) Iam = trim(COMP_NAME) // "Run" call ESMF_VMGetCurrent ( VM=vm, RC=STATUS ) VERIFY_(STATUS) ! Get my MAPL_Generic state !-------------------------- call MAPL_GetObjectFromGC ( GC, MAPL, RC=STATUS) VERIFY_(STATUS) call MAPL_TimerON(MAPL,"TOTAL") call MAPL_TimerON(MAPL,"RUN" ) ! Get my internal private state. This contains the transforms ! between the exchange grid and the atmos grid. !------------------------------------------------------------- call ESMF_UserCompGetInternalState(gc, 'GCM_state', wrap, status) VERIFY_(STATUS) gcm_internal_state => wrap%ptr XFORM_A2O = GCM_INTERNAL_STATE%XFORM_A2O XFORM_O2A = GCM_INTERNAL_STATE%XFORM_O2A impSKIN = GCM_INTERNAL_STATE%impSKIN expSKIN = GCM_INTERNAL_STATE%expSKIN do N=1,NUM_ICE_CATEGORIES SUBINDEXO(N) = N SUBINDEXA(N) = N+1 enddo ! Get children and their im/ex states from my generic state. !---------------------------------------------------------- call MAPL_Get ( MAPL, GCS=GCS, GIM=GIM, GEX=GEX,& RC=STATUS ) VERIFY_(STATUS) #ifdef USE_ODAS call MAPL_ExchangeGridGet(GCS(OGCM), EXCH=LOCSTREAM_O, RC=STATUS) VERIFY_(STATUS) #endif #ifndef DATAATM ! replay-mode stuff ! ----------------- call MAPL_GetResource(MAPL, ReplayMode, 'REPLAY_MODE:', & default="NoReplay", RC=STATUS ) VERIFY_(STATUS) REPLAY: if(adjustl(ReplayMode)=="Regular") then call MAPL_TimerON(MAPL,"--REPLAY" ) shutoffRpl = ESMF_AlarmIsRinging(GCM_INTERNAL_STATE%replayShutoffAlarm, RC=STATUS) VERIFY_(STATUS) timeForRpl = ESMF_AlarmIsRinging(GCM_INTERNAL_STATE%replayStartAlarm, RC=STATUS) VERIFY_(STATUS) if (timeForRpl .and. .not. shutoffRpl ) then ! clear Atm IAU tendencies first if( MAPL_AM_I_Root() ) print *, 'Zeroing IAU forcing ...' call ESMF_GridCompRun ( GCS(AIAU), importState=GIM(AIAU), exportState=GEX(AIAU), clock=clock, phase=2, userRC=status ) VERIFY_(STATUS) ! we should save import and internal states ! this is already done by record in MAPL_CAP call ESMF_ClockGet(clock, currTime=ct, rc=status) VERIFY_(STATUS) replayTime = ct ! save alarms' states call ESMF_ClockGet(clock, alarmCount = nalarms, rc=status) VERIFY_(STATUS) allocate (alarmList(nalarms), alarmRingTime(nalarms), ringingState(nalarms), stat = status) VERIFY_(STATUS) call ESMF_ClockGetAlarmList(clock, alarmListFlag=ESMF_ALARMLIST_ALL, & alarmList=alarmList, alarmCount = nalarms, rc=status) VERIFY_(STATUS) DO I = 1, nalarms call ESMF_AlarmGet(alarmList(I), ringTime=alarmRingTime(I), ringing=ringingState(I), rc=status) VERIFY_(STATUS) END DO ! fix the predictor alarm call ESMF_ClockGetAlarm(clock, 'PredictorAlarm', alarm, rc=status) VERIFY_(STATUS) call ESMF_AlarmRingerOn(alarm, RC=STATUS) VERIFY_(STATUS) ! time loop if( MAPL_AM_I_Root() ) print * TIME_LOOP: do DONE = ESMF_AlarmIsRinging(GCM_INTERNAL_STATE%replayStopAlarm, RC=STATUS) VERIFY_(STATUS) if ( DONE ) exit ! Run the AGCM Gridded Component ! ------------------------------ if( MAPL_AM_I_Root() ) print *, 'Advancing AGCM 1-Model TimeStep ...' call ESMF_GridCompRun ( GCS(AGCM), importState=GIM(AGCM), exportState=GEX(AGCM), clock=clock, userRC=status ) VERIFY_(STATUS) ! Advance the Clock ! ----------------- call ESMF_ClockAdvance ( clock, rc=status ) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) enddo TIME_LOOP ! end of time loop ! call make Atm IAU if( MAPL_AM_I_Root() ) print *, 'Creating IAU forcing ...' call ESMF_GridCompRun ( GCS(AIAU), importState=GIM(AIAU), exportState=GEX(AIAU), clock=clock, phase=1, userRC=status ) VERIFY_(STATUS) ! rewind the clock ! -------------------------------------------------------------- call ESMF_ClockSet(clock, direction=ESMF_DIRECTION_REVERSE, rc=status) VERIFY_(STATUS) do if( MAPL_AM_I_Root() ) print *, 'Rewinding Clock 1-Model TimeStep ...' call ESMF_ClockAdvance ( clock, rc=status ) VERIFY_(STATUS) call ESMF_ClockGet(clock, currTime=ct, rc=status) VERIFY_(STATUS) if (ct ==replayTime) exit enddo if( MAPL_AM_I_Root() ) then print *, 'Continue AGCM Replay ...' print * endif ! restore the state of the alarms call ESMF_ClockSet(clock, direction=ESMF_DIRECTION_FORWARD, rc=status) VERIFY_(STATUS) DO I = 1, nalarms call ESMF_AlarmSet(alarmList(I), ringTime=alarmRingTime(I), ringing=ringingState(I), rc=status) VERIFY_(STATUS) END DO deallocate(alarmList, alarmRingTime, ringingState) ! restore import and internal states call MAPL_GenericRefresh( GCS(AGCM), GIM(AGCM), GEX(AGCM), clock, rc=status ) VERIFY_(STATUS) end if if (shutoffRpl ) then ! clear IAU tendencies call ESMF_GridCompRun ( GCS(AIAU), importState=GIM(AIAU), exportState=GEX(AIAU), clock=clock, phase=2, userRC=status ) VERIFY_(STATUS) end if ! fix the predictor alarm call ESMF_ClockGetAlarm(clock, 'PredictorAlarm', alarm, rc=status) VERIFY_(STATUS) call ESMF_AlarmRingerOff(alarm, RC=STATUS) VERIFY_(STATUS) call MAPL_TimerOff(MAPL,"--REPLAY" ) end if REPLAY #endif ! the usual time step !-------------------- call MAPL_TimerOn(MAPL,"--ATMOSPHERE" ) call MAPL_TimerOn(MAPL,"AGCM" ) call ESMF_GridCompRun ( GCS(AGCM), importState=GIM(AGCM), exportState=GEX(AGCM), clock=clock, userRC=status ) VERIFY_(STATUS) call MAPL_TimerOff(MAPL,"AGCM" ) call MAPL_TimerOff(MAPL,"--ATMOSPHERE" ) #ifndef DATAATM ! Accumulate for digital filter ! ----------------------------- call ESMF_GridCompRun ( GCS(ADFI), importState=GIM(ADFI), exportState=GEX(ADFI), clock=clock, userRC=status ) VERIFY_(STATUS) #endif if ( ESMF_AlarmIsRinging(GCM_INTERNAL_STATE%alarmOcn, RC=STATUS) ) then VERIFY_(STATUS) ! time to couple and run ocean ! Synchronize for Next TimeStep ! ----------------------------- call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) call MAPL_TimerOn(MAPL,"--A2O" ) ! get tilevars and transform them ! SURFACE exports to OGCM imports ! Example how to do TW, we need to do all of the OCGMimports ! Copy attributes to deal with friendliness !------------------------------------------ call MAPL_CopyFriendliness(GIM(OGCM),'TW',expSKIN,'TSKINW', RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'HW',expSKIN,'HSKINW', RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'SW',expSKIN,'SSKINW', RC=STATUS) VERIFY_(STATUS) #ifdef USE_CICE call MAPL_CopyFriendliness(GIM(OGCM),'TI',expSKIN,'TSKINC' , RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'FRACICE',expSKIN,'FR', RC=STATUS) VERIFY_(STATUS) #else call MAPL_CopyFriendliness(GIM(OGCM),'TI',expSKIN,'TSKINI' , RC=STATUS) VERIFY_(STATUS) #endif call MAPL_CopyFriendliness(GIM(OGCM),'HI',expSKIN,'HSKINI', RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'SI',expSKIN,'SSKINI', RC=STATUS) VERIFY_(STATUS) #ifdef USE_CICE call MAPL_CopyFriendliness(GIM(OGCM),'VOLICE',expSKIN,'VOLICE', RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'VOLSNO',expSKIN,'VOLSNO', RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'ERGICE',expSKIN,'ERGICE', RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'ERGSNO',expSKIN,'ERGSNO', RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'TAUAGE',expSKIN,'TAUAGE', RC=STATUS) VERIFY_(STATUS) call MAPL_CopyFriendliness(GIM(OGCM),'MPOND',expSKIN,'VOLPOND', RC=STATUS) VERIFY_(STATUS) #endif ! Do the routing between the atm and ocean's decompositions of the exchage grid !------------------------------------------------------------------------------ call DO_A2O(GIM(OGCM),'TW' ,expSKIN,'TSKINW' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'HW' ,expSKIN,'HSKINW' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'SW' ,expSKIN,'SSKINW' , RC=STATUS) VERIFY_(STATUS) #ifndef USE_CICE call DO_A2O(GIM(OGCM),'TI' ,expSKIN,'TSKINI' , RC=STATUS) VERIFY_(STATUS) #endif call DO_A2O(GIM(OGCM),'HI' ,expSKIN,'HSKINI' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'SI' ,expSKIN,'SSKINI' , RC=STATUS) VERIFY_(STATUS) #ifdef USE_CICE call DO_A2O_SUBTILES_R4R4(GIM(OGCM),'TI' , SUBINDEXO, & expSKIN ,'TSKINC' , SUBINDEXA, RC=STATUS) VERIFY_(STATUS) call DO_A2O_SUBTILES_R4R8(GIM(OGCM),'FRACICE', SUBINDEXO, & expSKIN ,'FR' , SUBINDEXA, RC=STATUS) VERIFY_(STATUS) call DO_A2O_SUBTILES_R4R8(GIM(OGCM),'VOLICE' , SUBINDEXO, & expSKIN ,'VOLICE' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) call DO_A2O_SUBTILES_R4R8(GIM(OGCM),'VOLSNO' , SUBINDEXO, & expSKIN ,'VOLSNO' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) call DO_A2O_SUBTILES2D_R4R8(GIM(OGCM),'ERGICE' , SUBINDEXO, & expSKIN ,'ERGICE' , SUBINDEXO, & NUM_ICE_LAYERS, RC=STATUS) VERIFY_(STATUS) call DO_A2O_SUBTILES2D_R4R8(GIM(OGCM),'ERGSNO' , SUBINDEXO, & expSKIN ,'ERGSNO' , SUBINDEXO, & NUM_SNOW_LAYERS, RC=STATUS) VERIFY_(STATUS) call DO_A2O_SUBTILES_R4R4(GIM(OGCM),'TAUAGE' , SUBINDEXO, & expSKIN ,'TAUAGE' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) call DO_A2O_SUBTILES_R4R8(GIM(OGCM),'MPOND' , SUBINDEXO, & expSKIN ,'VOLPOND' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) #endif #ifndef USE_CICE call DO_A2O(GIM(OGCM),'TAUXW' ,expSKIN,'TAUXO' , RC=STATUS); VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'TAUYW' ,expSKIN,'TAUYO' , RC=STATUS); VERIFY_(STATUS) #else call DO_A2O(GIM(OGCM),'TAUXW' ,expSKIN,'TAUXW' , RC=STATUS); VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'TAUYW' ,expSKIN,'TAUYW' , RC=STATUS); VERIFY_(STATUS) #endif call DO_A2O(GIM(OGCM),'TAUXI' ,expSKIN,'TAUXI' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'TAUYI' ,expSKIN,'TAUYI' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'PENPAR' ,expSKIN,'PENPAR' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'PENPAF' ,expSKIN,'PENPAF' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'PENUVR' ,expSKIN,'PENUVR' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'PENUVF' ,expSKIN,'PENUVF' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'OUSTAR3',expSKIN,'OUSTAR3', RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'PS' ,expSKIN,'PS' , RC=STATUS) VERIFY_(STATUS) call DO_A2O(GIM(OGCM),'DISCHRG',expSKIN,'DISCHARGE', RC=STATUS) VERIFY_(STATUS) #ifdef USE_OBIO call DO_A2O(GIM(OGCM),'UU' ,expSKIN,'UU' , RC=STATUS) VERIFY_(STATUS) #ifndef DATAATM call DO_A2O(GIM(OGCM),'CO2SC' ,expSKIN,'CO2SC' , RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'DUDP', expSKIN, 'DUDP', RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'DUWT', expSKIN, 'DUWT', RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'DUSD', expSKIN, 'DUSD', RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'BCDP', expSKIN, 'BCDP', RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'BCWT', expSKIN, 'BCWT', RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'OCDP', expSKIN, 'OCDP', RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'OCWT', expSKIN, 'OCWT', RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'FSWBAND', expSKIN, 'FSWBAND', RC=STATUS) VERIFY_(STATUS) call DO_A2O_UGD(GIM(OGCM), 'FSWBANDNA', expSKIN, 'FSWBANDNA', RC=STATUS) VERIFY_(STATUS) #endif #endif call MAPL_TimerOff(MAPL,"--A2O" ) !-- ! OGCM exports to SURFACE imports ! Example how to do UW, we need to do all of the SURFACE 'friendly' tilevars call MAPL_TimerOn(MAPL,"--OCEAN" ) call MAPL_TimerOn(MAPL,"OGCM" ) call ESMF_GridCompRun ( GCS(OGCM), importState=gim(OGCM), exportState=gex(OGCM), clock=clock, userRC=status ) VERIFY_(STATUS) call MAPL_TimerOff(MAPL,"OGCM" ) call MAPL_TimerOff(MAPL,"--OCEAN" ) call MAPL_TimerOn (MAPL,"--O2A" ) #ifdef USE_ODAS call MAPL_GetResource(MAPL, flag, Label="surface_winds_to_iOdas:", default=0, rc=status) VERIFY_(STATUS) if(flag > 0) then call DO_A2OG(GEX(OGCM), 'TX', expSKIN, 'U10M', RC=STATUS) VERIFY_(STATUS) call DO_A2OG(GEX(OGCM), 'TY', expSKIN, 'V10M', RC=STATUS) VERIFY_(STATUS) endif #endif call DO_O2A(expSKIN, 'TSKINW' , GIM(OGCM), 'TW' , RC=STATUS) VERIFY_(STATUS) #ifndef USE_CICE call DO_O2A(expSKIN, 'TSKINI' , GIM(OGCM), 'TI' , RC=STATUS) VERIFY_(STATUS) #endif call DO_O2A(expSKIN, 'HSKINW' , GIM(OGCM), 'HW' , RC=STATUS) VERIFY_(STATUS) call DO_O2A(expSKIN, 'HSKINI' , GIM(OGCM), 'HI' , RC=STATUS) VERIFY_(STATUS) call DO_O2A(expSKIN, 'SSKINW' , GIM(OGCM), 'SW' , RC=STATUS) VERIFY_(STATUS) call DO_O2A(expSKIN, 'SSKINI' , GIM(OGCM), 'SI' , RC=STATUS) VERIFY_(STATUS) #ifdef USE_CICE #ifndef DATAATM call DO_O2A(expSKIN, 'DAIDTD' , GIM(OGCM), 'DAIDTD' , RC=STATUS) VERIFY_(STATUS) call DO_O2A(expSKIN, 'DVIDTD' , GIM(OGCM), 'DVIDTD' , RC=STATUS) VERIFY_(STATUS) #endif call DO_O2A_SUBTILES_R4R4(expSKIN , 'TSKINC' , SUBINDEXA, & GIM(OGCM), 'TI' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) call DO_O2A_SUBTILES_R8R4(expSKIN , 'FR' , SUBINDEXA, & GIM(OGCM), 'FRACICE' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) call DO_O2A_SUBTILES_R8R4(expSKIN , 'VOLICE' , SUBINDEXO, & GIM(OGCM), 'VOLICE' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) call DO_O2A_SUBTILES_R8R4(expSKIN , 'VOLSNO' , SUBINDEXO, & GIM(OGCM), 'VOLSNO' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) call DO_O2A_SUBTILES2D_R8R4(expSKIN , 'ERGICE' , SUBINDEXO, & GIM(OGCM), 'ERGICE' , SUBINDEXO, & NUM_ICE_LAYERS, RC=STATUS) VERIFY_(STATUS) call DO_O2A_SUBTILES2D_R8R4(expSKIN , 'ERGSNO' , SUBINDEXO, & GIM(OGCM), 'ERGSNO' , SUBINDEXO, & NUM_SNOW_LAYERS, RC=STATUS) VERIFY_(STATUS) call DO_O2A_SUBTILES_R4R4(expSKIN , 'TAUAGE' , SUBINDEXO, & GIM(OGCM), 'TAUAGE' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) call DO_O2A_SUBTILES_R8R4(expSKIN , 'VOLPOND' , SUBINDEXO, & GIM(OGCM), 'MPOND' , SUBINDEXO, RC=STATUS) VERIFY_(STATUS) #endif call DO_O2A(impSKIN, 'UW' , GEX(OGCM), 'UW' , RC=STATUS) VERIFY_(STATUS) call DO_O2A(impSKIN, 'VW' , GEX(OGCM), 'VW' , RC=STATUS) VERIFY_(STATUS) call DO_O2A(impSKIN, 'KPAR' , GEX(OGCM), 'KPAR' , RC=STATUS) VERIFY_(STATUS) #ifndef USE_CICE call DO_O2A(impSKIN, 'FRACICE' , GEX(OGCM), 'FRACICE', RC=STATUS) VERIFY_(STATUS) #else call DO_O2A(impSKIN, 'TAUXBOT' , GEX(OGCM), 'TAUXIBOT', RC=STATUS) VERIFY_(STATUS) call DO_O2A(impSKIN, 'TAUYBOT' , GEX(OGCM), 'TAUYIBOT', RC=STATUS) VERIFY_(STATUS) #endif call DO_O2A(impSKIN, 'UI' , GEX(OGCM), 'UI' , RC=STATUS) VERIFY_(STATUS) call DO_O2A(impSKIN, 'VI' , GEX(OGCM), 'VI' , RC=STATUS) VERIFY_(STATUS) ! OGCM export of TS_FOUND to SKIN !--------------------------------- call DO_O2A(impSKIN, 'TS_FOUND' , GEX(OGCM), 'TS_FOUND' , RC=STATUS) VERIFY_(STATUS) call ESMF_AlarmRingerOff(GCM_INTERNAL_STATE%alarmOcn, RC=STATUS) VERIFY_(STATUS) call MAPL_TimerOff(MAPL,"--O2A" ) endif call MAPL_TimerOff(MAPL,"RUN" ) call MAPL_TimerOff(MAPL,"TOTAL") RETURN_(ESMF_SUCCESS) contains subroutine DO_A2O(STATEO,NAMEO,STATEA,NAMEA,RC) type(ESMF_State) , intent(INOUT) :: STATEO type(ESMF_State) , intent(INOUT) :: STATEA character(len=*) , intent(IN ) :: NAMEO character(len=*) , intent(IN ) :: NAMEA integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_A2O" integer :: STATUS real, pointer :: ptrA(:) real, pointer :: ptrO(:) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then call MAPL_LocStreamTransform( ptrO, XFORM_A2O, ptrA, RC=STATUS ) VERIFY_(STATUS) end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_A2O subroutine DO_A2O_UGD(STATEO,NAMEO,STATEA,NAMEA,RC) type(ESMF_State) , intent(INOUT) :: STATEO type(ESMF_State) , intent(INOUT) :: STATEA character(len=*) , intent(IN ) :: NAMEO character(len=*) , intent(IN ) :: NAMEA integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_A2O_UGD" integer :: STATUS integer :: N real, pointer :: ptrA(:,:) real, pointer :: ptrO(:,:) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then do N = 1, size(ptrA,2) call MAPL_LocStreamTransform( ptrO(:,N), XFORM_A2O, ptrA(:,N), RC=STATUS ) VERIFY_(STATUS) end do end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_A2O_UGD subroutine DO_O2A(STATEA,NAMEA,STATEO,NAMEO,RC) type(ESMF_State) , intent(INOUT) :: STATEA type(ESMF_State) , intent(INOUT) :: STATEO character(len=*) , intent(IN ) :: NAMEA character(len=*) , intent(IN ) :: NAMEO integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_O2A" integer :: STATUS real, pointer :: ptrA(:) real, pointer :: ptrO(:) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then call MAPL_LocStreamTransform( ptrA, XFORM_O2A, ptrO, RC=STATUS ) VERIFY_(STATUS) end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_O2A #ifdef USE_CICE subroutine DO_A2O_SUBTILES_R4R4(STATEO,NAMEO,SUBINDEXO,STATEA,NAMEA,SUBINDEXA,RC) type(ESMF_State) , intent(INOUT) :: STATEO type(ESMF_State) , intent(INOUT) :: STATEA character(len=*) , intent(IN ) :: NAMEO character(len=*) , intent(IN ) :: NAMEA integer , intent(IN ) :: SUBINDEXO(:) integer , intent(IN ) :: SUBINDEXA(:) integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_A2O_SUBTILES_R4R4" integer :: STATUS real, pointer :: ptrA(:,:) real, pointer :: ptrO(:,:) integer :: N, DIMSO, DIMSA DIMSO = size(SUBINDEXO) DIMSA = size(SUBINDEXA) ASSERT_(DIMSO == DIMSA) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then do N=1,DIMSO call MAPL_LocStreamTransform( ptrO(:,SUBINDEXO(N)), XFORM_A2O, & ptrA(:,SUBINDEXA(N)), RC=STATUS ) VERIFY_(STATUS) enddo end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_A2O_SUBTILES_R4R4 subroutine DO_A2O_SUBTILES_R4R8(STATEO,NAMEO,SUBINDEXO,STATEA,NAMEA,SUBINDEXA,RC) type(ESMF_State) , intent(INOUT) :: STATEO type(ESMF_State) , intent(INOUT) :: STATEA character(len=*) , intent(IN ) :: NAMEO character(len=*) , intent(IN ) :: NAMEA integer , intent(IN ) :: SUBINDEXO(:) integer , intent(IN ) :: SUBINDEXA(:) integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_A2O_SUBTILES_R4R8" integer :: STATUS real(kind=ESMF_KIND_R8), pointer :: ptrA(:,:) real, pointer :: ptrO(:,:) integer :: N, DIMSO, DIMSA DIMSO = size(SUBINDEXO) DIMSA = size(SUBINDEXA) ASSERT_(DIMSO == DIMSA) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then do N=1,DIMSO call MAPL_LocStreamTransform( ptrO(:,SUBINDEXO(N)), XFORM_A2O, & ptrA(:,SUBINDEXA(N)), RC=STATUS ) VERIFY_(STATUS) enddo end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_A2O_SUBTILES_R4R8 subroutine DO_A2O_SUBTILES2D_R4R8(STATEO,NAMEO,SUBINDEXO,STATEA,NAMEA,SUBINDEXA, & DIMS, RC) type(ESMF_State) , intent(INOUT) :: STATEO type(ESMF_State) , intent(INOUT) :: STATEA character(len=*) , intent(IN ) :: NAMEO character(len=*) , intent(IN ) :: NAMEA integer , intent(IN ) :: SUBINDEXO(:) integer , intent(IN ) :: SUBINDEXA(:) integer , intent(IN ) :: DIMS integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_A2O_SUBTILES2D_R4R8" integer :: STATUS real(kind=ESMF_KIND_R8), pointer :: ptrA(:,:,:) real, pointer :: ptrO(:,:,:) integer :: N, K, DIMSO, DIMSA DIMSO = size(SUBINDEXO) DIMSA = size(SUBINDEXA) ASSERT_(DIMSO == DIMSA) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then do N=1,DIMSO do K=1,DIMS call MAPL_LocStreamTransform( ptrO(:,K,SUBINDEXO(N)), XFORM_A2O, & ptrA(:,K,SUBINDEXA(N)), RC=STATUS ) VERIFY_(STATUS) enddo enddo end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_A2O_SUBTILES2D_R4R8 subroutine DO_O2A_SUBTILES_R4R4(STATEA,NAMEA,SUBINDEXA,STATEO,NAMEO,SUBINDEXO,RC) type(ESMF_State) , intent(INOUT) :: STATEA type(ESMF_State) , intent(INOUT) :: STATEO character(len=*) , intent(IN ) :: NAMEA character(len=*) , intent(IN ) :: NAMEO integer , intent(IN ) :: SUBINDEXO(:) integer , intent(IN ) :: SUBINDEXA(:) integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_O2A_SUBTILES_R4R4" integer :: STATUS real, pointer :: ptrA(:,:) real, pointer :: ptrO(:,:) integer :: N, DIMSO, DIMSA DIMSO = size(SUBINDEXO) DIMSA = size(SUBINDEXA) ASSERT_(DIMSO == DIMSA) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then do N=1,DIMSO call MAPL_LocStreamTransform( ptrA(:, SUBINDEXA(N)), XFORM_O2A, & ptrO(:, SUBINDEXO(N)), RC=STATUS ) VERIFY_(STATUS) enddo end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_O2A_SUBTILES_R4R4 subroutine DO_O2A_SUBTILES_R8R4(STATEA,NAMEA,SUBINDEXA,STATEO,NAMEO,SUBINDEXO,RC) type(ESMF_State) , intent(INOUT) :: STATEA type(ESMF_State) , intent(INOUT) :: STATEO character(len=*) , intent(IN ) :: NAMEA character(len=*) , intent(IN ) :: NAMEO integer , intent(IN ) :: SUBINDEXO(:) integer , intent(IN ) :: SUBINDEXA(:) integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_O2A_SUBTILES_R8R4" integer :: STATUS real(kind=ESMF_KIND_R8), pointer :: ptrA(:,:) real, pointer :: ptrO(:,:) integer :: N, DIMSO, DIMSA DIMSO = size(SUBINDEXO) DIMSA = size(SUBINDEXA) ASSERT_(DIMSO == DIMSA) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then do N=1,DIMSO call MAPL_LocStreamTransform( ptrA(:, SUBINDEXA(N)), XFORM_O2A, & ptrO(:, SUBINDEXO(N)), RC=STATUS ) VERIFY_(STATUS) enddo end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_O2A_SUBTILES_R8R4 subroutine DO_O2A_SUBTILES2D_R8R4(STATEA,NAMEA,SUBINDEXA,STATEO,NAMEO,SUBINDEXO, & DIMS, RC) type(ESMF_State) , intent(INOUT) :: STATEA type(ESMF_State) , intent(INOUT) :: STATEO character(len=*) , intent(IN ) :: NAMEA character(len=*) , intent(IN ) :: NAMEO integer , intent(IN ) :: SUBINDEXO(:) integer , intent(IN ) :: SUBINDEXA(:) integer , intent(IN ) :: DIMS integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_O2A_SUBTILES2D_R8R4" integer :: STATUS real(kind=ESMF_KIND_R8), pointer :: ptrA(:,:,:) real, pointer :: ptrO(:,:,:) integer :: N, K, DIMSO, DIMSA DIMSO = size(SUBINDEXO) DIMSA = size(SUBINDEXA) ASSERT_(DIMSO == DIMSA) call MAPL_GetPointer(STATEO, ptrO, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) if (associated(ptrO) .and. associated(ptrA)) then do N=1,DIMSO do K=1,DIMS call MAPL_LocStreamTransform( ptrA(:,K,SUBINDEXA(N)), XFORM_O2A, & ptrO(:,K,SUBINDEXO(N)), RC=STATUS ) VERIFY_(STATUS) enddo enddo end if call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine DO_O2A_SUBTILES2D_R8R4 #endif #ifdef USE_ODAS subroutine DO_A2OG(STATEO,NAMEO,STATEA,NAMEA,RC) type(ESMF_State) , intent(INOUT) :: STATEO type(ESMF_State) , intent(INOUT) :: STATEA character(len=*) , intent(IN ) :: NAMEO character(len=*) , intent(IN ) :: NAMEA integer, optional, intent( OUT) :: RC character(len=ESMF_MAXSTR), parameter :: IAm="DO_A2O" integer :: STATUS real, pointer :: ptrA(:) real, pointer :: ptrO_2d(:,:) real, allocatable :: varO(:) integer :: nt call MAPL_GetPointer(STATEO, ptrO_2d, NAMEO, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) if (.not. associated(ptrO_2d)) then RETURN_(ESMF_SUCCESS) end if call MAPL_GetPointer(STATEA, ptrA, NAMEA, notFoundOK=.true., RC=STATUS) VERIFY_(STATUS) if (.not. associated(ptrA)) then RETURN_(ESMF_SUCCESS) end if call MAPL_LocStreamGet( LOCSTREAM_O, nt_local=nt, RC=STATUS ) VERIFY_(STATUS) allocate(varO(NT), stat=status) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) ! T2T (atmosphere-to-ocean tile) call MAPL_LocStreamTransform( varO, XFORM_A2O, ptrA, RC=STATUS ) VERIFY_(STATUS) ! T2G (ocean-tile-to-ocean-grid) call MAPL_LocStreamTransform( LOCSTREAM_O, ptrO_2d, varO, RC=STATUS ) VERIFY_(STATUS) call ESMF_VMBarrier(VM, rc=status) VERIFY_(STATUS) deallocate(varO) RETURN_(ESMF_SUCCESS) end subroutine DO_A2OG #endif end subroutine Run #ifdef USE_ODAS subroutine Finalize ( GC, IMPORT, EXPORT, CLOCK, RC ) ! !ARGUMENTS: type(ESMF_GridComp), intent(inout) :: GC ! Gridded component type(ESMF_State), intent(inout) :: IMPORT ! Import state type(ESMF_State), intent(inout) :: EXPORT ! Export state type(ESMF_Clock), intent(inout) :: CLOCK ! The clock integer, optional, intent( out) :: RC ! Error code ! !DESCRIPTION: The Finalize method of GCM. !EOP ! ErrLog Variables character(len=ESMF_MAXSTR) :: IAm integer :: STATUS character(len=ESMF_MAXSTR) :: COMP_NAME Iam = "Finalize" call ESMF_GridCompGet ( GC, name=COMP_NAME, RC=STATUS ) VERIFY_(STATUS) Iam = trim(COMP_NAME) // Iam status = chdir("restarts." // comp_name(5:7)); VERIFY_(STATUS) call MAPL_GenericFinalize ( GC, IMPORT, EXPORT, CLOCK, rc = STATUS) VERIFY_(STATUS) status = chdir(".."); VERIFY_(STATUS) RETURN_(ESMF_SUCCESS) end subroutine Finalize subroutine Record ( gc, import, export, clock, rc ) ! !ARGUMENTS: type(ESMF_GridComp), intent(INOUT) :: gc ! Gridded component type(ESMF_State), intent(INOUT) :: import ! Import state type(ESMF_State), intent(INOUT) :: export ! Export state type(ESMF_Clock), intent(INOUT) :: clock ! The supervisor clock integer, optional, intent( OUT) :: rc ! Error code: !EOP type (MAPL_MetaComp), pointer :: MAPL ! ErrLog Variables character(len=ESMF_MAXSTR) :: IAm integer :: STATUS character(len=ESMF_MAXSTR) :: COMP_NAME ! Locals logical :: doRecord ! Get the target components name and set-up traceback handle. ! ----------------------------------------------------------- Iam = "Record" call ESMF_GridCompGet( gc, NAME=comp_name, RC=status ) VERIFY_(STATUS) Iam = trim(comp_name) // Iam ! Get my internal MAPL_Generic state call MAPL_GetObjectFromGC ( GC, MAPL, RC=status) VERIFY_(STATUS) doRecord = MAPL_RecordAlarmIsRinging(MAPL, RC=status) VERIFY_(STATUS) if (doRecord) then status = chdir("restarts." // comp_name(5:7)); VERIFY_(STATUS) end if call MAPL_GenericRecord ( GC, IMPORT, EXPORT, CLOCK, rc = STATUS) VERIFY_(STATUS) if (doRecord) then status = chdir(".."); VERIFY_(STATUS) end if RETURN_(ESMF_SUCCESS) end subroutine Record #endif end module GEOS_GcmGridCompMod