program ESMF_StateEx
!------------------------------------------------------------------------------
!ESMF_EXAMPLE String used by test script to count examples.
!==============================================================================
#include "ESMF.h"
! ESMF Framework module
use ESMF
use ESMF_TestMod
implicit none
! Local variables
integer :: rc
type(ESMF_State) :: state
type(ESMF_FieldBundle) :: bundle
type(ESMF_Field) :: field, field1, field2
integer :: finalrc
integer :: result = 0 ! all pass
character(ESMF_MAXSTR) :: testname
character(ESMF_MAXSTR) :: failMsg
finalrc = ESMF_SUCCESS
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
write(failMsg, *) "Example failure"
write(testname, *) "Example ESMF_StateEx"
!-------------------------------------------------------------------------
!-------------------------------------------------------------------------
call ESMF_Initialize(defaultlogfilename="StateEx.Log", &
logkindflag=ESMF_LOGKIND_MULTI, rc=rc)
!-------------------------------------------------------------------------
!BOE
!\subsubsection{Create a State and add items}
!
! Creation of an empty {\tt ESMF\_State}. Then adding an {\tt ESMF\_FieldBundle}
! to it. Note that the {\tt ESMF\_FieldBundle} is empty.
! The {\tt ESMF\_State} only contains a reference to the objects it contains.
! It does not make a copy; the original objects can be updated and code
! accessing them by using the {\tt ESMF\_State} will see the updated version.
!EOE
!BOC
state = ESMF_StateCreate(name="Ocean", &
stateintent=ESMF_STATEINTENT_EXPORT, rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOC
bundle = ESMF_FieldBundleCreate(name="Surface Fields", rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOC
call ESMF_StateAdd(state, [bundle], rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!-------------------------------------------------------------------------
!BOE
!\subsubsection{Query a State for items and add more items}
!
! The objects contained in a State can be queried by name.
!EOE
!BOC
call ESMF_StateGet(state, itemName="Surface Fields", fieldbundle=bundle, &
rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOE
! More objects can be created and added to the State. Here an empty Field is
! created and added to the State.
!EOE
!BOC
field = ESMF_FieldEmptyCreate(name="MyField", rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOC
call ESMF_StateAdd(state, [field], rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOE
! Multiple objects of the same type can be added to the State at the same time.
!EOE
!BOC
field1 = ESMF_FieldEmptyCreate(name="field1", rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOC
field2 = ESMF_FieldEmptyCreate(name="field2", rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOC
call ESMF_StateAdd(state, [field1, field2], rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!-------------------------------------------------------------------------
!BOE
!\subsubsection{Removing items from a State}
!
! Objects contained in a State can be removed using the item name.
!EOE
!BOC
call ESMF_StateRemove(state, ["field1"], rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOE
! Notice that objects removed from a State are {\em not} destroyed by the
! {\tt ESMF\_StateRemove()} call. They must be destroyed explicitly when no
! longer needed.
!BOC
call ESMF_FieldDestroy(field1, rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!-------------------------------------------------------------------------
!BOE
!\subsubsection{Destroy a State}
!
! Once an {\tt ESMF\_State} is not longer needed, it should be destroyed.
!EOE
!BOC
call ESMF_StateDestroy(state, rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOE
! Notice that objects contained in a State are {\em not} destroyed by the
! {\tt ESMF\_StateDestroy()} call. They must be destroyed explicitly when no
! longer needed.
!BOC
call ESMF_FieldBundleDestroy(bundle, rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOC
call ESMF_FieldDestroy(field, rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!BOC
call ESMF_FieldDestroy(field2, rc=rc)
!EOC
if (rc.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
!===============================================================================
! 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.NE.ESMF_SUCCESS) finalrc = ESMF_FAILURE
if (finalrc.EQ.ESMF_SUCCESS) then
print *, "PASS: ESMF_StateEx.F90"
else
print *, "FAIL: ESMF_StateEx.F90"
end if
end program ESMF_StateEx