program ESMF_CompFortranAndC
#define ESMF_METHOD "program ESMF_CompFortranAndC"
#include "ESMF.h"
! ESMF Framework module
use ESMF
use ESMF_TestMod
use ESMF_CompMod
use user_FortranComponent, only: mySetVMInFortran, mySetServicesInFortran
implicit none
! Explicit interface for
interface
subroutine my_SetServicesInC(gcomp, rc)
use ESMF
type(ESMF_GridComp) :: gcomp
integer, intent(out) :: rc
end subroutine my_SetServicesInC
end interface
! Local variables
integer :: localPet, localrc, rc=ESMF_SUCCESS, userrc
type(ESMF_VM):: vm
type(ESMF_GridComp) :: compInFortran
type(ESMF_GridComp) :: compInC
type(ESMF_State) :: state1, state2
character(len=ESMF_MAXSTR) :: cname
! Variables related to the Clock
type(ESMF_Clock) :: clock
type(ESMF_TimeInterval) :: timeStep
type(ESMF_Time) :: startTime
type(ESMF_Time) :: stopTime
! cumulative result: count failures; no failures equals "all pass"
integer :: result = 0
! individual test name
character(ESMF_MAXSTR) :: testname
! individual test failure message and status msg
character(ESMF_MAXSTR) :: failMsg, finalMsg
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
write(failMsg, *) "System Test failure"
write(testname, *) "System Test ESMF_CompFortranAndC"
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
print *, "--------------------------------------- "
print *, "Start of ", trim(testname)
print *, "--------------------------------------- "
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! Create section
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
call ESMF_Initialize(defaultCalKind=ESMF_CALKIND_GREGORIAN, &
defaultlogfilename="CompFortranAndCSTest.Log", &
logkindflag=ESMF_LOGKIND_MULTI, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_LogSet (flush=.true.)
! Get the global VM
call ESMF_VMGetGlobal(vm, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
! Get our pet number for output print statements
call ESMF_VMGet(vm, localPet=localPet, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
cname = "Fortran Component"
compInFortran = ESMF_GridCompCreate(name=cname, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
print *, "Comp Create (Fortran) finished, name = ", trim(cname)
cname = "C Component"
compInC = ESMF_GridCompCreate(name=cname, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
print *, "Comp Create (C) finished, name = ", trim(cname)
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! Register section
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
call ESMF_GridCompSetVM(compInFortran, userRoutine=mySetVMInFortran, &
userRc=userrc, rc=localrc)
print *, "CompInFortran SetVM finished, rc= ", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompSetServices(compInFortran, &
userRoutine=mySetServicesInFortran, userRc=userrc, rc=localrc)
print *, "CompInFortran SetServices finished, rc= ", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompSetServices(compInC, userRoutine=my_SetServicesInC, &
userRc=userrc, rc=localrc)
print *, "CompInC SetServices finished, rc= ", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
!------------------------------------------------------------------------------
! Create and initialize a Clock.
!------------------------------------------------------------------------------
call ESMF_TimeIntervalSet(timeStep, s=2, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
print *, "Time Interval set"
call ESMF_TimeSet(startTime, yy=2004, mm=9, dd=25, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
print *, "Start Time set"
call ESMF_TimeSet(stopTime, yy=2004, mm=9, dd=26, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
print *, "Stop Time set"
clock = ESMF_ClockCreate(timeStep, startTime, stopTime=stopTime, &
name="Application Clock", rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
print *, "Clock created"
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! Init section
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
state1 = ESMF_StateCreate(name="igrid import state", &
stateintent=ESMF_STATEINTENT_IMPORT, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
state2 = ESMF_StateCreate(name="igrid export state", &
stateintent=ESMF_STATEINTENT_EXPORT, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompInitialize(compInFortran, importState=state1, &
exportState=state2, clock=clock, userRc=userrc, rc=localrc)
print *, "CompInFortran Initialize returned, rc=", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompInitialize(compInC, importState=state2, &
exportState=state1, clock=clock, userRc=userrc, rc=localrc)
print *, "CompInC Initialize returned, rc=", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! Run section
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
call ESMF_GridCompRun(compInFortran, importState=state1, &
exportState=state2, clock=clock, userRc=userrc, rc=localrc)
print *, "CompInFortran Run returned, rc=", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompRun(compInC, importState=state2, &
exportState=state1, clock=clock, userRc=userrc, rc=localrc)
print *, "CompInC Run returned, rc=", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! Finalize section
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
call ESMF_GridCompFinalize(compInFortran, importState=state1, &
exportState=state2, clock=clock, userRc=userrc, rc=localrc)
print *, "CompInFortran Finalize returned, rc=", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompFinalize(compInC, importState=state2, &
exportState=state1, clock=clock, userRc=userrc, rc=localrc)
print *, "CompInC Finalize returned, rc=", localrc, userrc
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! Destroy section
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
call ESMF_GridCompDestroy(compInFortran, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompDestroy(compInC, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_StateDestroy(state1, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_StateDestroy(state2, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_ClockDestroy(clock, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(endflag=ESMF_END_ABORT)
print *, "All Destroy routines done"
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
10 continue
! Normal ESMF Test output
print *, testname, " complete."
if (rc .eq. ESMF_SUCCESS) then
! Separate message to console, for quick confirmation of success/failure
write(finalMsg, *) "SUCCESS: ",trim(testname)," finished correctly."
write(0, *) ""
write(0, *) trim(testname)
write(0, *) trim(finalMsg)
write(0, *) ""
endif
print *, "------------------------------------------------------------"
print *, "------------------------------------------------------------"
print *, "Test finished, localPet = ", localPet
print *, "------------------------------------------------------------"
print *, "------------------------------------------------------------"
! IMPORTANT: ESMF_STest() prints the PASS string and the # of processors
! in the log file that the scripts grep for.
call ESMF_STest((rc.eq.ESMF_SUCCESS), testname, failMsg, result, ESMF_SRCLINE)
call ESMF_Finalize()
end program ESMF_CompFortranAndC