program ESMF_AppMainEx
#include "ESMF.h"
! ! The ESMF Framework module
use ESMF
use ESMF_TestMod
! User supplied modules
use ESMF_GriddedCompEx, only: GComp_SetServices, GComp_SetVM
implicit none
! ! Local variables
integer :: rc
logical :: finished
type(ESMF_Clock) :: tclock
type(ESMF_Calendar) :: gregorianCalendar
type(ESMF_TimeInterval) :: timeStep
type(ESMF_Time) :: startTime, stopTime
character(ESMF_MAXSTR) :: cname
type(ESMF_VM) :: vm
type(ESMF_State) :: importState, exportState
type(ESMF_GridComp) :: gcomp
integer :: finalrc, result
character(ESMF_MAXSTR) :: testname
character(ESMF_MAXSTR) :: failMsg
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
write(failMsg, *) "Example failure"
write(testname, *) "Example ESMF_GCompEx"
! ------------------------------------------------------------------------------
! ------------------------------------------------------------------------------
finalrc = ESMF_SUCCESS
!-------------------------------------------------------------------------
! ! Initialize the Framework and get the global VM
call ESMF_Initialize(vm=vm, defaultlogfilename="GCompEx.Log", &
logkindflag=ESMF_LOGKIND_MULTI, rc=rc)
if (rc .ne. ESMF_SUCCESS) then
print *, "Unable to initialize ESMF Framework"
print *, "FAIL: ESMF_GCompEx.F90"
call ESMF_Finalize(endflag=ESMF_END_ABORT)
endif
!-------------------------------------------------------------------------
! !
! ! Create, Init, Run, Finalize, Destroy Components.
print *, "Application Example 1:"
! Create the top level application component
cname = "Atmosphere Model Gridded Component"
gcomp = ESMF_GridCompCreate(name=cname, configFile="setup.rc", rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
! Optional user-supplied subroutine must be a public entry point.
call ESMF_GridCompSetVM(gcomp, GComp_SetVM, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
! This single user-supplied subroutine must be a public entry point.
call ESMF_GridCompSetServices(gcomp, userRoutine=GComp_SetServices, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
print *, "Comp Create returned, name = ", trim(cname)
! Create the necessary import and export states used to pass data
! between components.
importState = ESMF_StateCreate(name=cname, &
stateintent=ESMF_STATEINTENT_IMPORT, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
exportState = ESMF_StateCreate(name=cname, &
stateintent=ESMF_STATEINTENT_EXPORT, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
! See the TimeMgr document for the details on the actual code needed
! to set up a clock.
! initialize calendar to be Gregorian type
gregorianCalendar = ESMF_CalendarCreate(ESMF_CALKIND_GREGORIAN, name="Gregorian", rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
! initialize time interval to 6 hours
call ESMF_TimeIntervalSet(timeStep, h=6, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
! initialize start time to 5/1/2004
call ESMF_TimeSet(startTime, yy=2004, mm=5, dd=1, &
calendar=gregorianCalendar, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
! initialize stop time to 5/2/2004
call ESMF_TimeSet(stopTime, yy=2004, mm=5, dd=2, &
calendar=gregorianCalendar, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
! initialize the clock with the above values
tclock = ESMF_ClockCreate(timeStep, startTime, stopTime=stopTime, &
name="top clock", rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
! Call the Init routine. There is an optional index number
! for those components which have multiple entry points.
call ESMF_GridCompInitialize(gcomp, importState=importState, &
exportState=exportState, clock=tclock, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
print *, "Comp Initialize complete"
! Main run loop.
finished = .false.
do while (.not. finished)
call ESMF_GridCompRun(gcomp, importState=importState, &
exportState=exportState, clock=tclock, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
call ESMF_ClockAdvance(tclock, timeStep=timestep)
! query clock for current time
if (ESMF_ClockIsStopTime(tclock)) finished = .true.
enddo
print *, "Comp Run complete"
! Give the component a chance to write out final results, clean up.
call ESMF_GridCompFinalize(gcomp, importState=importState, &
exportState=exportState, clock=tclock, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
print *, "Comp Finalize complete"
! Destroy objects.
call ESMF_ClockDestroy(tclock, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
call ESMF_CalendarDestroy(gregorianCalendar, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
call ESMF_GridCompDestroy(gcomp, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
call ESMF_StateDestroy(importState, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
call ESMF_StateDestroy(exportState, rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
print *, "Destroy calls returned"
print *, "Application Example 1 finished"
! IMPORTANT: ESMF_STest() prints the PASS string and the # of processors in the log
! file that the scripts grep for.
call ESMF_STest((finalrc.eq.ESMF_SUCCESS), testname, failMsg, result, ESMF_SRCLINE)
call ESMF_Finalize(rc=rc)
if (rc.NE.ESMF_SUCCESS) then
finalrc = ESMF_FAILURE
end if
if (finalrc.EQ.ESMF_SUCCESS) then
print *, "PASS: ESMF_GCompEx.F90"
else
print *, "FAIL: ESMF_GCompEx.F90"
end if
end program ESMF_AppMainEx