program ESMF_FaultToleranceCompASTest
! ESMF Framework module
use ESMF
use ESMF_TestMod
use ESMF_FaultToleranceCompASTest_comp_mod, only: setservices
implicit none
! Local variables
integer :: localPet, petCount, userRc, localrc, rc
type(ESMF_VM) :: vm
type(ESMF_GridComp) :: actualComp
character(ESMF_MAXSTR) :: testname, finalMsg
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
write(testname, *) "System Test ESMF_FaultToleranceCompA STest"
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
print *, "--------------------------------------- "
print *, "Start of ", trim(testname)
print *, "--------------------------------------- "
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! Initialize ESMF
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
!
! Initialize framework and get back default global VM
call ESMF_Initialize(vm=vm, defaultlogfilename="FaultToleranceCompASTest.Log", &
logkindflag=ESMF_LOGKIND_MULTI, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
call ESMF_LogSet(flush=.true., rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
! Get number of PETs we are running with
call ESMF_VMGet(vm, petCount=petCount, localPet=localPet, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! - Sanity test the socket based connection
! - TODO: remove
! if (localPet == petCount-1) then
! call c_ESMCI_vmkSocketServer(localrc)
! if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
! ESMF_CONTEXT, rcToReturn=rc)) &
! call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
! endif
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! - This is the top level driver cap for an actual component running
! - remotely as an independent executable.
! - Create the actual component and go into the ServiceLoop, finally
! - destroy the component after returning from the ServiceLoop.
actualComp = ESMF_GridCompCreate(name="actual component A", rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
call ESMF_GridCompSetServices(actualComp, userRoutine=setservices, &
userRc=userRc, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
if (ESMF_LogFoundError(userRc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
call ESMF_GridCompServiceLoop(actualComp, port=60000, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
call ESMF_GridCompDestroy(actualComp, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) &
call ESMF_Finalize(rc=rc, endflag=ESMF_END_ABORT)
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
! Normal ESMF Test output
print *, testname, " complete."
! 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, *) ""
print *, "------------------------------------------------------------"
print *, "------------------------------------------------------------"
print *, "Test finished, localPet = ", localPet
print *, "------------------------------------------------------------"
print *, "------------------------------------------------------------"
call ESMF_Finalize()
end program ESMF_FaultToleranceCompASTest