!---------------------------------------------------------------------- !BOP ! ! !IROUTINE: SSIana --- Application main program to run the NCEP ! SSI system alone. ! ! !DESCRIPTION: This program use the ESMF superstructure to run ! the NCEP SSI data assimilation system. ! ! !REVISION HISTORY: ! ! March 2003 W Yang Initial code. ! ! !INTERFACE: PROGRAM SSIana #include "GEOS_ErrLog.h" ! !USES: ! USE ESMF_Mod USE ESMF_DELayoutMod USE ncepESMF_Mod ! fake ESMF grid component module. USE SSI_GridCompMod, ONLY: SSIana_SetServices => SetServices ! main grid component module. IMPLICIT none ! !!ESMF DERIVED DATA TYPE ARRAYS: ! TYPE(ESMF_GridComp) :: gcSSI ! the ESMF composite gridded ! component. TYPE(ESMF_Config) :: config_1 ! the ESMF config type array. TYPE(ESMF_DELayout) :: loAppl ! the ESMF layout type array. TYPE(ESMF_DELayout) :: loDefault ! the ESMF layout type array. TYPE(ncepESMF_GridComp) :: gcSSI1 ! the ESMF composite gridded TYPE(ESMF_State) :: impSSI ! the ESMF import state. TYPE(ESMF_State) :: expSSI ! the ESMF export state. TYPE(ESMF_Clock) :: clock ! the ESMF time management data ! type clock. TYPE(ncepESMF_TimeInstant) :: StartTime ! the ESMF time management ! variable ! for start time of the data ! assimilation. TYPE(ncepESMF_TimeInstant) :: StopTime ! the ESMF time management ! variable for end time of the ! data assimilation, for one ! cycle, usually be same of StartTime. TYPE(ncepESMF_TimeInstant) :: RefTime ! the ESMF time management variable ! for the reference time. TYPE(ncepESMF_TimeInstant) :: CurrentTime ! the ESMF time management variable ! for current wall time. ! For testing, set TimeStep the same type of others. !TYPE(ncepESMF_TimeInterval) :: TimeStep TYPE(ncepESMF_TimeInstant) :: TimeStep ! the ESMF time management variable ! for time step length for multiple ! cycles data assimilation job. ! !!DEFINE THE LOCAL DERIVED ARRAYS AND PARAMETERS: ! !TYPE(SSI_State) :: impSSI_local ! the local SSI grid component type array. !TYPE(SSI_Layout) :: layout1 ! the local layout type array. INTEGER :: rc ! the running error signal. INTEGER :: nfldsig INTEGER :: nfldsfc INTEGER :: npe INTEGER :: mype INTEGER :: nx INTEGER :: ny INTEGER :: i CHARACTER(ESMF_MAXSTR) :: GridCompName CHARACTER(ESMF_MAXSTR) :: impStateName CHARACTER(ESMF_MAXSTR) :: expStateName CHARACTER(ESMF_MAXSTR) :: StartTimeName CHARACTER(ESMF_MAXSTR) :: StopTimeName CHARACTER(ESMF_MAXSTR) :: RefTimeName CHARACTER(ESMF_MAXSTR) :: TimeStepName ! !!TIMING MEASUREMENT VARIABLES: ! REAL(8) :: t00 ! the wall time at the start point. REAL(8) :: t10 ! the running wall time used for every processors. REAL(8) :: tsum ! the total wall time used for all processors. REAL(8) :: tmax ! the maximum wall time used in a single porcessor. REAL(8) :: rtc ! the wall time function. ! !!BEGIN SSI CODE. ! ! !!TIMING. ! t00 = rtc() ! !!SET UP CHARACTERS PARAMETERS: ! GridCompName = 'SSI_STAND_ALONE GRID COMPONENT' impStateName = 'SSI import' expStateName = 'SSI export' StartTimeName = 'StartTime' StopTimeName = 'StopTime' RefTimeName = 'RefTime' TimeStepName = 'TimeStep' ! Initialize framework ! -------------------- CALL ESMF_Initialize(rc = rc) ! Setup layout and config attributes ! ---------------------------------- loDefault = ESMF_DELayoutCreate(rc = rc) config_1 = ESMF_ConfigCreate (rc = rc) CALL ESMF_ConfigLoadFile(config_1, 'ssi.rc', rc = rc) CALL ESMF_DELayoutGetNumDEs(loDefault, npe, rc = rc) CALL ESMF_DELayoutGetDEID (loDefault, mype, rc = rc) print*,'mype,npe=',mype,npe nx = ESMF_ConfigGetInt(config_1, label = 'NX:', default = 2, rc = rc) ny = ESMF_ConfigGetInt(config_1, label = 'NY:', default = 2, rc = rc) print*,'NX, NY=', nx, ny IF(nx*ny > npe) THEN PRINT*, 'Requested layout ', nx, ny, 'on ', npe CALL exit END IF loAppl = ESMF_DELayoutCreate((/(I, I = 0, npe-1)/), 2, (/NX, NY/), & (/(ESMF_COMMTYPE_MP, I=1, npe)/),rc = rc) ! !!CREATE THE ESMF SSI GRID COMPONENT, USING SAME LAYOUT AS APPLICATION: ! gcSSI = ESMF_GridCompCreate (name = GridCompName, & config = config_1, & rc = rc) ! !!REGISTER THE SSI GRID COMPONENT: ! CALL ESMF_GridCompSetServices ( gcSSI, SSIana_SetServices, rc ) ! !!CREATE THE IMPORT AND EXPORT ESMF STATES: ! impSSI = ESMF_StateCreate (impStateName, ESMF_STATEIMPORT, & compname = 'SSI_Standalone', rc = rc) expSSI = ESMF_StateCreate (expStateName, ESMF_STATEEXPORT, & compname = 'SSI_Standalone', rc = rc) ! !!USE THE ESMF TIME MANAGEMENT TO GET ALL RELATED TIME VARIABLES: ! !StartTime = ncepESMF_ConfigGet ( config_1, StartTimeName , rc=rc) !StopTime = ncepESMF_ConfigGet ( config_1, StopTimeName , rc=rc) !RefTime = ncepESMF_ConfigGet ( config_1, RefTimeName , rc=rc) !TimeStep = ncepESMF_ConfigGet ( config_1, TimeStepName , rc=rc) !clock1 = ncepESMF_ClockInit(TimeStep, StartTime, StopTime, RefTime, rc=rc) ! !!INITIALIZE THE SSI GRID COMPONENT: ! CALL ESMF_GridCompInitialize (gcSSI, importstate = impSSI, & exportstate = expSSI, & clock = clock, & phase = ESMF_SINGLEPHASE, & rc = rc) IF(rc/=0) THEN PRINT*, 'Run ncepESMF_GridCompInitialize, rc=', rc CALL stop1 END IF call stop1 ! !!PUT THE IMPORT STATE TO THE ESMF IMPORT STATE: ! !CALL ncepESMF_StateSet(impSSI, impSSI_local, rc=rc) ! !!MAIN DO LOOP TO RUN THE SSI GRID COMPONENT: ! ! For testing, only do one step. !Main_Loop: DO WHILE (CurrentTime /= StopTime) ! CALL ncepESMF_CplCompRun (gcCPL, StateList, clock1, phase, rc =rc) ! CALL ncepESMF_GridCompRun(gcSSI1, impSSI, expSSI, clock1, rc =rc) ! CALL ncepESMF_CplCompRun (gcCPL, StateList, clock1, phase, rc =rc) ! CALL ncepESMF_GridCompRun(gcModel, impModel, expModel, clock1, rc =rc) ! CALL ncepESMF_TimeAdvance(TimeStep, StartTime, StopTime, RefTime, rc =rc) !END DO Main_Loop ! !!AFTER RUNNING, FINALIZE THE SSI GRID COMPONENT: ! !CALL ncepESMF_GridCompFinalize(gcSSI1, impSSI, expSSI, clock1, rc=rc) IF(rc/=0) THEN PRINT*, 'Run ncepESMF_Finalize, rc=', rc CALL stop1 END IF ! !!GET THE ESMF LAYOUT TO LOCAL LAYOUT FOR THE LATTER TIMEING PURPOSE: ! !CALL ncepESMF_GridCompGet(gcSSI1, layout=layout1, rc=rc) ! !!DEALLOCATE ALL UNNECESSARY ALLOCATED ARRAYS TO CLEAN UP: ! !CALL ncepESMF_StateDestroy (impSSI, rc=rc) !CALL ncepESMF_StateDestroy (expSSI, rc=rc) !CALL ncepESMF_GridCompDestroy(gcSSI1, rc=rc) ! !!TIME MEASURING COMPUTATIONS: ! t10 = rtc()-t00 #ifdef sgi_origin clock_rate = irtc_rate() t10 = t10/clock_rate #endif CALL mpi_reduce(t10,tsum,1,mpi_real8,mpi_sum,0,mpi_comm_world,rc) CALL mpi_reduce(t10,tmax,1,mpi_real8,mpi_max,0,mpi_comm_world,rc) IF(mype==0) & WRITE(6,*)'SSI_Standalone: mype,npe,total tavg,tmax=',& mype,npe,tsum/npe,tmax ! !!CLEAN UP THE SSI APPLICATION COMPONENT: ! !CALL ncepESMF_AppCompDestroy (appl1, rc=rc) ! !!END THE PROGRAM: ! END PROGRAM SSIana ! !EOP !-------------------------------------------------------------------------