program ESMF_AttributeUpdateMultiReconcileUTest
#include "ESMF.h"
!==============================================================================
!BOP
! !PROGRAM: ESMF_AttributeUpdateMultiReconcileUTest - Attribute Update Unit Tests
!
! !DESCRIPTION:
!
! The code in this file drives F90 Attribute Update unit tests.
!
!-----------------------------------------------------------------------------
! !USES:
use ESMF
use ESMF_TestMod
use ESMF_AttributeUpdateMultiReconcileUTestMod, only : userm1_setvm, userm1_register, &
userm2_setvm, userm2_register, userm3_setvm, userm3_register, &
usercpl1_setvm, usercpl1_register, usercpl2_setvm, usercpl2_register
implicit none
!------------------------------------------------------------------------------
! The following line turns the CVS identifier string into a printable variable.
character(*), parameter :: version = &
'$Id$'
!------------------------------------------------------------------------------
! individual test failure message
character(ESMF_MAXSTR) :: failMsg
character(ESMF_MAXSTR) :: name
! cumulative result: count failures; no failures equals "all pass"
integer :: result = 0
! individual test result code
integer :: rc = ESMF_SUCCESS
! local variables
integer :: petCount, localPet
type(ESMF_VM) :: vm
type(ESMF_State) :: c1exp, c2imp
type(ESMF_GridComp) :: gridcomp1
type(ESMF_GridComp) :: gridcomp2
type(ESMF_GridComp) :: gridcomp3
type(ESMF_CplComp) :: cplcomp1
type(ESMF_CplComp) :: cplcomp2
character(ESMF_MAXSTR) :: convESMF,purpGen
type(ESMF_AttPack) :: attpack
type(ESMF_Field) :: field
type(ESMF_FieldBundle) :: fieldbundle
type(ESMF_Grid) :: grid
integer :: k
character(ESMF_MAXSTR) :: name2,value2,purp2,name3,outVal
character(ESMF_MAXSTR),dimension(2) :: attrList, valueList
!-------------------------------------------------------------------------------
! The unit tests are divided into Sanity and Exhaustive. The Sanity tests are
! always run. When the environment variable, EXHAUSTIVE, is set to ON then
! the EXHAUSTIVE and sanity tests both run. If the EXHAUSTIVE variable is set
! to OFF, then only the sanity unit tests.
! Special strings (Non-exhaustive and exhaustive) have been
! added to allow a script to count the number and types of unit tests.
!-------------------------------------------------------------------------------
!-----------------------------------------------------------------------------
call ESMF_TestStart(ESMF_SRCLINE, rc=rc)
if (rc /= ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
!-----------------------------------------------------------------------------
#ifdef ESMF_TESTEXHAUSTIVE
call ESMF_VMGetCurrent(vm, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_VMGet(vm, petCount=petCount, localPet=localPet, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
gridcomp1 = ESMF_GridCompCreate(name="gridcomp1", &
petList=(/0,1/), rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
gridcomp2 = ESMF_GridCompCreate(name="gridcomp2", &
petList=(/2,3/), rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
gridcomp3 = ESMF_GridCompCreate(name="gridcomp3", &
petList=(/4,5/), rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
cplcomp1 = ESMF_CplCompCreate(name="cplcomp1", &
petList=(/0,1,2,3/), rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
cplcomp2 = ESMF_CplCompCreate(name="cplcomp2", &
petList=(/0,1,4,5/), rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
c1exp = ESMF_StateCreate(name="Comp1 exportState", &
stateintent=ESMF_STATEINTENT_EXPORT, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
c2imp = ESMF_StateCreate(name="Comp2 importState", &
stateintent=ESMF_STATEINTENT_IMPORT, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompSetVM(gridcomp1, userm1_setvm, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompSetVM(gridcomp2, userm2_setvm, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompSetVM(gridcomp3, userm3_setvm, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompSetVM(cplcomp1, usercpl1_setvm, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompSetVM(cplcomp2, usercpl2_setvm, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompSetServices(gridcomp1, userRoutine=userm1_register, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompSetServices(gridcomp2, userRoutine=userm2_register, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompSetServices(gridcomp3, userRoutine=userm3_register, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompSetServices(cplcomp1, userRoutine=usercpl1_register, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompSetServices(cplcomp2, userRoutine=usercpl2_register, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompInitialize(gridcomp1, exportState=c1exp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompInitialize(gridcomp2, importState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompInitialize(gridcomp3, importState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompInitialize(cplcomp1, importState=c1exp, &
exportState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompInitialize(cplcomp2, importState=c1exp, &
exportState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
! Now we can start doing some testing
convESMF = 'ESMF'
purpGen = 'General'
name2 = 'StandardName'
value2 = 'tendency_of_air_pressure'
call ESMF_StateGet(c1exp, "fieldbundle", fieldbundle, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_FieldBundleGet(fieldbundle, grid=grid, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_FieldBundleGet(fieldbundle, fieldname="field", field=field, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
!EX_UTest_Multi_Proc_Only
call ESMF_AttributeGetAttPack(field, convention=convESMF, purpose=purpGen, &
attpack=attpack, rc=rc)
call ESMF_AttributeGet(field, name2, value=outVal, attpack=attpack, &
rc=rc)
print *, "PET: ", localPet, "outVal: ", trim(outVal)
print *, " expected: ", trim(value2)
print *, " rc: ", rc
write(failMsg, *) "Did not return ESMF_SUCCESS or wrong value"
write(name, *) "Getting an updated Attribute value from a Field test"
call ESMF_Test((rc==ESMF_SUCCESS).and.(value2==outVal), &
name, failMsg, result, ESMF_SRCLINE)
call ESMF_GridCompRun(gridcomp1, exportState=c1exp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompRun(cplcomp1, importState=c1exp, &
exportState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompRun(gridcomp2, importState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompRun(cplcomp2, importState=c1exp, &
exportState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompRun(gridcomp3, importState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
! Now we can start doing some testing
convESMF = 'ESMF'
purpGen = 'General'
name2 = 'StandardName'
value2 = 'default_standard_name'
name3 = 'LongName'
purp2 = 'Extended'
attrList(1) = 'Coordinates'
attrList(2) = 'Mask'
valueList(1) = "Latlon"
valueList(2) = "Yes"
call ESMF_StateGet(c1exp, "fieldbundle", fieldbundle, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_FieldBundleGet(fieldbundle, grid=grid, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_FieldBundleGet(fieldbundle, fieldname="field", field=field, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
!EX_UTest_Multi_Proc_Only
write(name, *) "Getting an updated Attribute value from a Field test"
call ESMF_LogWrite("Start: "//TRIM(name))
call ESMF_AttributeGetAttPack(field, convention=convESMF, purpose=purpGen, &
attpack=attpack, rc=rc)
call ESMF_AttributeGet(field, name2, value=outVal, attpack=attpack, rc=rc)
print *, "PET: ", localPet, "outVal: ", trim(outVal)
print *, " expected: ", trim(value2)
write(failMsg, *) "Did not return ESMF_SUCCESS or wrong value"
call ESMF_Test((rc==ESMF_SUCCESS).and.(value2==outVal), &
name, failMsg, result, ESMF_SRCLINE)
call ESMF_LogWrite("End: "//TRIM(name))
!EX_UTest_Multi_Proc_Only
call ESMF_AttributeGetAttPack(field, convention=convESMF, purpose=purp2, &
attpack=attpack, rc=rc)
call ESMF_AttributeGet(field, attrList(1), value=outVal, &
convention=convESMF, purpose=purp2, rc=rc)
print *, "PET: ", localPet, "outVal: ", trim(outVal)
print *, " expected: ", trim(valueList(1))
write(failMsg, *) "Did not return ESMF_SUCCESS or wrong value"
write(name, *) "Getting an updated Attribute package Attribute value from a Field test"
call ESMF_Test((rc==ESMF_SUCCESS).and.(valueList(1)==outVal), &
name, failMsg, result, ESMF_SRCLINE)
!EX_UTest_Multi_Proc_Only
call ESMF_AttributeGet(field, attrList(2), value=outVal, &
convention=convESMF, purpose=purp2, rc=rc)
print *, "PET: ", localPet, "outVal: ", trim(outVal)
print *, " expected: ", trim(valueList(2))
write(failMsg, *) "Did not return ESMF_SUCCESS or wrong value"
write(name, *) "Getting an updated Attribute package Attribute value from a Field test"
call ESMF_Test((rc==ESMF_SUCCESS).and.(valueList(2)==outVal), &
name, failMsg, result, ESMF_SRCLINE)
!EX_UTest_Multi_Proc_Only
write(name, *) "Getting an updated deleted Attribute value from a Field test"
call ESMF_LogWrite("Start: "//TRIM(name))
call ESMF_AttributeGet(field, name3, value=outVal, &
convention=convESMF, purpose=purpGen, rc=rc)
print *, "PET: ", localPet, "DELETED, rc = ", rc
write(failMsg, *) "Did not return ESMF_SUCCESS or wrong value"
call ESMF_Test((rc/=ESMF_SUCCESS), &
name, failMsg, result, ESMF_SRCLINE)
! Now back to finalizing the model run
call ESMF_GridCompFinalize(gridcomp1, exportState=c1exp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompFinalize(gridcomp2, importState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompFinalize(gridcomp3, importState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompFinalize(cplcomp1, importState=c1exp, &
exportState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompFinalize(cplcomp2, importState=c1exp, &
exportState=c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompDestroy(gridcomp1, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompDestroy(gridcomp2, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_GridCompDestroy(gridcomp3, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompDestroy(cplcomp1, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_CplCompDestroy(cplcomp2, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_StateDestroy(c1exp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
call ESMF_StateDestroy(c2imp, rc=rc)
if (rc .ne. ESMF_SUCCESS) call ESMF_Finalize(endflag=ESMF_END_ABORT)
#endif
!-----------------------------------------------------------------------------
call ESMF_TestEnd(ESMF_SRCLINE)
!-----------------------------------------------------------------------------
end program ESMF_AttributeUpdateMultiReconcileUTest