subroutine SetServices(model, rc)
type(ESMF_GridComp) :: model
integer, intent(out) :: rc
rc = ESMF_SUCCESS
! derive from NUOPC_Model
call NUOPC_CompDerive(model, modelSS, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
! specialize model
call NUOPC_CompSpecialize(model, specLabel=label_Advertise, &
specRoutine=Advertise, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
call NUOPC_CompSpecialize(model, specLabel=label_RealizeProvided, &
specRoutine=Realize, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
call NUOPC_CompSpecialize(model, specLabel=label_Advance, &
specRoutine=Advance, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
end subroutine
!-----------------------------------------------------------------------------
subroutine Advertise(model, rc)
type(ESMF_GridComp) :: model
integer, intent(out) :: rc
rc = ESMF_SUCCESS
! Eventually, you will advertise your model's import and
! export fields in this phase. For now, however, call
! your model's initialization routine(s).
! call my_model_init()
end subroutine
!-----------------------------------------------------------------------------
subroutine Realize(model, rc)
type(ESMF_GridComp) :: model
integer, intent(out) :: rc
rc = ESMF_SUCCESS
! Eventually, you will realize your model's fields here,
! but leave empty for now.
end subroutine
!-----------------------------------------------------------------------------
subroutine Advance(model, rc)
type(ESMF_GridComp) :: model
integer, intent(out) :: rc
! local variables
type(ESMF_Clock) :: clock
type(ESMF_State) :: importState, exportState
rc = ESMF_SUCCESS
! query the Component for its clock, importState and exportState
call NUOPC_ModelGet(model, modelClock=clock, importState=importState, &
exportState=exportState, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
! HERE THE MODEL ADVANCES: currTime -> currTime + timeStep
! Because of the way that the internal Clock was set by default,
! its timeStep is equal to the parent timeStep. As a consequence the
! currTime + timeStep is equal to the stopTime of the internal Clock
! for this call of the Advance() routine.
call ESMF_ClockPrint(clock, options="currTime", &
preString="------>Advancing MODEL from: ", rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
call ESMF_ClockPrint(clock, options="stopTime", &
preString="--------------------------------> to: ", rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
! Call your model's timestep routine here
! call my_model_update()
end subroutine
end module
!EOC
! A basic NUOPC Driver
module DRIVER
use ESMF
use NUOPC
use NUOPC_Driver, &
driver_routine_SS => SetServices, &
driver_label_SetModelServices => label_SetModelServices
use MYMODEL, only: mymodelSS => SetServices
implicit none
private
integer, parameter :: stepCount = 5
real(ESMF_KIND_R8), parameter :: stepTime = 30.D0 ! step time [s]
public :: SetServices
!-----------------------------------------------------------------------------
contains
!-----------------------------------------------------------------------------
subroutine SetServices(drvr, rc)
type(ESMF_GridComp) :: drvr
integer, intent(out) :: rc
rc = ESMF_SUCCESS
! NUOPC_Driver registers the generic methods
call NUOPC_CompDerive(drvr, driver_routine_SS, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
! attach specializing method(s)
call NUOPC_CompSpecialize(drvr, specLabel=driver_label_SetModelServices, &
specRoutine=SetModelServices, rc=rc)
if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
line=__LINE__, &
file=__FILE__)) &
return ! bail out
end subroutine SetServices