solve_nmm.F

References to this file elsewhere.
1 !-----------------------------------------------------------------------
2 !
3 !NCEP_MESO:MEDIATION_LAYER:SOLVER
4 !
5 !-----------------------------------------------------------------------
6 #include "nmm_loop_basemacros.h"
7 #include "nmm_loop_macros.h"
8 !-----------------------------------------------------------------------
9 !
10       SUBROUTINE SOLVE_NMM(GRID,CONFIG_FLAGS                           &
11 !
12 #include "nmm_dummy_args.inc"
13 !
14      &           )
15 !-----------------------------------------------------------------------
16       USE MODULE_DOMAIN
17       USE MODULE_CONFIGURE
18       USE MODULE_MODEL_CONSTANTS
19       USE MODULE_STATE_DESCRIPTION
20       USE MODULE_CTLBLK
21       USE MODULE_DM
22       USE MODULE_IGWAVE_ADJUST,		ONLY: PDTE,PFDHT,DDAMP,VTOA
23       USE MODULE_ADVECTION,		ONLY: ADVE,VAD2,HAD2,VAD2_SCAL,HAD2_SCAL
24       USE MODULE_NONHY_DYNAM,		ONLY: EPS,VADZ,HADZ
25       USE MODULE_DIFFUSION_NMM, 	ONLY: HDIFF
26       USE MODULE_BNDRY_COND,		ONLY: BOCOH,BOCOV
27       USE MODULE_PHYSICS_CALLS
28       USE MODULE_EXT_INTERNAL
29       USE MODULE_PRECIP_ADJUST
30       USE MODULE_NEST_UTIL
31 !-----------------------------------------------------------------------
32 !
33       IMPLICIT NONE
34 !
35 !-----------------------------------------------------------------------
36       INCLUDE "mpif.h"
37 !-----------------------------------------------------------------------
38 !
39 !***  INPUT DATA
40 !
41 !-----------------------------------------------------------------------
42 !
43       TYPE(DOMAIN),TARGET :: GRID
44 !
45 !***  DEFINITIONS OF DUMMY ARGUMENTS TO THIS ROUTINE (GENERATED FROM REGISTRY)
46 !
47 ! NOTE, REGISTRY NO LONGER GENERATES DUMMY ARGUMENTS OR DUMMY ARGUMENT
48 ! DECLARATIONS FOR RCONFIG ENTRIES. THEY ARE STILL PART OF STATE. ACCESS
49 ! TO THESE VARIABLES IS NOW THROUGH GRID STRUCTURE, AS MODIFIED BELOW.
50 ! AFFECTED VARIABLES: SIGMA, DT, NPHS, IDTAD, NRADS, NRADL, JULDAY,
51 ! JULYR, NUM_SOIL_LAYERS, NCNVC, ENSDIM, DY, AND SPEC_BDY_WIDTH.
52 ! JM, 20050819
53 !
54 !----------------------------
55 #include <nmm_dummy_decl.inc>
56 !----------------------------
57 !
58 !***  STRUCTURE THAT CONTAINS RUN-TIME CONFIGURATION (NAMELIST) DATA FOR DOMAIN
59 !
60       TYPE(GRID_CONFIG_REC_TYPE),INTENT(IN) :: CONFIG_FLAGS
61 !
62 !-----------------------------------------------------------------------
63 !
64 !***  LOCAL VARIABLES
65 !
66 !-----------------------------------------------------------------------
67       INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE                                &
68      &          ,IMS,IME,JMS,JME,KMS,KME                                & 
69      &          ,IPS,IPE,JPS,JPE,KPS,KPE                                &
70      &          ,ITS,ITE,JTS,JTE,KTS,KTE
71 !
72       INTEGER :: I,ICLTEND,IDF,IJDE,IJDS,IRTN,J,JC,JDF,K,KDF,LB,N_MOIST &
73      &          ,NTSD_current
74       INTEGER,SAVE :: NTSD_restart
75 !dusan      INTEGER :: MPI_COMM_COMP,MYPE,MYPROC,NPES
76       INTEGER :: MYPROC
77       INTEGER :: KVH,NTSD_rad,RC
78       REAL :: WC, QI, QR, QW, FICE, FRAIN
79       INTEGER :: NUM_OZMIXM,NUM_AEROSOLC
80 !
81       CHARACTER*80 :: MESSAGE
82 !
83 !  For precip assimilation:
84       INTEGER :: ISTAT
85       REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:) :: PPTDAT
86 
87 !  For physics compatibility with other packages
88       REAL,ALLOCATABLE,DIMENSION(:,:,:) :: TTEN,QTEN
89       REAL,ALLOCATABLE,DIMENSION(:,:,:) :: RTHRATEN,RTHBLTEN,RQVBLTEN
90 !
91       REAL :: DT_INV,GPS
92 !
93       LOGICAL :: LAST_TIME
94 !
95       LOGICAL wrf_dm_on_monitor
96       EXTERNAL wrf_dm_on_monitor
97 !
98 !-----------------------------------------------------------------------
99 !***  TIMING VARIABLES
100 !-----------------------------------------------------------------------
101       real,save :: solve_tim,exch_tim,pdte_tim,adve_tim,vtoa_tim        &
102      &,            vadz_tim,hadz_tim,eps_tim,vad2_tim,had2_tim          &
103      &,            radiation_tim,rdtemp_tim,turbl_tim,cltend_tim        &
104      &,            cucnvc_tim,gsmdrive_tim,hdiff_tim,bocoh_tim          &
105      &,            pfdht_tim,ddamp_tim,bocov_tim,uv_htov_tim,sum_tim    &
106      &,            adjppt_tim
107       real,save :: exch_tim_max
108       real :: btim,btimx
109       real :: et_max,this_tim
110       integer :: n_print_time
111 !
112 #ifdef RSL
113       integer rsl_internal_milliclock
114       external rsl_internal_milliclock
115 # define timef rsl_internal_milliclock
116 #else
117       real*8 :: timef
118 #endif
119 !-----------------------------------------------------------------------
120 !
121 #ifdef DEREF_KLUDGE
122 ! SEE http://www.mmm.ucar.edu/wrf/WG2/topics/deref_kludge.htm
123       INTEGER :: SM31,EM31,SM32,EM32,SM33,EM33 
124       INTEGER :: SM31X,EM31X,SM32X,EM32X,SM33X,EM33X
125       INTEGER :: SM31Y,EM31Y,SM32Y,EM32Y,SM33Y,EM33Y
126 #endif
127 !
128 !-----------------------------------------------------------------------
129 !
130 ! LIMIT THE NUMBER OF ARGUMENTS IF COMPILED WITH -DLIMIT_ARGS BY COPYING
131 ! SCALAR (NON-ARRAY) ARGUMENTS OUT OF THE GRID DATA STRUCTURE INTO LOCALLY
132 ! DEFINED COPIES (DEFINED IN EM_DUMMY_DECL.INC, ABOVE, AS THEY ARE IF THEY
133 ! ARE ARGUMENTS).  AN EQUIVALENT INCLUDE OF EM_SCALAR_DEREFS.INC APPEARS
134 ! AT THE END OF THE ROUTINE TO COPY BACK ANY CHNAGED NON-ARRAY VALUES.
135 ! THE DEFINITION OF COPY_IN OR COPY_OUT BEFORE THE INCLUDE DEFINES THE
136 ! DIRECTION OF THE COPY.  NMM_SCALAR_DEREFS IS GENERATED FROM REGISTRY.
137 !
138 !-----------------------------------------------------------------------
139 #define COPY_IN
140 #include <nmm_scalar_derefs.inc>
141 !-----------------------------------------------------------------------
142 !
143 ! TRICK PROBLEMATIC COMPILERS INTO NOT PERFORMING COPY-IN/COPY-OUT BY ADDING
144 ! INDICES TO ARRAY ARGUMENTS IN THE CALL STATEMENTS IN THIS ROUTINE.
145 ! IT HAS THE EFFECT OF PASSING ONLY THE FIRST ELEMENT OF THE ARRAY, RATHER
146 ! THAN THE ENTIRE ARRAY.  SEE:
147 ! http://www.mmm.ucar.edu/wrf/WG2/topics/deref_kludge.htm
148 !
149 !-----------------------------------------------------------------------
150 #include "deref_kludge.h"
151 !-----------------------------------------------------------------------
152 !
153 ! NEEDED BY SOME COMM LAYERS, E.G. RSL.  IF NEEDED, nmm_data_calls.inc IS
154 ! GENERATED FROM THE REGISTRY.  THE DEFINITION OF REGISTER_I1 ALLOWS
155 ! I1 DATA TO BE COMMUNICATED IN THIS ROUTINE IF NECESSARY.
156 !
157 !-----------------------------------------------------------------------
158 #ifdef DM_PARALLEL
159 #    define REGISTER_I1
160 #    include <nmm_data_calls.inc>
161 #endif
162 !-----------------------------------------------------------------------
163 !***********************************************************************
164 !-----------------------------------------------------------------------
165       CALL WRF_GET_MYPROC(MYPROC)
166       MYPE=MYPROC
167 !-----------------------------------------------------------------------
168 !
169 !***  OBTAIN DIMENSION INFORMATION STORED IN THE GRID DATA STRUCTURE.
170 !
171       CALL GET_IJK_FROM_GRID(GRID                                       &
172      &                      ,IDS,IDE,JDS,JDE,KDS,KDE                    &
173      &                      ,IMS,IME,JMS,JME,KMS,KME                    &
174      &                      ,IPS,IPE,JPS,JPE,KPS,KPE )
175 !-----------------------------------------------------------------------
176 !
177 !***  COMPUTE THESE STARTING AND STOPPING LOCATIONS FOR EACH TILE AND
178 !***  NUMBER OF TILES.
179 !***  SEE: http://www.mmm.ucar.edu/wrf/WG2/topics/settiles
180 !
181       CALL SET_TILES(GRID,IDS,IDE,JDS,JDE,IPS,IPE,JPS,JPE)
182 !-----------------------------------------------------------------------
183 !
184 !***  TTEN, QTEN are used by GD convection scheme
185 !
186       ALLOCATE(TTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT)
187       ALLOCATE(QTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT)
188       ALLOCATE(RTHBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT)
189       ALLOCATE(RQVBLTEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT)
190       ALLOCATE(RTHRATEN(IMS:IME,KMS:KME,JMS:JME),STAT=ISTAT)
191 !
192       DO J=JMS,JME
193       DO K=KMS,KME
194       DO I=IMS,IME
195         TTEN(I,K,J)=T(I,K,J)
196         QTEN(I,K,J)=Q(I,K,J)
197       ENDDO
198       ENDDO
199       ENDDO
200 !
201       GRID%SIGMA=1 
202       HYDRO=.FALSE.
203 !
204       IJDS=MIN(IDS,JDS)
205       IJDE=MAX(IDE,JDE)
206 !
207       IDF=IDE-1
208       JDF=JDE-1
209       KDF=KDE-1
210 !
211 !-----------------------------------------------------------------------
212 !
213 !***  FOR NOW SET CONTROLS FOR TILES TO PATCHES
214 !
215 !-----------------------------------------------------------------------
216       ITS=IPS
217       ITE=MIN(IPE,IDF)
218       JTS=JPS
219       JTE=MIN(JPE,JDF)
220       KTS=KPS
221       KTE=MIN(KPE,KDF)
222       if(ntsd==0)then
223         write(0,*)' its=',its,' ite=',ite
224         write(0,*)' jts=',jts,' jte=',jte
225         write(0,*)' kts=',kts,' kte=',kte
226       endif
227 !-----------------------------------------------------------------------
228 !***  SET TIMING VARIABLES TO ZERO AT START OF FORECAST.
229 !-----------------------------------------------------------------------
230       if(ntsd==0)then
231         solve_tim=0.
232         exch_tim=0.
233         pdte_tim=0.
234         adve_tim=0.
235         vtoa_tim=0.
236         vadz_tim=0.
237         hadz_tim=0.
238         eps_tim=0.
239         vad2_tim=0.
240         had2_tim=0.
241         radiation_tim=0.
242         rdtemp_tim=0.
243         turbl_tim=0.
244         cltend_tim=0.
245         cucnvc_tim=0.
246         gsmdrive_tim=0.
247         hdiff_tim=0.
248         bocoh_tim=0.
249         pfdht_tim=0.
250         ddamp_tim=0.
251         bocov_tim=0.
252         uv_htov_tim=0.
253         exch_tim_max=0.
254         adjppt_tim=0.
255       endif
256 !-----------------------------------------------------------------------
257       N_MOIST=NUM_MOIST
258 !
259       DO J=MYJS_P4,MYJE_P4
260         IHEG(J)=MOD(J+1,2)
261         IHWG(J)=IHEG(J)-1
262         IVEG(J)=MOD(J,2)
263         IVWG(J)=IVEG(J)-1
264       ENDDO
265 
266       DO J=MYJS_P4,MYJE_P4
267         IVW(J)=IVWG(J)
268         IVE(J)=IVEG(J)
269         IHE(J)=IHEG(J)
270         IHW(J)=IHWG(J)
271       ENDDO
272 !
273 !***  LATERAL POINTS IN THE BOUNDARY ARRAYS
274 !
275       LB=2*(IDF-IDS+1)+(JDF-JDS+1)-3
276 !
277 !***  APPROXIMATE GRIDPOINT SPACING (METERS)
278 !
279       JC=JMS+(JME-JMS)/2
280       GPS=SQRT(DX_NMM(IMS,JC)**2+DY_NMM**2)
281 !
282 !***  TIMESTEPS PER HOUR
283 !
284       TSPH=3600./GRID%DT
285 !
286       n_print_time=nint(3600./grid%dt)   ! Print stats once per hour
287 !-----------------------------------------------------------------------
288 !
289       NBOCO=0
290 !-----------------------------------------------------------------------
291 !***
292 !***               THE MAIN TIME INTEGRATION LOOP
293 !***
294 !-----------------------------------------------------------------------
295 !
296 !***  NTSD IS THE TIMESTEP COUNTER (Number of Time Steps Done)
297 !
298 !-----------------------------------------------------------------------
299 !***
300 !***  ADVANCE_count STARTS AT ZERO FOR ALL RUNS (REGULAR AND RESTART).
301 !***
302 !-----------------------------------------------------------------------
303 !
304       CALL DOMAIN_CLOCK_GET(GRID,ADVANCEcOUNT=NTSD_current)
305 !
306       IF(NTSD_current==0)THEN
307         IF(GRID%RESTART.AND.GRID%TSTART>0.)THEN
308           IHRST=NSTART_HOUR
309           NTSD_restart=NTSD+1
310         ELSE
311           IHRST=GRID%GMT
312           NSTART_HOUR=IHRST
313           NTSD_restart=0
314         ENDIF
315       ENDIF
316 !
317       NTSD=NTSD_restart+NTSD_current
318       LAST_TIME=domain_last_time_step(GRID)
319 !
320 !-----------------------------------------------------------------------
321 !
322       IF(WRF_DM_ON_MONITOR() )THEN
323         WRITE(MESSAGE,125)NTSD,NTSD*GRID%DT/3600.
324   125   FORMAT(' SOLVE_NMM: TIMESTEP IS ',I5,'   TIME IS ',F7.3,' HOURS')
325         CALL WRF_MESSAGE(TRIM(MESSAGE))
326       ENDIF
327 !
328 !-----------------------------------------------------------------------
329 !
330       CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
331       CALL WRF_GET_NPROC(NPES)
332 !
333 #if (NMM_NEST == 1)
334 !-----------------------------------------------------------------------------
335 !***  PATCHING NESTED BOUNDARIES.
336 !-----------------------------------------------------------------------------
337 !
338       CALL wrf_debug ( 100 , 'nmm: in patch' )
339 
340       btimx=timef()
341 #ifdef DM_PARALLEL
342 #    include "HALO_NMM_ZZ.inc"
343 #endif
344 
345       IF(GRID%ID/=1)THEN
346 !
347         CALL NESTBC_PATCH (PD_B,T_B,Q_B,U_B,V_B,Q2_B,CWM_B                                    &
348                           ,PD_BT,T_BT,Q_BT,U_BT,V_BT,Q2_BT,CWM_BT                             &
349                           ,PDNEST_B,TNEST_B,QNEST_B,UNEST_B,VNEST_B,Q2NEST_B,CWMNEST_B        &
350                           ,PDNEST_BT,TNEST_BT,QNEST_BT,UNEST_BT,VNEST_BT,Q2NEST_BT,CWMNEST_BT &
351                           ,IJDS,IJDE,GRID%SPEC_BDY_WIDTH                                      &
352                           ,IDS,IDF,JDS,JDF,KDS,KDE                                            &
353                           ,IMS,IME,JMS,JME,KMS,KME                                            &
354                           ,ITS,ITE,JTS,JTE,KTS,KTE                                            )
355         CALL wrf_debug ( 100 , 'nmm: out of patch' )
356 !
357 #ifdef MOVE_NESTS
358 
359         IF(GRID%ID/=1.AND.MOD(NTSD,1)==0.AND.GRID%NUM_MOVES==-99)THEN
360           XLOC_1=(IDE-1)/2     ! This maneuvers the storm to the center of the nest quickly
361           YLOC_1=(JDE-1)/2     ! This maneuvers the storm to the center of the nest quickly
362         ENDIF
363 #endif
364 
365       ENDIF
366 #endif
367 !
368 !-----------------------------------------------------------------------
369 !***  ALLOCATE PPTDAT ARRAY (PRECIP ASSIM):
370 !-----------------------------------------------------------------------
371 !
372       IF(GRID%PCPFLG.AND..NOT.ALLOCATED(PPTDAT))THEN
373         ALLOCATE(PPTDAT(IMS:IME,JMS:JME,3),STAT=ISTAT)
374       ENDIF
375 !
376 !-----------------------------------------------------------------------
377 !***
378 !***      Call READPCP to
379 !***            1) READ IN PRECIPITATION FOR HOURS 1, 2 and 3;
380 !***            2) Initialize DDATA to 999. (this is the amount
381 !***               of input precip allocated to each physics time step
382 !***               in ADJPPT; TURBL/SURFCE, which uses DDATA, is called
383 !***               before ADJPPT)
384 !***            3) Initialize LSPA to zero
385 !***
386 !-----------------------------------------------------------------------
387       IF (NTSD==0) THEN
388         IF (GRID%PCPFLG) THEN
389           CALL READPCP(PPTDAT,DDATA,LSPA                                &
390      &      ,IDS,IDE,JDS,JDE,KDS,KDE                                    &
391      &      ,IMS,IME,JMS,JME,KMS,KME                                    &
392      &      ,ITS,ITE,JTS,JTE,KTS,KTE)
393         ENDIF
394       ENDIF
395 !-----------------------------------------------------------------------
396 !
397       btim=timef()
398 !
399 !-----------------------------------------------------------------------
400 !***  ZERO OUT ACCUMULATED QUANTITIES WHEN NEEDED.
401 !-----------------------------------------------------------------------
402 !
403       CALL BUCKETS(NTSD,NPREC,NSRFC,NRDSW,NRDLW                         &
404      &            ,GRID%RESTART,GRID%TSTART                             &
405      &            ,NCLOD,NHEAT,GRID%NPHS,TSPH                           &
406      &            ,ACPREC,CUPREC,ACSNOW,ACSNOM,SSROFF,BGROFF            &
407      &            ,SFCEVP,POTEVP,SFCSHX,SFCLHX,SUBSHX,SNOPCX            &
408      &            ,SFCUVX,POTFLX                                        &
409      &            ,ARDSW,ASWIN,ASWOUT,ASWTOA                            &
410      &            ,ARDLW,ALWIN,ALWOUT,ALWTOA                            &
411      &            ,ACFRST,NCFRST,ACFRCV,NCFRCV                          &
412      &            ,AVCNVC,AVRAIN,TCUCN,TRAIN                            &
413      &            ,ASRFC                                                &
414      &            ,T,TLMAX,TLMIN                                        &
415      &            ,IDS,IDE,JDS,JDE,KDS,KDE                              &
416      &            ,IMS,IME,JMS,JME,KMS,KME                              &
417      &            ,ITS,ITE,JTS,JTE,KTS,KTE)
418 !-----------------------------------------------------------------------
419 !
420       IF(NTSD==0)THEN
421         FIRST=.TRUE.
422 !       call hpm_init()
423         btimx=timef()
424 !
425 !-----------------------------------------------------------------------
426 #ifdef DM_PARALLEL
427 #    include "HALO_NMM_A.inc"
428 #endif
429 !
430 #ifdef DM_PARALLEL
431       IF(CONFIG_FLAGS%MP_PHYSICS/=ETAMPNEW)THEN
432 #    include "HALO_NMM_A_3.inc"
433       ENDIF
434 #endif
435 !
436 !***  Only for chemistry:
437 !
438 #ifdef WRF_CHEM   
439 #ifdef DM_PARALLEL
440 #    include "HALO_NMM_A_2.inc"
441 #endif
442 #endif
443 !
444 !-----------------------------------------------------------------------
445 !***  USE THE FOLLOWING VARIABLES TO KEEP TRACK OF EXCHANGE TIMES.
446 !-----------------------------------------------------------------------
447         exch_tim=exch_tim+timef()-btimx
448 !       this_tim=timef()-btimx
449 !       call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max           &
450 !    &                    ,mpi_comm_comp,irtn)
451 !       exch_tim_max=exch_tim_max+et_max
452 !-----------------------------------------------------------------------
453 !
454         GO TO 2003
455       ENDIF
456 !
457 !-----------------------------------------------------------------------
458 !-----------------------------------------------------------------------
459  2000 CONTINUE
460 !-----------------------------------------------------------------------
461 !-----------------------------------------------------------------------
462 !
463 !-----------------------------------------------------------------------
464 !***  PRESSURE TENDENCY, SIGMA DOT, VERTICAL PART OF OMEGA-ALPHA
465 !-----------------------------------------------------------------------
466 !
467       btimx=timef()
468 !-----------------
469 #ifdef DM_PARALLEL
470 #    include "HALO_NMM_D.inc"
471 #endif
472 !-----------------
473       exch_tim=exch_tim+timef()-btimx
474 !     this_tim=timef()-btimx
475 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max             &
476 !    &                  ,mpi_comm_comp,irtn)
477 !     exch_tim_max=exch_tim_max+et_max
478 !
479       btimx=timef()
480 !
481       CALL PDTE(                                                        &
482 #ifdef DM_PARALLEL
483      &            GRID,                                                 &
484 #endif
485      &            NTSD,GRID%DT,PT,ETA2,RES,HYDRO                        &
486      &           ,HTM,HBM2                                              &
487      &           ,PD,PDSL,PDSLO                                         &
488      &           ,PETDT,DIV,PSDT                                        &
489      &           ,IHE,IHW,IVE,IVW,INDX3_WRK                             &
490      &           ,IDS,IDF,JDS,JDF,KDS,KDE                               &
491      &           ,IMS,IME,JMS,JME,KMS,KME                               &
492      &           ,ITS,ITE,JTS,JTE,KTS,KTE)
493 
494       pdte_tim=pdte_tim+timef()-btimx
495 !
496 !-----------------------------------------------------------------------
497 !***  ADVECTION OF T, U, AND V
498 !-----------------------------------------------------------------------
499 !
500       btimx=timef()
501 !-----------------
502 #ifdef DM_PARALLEL
503 #    include "HALO_NMM_F.inc"
504 #    include "HALO_NMM_F1.inc"
505 #endif
506 !-----------------
507       exch_tim=exch_tim+timef()-btimx
508 !     this_tim=timef()-btimx
509 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max             &
510 !    &                  ,mpi_comm_comp,irtn)
511 !     exch_tim_max=exch_tim_max+et_max
512 !
513       btimx=timef()
514 !
515       CALL ADVE(NTSD,GRID%DT,DETA1,DETA2,PDTOP                          &
516      &         ,CURV,F,FAD,F4D,EM_LOC,EMT_LOC,EN,ENT,DX_NMM,DY_NMM      &
517      &         ,HTM,HBM2,VTM,VBM2,LMH,LMV                               &
518      &         ,T,U,V,PDSLO,TOLD,UOLD,VOLD                              &
519      &         ,PETDT,UPSTRM                                            &
520      &         ,FEW,FNS,FNE,FSE                                         &
521      &         ,ADT,ADU,ADV                                             & 
522      &         ,N_IUP_H,N_IUP_V                                         &
523      &         ,N_IUP_ADH,N_IUP_ADV                                     &
524      &         ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                             &
525      &         ,IHE,IHW,IVE,IVW,INDX3_WRK                               &
526      &         ,IDS,IDF,JDS,JDF,KDS,KDE                                 &
527      &         ,IMS,IME,JMS,JME,KMS,KME                                 &
528      &         ,ITS,ITE,JTS,JTE,KTS,KTE)
529 !
530       adve_tim=adve_tim+timef()-btimx
531 !
532 !-----------------------------------------------------------------------
533 !***  PRESSURE TENDENCY, ETA/SIGMADOT, VERTICAL PART OF OMEGA-ALPHA TERM
534 !-----------------------------------------------------------------------
535 !
536       btimx=timef()
537 !
538       CALL VTOA(                                                        &
539 #ifdef DM_PARALLEL
540      &          GRID,                                                   &
541 #endif
542      &          NTSD,GRID%DT,PT,ETA2                                    &
543      &         ,HTM,HBM2,EF4T                                           &
544      &         ,T,DWDT,RTOP,OMGALF                                      &
545      &         ,PINT,DIV,PSDT,RES                                       &
546      &         ,IHE,IHW,IVE,IVW,INDX3_WRK                               &
547      &         ,IDS,IDF,JDS,JDF,KDS,KDE                                 &
548      &         ,IMS,IME,JMS,JME,KMS,KME                                 &
549      &         ,ITS,ITE,JTS,JTE,KTS,KTE)
550 !
551       vtoa_tim=vtoa_tim+timef()-btimx
552 !
553 !-----------------------------------------------------------------------
554 !***  VERTICAL ADVECTION OF HEIGHT
555 !-----------------------------------------------------------------------
556 !
557       btimx=timef()
558 !
559       CALL VADZ(NTSD,GRID%DT,FIS,GRID%SIGMA,DFL,HTM,HBM2                &
560      &         ,DETA1,DETA2,PDTOP                                       &
561      &         ,PINT,PDSL,PDSLO,PETDT                                   &
562      &         ,RTOP,T,Q,CWM,Z,W,DWDT,PDWDT                             &
563      &         ,IHE,IHW,IVE,IVW,INDX3_WRK                               &
564      &         ,IDS,IDF,JDS,JDF,KDS,KDE                                 &
565      &         ,IMS,IME,JMS,JME,KMS,KME                                 &
566      &         ,ITS,ITE,JTS,JTE,KTS,KTE)
567 
568       vadz_tim=vadz_tim+timef()-btimx
569 !
570 !-----------------------------------------------------------------------
571 !***  HORIZONTAL ADVECTION OF HEIGHT
572 !-----------------------------------------------------------------------
573 !
574       btimx=timef()
575 !-----------------
576 #ifdef DM_PARALLEL
577 #    include "HALO_NMM_G.inc"
578 #endif
579 !-----------------
580       exch_tim=exch_tim+timef()-btimx
581 !     this_tim=timef()-btimx
582 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max             &
583 !    &                  ,mpi_comm_comp,irtn)
584 !     exch_tim_max=exch_tim_max+et_max
585 !
586       btimx=timef()
587 !
588       CALL HADZ(NTSD,GRID%DT,HYDRO,HTM,HBM2,DETA1,DETA2,PDTOP           &
589      &         ,DX_NMM,DY_NMM,FAD                                       &
590      &         ,FEW,FNS,FNE,FSE                                         &
591      &         ,PDSL,U,V,W,Z                                            &
592      &         ,IHE,IHW,IVE,IVW,INDX3_WRK                               &
593      &         ,IDS,IDF,JDS,JDF,KDS,KDE                                 &
594      &         ,IMS,IME,JMS,JME,KMS,KME                                 &
595      &         ,ITS,ITE,JTS,JTE,KTS,KTE)
596 !
597       hadz_tim=hadz_tim+timef()-btimx
598 !
599 !-----------------------------------------------------------------------
600 !***  ADVECTION OF W
601 !-----------------------------------------------------------------------
602 !
603       btimx=timef()
604 !-----------------
605 #ifdef DM_PARALLEL
606 #    include "HALO_NMM_H.inc"
607 #endif
608 !-----------------
609       exch_tim=exch_tim+timef()-btimx
610 !     this_tim=timef()-btimx
611 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max             &
612 !    &                  ,mpi_comm_comp,irtn)
613 !     exch_tim_max=exch_tim_max+et_max
614 !
615       btimx=timef()
616 !
617       CALL EPS(NTSD,GRID%DT,HYDRO,DX_NMM,DY_NMM,FAD                     &
618      &        ,DETA1,DETA2,PDTOP,PT                                     &
619      &        ,HTM,HBM2,HBM3,LMH                                        &
620      &        ,PDSL,PDSLO,PINT,RTOP,PETDT,PDWDT                         &
621      &        ,DWDT,DWDTMN,DWDTMX                                       &
622      &        ,FNS,FEW,FNE,FSE                                          &
623      &        ,T,U,V,W,Q,CWM                                            &
624      &        ,IHE,IHW,IVE,IVW,INDX3_WRK                                &
625      &        ,IDS,IDF,JDS,JDF,KDS,KDE                                  &
626      &        ,IMS,IME,JMS,JME,KMS,KME                                  &
627      &        ,ITS,ITE,JTS,JTE,KTS,KTE)
628 !
629       eps_tim=eps_tim+timef()-btimx
630 !
631 !-----------------------------------------------------------------------
632 !***  VERTICAL ADVECTION OF Q, TKE, AND CLOUD WATER
633 !-----------------------------------------------------------------------
634 !
635       IF(MOD(NTSD,GRID%IDTAD)==0)THEN
636         btimx=timef()
637 !
638         vad2_micro_check: IF(CONFIG_FLAGS%MP_PHYSICS==ETAMPNEW)THEN
639           CALL VAD2(NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM               &
640      &             ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP                  &
641      &             ,HBM2,LMH                                            &
642      &             ,Q,Q2,CWM,PETDT                                      &
643      &             ,N_IUP_H,N_IUP_V                                     &
644      &             ,N_IUP_ADH,N_IUP_ADV                                 &
645      &             ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                         &
646      &             ,IHE,IHW,IVE,IVW,INDX3_WRK                           &
647      &             ,IDS,IDF,JDS,JDF,KDS,KDE                             &
648      &             ,IMS,IME,JMS,JME,KMS,KME                             &
649      &             ,ITS,ITE,JTS,JTE,KTS,KTE)
650 !
651         ELSE vad2_micro_check
652           CALL VAD2_SCAL(NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM          &
653      &                  ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP             &
654      &                  ,HBM2,LMH                                       &
655      &                  ,Q2,PETDT                                       &
656      &                  ,N_IUP_H,N_IUP_V                                &
657      &                  ,N_IUP_ADH,N_IUP_ADV                            &
658      &                  ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                    &
659      &                  ,IHE,IHW,IVE,IVW,INDX3_WRK                      &
660      &                  ,1,1                                            &
661      &                  ,IDS,IDF,JDS,JDF,KDS,KDE                        &
662      &                  ,IMS,IME,JMS,JME,KMS,KME                        &
663      &                  ,ITS,ITE,JTS,JTE,KTS,KTE)                              
664      
665           CALL VAD2_SCAL(NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM          &
666      &                  ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP             &
667      &                  ,HBM2,LMH                                       &
668      &                  ,MOIST,PETDT                                    &
669      &                  ,N_IUP_H,N_IUP_V                                &
670      &                  ,N_IUP_ADH,N_IUP_ADV                            &
671      &                  ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                    &
672      &                  ,IHE,IHW,IVE,IVW,INDX3_WRK                      &
673      &                  ,NUM_MOIST,2                                    &
674      &                  ,IDS,IDF,JDS,JDF,KDS,KDE                        &
675      &                  ,IMS,IME,JMS,JME,KMS,KME                        &
676      &                  ,ITS,ITE,JTS,JTE,KTS,KTE)
677 !
678           CALL VAD2_SCAL(NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM          &
679      &                  ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP             &
680      &                  ,HBM2,LMH                                       &
681      &                  ,SCALAR,PETDT                                   &
682      &                  ,N_IUP_H,N_IUP_V                                &
683      &                  ,N_IUP_ADH,N_IUP_ADV                            &
684      &                  ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                    &
685      &                  ,IHE,IHW,IVE,IVW,INDX3_WRK                      &
686      &                  ,NUM_SCALAR,2                                   &
687      &                  ,IDS,IDF,JDS,JDF,KDS,KDE                        &
688      &                  ,IMS,IME,JMS,JME,KMS,KME                        &
689      &                  ,ITS,ITE,JTS,JTE,KTS,KTE)
690 !
691 
692           DO J=MYJS,MYJE
693           DO K=KTS,KTE
694           DO i=MYIS,MYIE
695             Q(I,K,J)=MOIST(I,K,J,P_QV)/(1.+MOIST(I,K,J,P_QV))
696           ENDDO
697           ENDDO   
698           ENDDO   
699 !
700         ENDIF vad2_micro_check
701 !
702         vad2_tim=vad2_tim+timef()-btimx
703 !
704       ENDIF
705 !    
706 !-----------------------------------------------------------------------
707 !***  VERTICAL ADVECTION OF CHEMISTRY
708 !-----------------------------------------------------------------------
709 !
710 #ifdef WRF_CHEM  
711       IF(MOD(NTSD,GRID%IDTAD)==0)THEN
712 #ifdef IBM
713         btimx=timef()
714 #endif
715 !
716         CALL VAD2_SCAL(NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM            &
717      &           ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP                    &
718      &           ,HBM2,LMH                                              &
719      &           ,CHEM,PETDT                                            & 
720      &           ,N_IUP_H,N_IUP_V                                       &
721      &           ,N_IUP_ADH,N_IUP_ADV                                   &
722      &           ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                           &
723      &           ,IHE,IHW,IVE,IVW,INDX3_WRK                             &
724      &           ,NUM_CHEM,1                                            & 
725      &           ,IDS,IDF,JDS,JDF,KDS,KDE                               &
726      &           ,IMS,IME,JMS,JME,KMS,KME                               &
727      &           ,ITS,ITE,JTS,JTE,KTS,KTE)
728 !
729       ENDIF      
730 #endif 
731 !
732 !-----------------------------------------------------------------------
733 !***  HORIZONTAL ADVECTION OF Q, TKE, AND CLOUD WATER
734 !-----------------------------------------------------------------------
735 !
736       IF(MOD(NTSD,GRID%IDTAD)==0)THEN
737         btimx=timef()
738 !-----------------
739 #ifdef DM_PARALLEL
740 #    include "HALO_NMM_I.inc"
741 #endif
742 !
743 #ifdef DM_PARALLEL
744         IF(CONFIG_FLAGS%MP_PHYSICS/=ETAMPNEW)THEN
745 #    include "HALO_NMM_I_3.inc"
746         ENDIF
747 #endif
748 !
749 !-----------------
750         exch_tim=exch_tim+timef()-btimx
751 !       this_tim=timef()-btimx
752 !       call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max           &
753 !    &                    ,mpi_comm_comp,irtn)
754 !       exch_tim_max=exch_tim_max+et_max
755 !
756         btimx=timef()
757 !
758 !-----------------------------------------------------------------------
759         had2_micro_check: IF(CONFIG_FLAGS%MP_PHYSICS==ETAMPNEW)THEN
760 !-----------------------------------------------------------------------
761 !
762           CALL HAD2(                                                   &
763 #if defined(DM_PARALLEL)
764      &              GRID%DOMDESC,                                      &
765 #endif
766      &              NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM              &
767      &             ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP                 &
768      &             ,HTM,HBM2,HBM3,LMH                                  &
769      &             ,Q,Q2,CWM,U,V,Z,HYDRO                               &
770      &             ,N_IUP_H,N_IUP_V                                    &
771      &             ,N_IUP_ADH,N_IUP_ADV                                &
772      &             ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                        &
773      &             ,IHE,IHW,IVE,IVW,INDX3_WRK                          &
774      &             ,IDS,IDF,JDS,JDF,KDS,KDE                            &
775      &             ,IMS,IME,JMS,JME,KMS,KME                            &
776      &             ,ITS,ITE,JTS,JTE,KTS,KTE)
777 !
778 !***  UPDATE MOIST ARRAY
779 !
780           DO J=MYJS,MYJE
781           DO K=KTS,KTE
782           DO I=MYIS,MYIE
783             MOIST(I,K,J,P_QV)=Q(I,K,J)/(1.-Q(I,K,J))
784             WC = CWM(I,K,J)
785             QI = 0.
786             QR = 0.
787             QW = 0.
788             FICE=F_ICE(I,K,J)
789             FRAIN=F_RAIN(I,K,J)
790 !
791             IF(FICE>=1.)THEN
792               QI=WC
793             ELSEIF(FICE<=0.)THEN
794               QW=WC
795             ELSE
796               QI=FICE*WC
797               QW=WC-QI
798             ENDIF
799 !
800             IF(QW>0..AND.FRAIN>0.)THEN
801               IF(FRAIN>=1.)THEN
802                 QR=QW
803                 QW=0.
804               ELSE
805                 QR=FRAIN*QW
806                 QW=QW-QR
807               ENDIF
808             ENDIF
809 !
810             MOIST(I,K,J,P_QC)=QW
811             MOIST(I,K,J,P_QR)=QR
812             MOIST(I,K,J,P_QI)=0.
813             MOIST(I,K,J,P_QS)=QI
814             MOIST(I,K,J,P_QG)=0.
815           ENDDO
816           ENDDO
817           ENDDO
818 !
819 !-----------------------------------------------------------------------
820         ELSE had2_micro_check
821 !-----------------------------------------------------------------------
822 !
823           CALL HAD2_SCAL(                                              &
824 #if defined(DM_PARALLEL)
825      &                   GRID%DOMDESC,                                 &
826 #endif        
827      &                   NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM         &
828      &                  ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP            &
829      &                  ,HTM,HBM2,HBM3,LMH                             &
830      &                  ,Q2,U,V,Z,HYDRO                                &
831      &                  ,N_IUP_H,N_IUP_V                               &
832      &                  ,N_IUP_ADH,N_IUP_ADV                           &
833      &                  ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                   &
834      &                  ,IHE,IHW,IVE,IVW,INDX3_WRK                     &
835      &                  ,1,1                                           &
836      &                  ,IDS,IDF,JDS,JDF,KDS,KDE                       &
837      &                  ,IMS,IME,JMS,JME,KMS,KME                       &
838      &                  ,ITS,ITE,JTS,JTE,KTS,KTE)
839 !        
840           CALL HAD2_SCAL(                                              &
841 #if defined(DM_PARALLEL)
842      &                   GRID%DOMDESC,                                 &
843 #endif
844      &                   NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM         &
845      &                  ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP            &
846      &                  ,HTM,HBM2,HBM3,LMH                             &
847      &                  ,MOIST,U,V,Z,HYDRO                             &
848      &                  ,N_IUP_H,N_IUP_V                               &
849      &                  ,N_IUP_ADH,N_IUP_ADV                           &
850      &                  ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                   &
851      &                  ,IHE,IHW,IVE,IVW,INDX3_WRK                     &
852      &                  ,NUM_MOIST,2                                   &
853      &                  ,IDS,IDF,JDS,JDF,KDS,KDE                       &
854      &                  ,IMS,IME,JMS,JME,KMS,KME                       &
855      &                  ,ITS,ITE,JTS,JTE,KTS,KTE)
856 !
857           CALL HAD2_SCAL(                                              &
858 #if defined(DM_PARALLEL)
859      &                   GRID%DOMDESC,                                 &
860 #endif
861      &                   NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM         &
862      &                  ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP            &
863      &                  ,HTM,HBM2,HBM3,LMH                             &
864      &                  ,SCALAR,U,V,Z,HYDRO                            &
865      &                  ,N_IUP_H,N_IUP_V                               &
866      &                  ,N_IUP_ADH,N_IUP_ADV                           &
867      &                  ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                   &
868      &                  ,IHE,IHW,IVE,IVW,INDX3_WRK                     &
869      &                  ,NUM_SCALAR,2                                  &
870      &                  ,IDS,IDF,JDS,JDF,KDS,KDE                       &
871      &                  ,IMS,IME,JMS,JME,KMS,KME                       &
872      &                  ,ITS,ITE,JTS,JTE,KTS,KTE)                             
873 !    
874           DO J=MYJS,MYJE
875           DO K=KTS,KTE 
876           DO I=MYIS,MYIE
877             Q(I,K,J)=MOIST(I,K,J,P_QV)/(1.+MOIST(I,K,J,P_QV))           
878           ENDDO
879           ENDDO    
880           ENDDO   
881 !
882 !-----------------------------------------------------------------------
883         ENDIF had2_micro_check
884 !-----------------------------------------------------------------------
885 !
886         had2_tim=had2_tim+timef()-btimx
887       ENDIF
888 !
889 !-----------------------------------------------------------------------
890 !***  HORIZONTAL ADVECTION OF CHEMISTRY
891 !-----------------------------------------------------------------------
892 !
893 #ifdef WRF_CHEM
894       IF(MOD(NTSD,GRID%IDTAD)==0)THEN
895         btimx=timef()
896 #ifdef DM_PARALLEL
897 #    include "HALO_NMM_I_2.inc"
898 #endif
899         exch_tim=exch_tim+timef()-btimx
900 !       this_tim=timef()-btimx
901 !       call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max           &
902 !    &                    ,mpi_comm_comp,irtn)
903 !       exch_tim_max=exch_tim_max+et_max
904 !
905         btimx=timef()
906 !
907         CALL HAD2_SCAL(                                                &
908 #if defined(DM_PARALLEL)
909      &                 GRID%DOMDESC,                                   &
910 #endif
911      &                 NTSD,GRID%DT,GRID%IDTAD,DX_NMM,DY_NMM           &
912      &                ,AETA1,AETA2,DETA1,DETA2,PDSL,PDTOP              &
913      &                ,HTM,HBM2,HBM3,LMH                               &
914      &                ,CHEM,U,V,Z,HYDRO                                &
915      &                ,N_IUP_H,N_IUP_V                                 &
916      &                ,N_IUP_ADH,N_IUP_ADV                             &
917      &                ,IUP_H,IUP_V,IUP_ADH,IUP_ADV                     &
918      &                ,IHE,IHW,IVE,IVW,INDX3_WRK                       &
919      &                ,NUM_CHEM,1                                      &
920      &                ,IDS,IDF,JDS,JDF,KDS,KDE                         &
921      &                ,IMS,IME,JMS,JME,KMS,KME                         &
922      &                ,ITS,ITE,JTS,JTE,KTS,KTE)
923 
924       ENDIF
925 #endif
926 !
927 !----------------------------------------------------------------------
928 !***  RADIATION
929 !----------------------------------------------------------------------
930 !
931 !***  When allocating CAM radiation 4d arrays (ozmixm, aerosolc), 
932 !***  the following two scalars are not needed.
933 !
934       NUM_OZMIXM=1
935       NUM_AEROSOLC=1
936 !
937       IF(NTSD<=0)THEN
938         NTSD_rad=NTSD
939       ELSE
940 !
941 !***  Call radiation just BEFORE the top of the hour
942 !***  so that updated fields are written to history files.
943 !
944         NTSD_rad=NTSD+1
945       ENDIF
946 !
947       IF(MOD(NTSD_rad,GRID%NRADS)==0.OR.                               &
948      &   MOD(NTSD_rad,GRID%NRADL)==0)THEN
949         btimx=timef()
950 !
951         CALL RADIATION(NTSD_rad,GRID%DT,GRID%JULDAY,GRID%JULYR         &
952      &                ,GRID%XTIME,GRID%JULIAN                          &
953      &                ,IHRST,GRID%NPHS                                 &
954      &                ,GLAT,GLON,GRID%NRADS,GRID%NRADL                 &
955      &                ,DETA1,DETA2,AETA1,AETA2,ETA1,ETA2,PDTOP,PT      &
956      &                ,PD,RES,PINT,T,Q,MOIST,THS,ALBEDO,EPSR           &
957      &                ,F_ICE,F_RAIN                                    &
958 #ifdef WRF_CHEM
959      &                ,GD_CLOUD,GD_CLOUD2                              &
960 #endif
961      &                ,SM,HBM2,LMH,CLDFRA,N_MOIST,RESTRT               &
962      &                ,RLWTT,RSWTT,RLWIN,RSWIN,RSWINC,RSWOUT           &
963      &                ,RLWTOA,RSWTOA,CZMEAN                            &
964      &                ,CFRACL,CFRACM,CFRACH,SIGT4                      &
965      &                ,ACFRST,NCFRST,ACFRCV,NCFRCV                     &
966      &                ,CUPPT,VEGFRC,SNO,HTOP,HBOT                      &
967      &                ,Z,SICE,NUM_AEROSOLC,NUM_OZMIXM                  &
968      &                ,GRID,CONFIG_FLAGS                               &
969      &                ,RTHRATEN                                        &  
970 #ifdef WRF_CHEM
971      &                ,PM2_5_DRY, PM2_5_WATER, PM2_5_DRY_EC            &
972      &                ,TAUAER1, TAUAER2, TAUAER3, TAUAER4              & 
973      &                ,GAER1, GAER2, GAER3, GAER4                      &
974      &                ,WAER1, WAER2, WAER3, WAER4                      &
975 #endif
976      &                ,IDS,IDF,JDS,JDF,KDS,KDE                         &
977      &                ,IMS,IME,JMS,JME,KMS,KME                         &
978      &                ,ITS,ITE,JTS,JTE,KTS,KTE)
979 !
980         DO J=JMS,JME
981         DO I=IMS,IME
982           GSW(I,J)=RSWIN(I,J)-RSWOUT(I,J)
983         ENDDO
984         ENDDO
985 !
986 !                            ***  NOTE  ***
987 ! RLWIN/RSWIN  - downward longwave/shortwave at the surface (formerly TOTLWDN/TOTSWDN)
988 ! RSWINC - CLEAR-SKY downward shortwave at the surface (new for AQ)
989 !                            ***  NOTE  ***
990 !
991         radiation_tim=radiation_tim+timef()-btimx
992       ENDIF
993 !
994 !----------------------------------------------------------------------
995 !***  APPLY TEMPERATURE TENDENCY DUE TO RADIATION
996 !----------------------------------------------------------------------
997 !
998       btimx=timef()
999 !
1000       CALL RDTEMP(NTSD,GRID%DT,GRID%JULDAY,GRID%JULYR,IHRST,GLAT,GLON  &
1001      &           ,CZEN,CZMEAN,T,RSWTT,RLWTT,HTM,HBM2                   &
1002      &           ,IDS,IDF,JDS,JDF,KDS,KDE                              &
1003      &           ,IMS,IME,JMS,JME,KMS,KME                              &
1004      &           ,ITS,ITE,JTS,JTE,KTS,KTE)
1005 !
1006       rdtemp_tim=rdtemp_tim+timef()-btimx
1007 !
1008 !----------------------------------------------------------------------
1009 !***  TURBULENT PROCESSES 
1010 !----------------------------------------------------------------------
1011 !
1012       IF(MOD(NTSD,GRID%NPHS)==0)THEN
1013 !
1014         btimx=timef()
1015 !
1016         CALL TURBL(NTSD,GRID%DT,GRID%NPHS,RESTRT                       &
1017      &            ,N_MOIST,GRID%NUM_SOIL_LAYERS,SLDPTH,DZSOIL          &
1018      &            ,DETA1,DETA2,AETA1,AETA2,ETA1,ETA2,PDTOP,PT          &
1019 !    &            ,SM,LMH,HTM,VTM,HBM2,VBM2,DX_NMM,DFL                 &
1020      &            ,SM,LMH,HTM,VTM,HBM2,VBM2,DX_NMM,DFRLG               &
1021      &            ,CZEN,CZMEAN,SIGT4,RLWIN,RSWIN,RADOT                 &
1022      &            ,PD,RES,PINT,T,Q,CWM,F_ICE,F_RAIN,SR                 &
1023      &            ,Q2,U,V,THS,NMM_TSK,SST,PREC,SNO,ZERO_3D             &
1024      &            ,FIS,Z0,Z0BASE,USTAR,PBLH,LPBL,EL_MYJ                &
1025      &            ,MOIST,RMOL                                          &
1026      &            ,EXCH_H,AKHS,AKMS,AKHS_OUT,AKMS_OUT                  &
1027      &            ,THZ0,QZ0,UZ0,VZ0,QSH,MAVAIL                         &
1028      &            ,STC,SMC,CMC,SMSTAV,SMSTOT,SSROFF,BGROFF             &
1029      &            ,IVGTYP,ISLTYP,VEGFRC,SHDMIN,SHDMAX,GRNFLX           &
1030      &            ,SFCEXC,ACSNOW,ACSNOM,SNOPCX,SICE,TG,SOILTB          &
1031      &            ,ALBASE,MXSNAL,ALBEDO,SH2O,SI,EPSR                   &
1032      &            ,U10,V10,TH10,Q10,TSHLTR,QSHLTR,PSHLTR               &
1033      &            ,T2,QSG,QVG,QCG,SOILT1,TSNAV,SMFR3D,KEEPFR3DFLAG     &
1034      &            ,TWBS,QWBS,SFCSHX,SFCLHX,SFCEVP                      &
1035      &            ,POTEVP,POTFLX,SUBSHX                                &
1036      &            ,APHTIM,ARDSW,ARDLW,ASRFC                            &
1037      &            ,RSWOUT,RSWTOA,RLWTOA                                &
1038      &            ,ASWIN,ASWOUT,ASWTOA,ALWIN,ALWOUT,ALWTOA             &
1039      &            ,UZ0H,VZ0H,DUDT,DVDT                                 & 
1040      &            ,RTHBLTEN,RQVBLTEN                                   & 
1041      &            ,GRID%PCPFLG,DDATA                                   &
1042      &            ,GRID,CONFIG_FLAGS                                   &
1043      &            ,IHE,IHW,IVE,IVW                                     &
1044      &            ,IDS,IDF,JDS,JDF,KDS,KDE                             &
1045      &            ,IMS,IME,JMS,JME,KMS,KME                             &
1046      &            ,ITS,ITE,JTS,JTE,KTS,KTE)
1047 !
1048 !                     ***  NOTE  ***
1049 ! RLWIN/RSWIN - downward longwave/shortwave at the surface
1050 !                     ***  NOTE  ***
1051 !
1052         turbl_tim=turbl_tim+timef()-btimx
1053 !
1054         btimx=timef()
1055 !-----------------
1056 #ifdef DM_PARALLEL
1057 # include "HALO_NMM_TURBL_A.inc"
1058 #endif
1059 !-----------------
1060 #ifdef DM_PARALLEL
1061 # include "HALO_NMM_TURBL_B.inc"
1062 #endif
1063 !-----------------
1064         exch_tim=exch_tim+timef()-btimx
1065 !       this_tim=timef()-btimx
1066 !       call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max           &
1067 !    &                    ,mpi_comm_comp,irtn)
1068 !       exch_tim_max=exch_tim_max+et_max
1069 !
1070 !***  INTERPOLATE WINDS FROM H POINTS BACK TO V POINTS.
1071 !
1072         btimx=timef()
1073         CALL UV_H_TO_V(NTSD,GRID%DT,GRID%NPHS,UZ0H,VZ0H,UZ0,VZ0         &
1074      &                ,DUDT,DVDT,U,V,HBM2,VTM,IVE,IVW                   &
1075      &                ,IDS,IDF,JDS,JDF,KDS,KDE                          &
1076      &                ,IMS,IME,JMS,JME,KMS,KME                          &
1077      &                ,ITS,ITE,JTS,JTE,KTS,KTE)
1078         uv_htov_tim=uv_htov_tim+timef()-btimx
1079 !
1080 !----------------------------------------------------------------------
1081 !*** STORE ORIGINAL TEMPERATURE ARRAY
1082 !----------------------------------------------------------------------
1083 !
1084         btimx=timef()
1085 !-----------------
1086 #ifdef DM_PARALLEL
1087 #    include "HALO_NMM_J.inc"
1088 #endif
1089 !
1090 #ifdef DM_PARALLEL
1091         IF(CONFIG_FLAGS%MP_PHYSICS/=ETAMPNEW)THEN
1092 #    include "HALO_NMM_J_3.inc"
1093         ENDIF
1094 #endif
1095 !
1096 #ifdef WRF_CHEM
1097 #ifdef DM_PARALLEL
1098 #    include "HALO_NMM_J_2.inc"
1099 #endif
1100 #endif
1101 !-----------------
1102         exch_tim=exch_tim+timef()-btimx
1103 !       this_tim=timef()-btimx
1104 !       call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max           &
1105 !    &                    ,mpi_comm_comp,irtn)
1106 !       exch_tim_max=exch_tim_max+et_max
1107 !
1108         ICLTEND=-1
1109         btimx=timef()
1110 ! 
1111         CALL CLTEND(ICLTEND,GRID%NPHS,T,T_OLD,T_ADJ                    &
1112      &             ,IDS,IDF,JDS,JDF,KDS,KDE                            &
1113      &             ,IMS,IME,JMS,JME,KMS,KME                            &
1114      &             ,ITS,ITE,JTS,JTE,KTS,KTE)
1115 !
1116         cltend_tim=cltend_tim+timef()-btimx
1117       ENDIF
1118 !
1119 !----------------------------------------------------------------------
1120 !***  CONVECTIVE PRECIPITATION
1121 !----------------------------------------------------------------------
1122       IF(MOD(NTSD,GRID%NCNVC)==0.AND.                                  &
1123      &   CONFIG_FLAGS%CU_PHYSICS==KFETASCHEME)THEN
1124 !
1125         btimx=timef()
1126 !-----------------
1127 #ifdef DM_PARALLEL
1128 #    include "HALO_NMM_C.inc"
1129 #endif
1130 !-----------------
1131         exch_tim=exch_tim+timef()-btimx
1132 !       this_tim=timef()-btimx
1133 !       call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max          &
1134 !    &                    ,mpi_comm_comp,irtn)
1135 !       exch_tim_max=exch_tim_max+et_max
1136       ENDIF
1137 !
1138       IF(GRID%NCNVC/=999)THEN
1139         btimx=timef()
1140 !
1141 !***  GET TENDENCIES FOR GD SCHEME.
1142 !    
1143         IF(CONFIG_FLAGS%CU_PHYSICS==GDSCHEME)THEN
1144           DT_INV=1./GRID%DT
1145           DO J=JMS,JME
1146           DO K=KMS,KME
1147           DO I=IMS,IME
1148             TTEN(I,K,J)=(T(I,K,J)-TTEN(I,K,J))*DT_INV
1149             QTEN(I,K,J)=(Q(I,K,J)-QTEN(I,K,J))*DT_INV
1150           ENDDO
1151           ENDDO
1152           ENDDO
1153         ENDIF
1154 
1155         CALL CUCNVC(NTSD,GRID%DT,GRID%NCNVC,GRID%NRADS,GRID%NRADL      &
1156      &             ,GPS,RESTRT,HYDRO,CLDEFI,LMH,N_MOIST,GRID%ENSDIM    &
1157      &             ,MOIST                                              &
1158      &             ,DETA1,DETA2,AETA1,AETA2,ETA1,ETA2                  &
1159      &             ,F_ICE,F_RAIN                                       &
1160 !***  Changes for other cu schemes, most for GD scheme
1161      &             ,APR_GR,APR_W,APR_MC,TTEN,QTEN                      &
1162      &             ,APR_ST,APR_AS,APR_CAPMA                            &
1163      &             ,APR_CAPME,APR_CAPMI                                &
1164      &             ,MASS_FLUX,XF_ENS                                   &
1165      &             ,PR_ENS,GSW                                         &
1166 #ifdef WRF_CHEM
1167      &             ,GD_CLOUD,GD_CLOUD2                                 &
1168 #endif
1169 !
1170      &             ,PDTOP,PT,PD,RES,PINT,T,Q,CWM,TCUCN                 &
1171      &             ,OMGALF,U,V,VTM,W,Z,FIS,W0AVG                       &
1172      &             ,PREC,ACPREC,CUPREC,CUPPT,CPRATE                    &
1173      &             ,SM,HBM2,LPBL,CNVBOT,CNVTOP                         &
1174      &             ,HTOP,HBOT,HTOPD,HBOTD,HTOPS,HBOTS                  &
1175      &             ,RTHBLTEN,RQVBLTEN,RTHRATEN                         & 
1176      &             ,AVCNVC,ACUTIM,ZERO_3D,IHE,IHW                      &
1177      &             ,GRID,CONFIG_FLAGS                                  &
1178      &             ,IDS,IDF,JDS,JDF,KDS,KDE                            &
1179      &             ,IMS,IME,JMS,JME,KMS,KME                            &
1180      &             ,ITS,ITE,JTS,JTE,KTS,KTE)
1181 !
1182         cucnvc_tim=cucnvc_tim+timef()-btimx
1183 !
1184       ENDIF
1185 !
1186 !----------------------------------------------------------------------
1187 !***  GRIDSCALE MICROPHYSICS (CONDENSATION & PRECIPITATION)
1188 !----------------------------------------------------------------------
1189 !
1190       IF(MOD(NTSD,GRID%NPHS)==0)THEN
1191         btimx=timef()
1192 !
1193         CALL GSMDRIVE(NTSD,GRID%DT,GRID%NPHS,N_MOIST                   &
1194      &               ,DX_NMM(ITS,JC),GRID%DY,LMH,SM,HBM2,FIS           &
1195      &               ,DETA1,DETA2,AETA1,AETA2,ETA1,ETA2                &
1196      &               ,PDTOP,PT,PD,RES,PINT,T,Q,CWM,TRAIN               &
1197      &               ,MOIST,SCALAR,NUM_SCALAR                          &
1198      &               ,F_ICE,F_RAIN,F_RIMEF,SR                          &
1199      &               ,PREC,ACPREC,AVRAIN,ZERO_3D                       &
1200      &               ,MP_RESTART_STATE                                 &
1201      &               ,TBPVS_STATE                                      &
1202      &               ,TBPVS0_STATE                                     &
1203      &               ,GRID,CONFIG_FLAGS                                &
1204      &               ,IDS,IDF,JDS,JDF,KDS,KDE                          &
1205      &               ,IMS,IME,JMS,JME,KMS,KME                          &
1206      &               ,ITS,ITE,JTS,JTE,KTS,KTE)
1207 !
1208         gsmdrive_tim=gsmdrive_tim+timef()-btimx
1209 !
1210 !-----------------------------------------------------------------------
1211 !---------PRECIPITATION ASSIMILATION------------------------------------
1212 !-----------------------------------------------------------------------
1213 !
1214         IF (GRID%PCPFLG) THEN
1215           btimx=timef()
1216 !
1217           CALL CHKSNOW(NTSD,GRID%DT,GRID%NPHS,SR,PPTDAT                 &
1218      &      ,IDS,IDE,JDS,JDE,KDS,KDE                                    &
1219      &      ,IMS,IME,JMS,JME,KMS,KME                                    &
1220      &      ,ITS,ITE,JTS,JTE,KTS,KTE)
1221           CALL ADJPPT(NTSD,GRID%DT,GRID%NPHS,PREC,LSPA,PPTDAT,DDATA     &
1222      &      ,IDS,IDE,JDS,JDE,KDS,KDE                                    &
1223      &      ,IMS,IME,JMS,JME,KMS,KME                                    &
1224      &      ,ITS,ITE,JTS,JTE,KTS,KTE)
1225 !
1226           adjppt_tim=adjppt_tim+timef()-btimx
1227         ENDIF
1228 !
1229 !----------------------------------------------------------------------
1230 !***  CALCULATE TEMP TENDENCIES AND RESTORE ORIGINAL TEMPS
1231 !----------------------------------------------------------------------
1232 !      
1233         ICLTEND=0
1234         btimx=timef()
1235 !
1236         CALL CLTEND(ICLTEND,GRID%NPHS,T,T_OLD,T_ADJ                    &
1237      &             ,IDS,IDF,JDS,JDF,KDS,KDE                            &
1238      &             ,IMS,IME,JMS,JME,KMS,KME                            &
1239      &             ,ITS,ITE,JTS,JTE,KTS,KTE)
1240 !
1241         cltend_tim=cltend_tim+timef()-btimx
1242       ENDIF
1243 !
1244 !----------------------------------------------------------------------
1245 !***  UPDATE TEMP TENDENCIES FROM CLOUD PROCESSES EVERY TIME STEP
1246 !----------------------------------------------------------------------
1247 !
1248       ICLTEND=1
1249       btimx=timef()
1250 !
1251       CALL CLTEND(ICLTEND,GRID%NPHS,T,T_OLD,T_ADJ                      &
1252      &           ,IDS,IDF,JDS,JDF,KDS,KDE                              &
1253      &           ,IMS,IME,JMS,JME,KMS,KME                              &
1254      &           ,ITS,ITE,JTS,JTE,KTS,KTE)
1255 !
1256       cltend_tim=cltend_tim+timef()-btimx
1257 !
1258 !----------------------------------------------------------------------
1259 !***  LATERAL DIFFUSION
1260 !----------------------------------------------------------------------
1261 !
1262       btimx=timef()
1263 !-----------------
1264 #ifdef DM_PARALLEL
1265 #    include "HALO_NMM_K.inc"
1266 #endif
1267 !-----------------
1268       exch_tim=exch_tim+timef()-btimx
1269 !     this_tim=timef()-btimx
1270 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max             &
1271 !    &                  ,mpi_comm_comp,irtn)
1272 !     exch_tim_max=exch_tim_max+et_max
1273 !
1274       btimx=timef()
1275 !
1276       CALL HDIFF(NTSD,GRID%DT,FIS,DY_NMM,HDAC,HDACV                    &
1277      &          ,HTM,HBM2,VTM,DETA1,GRID%SIGMA                         &
1278      &          ,T,Q,U,V,Q2,Z,W,SM,SICE                                &
1279      &          ,IHE,IHW,IVE,IVW,INDX3_WRK                             &
1280      &          ,IDS,IDF,JDS,JDF,KDS,KDE                               &
1281      &          ,IMS,IME,JMS,JME,KMS,KME                               &
1282      &          ,ITS,ITE,JTS,JTE,KTS,KTE)
1283 !
1284       DO J=MYJS,MYJE
1285       DO K=KTS,KTE
1286       DO I=MYIS,MYIE
1287 !!!      MOIST(I,K,J,P_QV)=MAX(0.,Q(I,K,J)/(1.-Q(I,K,J)))
1288          MOIST(I,K,J,P_QV)=Q(I,K,J)/(1.-Q(I,K,J))
1289       ENDDO
1290       ENDDO
1291       ENDDO
1292 !
1293       hdiff_tim=hdiff_tim+timef()-btimx
1294 !
1295 !----------------------------------------------------------------------
1296 !***  UPDATING BOUNDARY VALUES AT HEIGHT POINTS
1297 !----------------------------------------------------------------------
1298 !
1299       btimx=timef()
1300 !-----------------
1301 #ifdef DM_PARALLEL
1302 #    include "HALO_NMM_L.inc"
1303 #endif
1304 !
1305 #ifdef DM_PARALLEL
1306 #    include "HALO_NMM_L_3.inc"
1307 #endif
1308 !
1309 #ifdef WRF_CHEM
1310 #ifdef DM_PARALLEL
1311 #    include "HALO_NMM_L_2.inc"
1312 #endif
1313 #endif
1314 !-----------------
1315       exch_tim=exch_tim+timef()-btimx
1316 !     this_tim=timef()-btimx
1317 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max             &
1318 !    &                  ,mpi_comm_comp,irtn)
1319 !     exch_tim_max=exch_tim_max+et_max
1320 !
1321       btimx=timef()
1322 !
1323       CALL BOCOH(GRID%ID,NTSD,GRID%DT,NEST,NUNIT_NBC,NBOCO,LAST_TIME,TSPH & 
1324      &          ,LB,ETA1,ETA2,PDTOP,PT,RES,HTM                         &
1325      &          ,PD_B,T_B,Q_B,U_B,V_B,Q2_B,CWM_B                       &
1326      &          ,PD_BT,T_BT,Q_BT,U_BT,V_BT,Q2_BT,CWM_BT                &
1327      &          ,PD,T,Q,Q2,CWM,PINT,MOIST,N_MOIST,SCALAR,NUM_SCALAR    &
1328 #ifdef WRF_CHEM
1329      &          ,CHEM,NUM_CHEM,CONFIG_FLAGS                            &
1330 #endif
1331      &          ,IJDS,IJDE,GRID%SPEC_BDY_WIDTH,Z                       &
1332      &          ,IHE,IHW,IVE,IVW,INDX3_WRK                             &
1333      &          ,IDS,IDF,JDS,JDF,KDS,KDE                               &
1334      &          ,IMS,IME,JMS,JME,KMS,KME                               &
1335      &          ,ITS,ITE,JTS,JTE,KTS,KTE)
1336 !
1337       bocoh_tim=bocoh_tim+timef()-btimx
1338 !     if(mod(ntsd,n_print_time)==0)then
1339 !       call twr(t,0,'t',ntsd,mype,npes,mpi_comm_comp &
1340 !    &          ,ids,ide,jds,jde,kds,kde                               &
1341 !    &          ,ims,ime,jms,jme,kms,kme                               &
1342 !    &          ,its,ite,jts,jte,kts,kte)
1343 !     endif
1344 !
1345 !----------------------------------------------------------------------
1346 !***  IS IT TIME FOR A CHECK POINT ON THE MODEL HISTORY FILE?
1347 !----------------------------------------------------------------------
1348 !
1349  2003 CONTINUE
1350 !
1351 !----------------------------------------------------------------------
1352 !***  PRESSURE GRD, CORIOLIS, DIVERGENCE, AND HORIZ PART OF OMEGA-ALPHA
1353 !----------------------------------------------------------------------
1354 !
1355       btimx=timef()
1356 !-----------------
1357 #ifdef DM_PARALLEL
1358 #    include "HALO_NMM_A.inc"
1359 #endif
1360 !
1361 #ifdef DM_PARALLEL
1362       IF(CONFIG_FLAGS%MP_PHYSICS/=ETAMPNEW)THEN
1363 #    include "HALO_NMM_A_3.inc"
1364       ENDIF
1365 #endif
1366 !
1367 #ifdef WRF_CHEM
1368 #ifdef DM_PARALLEL
1369 #    include "HALO_NMM_A_2.inc"
1370 #endif
1371 #endif
1372 !-----------------
1373       exch_tim=exch_tim+timef()-btimx
1374 !     this_tim=timef()-btimx
1375 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max             &
1376 !    &                  ,mpi_comm_comp,irtn)
1377 !     exch_tim_max=exch_tim_max+et_max
1378 !
1379       btimx=timef()
1380 !
1381       CALL PFDHT(NTSD,LAST_TIME,PT,DETA1,DETA2,PDTOP,RES,FIS           &
1382      &          ,HYDRO,GRID%SIGMA,FIRST,DX_NMM,DY_NMM                  &
1383      &          ,HTM,HBM2,VTM,VBM2,VBM3                                &
1384      &          ,FDIV,FCP,WPDAR,DFL,CPGFU,CPGFV                        &
1385      &          ,PD,PDSL,T,Q,U,V,CWM,OMGALF,PINT,DWDT                  &
1386      &          ,RTOP,DIV,FEW,FNS,FNE,FSE                              &
1387      &          ,IHE,IHW,IVE,IVW,INDX3_WRK                             &
1388      &          ,IDS,IDF,JDS,JDF,KDS,KDE                               &
1389      &          ,IMS,IME,JMS,JME,KMS,KME                               &
1390      &          ,ITS,ITE,JTS,JTE,KTS,KTE)
1391 !
1392       pfdht_tim=pfdht_tim+timef()-btimx
1393 !
1394 !----------------------------------------------------------------------
1395 !***  DIVERGENCE DAMPING
1396 !----------------------------------------------------------------------
1397 !
1398       btimx=timef()
1399 !-----------------
1400 #ifdef DM_PARALLEL
1401 #    include "HALO_NMM_B.inc"
1402 #endif
1403 !-----------------
1404       exch_tim=exch_tim+timef()-btimx
1405 !     this_tim=timef()-btimx
1406 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max            &
1407 !    &                  ,mpi_comm_comp,irtn)
1408 !     exch_tim_max=exch_tim_max+et_max
1409 !
1410       btimx=timef()
1411 !
1412       CALL DDAMP(NTSD,GRID%DT,DETA1,DETA2,PDSL,PDTOP,DIV,HBM2,VTM      &
1413      &          ,T,U,V,DDMPU,DDMPV                                     &
1414      &          ,IHE,IHW,IVE,IVW,INDX3_WRK                             &
1415      &          ,IDS,IDF,JDS,JDF,KDS,KDE                               &
1416      &          ,IMS,IME,JMS,JME,KMS,KME                               &
1417      &          ,ITS,ITE,JTS,JTE,KTS,KTE)
1418 !
1419       ddamp_tim=ddamp_tim+timef()-btimx
1420 !----------------------------------------------------------------------
1421 !----------------------------------------------------------------------
1422 !
1423       IF(FIRST.AND.NTSD==0)THEN
1424         FIRST=.FALSE.
1425         btimx=timef()
1426 !-----------------
1427 #ifdef DM_PARALLEL
1428 #    include "HALO_NMM_A.inc"
1429 #endif
1430 #ifdef WRF_CHEM
1431 #ifdef DM_PARALLEL
1432 #    include "HALO_NMM_A_2.inc"
1433 #endif
1434 #endif
1435 !-----------------
1436         exch_tim=exch_tim+timef()-btimx
1437 !       this_tim=timef()-btimx
1438 !       call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max          &
1439 !    &                    ,mpi_comm_comp,irtn)
1440 !       exch_tim_max=exch_tim_max+et_max
1441 !
1442         GO TO 2000
1443       ENDIF
1444 !
1445 !----------------------------------------------------------------------
1446 !***  UPDATING BOUNDARY VALUES AT VELOCITY POINTS
1447 !----------------------------------------------------------------------
1448 !
1449       btimx=timef()
1450 !-----------------
1451 #ifdef DM_PARALLEL
1452 #    include "HALO_NMM_C.inc"
1453 #endif
1454 !-----------------
1455       exch_tim=exch_tim+timef()-btimx
1456 !     this_tim=timef()-btimx
1457 !     call mpi_allreduce(this_tim,et_max,1,mpi_real,mpi_max            &
1458 !    &                  ,mpi_comm_comp,irtn)
1459 !     exch_tim_max=exch_tim_max+et_max
1460 !
1461       btimx=timef()
1462 !
1463       CALL BOCOV(GRID%ID,NTSD,GRID%DT,LB,VTM,U_B,V_B,U_BT,V_BT         & 
1464      &          ,U,V                                                   &
1465      &          ,IJDS,IJDE,GRID%SPEC_BDY_WIDTH                         &
1466      &          ,IHE,IHW,IVE,IVW,INDX3_WRK                             &
1467      &          ,IDS,IDF,JDS,JDF,KDS,KDE                               &
1468      &          ,IMS,IME,JMS,JME,KMS,KME                               &
1469      &          ,ITS,ITE,JTS,JTE,KTS,KTE )
1470 !
1471       bocov_tim=bocov_tim+timef()-btimx
1472 !
1473 !----------------------------------------------------------------------
1474 !***  COPY THE NMM VARIABLE Q2 TO THE WRF VARIABLE TKE_MYJ
1475 !----------------------------------------------------------------------
1476 !
1477       DO J=JTS,JTE
1478       DO K=KTS,KTE
1479       DO I=ITS,ITE
1480         TKE_MYJ(I,K,J)=0.5*Q2(I,K,J) !TKE is q squared over 2
1481       ENDDO
1482       ENDDO
1483       ENDDO
1484 !
1485 !----------------------------------------------------------------------
1486 !
1487       IF(LAST_TIME.AND.ALLOCATED(PPTDAT))THEN
1488         DEALLOCATE(PPTDAT,STAT=ISTAT)
1489       ENDIF
1490 !
1491 !----------------------------------------------------------------------
1492 !
1493       solve_tim=solve_tim+timef()-btim
1494 !
1495 !----------------------------------------------------------------------
1496 !***  PRINT TIMING VARIABLES WHEN DESIRED.
1497 !----------------------------------------------------------------------
1498 !
1499       sum_tim=pdte_tim+adve_tim+vtoa_tim+vadz_tim+hadz_tim+eps_tim     &
1500      &       +vad2_tim+had2_tim+radiation_tim+rdtemp_tim+turbl_tim     &
1501      &       +cltend_tim+cucnvc_tim+gsmdrive_tim+hdiff_tim             &
1502      &       +bocoh_tim+pfdht_tim+ddamp_tim+bocov_tim+uv_htov_tim      &
1503      &       +exch_tim+adjppt_tim
1504 !
1505       if(mod(ntsd,n_print_time)==0)then
1506         write(0,*)' ntsd=',ntsd,' solve_tim=',solve_tim*1.e-3          &
1507      &           ,' sum_tim=',sum_tim*1.e-3
1508         write(0,*)' pdte_tim=',pdte_tim*1.e-3,' pct=',pdte_tim/sum_tim*100.
1509         write(0,*)' adve_tim=',adve_tim*1.e-3,' pct=',adve_tim/sum_tim*100.
1510         write(0,*)' vtoa_tim=',vtoa_tim*1.e-3,' pct=',vtoa_tim/sum_tim*100.
1511         write(0,*)' vadz_tim=',vadz_tim*1.e-3,' pct=',vadz_tim/sum_tim*100.
1512         write(0,*)' hadz_tim=',hadz_tim*1.e-3,' pct=',hadz_tim/sum_tim*100.
1513         write(0,*)' eps_tim=',eps_tim*1.e-3,' pct=',eps_tim/sum_tim*100.
1514         write(0,*)' vad2_tim=',vad2_tim*1.e-3,' pct=',vad2_tim/sum_tim*100.
1515         write(0,*)' had2_tim=',had2_tim*1.e-3,' pct=',had2_tim/sum_tim*100.
1516         write(0,*)' radiation_tim=',radiation_tim*1.e-3,' pct=',radiation_tim/sum_tim*100.
1517         write(0,*)' rdtemp_tim=',rdtemp_tim*1.e-3,' pct=',rdtemp_tim/sum_tim*100.
1518         write(0,*)' turbl_tim=',turbl_tim*1.e-3,' pct=',turbl_tim/sum_tim*100.
1519         write(0,*)' cltend_tim=',cltend_tim*1.e-3,' pct=',cltend_tim/sum_tim*100.
1520         write(0,*)' cucnvc_tim=',cucnvc_tim*1.e-3,' pct=',cucnvc_tim/sum_tim*100.
1521         write(0,*)' gsmdrive_tim=',gsmdrive_tim*1.e-3,' pct=',gsmdrive_tim/sum_tim*100.
1522         write(0,*)' adjppt_tim=',adjppt_tim*1.e-3,' pct=',adjppt_tim/sum_tim*100.
1523         write(0,*)' hdiff_tim=',hdiff_tim*1.e-3,' pct=',hdiff_tim/sum_tim*100.
1524         write(0,*)' bocoh_tim=',bocoh_tim*1.e-3,' pct=',bocoh_tim/sum_tim*100.
1525         write(0,*)' pfdht_tim=',pfdht_tim*1.e-3,' pct=',pfdht_tim/sum_tim*100.
1526         write(0,*)' ddamp_tim=',ddamp_tim*1.e-3,' pct=',ddamp_tim/sum_tim*100.
1527         write(0,*)' bocov_tim=',bocov_tim*1.e-3,' pct=',bocov_tim/sum_tim*100.
1528         write(0,*)' uv_h_to_v_tim=',uv_htov_tim*1.e-3,' pct=',uv_htov_tim/sum_tim*100.
1529         write(0,*)' exch_tim=',exch_tim*1.e-3,' pct=',exch_tim/sum_tim*100.
1530 !        call time_stats(exch_tim,'exchange',ntsd,mype,npes,mpi_comm_comp)
1531 !        write(0,*)' exch_tim_max=',exch_tim_max*1.e-3
1532 !
1533         call field_stats(t,mype,mpi_comm_comp                          &
1534      &                  ,ids,ide,jds,jde,kds,kde                       &
1535      &                  ,ims,ime,jms,jme,kms,kme                       &
1536      &                  ,its,ite,jts,jte,kts,kte)
1537       endif
1538 !
1539 !     if(last_time)then
1540       DEALLOCATE(TTEN,STAT=ISTAT)
1541       DEALLOCATE(QTEN,STAT=ISTAT)
1542       DEALLOCATE(RTHRATEN,STAT=ISTAT)
1543       DEALLOCATE(RTHBLTEN,STAT=ISTAT)
1544       DEALLOCATE(RQVBLTEN,STAT=ISTAT)
1545 !
1546 #define COPY_OUT
1547 #include <nmm_scalar_derefs.inc>
1548       Return
1549 !----------------------------------------------------------------------
1550 !**********************************************************************
1551 !**********************************************************************
1552 !*************    EXIT FROM THE TIME LOOP    **************************
1553 !**********************************************************************
1554 !**********************************************************************
1555 !----------------------------------------------------------------------
1556       END SUBROUTINE SOLVE_NMM
1557 !----------------------------------------------------------------------
1558 !**********************************************************************
1559 !----------------------------------------------------------------------
1560       SUBROUTINE TWR(ARRAY,KK,FIELD,NTSD,MYPE,NPES,MPI_COMM_COMP       &
1561      &              ,IDS,IDE,JDS,JDE,KDS,KDE                           &
1562      &              ,IMS,IME,JMS,JME,KMS,KME                           &
1563      &              ,ITS,ITE,JTS,JTE,KTS,KTE)
1564 !----------------------------------------------------------------------
1565 !**********************************************************************
1566       USE MODULE_EXT_INTERNAL
1567 !
1568       IMPLICIT NONE
1569       INCLUDE "mpif.h"
1570 !----------------------------------------------------------------------
1571 !----------------------------------------------------------------------
1572       INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
1573      &                     ,IMS,IME,JMS,JME,KMS,KME                    &
1574      &                     ,ITS,ITE,JTS,JTE,KTS,KTE                    &
1575      &                     ,KK,MPI_COMM_COMP,MYPE,NPES,NTSD
1576 !
1577       REAL,DIMENSION(IMS:IME,KMS:KME+KK,JMS:JME),INTENT(IN) :: ARRAY
1578 !
1579       CHARACTER(*),INTENT(IN) :: FIELD
1580 !
1581 !*** LOCAL VARIABLES
1582 !
1583       INTEGER,DIMENSION(MPI_STATUS_SIZE) :: JSTAT
1584       INTEGER,DIMENSION(MPI_STATUS_SIZE,4) :: STATUS_ARRAY
1585       INTEGER,DIMENSION(2) :: IM_REM,JM_REM,IT_REM,JT_REM
1586 !
1587       INTEGER :: I,IENDX,IER,IPE,IRECV,IRTN,ISEND,IUNIT                &
1588      &          ,J,K,N,NLEN,NSIZE
1589       INTEGER :: ITS_REM,ITE_REM,JTS_REM,JTE_REM
1590 !
1591       REAL,DIMENSION(IDS:IDE,JDS:JDE) :: TWRITE
1592       REAL,ALLOCATABLE,DIMENSION(:) :: VALUES
1593       CHARACTER(5) :: TIMESTEP
1594       CHARACTER(6) :: FMT
1595       CHARACTER(12) :: FILENAME
1596 !----------------------------------------------------------------------
1597 !**********************************************************************
1598 !----------------------------------------------------------------------
1599 !
1600       IF(NTSD<=9)THEN
1601         FMT='(I1.1)'
1602         NLEN=1
1603       ELSEIF(NTSD<=99)THEN
1604         FMT='(I2.2)'
1605         NLEN=2
1606       ELSEIF(NTSD<=999)THEN
1607         FMT='(I3.3)'
1608         NLEN=3
1609       ELSEIF(NTSD<=9999)THEN
1610         FMT='(I4.4)'
1611         NLEN=4
1612       ELSEIF(NTSD<=99999)THEN
1613         FMT='(I5.5)'
1614         NLEN=5
1615       ENDIF
1616       WRITE(TIMESTEP,FMT)NTSD
1617       FILENAME=FIELD//'_'//TIMESTEP(1:NLEN)
1618 !
1619       IF(MYPE==0)THEN
1620         CALL INT_GET_FRESH_HANDLE(IUNIT)
1621         CLOSE(IUNIT)
1622         OPEN(UNIT=IUNIT,FILE=FILENAME,FORM='UNFORMATTED',IOSTAT=IER)
1623       ENDIF
1624 !
1625 !----------------------------------------------------------------------
1626 !!!!  DO 500 K=KTS,KTE+KK     !Unflipped
1627 !!!!  DO 500 K=KTE+KK,KTS,-1
1628       DO 500 K=KDE-1,KDS,-1   !Write LM layers top down for checking
1629 !----------------------------------------------------------------------
1630 !
1631       IF(MYPE==0)THEN
1632         DO J=JTS,JTE
1633         DO I=ITS,ITE
1634           TWRITE(I,J)=ARRAY(I,K,J)
1635         ENDDO
1636         ENDDO
1637 !
1638         DO IPE=1,NPES-1
1639           CALL MPI_RECV(IT_REM,2,MPI_INTEGER,IPE,IPE                    &
1640      &                 ,MPI_COMM_COMP,JSTAT,IRECV)
1641           CALL MPI_RECV(JT_REM,2,MPI_INTEGER,IPE,IPE                    &
1642      &                 ,MPI_COMM_COMP,JSTAT,IRECV)
1643 !
1644           ITS_REM=IT_REM(1)
1645           ITE_REM=IT_REM(2)
1646           JTS_REM=JT_REM(1)
1647           JTE_REM=JT_REM(2)
1648 !
1649           NSIZE=(ITE_REM-ITS_REM+1)*(JTE_REM-JTS_REM+1)
1650           ALLOCATE(VALUES(1:NSIZE))
1651 !
1652           CALL MPI_RECV(VALUES,NSIZE,MPI_REAL,IPE,IPE                   &
1653      &                 ,MPI_COMM_COMP,JSTAT,IRECV)
1654           N=0
1655           DO J=JTS_REM,JTE_REM
1656             DO I=ITS_REM,ITE_REM
1657               N=N+1
1658               TWRITE(I,J)=VALUES(N)
1659             ENDDO
1660           ENDDO
1661 !
1662           DEALLOCATE(VALUES)
1663 !
1664         ENDDO
1665 !
1666 !----------------------------------------------------------------------
1667       ELSE
1668         NSIZE=(ITE-ITS+1)*(JTE-JTS+1)
1669         ALLOCATE(VALUES(1:NSIZE))
1670 !
1671         N=0
1672         DO J=JTS,JTE
1673         DO I=ITS,ITE
1674           N=N+1
1675           VALUES(N)=ARRAY(I,K,J)
1676         ENDDO
1677         ENDDO
1678 !
1679         IT_REM(1)=ITS
1680         IT_REM(2)=ITE
1681         JT_REM(1)=JTS
1682         JT_REM(2)=JTE
1683 !
1684         CALL MPI_SEND(IT_REM,2,MPI_INTEGER,0,MYPE                       &
1685      &               ,MPI_COMM_COMP,ISEND)
1686         CALL MPI_SEND(JT_REM,2,MPI_INTEGER,0,MYPE                       &
1687      &               ,MPI_COMM_COMP,ISEND)
1688 !
1689         CALL MPI_SEND(VALUES,NSIZE,MPI_REAL,0,MYPE                      &
1690      &               ,MPI_COMM_COMP,ISEND)
1691 !
1692         DEALLOCATE(VALUES)
1693 !
1694       ENDIF
1695 !----------------------------------------------------------------------
1696 !
1697       CALL MPI_BARRIER(MPI_COMM_COMP,IRTN)
1698 !
1699       IF(MYPE==0)THEN
1700 !
1701         DO J=JDS,JDE-1
1702           IENDX=IDE-1
1703           IF(MOD(J,2)==0)IENDX=IENDX-1
1704           WRITE(IUNIT)(TWRITE(I,J),I=1,IENDX)
1705         ENDDO
1706 !
1707       ENDIF
1708 !
1709 !----------------------------------------------------------------------
1710   500 CONTINUE
1711 !
1712       IF(MYPE==0)CLOSE(IUNIT)
1713 !----------------------------------------------------------------------
1714 !
1715       END SUBROUTINE TWR
1716 !----------------------------------------------------------------------
1717 !**********************************************************************
1718 !----------------------------------------------------------------------
1719       SUBROUTINE EXIT(NAME,T,Q,U,V,Q2,NTSD,MYPE,MPI_COMM_COMP          &
1720      &               ,IDS,IDE,JDS,JDE,KDS,KDE                          &
1721      &               ,IMS,IME,JMS,JME,KMS,KME                          &
1722      &               ,ITS,ITE,JTS,JTE,KTS,KTE)
1723 !----------------------------------------------------------------------
1724 !**********************************************************************
1725       USE MODULE_EXT_INTERNAL
1726 !
1727 !----------------------------------------------------------------------
1728       IMPLICIT NONE
1729 !----------------------------------------------------------------------
1730       INCLUDE "mpif.h"
1731 !----------------------------------------------------------------------
1732       INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
1733      &                     ,IMS,IME,JMS,JME,KMS,KME                    &
1734      &                     ,ITS,ITE,JTS,JTE,KTS,KTE                    &
1735      &                     ,MYPE,MPI_COMM_COMP,NTSD      
1736 !
1737       REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: T,Q,U,V,Q2
1738       CHARACTER(*),INTENT(IN) :: NAME
1739 !
1740       INTEGER :: I,J,K,IEND,IERR,IRET
1741       CHARACTER(256) :: ERRMESS
1742       LOGICAL :: E_BDY,S_BDY
1743 !----------------------------------------------------------------------
1744       IRET=0
1745   100 FORMAT(' EXIT ',A,' AT NTSD=',I5)
1746       IEND=ITE
1747       S_BDY=(JTS==JDS)
1748       E_BDY=(ITE==IDE-1)
1749 !
1750       DO J=JTS,JTE
1751       IEND=ITE
1752       DO K=KTS,KTE
1753       IF(E_BDY.AND.MOD(J,2)==0)IEND=ITE-1
1754 !
1755       DO I=ITS,IEND
1756         IF(T(I,K,J)>330..OR.T(I,K,J)<180..OR.T(I,K,J)/=T(I,K,J))THEN
1757           WRITE(0,100)NAME,NTSD
1758           WRITE(0,200)I,J,K,T(I,K,J),MYPE,NTSD
1759   200     FORMAT(' BAD VALUE I=',I3,' J=',I3,' K=',I2,' T=',E12.5      &
1760      &,          ' MYPE=',I3,' NTSD=',I5)
1761           IRET=666
1762           return
1763 !         WRITE(ERRMESS,205)NAME,T(I,K,J),I,K,J,MYPE
1764   205     FORMAT(' EXIT ',A,' TEMPERATURE=',E12.5                      &
1765      &,          ' AT (',I3,',',I2,',',I3,')',' MYPE=',I3)
1766 !         CALL WRF_ERROR_FATAL(ERRMESS)
1767 !         CALL MPI_ABORT(MPI_COMM_WORLD,1,IERR)
1768         ELSEIF(Q(I,K,J)<-1.E-4.OR.Q(I,K,J)>30.E-3                      &
1769      &         .OR.Q(I,K,J)/=Q(I,K,J))THEN
1770           WRITE(0,100)NAME,NTSD
1771           WRITE(0,300)I,J,K,Q(I,K,J),MYPE,NTSD
1772   300     FORMAT(' BAD VALUE I=',I3,' J=',I3,' K=',I2,' Q=',E12.5      &
1773      &,          ' MYPE=',I3,' NTSD=',I5)
1774           IRET=666
1775           return
1776 !         WRITE(ERRMESS,305)NAME,Q(I,K,J),I,K,J,MYPE
1777   305     FORMAT(' EXIT ',A,' SPEC HUMIDITY=',E12.5                    &
1778      &,          ' AT (',I3,',',I2,',',I3,')',' MYPE=',I3)
1779 !         CALL WRF_ERROR_FATAL(ERRMESS)
1780 !         CALL MPI_ABORT(MPI_COMM_WORLD,1,IERR)
1781         ENDIF
1782       ENDDO
1783       ENDDO
1784       ENDDO
1785 !
1786       DO J=JTS,JTE
1787       IEND=ITE
1788       DO K=KTS,KTE
1789       IF(E_BDY.AND.MOD(J,2)==1)IEND=ITE-1
1790       DO I=ITS,IEND
1791         IF(ABS(U(I,K,J))>125..OR.ABS(V(I,K,J))>125.                    &
1792      &         .OR.U(I,K,J)/=U(I,K,J).OR.V(I,K,J)/=V(I,K,J))THEN
1793           WRITE(0,100)NAME,NTSD
1794           WRITE(0,400)I,J,K,U(I,K,J),V(I,K,J),MYPE,NTSD
1795   400     FORMAT(' BAD VALUE I=',I3,' J=',I3,' K=',I2,' U=',E12.5      &
1796      &,          ' V=',E12.5,' MYPE=',I3,' NTSD=',I5)
1797           IRET=666
1798           return
1799 !         WRITE(ERRMESS,405)NAME,U(I,K,J),V(I,K,J),I,K,J,MYPE
1800   405     FORMAT(' EXIT ',A,' U=',E12.5,' V=',E12.5                    &
1801      &,          ' AT (',I3,',',I2,',',I3,')',' MYPE=',I3)
1802 !         CALL WRF_ERROR_FATAL(ERRMESS)
1803 !         CALL MPI_ABORT(MPI_COMM_WORLD,1,IERR)
1804         ENDIF
1805       ENDDO
1806       ENDDO
1807       ENDDO
1808 !----------------------------------------------------------------------
1809       END SUBROUTINE EXIT
1810 !----------------------------------------------------------------------
1811 !**********************************************************************
1812 !----------------------------------------------------------------------
1813       SUBROUTINE TIME_STATS(TIME_LCL,NAME,NTSD,MYPE,NPES,MPI_COMM_COMP)
1814 !----------------------------------------------------------------------
1815 !**********************************************************************
1816       USE MODULE_EXT_INTERNAL
1817 !
1818 !----------------------------------------------------------------------
1819       IMPLICIT NONE
1820 !----------------------------------------------------------------------
1821       INCLUDE "mpif.h"
1822 !----------------------------------------------------------------------
1823       INTEGER,INTENT(IN) :: MPI_COMM_COMP,MYPE,NPES,NTSD
1824       REAL,INTENT(IN) :: TIME_LCL
1825 !
1826       CHARACTER(*),INTENT(IN) :: NAME
1827 !
1828 !*** LOCAL VARIABLES
1829 !
1830       INTEGER,DIMENSION(MPI_STATUS_SIZE) :: JSTAT
1831       INTEGER,DIMENSION(MPI_STATUS_SIZE,4) :: STATUS_ARRAY
1832       INTEGER,ALLOCATABLE,DIMENSION(:) :: ID_PE,IPE_SORT
1833 !
1834       INTEGER :: IPE,IPE_MAX,IPE_MEDIAN,IPE_MIN,IRECV,IRTN,ISEND       &
1835      &          ,N,N_MEDIAN,NLEN
1836 !
1837       REAL,ALLOCATABLE,DIMENSION(:) :: TIME,SORT_TIME
1838       REAL,DIMENSION(2) :: REMOTE
1839       REAL :: TIME_MAX,TIME_MEAN,TIME_MEDIAN,TIME_MIN
1840 !
1841       CHARACTER(5) :: TIMESTEP
1842       CHARACTER(6) :: FMT
1843       CHARACTER(25) :: TITLE
1844 !----------------------------------------------------------------------
1845 !**********************************************************************
1846 !----------------------------------------------------------------------
1847 !
1848       IF(NTSD<=9)THEN
1849         FMT='(I1.1)'
1850         NLEN=1
1851       ELSEIF(NTSD<=99)THEN
1852         FMT='(I2.2)'
1853         NLEN=2
1854       ELSEIF(NTSD<=999)THEN
1855         FMT='(I3.3)'
1856         NLEN=3
1857       ELSEIF(NTSD<=9999)THEN
1858         FMT='(I4.4)'
1859         NLEN=4
1860       ELSEIF(NTSD<=99999)THEN
1861         FMT='(I5.5)'
1862         NLEN=5
1863       ENDIF
1864       WRITE(TIMESTEP,FMT)NTSD
1865       TITLE=NAME//'_'//TIMESTEP(1:NLEN)
1866 !
1867 !----------------------------------------------------------------------
1868 !
1869       IF(MYPE==0)THEN
1870         ALLOCATE(TIME(1:NPES))
1871         ALLOCATE(SORT_TIME(1:NPES))
1872         ALLOCATE(ID_PE(1:NPES))
1873         ALLOCATE(IPE_SORT(1:NPES))
1874 !
1875         TIME(1)=TIME_LCL
1876         ID_PE(1)=MYPE
1877 !
1878 !***  COLLECT TIMES AND PE VALUES FROM OTHER PEs
1879 !
1880         DO IPE=1,NPES-1
1881           CALL MPI_RECV(REMOTE,2,MPI_REAL,IPE,IPE                      &
1882      &                 ,MPI_COMM_COMP,JSTAT,IRECV)
1883 !
1884           TIME(IPE+1)=REMOTE(1)
1885           ID_PE(IPE+1)=NINT(REMOTE(2))
1886         ENDDO
1887 !
1888 !***  NOW GET STATS.
1889 !***  FIRST THE MAX, MIN, AND MEAN TIMES.
1890 !
1891         TIME_MEAN=0.
1892         TIME_MAX=-1.
1893         TIME_MIN=1.E10
1894         IPE_MAX=-1
1895         IPE_MIN=-1
1896 !
1897         DO N=1,NPES
1898           TIME_MEAN=TIME_MEAN+TIME(N)
1899 !
1900           IF(TIME(N)>TIME_MAX)THEN
1901             TIME_MAX=TIME(N)
1902             IPE_MAX=ID_PE(N)
1903           ENDIF
1904 !
1905           IF(TIME(N)<TIME_MIN)THEN
1906             TIME_MIN=TIME(N)
1907             IPE_MIN=ID_PE(N)
1908           ENDIF
1909 !
1910         ENDDO
1911 !
1912         TIME_MAX=TIME_MAX*1.E-3
1913         TIME_MIN=TIME_MIN*1.E-3
1914         TIME_MEAN=TIME_MEAN*1.E-3/REAL(NPES)
1915 !
1916 !***  THEN THE MEDIAN TIME.
1917 !
1918         CALL SORT(TIME,NPES,SORT_TIME,IPE_SORT)
1919         N_MEDIAN=(NPES+1)/2
1920         TIME_MEDIAN=SORT_TIME(N_MEDIAN)*1.E-3
1921         IPE_MEDIAN=IPE_SORT(N_MEDIAN)
1922 !
1923 !----------------------------------------------------------------------
1924       ELSE
1925 !
1926 !***  SEND TIME AND PE VALUE TO PE0.
1927 !
1928         REMOTE(1)=TIME_LCL
1929         REMOTE(2)=REAL(MYPE)
1930 !
1931         CALL MPI_SEND(REMOTE,2,MPI_REAL,0,MYPE,MPI_COMM_COMP,ISEND)
1932 !
1933       ENDIF
1934 !----------------------------------------------------------------------
1935 !
1936       CALL MPI_BARRIER(MPI_COMM_COMP,IRTN)
1937 !
1938 !***  WRITE RESULTS
1939 !
1940       IF(MYPE==0)THEN
1941         WRITE(0,100)TITLE
1942         WRITE(0,105)TIME_MAX,IPE_MAX
1943         WRITE(0,110)TIME_MIN,IPE_MIN
1944         WRITE(0,115)TIME_MEDIAN,IPE_MEDIAN
1945         WRITE(0,120)TIME_MEAN
1946   100   FORMAT(' Time for ',A)
1947   105   FORMAT(' Maximum=',G11.5,' for PE ',I2.2)
1948   110   FORMAT(' Minimum=',G11.5,' for PE ',I2.2)
1949   115   FORMAT(' Median =',G11.5,' for PE ',I2.2)
1950   120   FORMAT(' Mean   =',G11.5)
1951       ENDIF
1952 !----------------------------------------------------------------------
1953 !
1954       END SUBROUTINE TIME_STATS
1955 !
1956 !----------------------------------------------------------------------
1957 !**********************************************************************
1958 !----------------------------------------------------------------------
1959       SUBROUTINE SORT(DATA,NPES,DATA_SORTED,IPE_SORTED)
1960 !----------------------------------------------------------------------
1961 !***
1962 !***  SORT DATA FROM MULTIPLE PEs.  SEND BACK THE SORTED DATA ITEMS
1963 !***  ALONG WITH THE ASSOCIATED TASK IDs.
1964 !***
1965 !----------------------------------------------------------------------
1966       IMPLICIT NONE
1967 !----------------------------------------------------------------------
1968       INTEGER,INTENT(IN) :: NPES
1969       REAL,DIMENSION(NPES),INTENT(IN) :: DATA
1970 !
1971       INTEGER,DIMENSION(NPES),INTENT(OUT) :: IPE_SORTED
1972       REAL,DIMENSION(NPES),INTENT(OUT) :: DATA_SORTED
1973 !----------------------------------------------------------------------
1974       TYPE :: DATA_LINK
1975         REAL :: VALUE
1976         INTEGER :: IPE
1977         TYPE(DATA_LINK),POINTER :: NEXT_VALUE
1978       END TYPE
1979 !----------------------------------------------------------------------
1980 !
1981 !***  LOCAL VARIABLES
1982 !
1983 !----------------------------------------------------------------------
1984       INTEGER :: ISTAT,N
1985 !
1986       TYPE(DATA_LINK),POINTER :: HEAD,TAIL  ! Smallest, largest
1987       TYPE(DATA_LINK),POINTER :: PTR_NEW    ! Each new value
1988       TYPE(DATA_LINK),POINTER :: PTR1,PTR2  ! Working pointers
1989 !----------------------------------------------------------------------
1990 !**********************************************************************
1991 !----------------------------------------------------------------------
1992       pe_loop: DO N=1,NPES
1993         ALLOCATE(PTR_NEW,STAT=ISTAT)  ! Location for next data items
1994         PTR_NEW%VALUE=DATA(N)
1995         PTR_NEW%IPE=N-1
1996 !
1997 !----------------------------------------------------------------------
1998 !***  DETERMINE WHERE IN LIST TO INSERT VALUE.
1999 !***  FIRST THE INITIAL DATA VALUE.
2000 !----------------------------------------------------------------------
2001 !
2002 !       main: IF(.NOT.ASSOCIATED(HEAD))THEN
2003         main: IF(N==1)THEN
2004           HEAD=>PTR_NEW
2005           TAIL=>HEAD
2006           NULLIFY(PTR_NEW%NEXT_VALUE)
2007 !
2008 !----------------------------------------------------------------------
2009 !***  THE NEW VALUE IS LESS THAN THE SMALLEST VALUE ALREADY SORTED.
2010 !----------------------------------------------------------------------
2011 !
2012         ELSE
2013           check: IF(PTR_NEW%VALUE<HEAD%VALUE)THEN
2014             PTR_NEW%NEXT_VALUE=>HEAD
2015             HEAD=>PTR_NEW
2016 !
2017 !----------------------------------------------------------------------
2018 !***  THE NEW VALUE IS GREATER THAN THE LARGEST VALUE ALREADY SORTED.
2019 !----------------------------------------------------------------------
2020 !
2021           ELSEIF(PTR_NEW%VALUE>=TAIL%VALUE)THEN
2022             TAIL%NEXT_VALUE=>PTR_NEW  ! This is what connects the former
2023                                       ! final value in the list to
2024                                       ! the new value being appended.
2025             TAIL=>PTR_NEW
2026             NULLIFY(TAIL%NEXT_VALUE)
2027 !
2028 !----------------------------------------------------------------------
2029 !***  THE NEW VALUE IS IN BETWEEN VALUES ALREADY SORTED.
2030 !----------------------------------------------------------------------
2031 !
2032           ELSE
2033             PTR1=>HEAD
2034             PTR2=>PTR1%NEXT_VALUE
2035 !
2036             search: DO
2037               IF((PTR_NEW%VALUE>=PTR1%VALUE).AND.                      &
2038      &           (PTR_NEW%VALUE<PTR2%VALUE))THEN
2039                 PTR_NEW%NEXT_VALUE=>PTR2
2040                 PTR1%NEXT_VALUE=>PTR_NEW
2041                 EXIT search
2042               ENDIF
2043 !
2044               PTR1=>PTR2
2045               PTR2=>PTR2%NEXT_VALUE
2046             ENDDO search
2047 !
2048           ENDIF check
2049 !
2050         ENDIF main
2051 !
2052       ENDDO pe_loop
2053 !
2054 !----------------------------------------------------------------------
2055 !***  COLLECT THE SORTED NUMBERS FROM THE LINKED LIST.
2056 !----------------------------------------------------------------------
2057 !
2058       PTR1=>HEAD
2059 !
2060       DO N=1,NPES
2061 !       IF(.NOT.ASSOCIATED(PTR_NEW))EXIT
2062         DATA_SORTED(N)=PTR1%VALUE
2063         IPE_SORTED(N)=PTR1%IPE
2064         PTR1=>PTR1%NEXT_VALUE
2065       ENDDO
2066 !
2067       DEALLOCATE(PTR_NEW)
2068       NULLIFY (HEAD,TAIL,PTR1,PTR2)
2069 !----------------------------------------------------------------------
2070       END SUBROUTINE SORT
2071 !----------------------------------------------------------------------
2072 !**********************************************************************
2073 !----------------------------------------------------------------------
2074       SUBROUTINE FIELD_STATS(FIELD,MYPE,MPI_COMM_COMP                  &
2075      &                      ,IDS,IDE,JDS,JDE,KDS,KDE                   &
2076      &                      ,IMS,IME,JMS,JME,KMS,KME                   &
2077      &                      ,ITS,ITE,JTS,JTE,KTS,KTE)
2078 !----------------------------------------------------------------------
2079 !***
2080 !***  GENERATE STANDARD LAYER STATISTICS FOR THE DESIRED FIELD.
2081 !***
2082 !----------------------------------------------------------------------
2083       IMPLICIT NONE
2084 !----------------------------------------------------------------------
2085       INCLUDE "mpif.h"
2086 !----------------------------------------------------------------------
2087 !
2088       INTEGER,INTENT(IN) :: MPI_COMM_COMP,MYPE
2089       INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                    &
2090      &                     ,IMS,IME,JMS,JME,KMS,KME                    &
2091      &                     ,ITS,ITE,JTS,JTE,KTS,KTE
2092 !
2093       REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: FIELD
2094 !
2095 !----------------------------------------------------------------------
2096 !***  LOCAL
2097 !----------------------------------------------------------------------
2098 !
2099       INTEGER,PARAMETER :: DOUBLE=SELECTED_REAL_KIND(15,300)
2100 !
2101       INTEGER :: I,IEND,IRTN,I_BY_J,J,K,KFLIP
2102 !
2103       REAL :: FIKJ,FMAXK,FMINK
2104       REAL(KIND=DOUBLE) :: F_MEAN,POINTS,RMS,ST_DEV,SUMFK,SUMF2K
2105       REAL,DIMENSION(KTS:KTE) :: FMAX,FMAX_0,FMIN,FMIN_0
2106       REAL(KIND=DOUBLE),DIMENSION(KTS:KTE) :: SUMF,SUMF_0,SUMF2,SUMF2_0
2107 !----------------------------------------------------------------------
2108 !
2109       I_BY_J=(IDE-IDS)*(JDE-JDS)-(JDE-JDS-1)/2  ! This assumes that
2110                                                 ! IDE and JDE are each
2111                                                 ! one greater than the
2112                                                 ! true grid size.
2113 !
2114       layer_loop:  DO K=KTS,KTE
2115 !
2116         FMAXK=-1.E10
2117         FMINK=1.E10
2118         SUMFK=0.
2119         SUMF2K=0.
2120 !
2121         DO J=JTS,JTE
2122           IEND=MIN(ITE,IDE-1)
2123           IF(MOD(J,2)==0.AND.ITE==IDE-1)IEND=IEND-1
2124           DO I=ITS,IEND
2125             FIKJ=FIELD(I,K,J)
2126             FMAXK=MAX(FMAXK,FIKJ)
2127             FMINK=MIN(FMINK,FIKJ)
2128             SUMFK=SUMFK+FIKJ
2129             SUMF2K=SUMF2K+FIKJ*FIKJ
2130           ENDDO
2131         ENDDO
2132 !
2133         FMAX(K)=FMAXK
2134         FMIN(K)=FMINK
2135         SUMF(K)=SUMFK
2136         SUMF2(K)=SUMF2K
2137 !
2138       ENDDO layer_loop
2139 !
2140 !----------------------------------------------------------------------
2141 !***  GLOBAL STATS
2142 !----------------------------------------------------------------------
2143 !
2144       CALL MPI_REDUCE(SUMF,SUMF_0,KTE,MPI_REAL8,MPI_SUM,0              &
2145      &               ,MPI_COMM_COMP,IRTN)
2146       CALL MPI_REDUCE(SUMF2,SUMF2_0,KTE,MPI_REAL8,MPI_SUM,0            &
2147      &               ,MPI_COMM_COMP,IRTN)
2148       CALL MPI_REDUCE(FMAX,FMAX_0,KTE,MPI_REAL,MPI_MAX,0               &
2149      &               ,MPI_COMM_COMP,IRTN)
2150       CALL MPI_REDUCE(FMIN,FMIN_0,KTE,MPI_REAL,MPI_MIN,0               &
2151      &               ,MPI_COMM_COMP,IRTN)
2152 !
2153       IF(MYPE==0)THEN
2154         POINTS=I_BY_J
2155         DO K=KTE,KTS,-1
2156           F_MEAN=SUMF_0(K)/POINTS
2157           ST_DEV=SQRT((POINTS*SUMF2_0(K)-SUMF_0(K)*SUMF_0(K))/         &
2158      &                (POINTS*(POINTS-1)))
2159           RMS=SQRT(SUMF2_0(K)/POINTS)
2160           KFLIP=KTE-K+1
2161           WRITE(0,101)KFLIP,FMAX_0(K),FMIN_0(K)
2162           WRITE(0,102)F_MEAN,ST_DEV,RMS
2163   101     FORMAT(' LAYER=',I2,' MAX=',E13.6,' MIN=',E13.6)
2164   102     FORMAT(9X,' MEAN=',E13.6,' STDEV=',E13.6,' RMS=',E13.6)
2165         ENDDO
2166       ENDIF
2167 !----------------------------------------------------------------------
2168       END SUBROUTINE FIELD_STATS
2169 !----------------------------------------------------------------------
2170       FUNCTION TIMEF()
2171       REAL*8 TIMEF
2172       INTEGER IC, IR
2173       CALL SYSTEM_CLOCK(COUNT=IC, COUNT_RATE=IR)
2174       TIMEF=REAL(IC)/REAL(IR) * 1000.0
2175       END