! $Id$ ! ! Earth System Modeling Framework ! Copyright (c) 2002-2023, University Corporation for Atmospheric Research, ! Massachusetts Institute of Technology, Geophysical Fluid Dynamics ! Laboratory, University of Michigan, National Centers for Environmental ! Prediction, Los Alamos National Laboratory, Argonne National Laboratory, ! NASA Goddard Space Flight Center. ! Licensed under the University of Illinois-NCSA License. ! !============================================================================== !============================================================================== !ESMF_EXAMPLE String used by test script to count examples. !============================================================================== !------------------------------------------------------------------------------ !BOE ! ! \subsubsection{Communication - Send and Recv} ! ! The VM layer provides MPI-like point-to-point communication. Use ! {\tt ESMF\_VMSend()} and {\tt ESMF\_VMRecv()} to pass data between two PETs. ! The following code sends data from PET 'src' and receives it on PET 'dst'. ! Both PETs must be part of the same VM. ! !EOE !------------------------------------------------------------------------------ program ESMF_VMSendVMRecvEx #include "ESMF.h" use ESMF use ESMF_TestMod implicit none ! local variables integer:: i, rc type(ESMF_VM):: vm integer:: localPet, petCount integer:: count, src, dst integer, allocatable:: localData(:) ! result code integer :: finalrc, result character(ESMF_MAXSTR) :: testname character(ESMF_MAXSTR) :: failMsg !------------------------------------------------------------------------- !------------------------------------------------------------------------- write(failMsg, *) "Example failure" write(testname, *) "Example ESMF_VMSendVMRecvEx" ! ------------------------------------------------------------------------------ ! ------------------------------------------------------------------------------ finalrc = ESMF_SUCCESS call ESMF_Initialize(vm=vm, defaultlogfilename="VMSendVMRecvEx.Log", & logkindflag=ESMF_LOGKIND_MULTI, rc=rc) if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT) call ESMF_VMGet(vm, localPet=localPet, petCount=petCount, rc=rc) if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT) !BOE ! Set up the {\tt localData} array. !EOE !BOC count = 10 allocate(localData(count)) do i=1, count localData(i) = localPet*100 + i enddo !EOC !BOE ! Carry out the data transfer between {\tt src} PET and {\tt dst} PET. !EOE src = petCount - 1 dst = 0 !BOC if (localPet==src) then call ESMF_VMSend(vm, sendData=localData, count=count, dstPet=dst, rc=rc) endif !EOC if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT) !BOC if (localPet==dst) then call ESMF_VMRecv(vm, recvData=localData, count=count, srcPet=src, rc=rc) endif !EOC if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT) do i=1, count print *, 'localData for PET ',localPet,': ', localData(i) enddo !BOE ! Finally, on {\tt dst} PET, test the received data for correctness. !EOE !BOC if (localPet==dst) then do i=1, count if (localData(i) /= src*100 + i) then finalrc = ESMF_RC_VAL_WRONG endif enddo endif !EOC ! 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/=ESMF_SUCCESS) finalrc = ESMF_FAILURE if (finalrc==ESMF_SUCCESS) then print *, "PASS: ESMF_VMSendVMRecvEx.F90" else print *, "FAIL: ESMF_VMSendVMRecvEx.F90" endif end program