390 likes | 402 Views
ESMF Infrastructure Layer. 2 nd ESMF Community Meeting, GFDL, May 15 th 2003 http://www.esmf.ucar.edu , esmf@ucar.edu. Talk Outline. What is the infrastructure layer What is it for What it contains ESMF infrastructure in this release ESMF version 1.0 function call † examples (code!!!)
E N D
ESMF Infrastructure Layer 2nd ESMF Community Meeting, GFDL, May 15th 2003 http://www.esmf.ucar.edu, esmf@ucar.edu
Talk Outline • What is the infrastructure layer • What is it for • What it contains • ESMF infrastructure in this release • ESMF version 1.0 function call† examples (code!!!) (†aka API or methods) • Next steps…. • Infrastructure Utility Example
Infrastructure Layer NCAR Atmosphere NCAR Atmosphere • A standard software platform for enabling interoperability (developing couplers, ensuring performance portability). • Set of reusable software for Earth science applications. Streamlined development for researchers. My Sea Ice GFDL Ocean GFDL Ocean NSIPP Land NSIPP Land
Infrastructure Layer Scope ESMF Superstructure Support for • Physical Grids • Regridding • Decomposition/composition • Communication • Calendar and Time • I/O • Logging and Profiling User Code ESMF Infrastructure
Location Within ESMF 1. ESMF provides an environment for assembling components. Application Component Gridded Components Coupler Components 2. ESMF provides a toolkit that components use to • ensure interoperability • abstract common services Component: run(), checkpoint() INFRASTRUCTURE LAYER Grid: regrid(), transpose() + Metrics Field: halo(), import(), export() + I/O Layout, PEList, Machine Model
Talk Outline • What is the infrastructure layer • What is it for • What it contains • ESMF infrastructure in this release • ESMF version 1.0 function call† examples (code!!!) (†aka API or methods) • Next steps…. • Infrastructure utility example
Bundle Regrid Field Grid PhysGrid DistGrid F90 Data Communications C++ DELayout Array Route MachineModel Comm Time, Alarm, Calendar, LogErr, I/O, Attributes Infrastructure Internal Organization Two tiers Class hierarchy for data and communications
Creating an ESMF Field • Fortran Array • Array Attach • Field Attach Array real, dimension(100,100) :: arr ESMF_Array esArr = ESMF_ArrayCreate(arr,…) info. ESMF_Field metadata ESMF_FieldAttachArray(esFld,esArr,…) ESMF_Grid ESMF_Array info.
Creating an ESMF Grid call ESMF_DistGridCreate…(…) call ESMF_PhysGridCreate…(…) DistGrid PhysGrid ESMF_Grid
Field and Grid Together : grid = ESMF_GridCreate(…,layout,…) : field_u = ESMF_FieldCreate(grid, array) : ESMF_Field metadata ESMF_Grid ESMF_Array info. • Create field distributed over a set of decomposition elements (DE’s). • Domain decomposition determined by DELayout, layout. • Each object (grid and field_u) has internal representation. • Other parts of the infrastructure layer use the internal representation e.g. • Regrid() – interpolation/extrapolation + redistribute over DE’s • Redistribution() - general data rearrangement over DE’s • Halo() – specialized redistribution
Regrid • Function mapping field’s array to a different physical and distributed grid. • RegridCreate() – creates a Regrid structure to be used/re-used regrid = ESMF_RegridCreate(src_field, dst_field, method, [name], [rc]) Source, Dest field can be empty of field data (RegridCreate() uses grid metrics) • PhysGrid, DistGrid info used for setting up regrid • Resulting regrid can be used for other fields sharing same Grid • Method specifies interpolation algorithm. For example, bilinear, b-spline, etc…
Regrid Interface (cont) • RegridRun() – performs actual regridding call ESMF_RegridRun(src_field, dst_field, regrid,[rc]) • Communication and interpolation handled transparently. • RegridDestroy() – frees up memory call ESMF_RegridDestroy(regrid,[rc]) src_field dst_field
src_field Redistribution • No interpolation or extrapolation • Maps between distributed grids, field’s array and physical grid are the same i.e. • Example: layout() created two distributed grids one decomposed in X and one decomposed in Y. • Redistribution() function maps array data between the distributions (a transpose/corner turn) • Communication handled transparently dst_field
Halo • Fields have distributed index space of • Exclusive {E}, compute {C} and local {L} region where • Halo() fills points not in {E} or {C} from remote {E} e.g call ESMF_FieldHalo(field_foo, status) {L} {L} {C} {C} {E} {E} DE4 DE3
Bundle and Location Stream • ESMF_Bundle • collection of fields on the same grid • ESMF_LocationStream • Like a field but….. • unstructured index space with an associated physical grid space • useful for observations e.g. radiosonde, floats • Functions for create(), regrid(), redistribute(), halo() etc…
ESMF Infrastructure Utilities • Clock • Alarm • Calendar • I/O • Logging • Profiling • Attribute • Machine model and comms Ensures consistent time between components Provides field level I/O in standard forms – netCDF, binary, HDF, GRIB, Bufr Consistent monitoring and messaging Consistent parameter handling Hardware and system software hiding. Platform customizable
Time • Standard type for any component • Calendar (support for range of calendars) ! initialize stop time to 13May2003, 2:00 pm call ESMF_TimeInit(inject_stop_time, & YR=int(2003,kind=ESMF_IKIND_I8), & MM=off_month, DD=off_day, H=off_hour, M=off_min, & S=int(0,kind=ESMF_IKIND_I8), & cal=gregorianCalendar, rc=rc) do while (currTime .le. inject_stop_time ) : call ESMF_ClockAdvance(localclock, rc=rc) call ESMF_ClockGetCurrTime(localclock, currtime, rc) end call ESMF_CalendarInit(gregorianCalendar, ESMF_CAL_GREGORIAN, rc)
I/O • Field level binary, netCDF, HDF, GRIB, bufr • Currently I/O piped through 1 PE call ESMF_FieldAllGather(field_u, outarray, status) if (de_id .eq. 0) then write(filename, 20) "U_velocity", file_no call ESMF_ArrayWrite(outarray, filename=filename, rc=status) endif call ESMF_ArrayDestroy(outarray, status) • Current system fixed textual.
Attributes • Flexible parameter specs, configuration e.g. file of parameters Code
Internal Classes • Machine model • Captures system attributes, CPU, mem, connectivity graph • Useful for defining decomposition, load-balance, performance predictions. • Comms • Communication driver, allows bindings to MPI, shared memory, vendor system libraries
Comms Performance Test Right mix (green) on Compaq gives x2 realized bandwidth (in large message limit)
Talk Outline • What is the infrastructure layer • What is it for • What it contains • ESMF infrastructure in this release • ESMF version 1.0 function call† examples (code!!!) (†aka API or methods) • Next steps…. • Infrastructure utility example
Regrid Next Steps • Support for all ESMF Grids • Support for regridding methods: Bilinear Bicubic 1st-order Conservative 2nd-order Conservative Rasterized Conservative Nearest-neighbor distance-weighted average Halo Next Steps • Support for periodicity • More general haloing • in tandem with distributed grid evolution • Adjoint forms Spectral transforms 1-d interpolations (splines) Index-space (shifts, stencils) Adjoints of many above
Distributed Grid • Regular 2d already supported • Next steps • Generalized 1d decomposition • Extend support for 2d and quasi regular decomposition • Spectral grid decompositions Physical Grid Next Steps • Larger set of metrics, grids • High level routines for rapid definition of common grids.
I/O Next Steps • Broaden format set, binary, netCDF, HDF, GRIB, bufr • Improve parallelization • Full support for alarms • Broader functionality Time/Logging/Profiling Next Steps
Summary • ESMF Infrastructure Layer • Comprehensive class structure available in version 1.0 • Over the coming year significant extension of functionality will take place. • Feedback and comments on version 1.0 welcome http://www.esmf.ucar.edu
Time Manager ESMF Infrastructure Utility detailed example Earl Schwab, ESMF Core Team, NCAR
What is Time Manager? • Clock for time simulation • Time representation • Time calculator • Time comparisons • Time queries • F90 API, C++ implementation
Clock for time simulation type(ESMF_Clock) :: clock call ESMF_ClockInit(clock, timeStep, startTime, stopTime, rc=rc) do while (.not.ESMF_ClockIsStopTime(clock, rc)) ! Do application work . . . call ESMF_ClockAdvance(clock, rc=rc) end do
Clock (cont.) • Clock queries/commands call ESMF_ClockGetCurrTime(clock, currTime, rc) call ESMF_ClockSetCurrTime(clock, currTime, rc) call ESMF_ClockGetTimeStep(clock, timeStep, rc) call ESMF_ClockSetTimeStep(clock, timeStep, rc) call ESMF_ClockGetAdvanceCount(clock, advanceCount, rc) call ESMF_ClockGetStartTime(clock, startTime, rc) call ESMF_ClockGetStopTime(clock, stopTime, rc) call ESMF_ClockGetPrevTime(clock, prevTime, rc) call ESMF_ClockSyncToWallClock(clock, rc)
Time Representation type(ESMF_Calendar) :: calendar1 call ESMF_CalendarInit(calendar1, ESMF_CAL_GREGORIAN, rc) - ESMF_CAL_GREGORIAN (3/1/-4800 to 10/29/292,277,019,914) - ESMF_CAL_JULIAN (+/- 106,751,991,167,300 days) - ESMF_CAL_NOLEAP - ESMF_CAL_360DAY
Time Representation (cont.) type(ESMF_Time) :: time1 call ESMF_TimeInit(time1, YR=int( 2003 ,kind=ESMF_IKIND_I8), & MM= 5 , DD= 15 , H= 15 , cal=calendar1, rc=rc) - YR, MM, DD, H, M, S F90 optional - D, H, M, S arguments type(ESMF_TimeInterval) :: timeInterval1 call ESMF_TimeIntervalInit(timeInterval1, D=int( 90 ,kind=ESMF_IKIND_I8), rc=rc) - D, H, M, S F90 optional arguments
Time Calculator • Time differencing • Time increment/decrement by a time interval • Time interval arithmetic (+, -, *, /)
Time Calculator (cont.) call ESMF_TimeInit(time1, YR=int( 2003 ,kind=ESMF_IKIND_I8), & MM= 5 , DD= 15 , cal=gregorianCalendar, rc=rc) call ESMF_TimeInit(time2, YR=int( 2003 ,kind=ESMF_IKIND_I8), & MM= 3 , DD= 26 , cal=gregorianCalendar, rc=rc) call ESMF_TimeIntervalInit(timeInterval1, D=int( 90 ,kind=ESMF_IKIND_I8, rc=rc) timeInterval2 = time2 - time1 time1 = time1 + timeInterval1 ! Uses F90 overloaded timeInterval3 = timeInterval1 * 2 ! operators double precision :: ratio ratio = timeInterval1 / timeInterval2
Time Comparisons >, <, >=, <=, ==, <> F90 overloaded operators between any 2 times or time intervals if (time1 < time2) then … end if if (timeInterval1 .ge. timeInterval2) then … end if
Time Queries call ESMF_TimeGet(time1, YR=yr, MM=mm, DD=dd, H=h, M=m, S=s, rc=rc) call ESMF_TimeIntervalGet(timeInterval1, D=d, H=h, M=m, S=s) call ESMF_TimeGetDayOfYear(time1, dayOfYear, rc) ! double or integer call ESMF_TimeGetDayOfMonth(time1, dayOfMonth, rc) call ESMF_TimeGetDayOfWeek(time1, dayOfWeek, rc) call ESMF_TimeGetMidMonth(time1, midMonth, rc) call ESMF_TimeGetString(time1, string, rc) ! 2003-05-14T12:20:19 (ISO 8601) call ESMF_TimeIntervalGetString(timeInterval1, string, rc) ! P1DT12H0M0S (ISO) call ESMF_TimeGetRealTime(time1, rc)
More information • ESMF User’s Guide • ESMF Reference Manual • ESMF Requirements Document • Time Manager F90 API & examples source code esmf_1_0_0_r/src/Infrastructure/TimeMgr/interface esmf_1_0_0_r/src/Infrastructure/TimeMgr/examples