File: C:\NOAA\NEMS_11731\src\MAIN_NEMS.F90

1     !-----------------------------------------------------------------------
2     !
3           PROGRAM MAIN_NEMS
4     !
5     !-----------------------------------------------------------------------
6     !***  Main Program for NEMS.
7     !***  Define ESMF data types and procedures.
8     !-----------------------------------------------------------------------
9     !
10     !-----------------------------------------------------------------------
11     !
12     ! PROGRAM HISTORY LOG:
13     !   2007-       Black   - Modified from Wei-yu's version
14     !   2007-09     Black   - Create the Clock here.
15     !   2009-08     Colon   - Unified NEM-NMM & NEMS-GFS
16     !   2009-06-29  Black   - Modified for addition of NMM nesting;
17     !                         added new ATM Driver Component.
18     !   2009-09     Lu      - Add w3tage calls for resource statistics
19     !   2009-08     W. Yang - Ensemble GEFS Concurrency Code.
20     !   2010-03     Jovic/Black - Revised to create NEMS gridded component
21     !                             for new structure.
22     !   2010-04     Yang    - Add GEFS and GFS for the revised NEMS.
23     !   2010-11     Yang    - Add the "Generic Core" in the NEMS.
24     !
25     !-----------------------------------------------------------------------
26     !
27           USE ESMF_Mod
28     !
29     !-----------------------------------------------------------------------
30     !***  USE the NEMS gridded component module.  Although it
31     !***  contains the calls to Register and the top level Initialize,
32     !***  Run, and Finalize, only the Register routine is public.
33     !-----------------------------------------------------------------------
34     !
35            USE module_NEMS_GRID_COMP, ONLY: NEMS_REGISTER
36     !
37     !-----------------------------------------------------------------------
38     !***  The following module contains error-checking.
39     !-----------------------------------------------------------------------
40     !
41            USE module_ERR_MSG,ONLY: ERR_MSG,MESSAGE_CHECK
42     !
43     !-----------------------------------------------------------------------
44     !
45           IMPLICIT NONE
46     !
47     !-----------------------------------------------------------------------
48     !***  Local Variables.
49     !-----------------------------------------------------------------------
50     !
51           INTEGER :: MYPE                                                   &  !<-- The MPI task ID
52                     ,NHOURS_FCST                                            &  !<-- Length of forecast in hours
53                     ,NSECONDS_FCST                                          &  !<-- Length of forecast in seconds
54                     ,TIMESTEP_SEC_WHOLE                                     &  !<-- Integer part of timestep
55                     ,TIMESTEP_SEC_NUMERATOR                                 &  !<-- Numerator of fractional part
56                     ,TIMESTEP_SEC_DENOMINATOR                               &  !<-- Denominator of fractional part
57                     ,YY,MM,DD                                               &  !<-- Time variables for date
58                     ,HH,MNS,SEC                                                !<-- Time variables for time of day
59     !
60           TYPE(ESMF_TimeInterval) :: RUNDURATION                            &  !<-- The ESMF time. The total forecast hours.
61                                     ,TIMESTEP                                  !<-- The ESMF timestep length (we only need a dummy here)
62     !
63           TYPE(ESMF_Time) :: CURRTIME                                       &  !<-- The ESMF current time.
64                             ,STARTTIME                                         !<-- The ESMF start time.
65     !
66           TYPE(ESMF_VM) :: VM                                                  !<-- The ESMF virtual machine,
67                                                                                !    which contains and manages
68                                                                                !    the computer CPU resource
69                                                                                !    for the ESMF grid components.
70     !
71           TYPE(ESMF_GridComp) :: NEMS_GRID_COMP                                !<-- The NEMS gridded component.
72     !
73           TYPE(ESMF_State) :: NEMS_EXP_STATE                                &  !<-- The NEMS export state
74                              ,NEMS_IMP_STATE                                   !<-- The NEMS import state
75     !      
76           TYPE(ESMF_Clock) :: CLOCK_MAIN                                       !<-- The ESMF time management clock
77     !
78           TYPE(ESMF_Config) :: CF_MAIN                                         !<-- The Configure object
79     !
80           LOGICAL :: RUN_CONTINUE                                              !<-- Flag for more than one NEMS run.
81     !
82           INTEGER :: HH_START                                               &
83                     ,HH_FINAL
84     !
85           INTEGER :: RC=ESMF_SUCCESS                                        &  !<-- The running error signal
86                     ,RC_MAIN                                                   !<-- The final value of the Main error code
87     !
88     !-----------------------------------------------------------------------
89     !***********************************************************************
90     !-----------------------------------------------------------------------
91     !
92     #ifdef IBM
93           include 'fexcp.h'
94           call signal(11, xl__trce)
95     #endif
96     !
97     !-----------------------------------------------------------------------
98     !!
99     !-----------------------------------------------------------------------
100     !***  Initialize the final error signal.
101     !-----------------------------------------------------------------------
102     !
103           RC_MAIN=ESMF_SUCCESS
104     !
105     !-----------------------------------------------------------------------
106     !***  Initialize the ESMF framework. 
107     !-----------------------------------------------------------------------
108     ! 
109           CALL ESMF_Initialize(VM             =VM                           & !<-- The ESMF Virtual Machine
110                               ,defaultCalendar=ESMF_CAL_GREGORIAN           & !<-- Set up the default calendar.
111                               ,defaultlogtype =ESMF_LOG_MULTI               & !<-- Define multiple log error output file;
112                                                                               !    each task has its own log error output file.
113                               ,rc             =RC)
114     !
115     !-----------------------------------------------------------------------
116     !***  Extract the MPI task ID.
117     !-----------------------------------------------------------------------
118     !
119     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
120           MESSAGE_CHECK="MAIN: Obtain the local task ID"
121     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
122     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
123     !
124           CALL ESMF_VmGet(vm      =VM                                       &  !<-- The ESMF Virtual Machine
125                          ,localpet=MYPE                                     &  !<-- The local MPI task ID
126                          ,rc      =RC)
127     !
128     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
129           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
130     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
131     !
132     #if defined (SVN_INFO) && defined (CMP_YEAR) && defined (CMP_JD)
133           if (mype==0) call w3tagb('NEMS '//SVN_INFO                        &
134                       ,CMP_YEAR, CMP_JD, 0000, 'NEMS')
135     #else
136           if (mype==0) call w3tagb('nems     ',0000,0000,0000,'np23   ')
137     #endif
138     !
139     !-----------------------------------------------------------------------
140     !***  Set up the default log.
141     !-----------------------------------------------------------------------
142     !
143     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
144           MESSAGE_CHECK="Set Up ESMF Log"
145     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
146     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
147     !
148           CALL ESMF_LogSet(verbose    =ESMF_TRUE                            &
149                           ,flush      =ESMF_TRUE                            &
150                           ,rootOnly   =ESMF_FALSE                           &
151                           ,halt       =ESMF_LOG_HALTNEVER                   &  !<-- The job will not stop automatically
152                                                                                !    when an ESMF error occurs.
153                           ,maxElements=1                                    &  !<-- Maximum number of elements in the log
154                                                                                !    before printing them to the log file.
155                           ,rc         =RC)
156     !
157     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
158           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
159     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
160     !
161     !-----------------------------------------------------------------------
162     !***  Create and load the Configure object which will hold the contents
163     !***  of the Main configure file.
164     !-----------------------------------------------------------------------
165     !
166     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
167           MESSAGE_CHECK="Create/Load the Main Configure Object"
168     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
169     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
170     !
171           CF_MAIN=ESMF_ConfigCreate(rc=RC)
172     !
173           CALL ESMF_ConfigLoadFile(config  =CF_MAIN            & !<-- The Configure object
174                                   ,filename='model_configure'  & !<-- The name of the configure file 
175                                   ,rc      =RC)
176     !
177     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
178           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
179     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
180     !
181     !-----------------------------------------------------------------------
182     !***  Create the NEMS gridded component which will create and
183     !***  control the ATM (atmosphere), OCN (ocean), ICE (sea ice), etc.
184     !***  gridded components.
185     !-----------------------------------------------------------------------
186     !
187     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
188           MESSAGE_CHECK="Create the NEMS Gridded Component"
189     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
190     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
191     !
192           NEMS_GRID_COMP=ESMF_GridCompCreate(name        ='NEMS Grid Comp'  & !<-- NEMS component name
193                                             ,gridcomptype=ESMF_ATM          & !<-- A Type that the user can query.
194                                             ,configFile  ='model_configure'  & !<-- Link the user-created configure file.
195                                             ,rc          =RC)
196     !
197     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
198           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
199     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
200     !
201     !-----------------------------------------------------------------------
202     !***  Register the NEMS gridded component's Initialize, Run and
203     !***  Finalize routines.
204     !-----------------------------------------------------------------------
205     !
206     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
207           MESSAGE_CHECK="Register NEMS Gridded Component Init, Run, Finalize"
208     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
209     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
210     !
211           CALL ESMF_GridCompSetServices(NEMS_GRID_COMP                      &  !<-- The NEMS component
212                                        ,NEMS_REGISTER                       &  !<-- User's subroutineName
213                                        ,RC)
214     !
215     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
216           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
217     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
218     !
219     !-----------------------------------------------------------------------
220     !***  Create the main ESMF Clock.
221     !***  The Clock is needed for all calls to Init, Run, and Finalize.
222     !
223     !***  A timestep is needed to create the Clock but actual timesteps
224     !***  are handled by the individual subcomponents therefore a dummy
225     !***  value is used here.
226     !-----------------------------------------------------------------------
227     !
228           TIMESTEP_SEC_WHOLE      =1                                           !<-- Dummy timestep values
229           TIMESTEP_SEC_NUMERATOR  =0                                           !
230           TIMESTEP_SEC_DENOMINATOR=1                                           !<--
231     !
232     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
233           MESSAGE_CHECK="Set up Time Step Interval in Main Clock"
234     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
235     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
236     !
237           CALL ESMF_TimeIntervalSet(timeinterval=TIMESTEP                   &  !<-- Main Clock's timestep
238                                    ,s           =TIMESTEP_SEC_WHOLE         &  !<-- Whole part of timestep
239                                    ,sn          =TIMESTEP_SEC_NUMERATOR     &  !<-- Numerator of fractional part
240                                    ,sd          =TIMESTEP_SEC_DENOMINATOR   &  !<-- Denominator of fractional part
241                                    ,rc          =RC)
242     !
243     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
244           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
245     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
246     !
247     !-----------------------------------------------------------------------
248     !***  Set the start time in the Main Clock.
249     !-----------------------------------------------------------------------
250     !
251     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
252           MESSAGE_CHECK="MAIN: Extract Starting Year from Config File"
253     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
254     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
255     !
256           CALL ESMF_ConfigGetAttribute(config=CF_MAIN                       &
257                                       ,value =YY                            &
258                                       ,label ='start_year:'                 &
259                                       ,rc    =RC)
260     !
261     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
262           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
263     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
264     !
265     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
266           MESSAGE_CHECK="MAIN: Extract Starting Month from Config File"
267     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
268     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
269     !
270           CALL ESMF_ConfigGetAttribute(config=CF_MAIN                       &
271                                       ,value =MM                            &
272                                       ,label ='start_month:'                &
273                                       ,rc    =RC)
274     !
275     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
276           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
277     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
278     !
279     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
280           MESSAGE_CHECK="MAIN: Extract Starting Day from Config File"
281     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
282     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
283     !
284           CALL ESMF_ConfigGetAttribute(config=CF_MAIN                       &
285                                       ,value =DD                            &
286                                       ,label ='start_day:'                  &
287                                       ,rc    =RC)
288     !
289     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
290           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
291     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
292     !
293     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
294           MESSAGE_CHECK="MAIN: Extract Starting Hour from Config File"
295     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
296     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
297     !
298           CALL ESMF_ConfigGetAttribute(config=CF_MAIN                       &
299                                       ,value =HH                            &
300                                       ,label ='start_hour:'                 &
301                                       ,rc    =RC)
302     !
303     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
304           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
305     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
306     !
307     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
308           MESSAGE_CHECK="MAIN: Extract Starting Minute from Config File"
309     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
310     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
311     !
312           CALL ESMF_ConfigGetAttribute(config=CF_MAIN                       &
313                                       ,value =MNS                           &
314                                       ,label ='start_minute:'               &
315                                       ,rc    =RC)
316     !
317     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
318           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
319     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
320     !
321     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
322           MESSAGE_CHECK="MAIN: Extract Starting Second from Config File"
323     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
324     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
325     !
326           CALL ESMF_ConfigGetAttribute(config=CF_MAIN                       &
327                                       ,value =SEC                           &
328                                       ,label ='start_second:'               &
329                                       ,rc    =RC)
330     !
331     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
332           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
333     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
334     !
335     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
336           MESSAGE_CHECK="MAIN: Set the Forecast Start Time"
337     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
338     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
339     !
340           CALL ESMF_TimeSet(time=STARTTIME                                  &  !<-- The start time of the forecast (ESMF)
341                            ,yy  =YY                                         &  !<-- Year from config file
342                            ,mm  =MM                                         &  !<-- Month from config file
343                            ,dd  =DD                                         &  !<-- Day from config file
344                            ,h   =HH                                         &  !<-- Hour from config file
345                            ,m   =MNS                                        &  !<-- Minute from config file
346                            ,s   =SEC                                        &  !<-- Second from config file
347                            ,rc  =RC)
348     !
349     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
350           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
351     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
352     !
353     !-----------------------------------------------------------------------
354     !***  Set the run duration in the Main Clock.
355     !-----------------------------------------------------------------------
356     !
357     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
358           MESSAGE_CHECK="MAIN: Extract Forecast Length from Config File"
359     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
360     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
361     !
362           CALL ESMF_ConfigGetAttribute(config=CF_MAIN                       &
363                                       ,value =NHOURS_FCST                   &
364                                       ,label ='nhours_fcst:'                &
365                                       ,rc    =RC)
366     !
367     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
368           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
369     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
370     !
371           NSECONDS_FCST=NHOURS_FCST*3600                                       !<-- The forecast length (sec) (REAL)
372     !
373     !-----------------------------------------------------------------------
374     !
375     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
376           MESSAGE_CHECK="MAIN: Set the Forecast Length"
377     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
378     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
379     !
380           CALL ESMF_TimeIntervalSet(timeinterval=RUNDURATION                &  !<-- The forecast length (s) (ESMF)
381                                    ,s           =NSECONDS_FCST              &
382                                    ,rc          =RC)
383     !
384     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
385           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
386     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
387     !
388     !-----------------------------------------------------------------------
389     !***  Now the Main Clock can be created.
390     !-----------------------------------------------------------------------
391     !
392     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
393           MESSAGE_CHECK="Create the Main Clock"
394     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
395     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
396     !
397           CLOCK_MAIN=ESMF_ClockCreate(name       ='CLOCK_MAIN'              &  !<-- The top-level ESMF Clock
398                                      ,timeStep   =TIMESTEP                  &  !<-- Timestep needed by the Clock (ESMF)
399                                      ,startTime  =STARTTIME                 &  !<-- The integration start time (ESMF)
400                                      ,runDuration=RUNDURATION               &  !<-- The integration duration (ESMF)
401                                      ,rc         =RC)
402     !
403     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
404           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
405     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
406     !
407     !-----------------------------------------------------------------------
408     !***  Create the NEMS component's import/export states.
409     !***  Currently they are not required to perform an actual function.
410     !-----------------------------------------------------------------------
411     !
412     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
413           MESSAGE_CHECK="Create the NEMS Import/Export States"
414     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
415     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
416     !
417           NEMS_IMP_STATE=ESMF_StateCreate(stateName='NEMS Import State'     &
418                                          ,rc       =RC)
419     !
420           NEMS_EXP_STATE=ESMF_StateCreate(stateName='NEMS Export State'     &
421                                          ,rc       =RC)
422     !      
423     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
424           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
425     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
426     !
427     !-----------------------------------------------------------------------
428     !***  Execute the INITIALIZE step for the NEMS component.
429     !***  The Initialize routine that is called here as well as the
430     !***  Run and Finalize routines invoked below are those specified
431     !***  in the Register routine called in ESMF_GridCompSetServices above.
432     !-----------------------------------------------------------------------
433     !
434     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
435           MESSAGE_CHECK="Execute the NEMS Component Initialize Step"
436     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
437     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
438     !
439           CALL ESMF_GridCompInitialize(gridcomp   =NEMS_GRID_COMP           &  !<-- The NEMS component
440                                       ,importState=NEMS_IMP_STATE           &  !<-- The NEMS component import state
441                                       ,exportState=NEMS_EXP_STATE           &  !<-- The NEMS component export state
442                                       ,clock      =CLOCK_MAIN               &  !<-- The ESMF clock
443                                       ,phase      =ESMF_SINGLEPHASE         &
444                                       ,rc         =RC)
445     !
446     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
447           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
448     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
449     !
450     !-----------------------------------------------------------------------
451     !***  Execute the RUN step for the NEMS component.
452     !-----------------------------------------------------------------------
453     !
454     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
455           MESSAGE_CHECK="Execute the NEMS Component Run Step"
456     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
457     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
458     !
459           CALL ESMF_GridCompRun(gridcomp   =NEMS_GRID_COMP                  &  !<-- The NEMS component
460                                ,importState=NEMS_IMP_STATE                  &  !<-- The NEMS component import state
461                                ,exportState=NEMS_EXP_STATE                  &  !<-- The NEMS component export state
462                                ,clock      =CLOCK_MAIN                      &  !<-- The ESMF clock
463                                ,phase      =ESMF_SINGLEPHASE                &
464                                ,rc         =RC)
465     !
466     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
467           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
468     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
469     !
470     !-----------------------------------------------------------------------
471     !***  The RUN_CONTINUE flag tells us if the RUN step of the
472     !***  NEMS component must be called multiple times for ensembles.
473     !-----------------------------------------------------------------------
474     !
475     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
476           MESSAGE_CHECK="Extract the RUN_CONTINUE flag from Config File"
477     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
478     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
479     !
480           CALL ESMF_ConfigGetAttribute(config = CF_MAIN                     &
481                                       ,value  = RUN_CONTINUE                &
482                                       ,label  = 'RUN_CONTINUE:'             &
483                                       ,rc     = RC)
484     !
485     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
486           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
487     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
488     !
489     !-----------------------------------------------------------------------
490     !***  Update the Main clock.  This is for calling the RUN step
491     !***  of the NEMS component multiple times.
492     !-----------------------------------------------------------------------
493     !
494           IF(RUN_CONTINUE) THEN
495     !
496     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
497             MESSAGE_CHECK="Extract the Ensemble Clock Parameters from Config File"
498     !       CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
499     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
500     !
501             CALL ESMF_ConfigGetAttribute(config = CF_MAIN                   &
502                                         ,value  = hh_start                  &
503                                         ,label  = 'HH_START:'               &
504                                         ,rc     = RC)
505     !
506             CALL ESMF_ConfigGetAttribute(config = CF_MAIN                   &
507                                         ,value  = hh_final                  &
508                                         ,label  = 'HH_FINAL:'               &
509                                         ,rc     = RC)
510     !
511     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
512             CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
513     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
514     !
515             NHOURS_FCST = HH_FINAL - HH_START
516     !
517     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
518             MESSAGE_CHECK="MAIN: Re-set the clock after the ensemble run cycles."
519     !       CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
520     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
521     !
522             CALL ESMF_TimeIntervalSet(timeInterval = RUNDURATION            &
523                                      ,h            = NHOURS_FCST            &
524                                      ,rc           = RC)
525     !
526             CALL ESMF_ClockGet(clock    = CLOCK_MAIN                        &
527                               ,currTime = CURRTIME                          &
528                               ,rc       = rc)
529     !
530             CURRTIME = CURRTIME + RUNDURATION
531     !
532             CALL ESMF_ClockSet(clock       = CLOCK_MAIN                     &
533                               ,RunDuration = RUNDURATION                    &
534                               ,currTime    = CURRTIME                       &
535                               ,rc          = RC)
536     !
537     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
538               CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
539     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
540     !
541           END IF
542     !
543     !-----------------------------------------------------------------------
544     !***  Execute the FINALIZE step for the NEMS component.
545     !-----------------------------------------------------------------------
546     !
547     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
548           MESSAGE_CHECK="Execute the NEMS Component Finalize Step"
549     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
550     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
551     !
552           CALL ESMF_GridCompFinalize(gridcomp   =NEMS_GRID_COMP             &  !<-- The NEMS component
553                                     ,importState=NEMS_IMP_STATE             &  !<-- The NEMS component import state
554                                     ,exportState=NEMS_EXP_STATE             &  !<-- The NEMS component export state
555                                     ,clock      =CLOCK_MAIN                 &  !<-- The Main ESMF clock
556                                     ,phase      =ESMF_SINGLEPHASE           &
557                                     ,rc         =RC)
558     !
559     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
560           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
561     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
562     !
563     !-----------------------------------------------------------------------
564     !***  Destroy the Main Clock.
565     !-----------------------------------------------------------------------
566     !
567     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
568           MESSAGE_CHECK="Destroy the Main Clock"
569     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
570     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
571     !
572           CALL ESMF_ClockDestroy(clock=CLOCK_MAIN                           &
573                                 ,rc   =RC)
574     !
575     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
576           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
577     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
578     !
579     !-----------------------------------------------------------------------
580     !***  Destroy the Main Configure object.
581     !-----------------------------------------------------------------------
582     !
583     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
584           MESSAGE_CHECK="Destroy the Main Configure Object"
585     !     CALL ESMF_LogWrite(MESSAGE_CHECK,ESMF_LOG_INFO,rc=RC)
586     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
587     !
588           CALL ESMF_ConfigDestroy(config=CF_MAIN                            &
589                                  ,rc    =RC)
590     !
591     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
592           CALL ERR_MSG(RC,MESSAGE_CHECK,RC_MAIN)
593     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
594     !
595     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
596           MESSAGE_CHECK = "Destroy the ESMF states"
597     !      CALL ESMF_LogWrite(MESSAGE_CHECK, ESMF_LOG_INFO, rc = RC)
598     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
599     
600           CALL ESMF_StateDestroy(state=NEMS_IMP_STATE                       &
601                                 ,rc   =RC)
602           CALL ESMF_StateDestroy(state=NEMS_EXP_STATE                       &
603                                 ,rc   =RC)
604     !
605     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
606           CALL ERR_MSG(RC, MESSAGE_CHECK, RC_MAIN)
607     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
608     !
609     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
610           MESSAGE_CHECK = "Destroy ESMF Grid Comp and Cpl Comp"
611     !      CALL ESMF_LogWrite(MESSAGE_CHECK, ESMF_LOG_INFO, rc = RC)
612     ! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
613     !
614           CALL ESMF_GridCompDestroy(gridcomp=NEMS_GRID_COMP                 &
615                                    ,rc      =RC)
616     
617           CALL ERR_MSG(RC, MESSAGE_CHECK, RC_MAIN)
618     !
619     !-----------------------------------------------------------------------
620     !***  Shut down the ESMF system.
621     !-----------------------------------------------------------------------
622     !
623           CALL ESMF_Finalize()
624     !
625           IF(RC_MAIN==ESMF_SUCCESS)THEN
626     !       WRITE(0,*)'MODEL FORECAST RUN SUCCEEDED'
627           ELSE
628             WRITE(0,*)'MODEL FORECAST RUN FAILED  RC_MAIN=',RC_MAIN
629           ENDIF
630     !
631     !-----------------------------------------------------------------------
632     !
633           if(mype==0)call w3tage('nems     ')
634     !
635     !-----------------------------------------------------------------------
636     !
637           END PROGRAM MAIN_NEMS
638     !
639     !-----------------------------------------------------------------------
640