Joint CCSM/ESMF meeting
Tuesday May 16th, 3:00-4:00pm
Directors Conference room
Attending: Cecelia, Erik, Mariana, Don
- Review last meeting
- Peggy has files now – progress? Doing ok!
- Is Brian E. happy enough? Wait for ESMF_2_3_0.
- What does our design look like again?
- We now have ESMF_Initialize in our codes (CAM, CLM)
- Is it ok to have ESMF_Initialize but not ESMF_Finalize? (CCSM has it's own finalize that shuts down MPI and this conflicts with the ESMF_Finalize). Could we make shutting down MPI an option to ESMF_Finalize?
- Erik with Ed and/or Gerhard on configure script – in July (maybe 2nd week of July for a week or so)
- ESMF2_2_2 – Right now for coding
- ESMF2_3_0 – Changes without structure changes (August 15th or so)
- ESMF3_0_0 – Gerhards huge change
Cecelia would like us to use ESMF_2_3_0 for Stage-1.CCSM Objects being used at driver and passed to all components
- We are wrapping ESMF clocks into a CCSM shared clock.
- We have a CCSM Initialization object read in at the driver level and passed to all components.
- Both of these objects are converted into data on ESMF state and then extracted out by a component which then reconstructs them for it's internal use (so it can use the object methods for handling the data).
Time-manager wrapping we are doing:
shr_timemgr_mod
Clock object (based on ESMF clock, has a restart alarm standard, and extra info)
(The EClock has a pointer to the restart alarm in it, added here so the object can reference the alarm directly without having to go through the clock)
(later we will also have alarms for each component model: lnd, ice, ocn, and atm)
type shr_timemgr_clockType private ! This is an opaque type ! ------------------------------------------------------------------------ ! ----------- Information saved on restart ------------------------------- ! ------------------------------------------------------------------------ {color:red}type(ESMF_Clock) :: EClock ! Time information type(ESMF_Alarm) :: restart ! Restart alarm {color} type(shr_timemgr_clockInfoType) :: info ! Misc. Info: perpetual mode, orbit ! ------------------------------------------------------------------------ ! Variables that are written out to restart file from above ! ------------------------------------------------------------------------ type(shr_ncio_descripType) :: var(NClockVars) end type shr_timemgr_clockType
Clock information type
(Contains perpetual date, misc info, as well as orbital information. Orbital information is included so that the orbit can potentially be kept up to date with the clock).
type shr_timemgr_clockInfoType ! CCSM time information: perpetual mode info and orbital information private ! This is an opaque type ! ------------------------------------------------------------------------ ! ----------- Information saved on restart ------------------------------- ! ------------------------------------------------------------------------ ! Description of this clock character(len=SHR_KIND_CL) :: desc ! If this is a master synchronization clock or not logical :: MasterSyncClock ! Calendar type character(len=SHR_KIND_CS) :: calendar ! Perpetual date information logical :: perpetual_run = .false. ! If running in perpetual mode {color:red}type(ESMF_Time) :: perpetual_time ! Time/date of perpetual mode{color} ! Orbital information to set: either year or all of rest integer(SHR_KIND_IN) :: orb_mode = SHR_ORB_UNDEF_INT ! Orbit mode integer(SHR_KIND_IN) :: orb_iyear_AD = SHR_ORB_UNDEF_INT ! year for orbit real(SHR_KIND_R8) :: orb_obliq = SHR_ORB_UNDEF_REAL ! Obliquity of orbit real(SHR_KIND_R8) :: orb_eccen = SHR_ORB_UNDEF_REAL ! Eccentricity of orbit real(SHR_KIND_R8) :: orb_mvelp = SHR_ORB_UNDEF_REAL ! Locatn of vernal equinox ! ------------------------------------------------------------------------ ! ----------- Information not saved on restart --------------------------- ! ------------------------------------------------------------------------ ! If wish to turn restarts off logical :: NoRestarts = .false. ! Orbital information derived from above real(SHR_KIND_R8) :: orb_obliqr = SHR_ORB_UNDEF_REAL real(SHR_KIND_R8) :: orb_lambm0 = SHR_ORB_UNDEF_REAL real(SHR_KIND_R8) :: orb_mvelpp = SHR_ORB_UNDEF_REAL !------------------------------------------------------------------------ ! Variables that are written out to restart file from above !------------------------------------------------------------------------- type(shr_ncio_descripType) :: var(NInfoVars) end type shr_timemgr_clockInfoType
Initialization information object we use at the driver level and in components:
shr_inputInfo_mod
type shr_inputInfo_initType private ! This type is opaque !----------------------------------------------------------------------------- ! Information shared by all model components !----------------------------------------------------------------------------- ! ----------- Information not saved on restart -------------------- ! Start type: startup, branch or continue character(SHR_KIND_CL) :: start_type ! Type of startup ! ----------- Information saved on restart ------------------------ ! Case description and name (save these on restart) character(SHR_KIND_CL) :: case_desc ! Long description of this case character(SHR_KIND_CS) :: case_name ! Short case identification ! Special configurations (save these on restart) logical :: atm_adiabatic ! No surface models and atm adiabatic mode logical :: atm_ideal_phys ! No surface models and atm ideal-physics logical :: aqua_planet ! No ice/lnd, analytic ocn, perpetual time ! MSS information needed for CAM now, but not in the future? (save these on restart) integer :: mss_irt ! MSS retention period character(SHR_KIND_CL) :: mss_wpass ! MSS write password ! Information ONLY used by the top level application driver. ! ----------- Information not saved on restart -------------------- ! Restart file info character(SHR_KIND_CL) :: restart_pfile ! Restart pointer file character(SHR_KIND_CL) :: restart_file ! Full archive path to restart file character(SHR_KIND_CL) :: archive_dir ! Directory to archive to... character(SHR_KIND_CL) :: restart_file_override ! List to override on restart file logical :: brnch_retain_casename ! If branch and can use same casename !----------------------------------------------------------------------------- ! Variables that are written out to restart file from above !----------------------------------------------------------------------------- type(shr_ncio_descripType) :: var(NVars) end type shr_inputInfo_InitType
So what does that look like in the initialization part of the code?
type(InitInfo_t) :: InitInfo ! CCSM initialization information ! note -the set of fields in the following states are determined in the prefix ! and can be obtained from cpl_fields_mod.F90 ! note- the suffix (_a etc.) determines the grid and decomp of the fields and is ! defined in the gc that contains those grids type(ESMF_State) :: cs_a ! nested states: l2x_a, i2x_a, o2x_a type(ESMF_State) :: a2x_a ! Atm export, atm grid and decomp - defined in atm gc type(ESMF_State) :: a2x_l ! Atm export, lnd grid and decomp - defined at top level type(ESMF_State) :: a2x_i ! Atm export, ice grid and decomp - defined at top level type(ESMF_State) :: a2x_o ! Atm export, ocn grid and decomp - defined at top level type(ESMF_State) :: l2x_a ! Lnd export, atm grid and decomp - defined at top level type(ESMF_State) :: o2x_a ! Ocn export, atm grid and decomp - defined at top level type(ESMF_State) :: i2x_a ! Ice export, atm grid and decomp - defined at top level type(ESMF_State) :: x2a_a ! Atm import, atm grid and decomp - defined in atm gc type(ESMF_GridComp) :: gc_atm ! Atmosphere gridded component type(ESMF_GridComp) :: gc_mrg_x2a ! Atmosphere import state merge/preparer gridded component type(shr_timemgr_ClockType) :: SyncClock ! CCSM clock type(shr_timemgr_ClockInfoType):: TimeMgrInfo ! CCSM time-management information type(shr_timemgr_ClockSetupType):: ClockSetup ! CCSM time-management . . . ! Add ccsm_init_data to import state as state on each import state call eshr_inputinfo_Info2EState( InitInfo, x2a_a ) . . . ! Each component is given it s coupling frequency by querying the alarms setup for each component ! Each component will create it s own internal clock, using ESyncClock to set start, ! stop, calendar and ref time, as well as using the restart alarm call eshr_timemgr_Info2EState( TimeMgrInfo, x2a_a ) . . . if ( shr_inputinfo_RunModel( InitInfo, atm ) ) & call ESMF_GridCompInitialize( gc_atm, import=x2a_a, export=a2x_a, phase=1, clock=ESyncClock, rc=rc ) . . .
What does the run loop look like?
do while ( .not. ESMF_IsStopTime( EClock ) ) if ( shr_inputinfo_RunModel( InitInfo, atm ) .and. ESMF_AlarmIsRinging( atm_alarm ) )then call ESMF_GridCompRun( gc_atm, import=x2a_a, export=a2x_a, ESyncClock, phase=1 ) call ESMF_CplCompRun ( cc_map_a2l, import=a2x_a, export=a2x_l, rc=rc ) call ESMF_CplCompRun ( cc_map_a2i, import=a2x_a, export=a2x_i, rc=rc ) call ESMF_CplCompRun ( cc_map_a2o, import=a2x_a, export=a2x_o, rc=rc ) end if ! Similarily call the surface components... . . . if ( shr_inputinfo_RunModel( InitInfo, atm ) .and. ESMF_AlarmIsRinging( atm_alarm ) )then ! Note: cs_a is the composite state pointing to: l2x_a, i2x_a, and o2x_a call ESMF_GridCompRun( gc_mrg_x2a, import=cs_a, export=x2a_a, rc=rc ) call ESMF_GridCompRun( gc_atm, import=x2a_a, phase=2 ) call ESMF_AlarmRingerOff( atm_alarm ) end if call ESMF_ClockAdvance( EClock ) end do