! $Id: ESMF_CompFortranAndCSTest.F90,v 1.33 2011/07/01 16:07:57 rokuingh Exp $ ! !------------------------------------------------------------------------- !ESMF_SYSTEM_TEST String used by test script to count system tests. !========================================================================= !------------------------------------------------------------------------- ! !DESCRIPTION: ! System test CompFortranAndC. ! This system test checks that States are transfered accurately between ! Components that are implemented in different languages (Fortran and C). ! Two components are created by the driver code and their SetServices() ! are invoked. ! The rest of the code works on an Array within a specific State that is ! on turns modified by one Component followed by the other Component ! verifying those changes. In addition a Field object, created on a Mesh, ! is passed between the Components via a State. Specifically on, ! ! "Init section": ! --The Fortran Component adds an Array to state1 and initializes its data. ! --The C Component accesses the Array imported through state1 and ! re-initializes the data values of the same Array. ! --The C Component reads VTK data from file, creates Mesh object which is ! used to further create a Field object. ! --The C Component adds the Field object to state2. ! ! "Run section": ! --The Fortran Component first verifies the Array values just initialized by ! the C Component, and then modifies it again before returning. ! --The Fortran Component access the Field object imported from the C Component ! via state2. It calls the Field's print method to verify correctness. ! --The C Component verifies the Array values just modifed by the Fortran ! component and returns. ! ! "Finalize section": ! --The Fortran Component cleans up the state contents (i.e. it destroys the ! Array object and deallocates the Fortran array it points to). ! --The C Component accesses the Field object it created previously through ! its export State, and destroys all associated resources. ! !------------------------------------------------------------------------- !\begin{verbatim} 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) ! 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 !\end{verbatim}