program nmmb

  use mpi
  use esmf
  use atm_cc,only: atm_cmp_start
  use module_nmm_grid_comp ,only: nmm_register

  implicit none

  integer :: RC, RC_USER
  integer :: MPI_COMM_ATMOS,MYPE
  integer :: YY,MM,DD,HH,MNS,SEC, NHOURS_FCST
  type(ESMF_TimeInterval) :: RUNDURATION,TIMESTEP
  type(ESMF_Time) :: STARTTIME

  type(ESMF_VM) :: VM
  type(ESMF_Config) :: CF_MAIN
  type(ESMF_GridComp) :: NMM_GC
  type(ESMF_State) :: NMM_ES,NMM_IS
  type(ESMF_Clock) :: CLOCK



  call ATM_CMP_START(MPI_COMM_ATMOS)
  call ESMF_Initialize(VM=VM,defaultCalKind=ESMF_CALKIND_GREGORIAN,logkindflag=ESMF_LOGKIND_MULTI &
                      ,mpiCommunicator=MPI_COMM_ATMOS,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=36, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_VMGet(vm=VM,localpet=MYPE,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=37, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

 call redirect(mype)

  CF_MAIN = ESMF_ConfigCreate(rc=RC)
  call ESMF_ConfigLoadFile(config=CF_MAIN,filename='configure_file_01',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=42, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_TimeIntervalSet(timeinterval=TIMESTEP,s=1,sn=0,sd=1,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=44, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_ConfigGetAttribute(config=CF_MAIN,value =YY,label='start_year:',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=46, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_ConfigGetAttribute(config=CF_MAIN,value =MM,label='start_month:',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=47, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_ConfigGetAttribute(config=CF_MAIN,value =DD,label='start_day:',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=48, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_ConfigGetAttribute(config=CF_MAIN,value =HH,label='start_hour:',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=49, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_ConfigGetAttribute(config=CF_MAIN,value =MNS,label='start_minute:',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=50, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_ConfigGetAttribute(config=CF_MAIN,value =SEC,label='start_second:',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=51, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_TimeSet(time=STARTTIME,yy=YY,mm=MM,dd=DD,h=HH,m=MNS,s=SEC,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=52, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_ConfigGetAttribute(config=CF_MAIN,value=NHOURS_FCST,label='nhours_fcst:',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=54, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_TimeIntervalSet(timeinterval=RUNDURATION,s=NHOURS_FCST*3600,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=55, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  CLOCK = ESMF_ClockCreate(name='CLOCK',timeStep=TIMESTEP,startTime=STARTTIME,runDuration=RUNDURATION,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=57, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  NMM_GC = ESMF_GridCompCreate(name='NMMB Grid Comp',config=CF_MAIN,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=59, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_GridCompSetServices(NMM_GC,NMM_REGISTER,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=60, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  NMM_IS = ESMF_StateCreate(name='NMMB Import State',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=62, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  NMM_ES = ESMF_StateCreate(name='NMMB Export State',rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=63, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_GridCompInitialize (gridcomp=NMM_GC,importState=NMM_IS,exportState=NMM_ES,clock=CLOCK,phase=1,userRc=RC_USER,rc=RC)
  if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=66, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  if (ESMF_LogFoundError(RC_USER, msg="Aborting NMMB", line=67, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_GridCompRun        (gridcomp=NMM_GC,importState=NMM_IS,exportState=NMM_ES,clock=CLOCK,phase=1,userRc=RC_USER,rc=RC)
  if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=70, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  if (ESMF_LogFoundError(RC_USER, msg="Aborting NMMB", line=71, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_GridCompFinalize   (gridcomp=NMM_GC,importState=NMM_IS,exportState=NMM_ES,clock=CLOCK,phase=1,userRc=RC_USER,rc=RC)
  if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=74, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  if (ESMF_LogFoundError(RC_USER, msg="Aborting NMMB", line=75, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_ClockDestroy(clock=CLOCK,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=77, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_StateDestroy(state=NMM_IS,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=78, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_StateDestroy(state=NMM_ES,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=79, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)
  call ESMF_GridCompDestroy(gridcomp=NMM_GC,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=80, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  call ESMF_Finalize(endflag=ESMF_END_NORMAL,rc=RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=82, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

!rv  call MPI_Barrier(MPI_COMM_ATMOS, RC); if (ESMF_LogFoundError(RC, msg="Aborting NMMB", line=84, file="NMMB.F90")) call ESMF_Finalize(endflag=ESMF_END_ABORT)

  if (MYPE == 0) then
    write(*,*)"Execution of NMMB finished successfully!"
    write(0,*)"Execution of NMMB finished successfully!"
  end if

end program nmmb