    SUBROUTINE READ_RESTRT
!>--------------------------------------------------------------------------------------------------
!> SUBROUTINE READ_RESTRT
!>
!> SUBPROGRAM: READ_RESTRT - READ AND DISTRIBUTE RESTRT FILE
!> PROGRAMMER: BLACK
!> ORG: W/NP2
!> DATE: 98-10-22
!>
!> ABSTRACT:
!> READ_RESTRT READS IN QUANTITIES FROM THE NFC FILE OR THE RESTRT FILE AND DISTRIBUTES THEM TO THE 
!> OTHER NODES/PES
!>
!> PROGRAM HISTORY LOG:
!v 97-??-??  MEYS       - ORIGINATOR
!> 97-08-??  BLACK      - REWROTE FOR BENCHMARK
!> 98-??-??  TUCCILLO   - MODIFIED FOR SINGLE OR DOUBLE PRECISION
!> 98-10-23  BLACK      - MODIFIED FOR NEWEST RESTART FILE
!> 18-01-15  LUCCI      - MODERNIZATION OF THE CODE, INCLUDING:
!>                        * F77 TO F90/F95
!>                        * INDENTATION & UNIFORMIZATION CODE
!>                        * REPLACEMENT OF COMMONS BLOCK FOR MODULES
!>                        * DOCUMENTATION WITH DOXYGEN
!>                        * OPENMP FUNCTIONALITY
!>
!> INPUT ARGUMENT LIST:
!> NONE
!>
!> OUTPUT ARGUMENT LIST:
!> NONE
!>
!> INPUT/OUTPUT ARGUMENT LIST:
!> NONE 
!>
!> USE MODULES: ACMCLD
!>              ACMCLH 
!>              ACMPRE
!>              ACMRDL
!>              ACMRDS
!>              ACMSFC
!>              BOCO
!>              CLDWTR
!>              CNVCLD
!>              CONTIN
!>              CTLBLK
!>              DYNAM
!>              F77KINDS
!>              GLB_TABLE
!>              INDX
!>              LOOPS
!>              MAPOT
!>              MAPPINGS
!>              MASKS
!>              MPPCOM
!>              OUTFIL
!>              PARMETA
!>              PARMSOIL
!>              PARM_TBL
!>              PHYS
!>              PRFHLD
!>              PVRBLS
!>              SOIL
!>              TEMPCOM
!>              TOPO
!>              VRBLS
!>
!> DRIVER     : INIT
!>              INITS
!>
!> CALLS      : DSTRB
!>              IDSTRB
!>              MPI_BARRIER
!>              MPI_BCAST
!>--------------------------------------------------------------------------------------------------
    USE ACMCLD
    USE ACMCLH
    USE ACMPRE
    USE ACMRDL
    USE ACMRDS
    USE ACMSFC
    USE BOCO
    USE CLDWTR
    USE CNVCLD
    USE CONTIN
    USE CTLBLK
    USE DYNAM
    USE F77KINDS
    USE GLB_TABLE
    USE INDX
    USE LOOPS
    USE MAPOT
    USE MAPPINGS
    USE MASKS
    USE MPPCOM
    USE OUTFIL
    USE PARMETA
    USE PARMSOIL
    USE PARM_TBL
    USE PHYS
    USE PRFHLD 
    USE PVRBLS
    USE SOIL
    USE TEMPCOM
    USE TOPO
    USE VRBLS
!
    IMPLICIT NONE
!
    REAL   (KIND=R4KIND), PARAMETER :: D00    =    0.0
    REAL   (KIND=R4KIND), PARAMETER :: D50    =     .50
    REAL   (KIND=R4KIND), PARAMETER :: H1     =    1.0
    REAL   (KIND=R4KIND), PARAMETER :: G      =    9.8
    REAL   (KIND=R4KIND), PARAMETER :: CM1    = 2937.4
    REAL   (KIND=R4KIND), PARAMETER :: CM2    =    4.9283
    REAL   (KIND=R4KIND), PARAMETER :: CM3    =   23.5518
    REAL   (KIND=R4KIND), PARAMETER :: EPS    =    0.622
    REAL   (KIND=R4KIND), PARAMETER :: Q2INI  =     .50
    REAL   (KIND=R4KIND), PARAMETER :: EPSQ2  =    2.E-2
    REAL   (KIND=R4KIND), PARAMETER :: EPSQ   =    2.E-12 
    REAL   (KIND=R4KIND), PARAMETER :: EPSWET =    0.0
    REAL   (KIND=R4KIND), PARAMETER :: Z0LAND =     .10
    REAL   (KIND=R4KIND), PARAMETER :: Z0SEA  =     .001 
    REAL   (KIND=R4KIND), PARAMETER :: FCM    =     .00001 
    REAL   (KIND=R4KIND), PARAMETER :: DTR    =    0.1745329E-1
    REAL   (KIND=R4KIND), PARAMETER :: H360   =  360.0
    REAL   (KIND=R4KIND), PARAMETER :: H1905  =  190.5
    REAL   (KIND=R4KIND), PARAMETER :: H105   =  105.0
!
    INTEGER(KIND=I4KIND), PARAMETER :: IMJM = IM * JM - JM / 2
    INTEGER(KIND=I4KIND), PARAMETER :: JMP1 = JM + 1
    INTEGER(KIND=I4KIND), PARAMETER :: IMT  =  2 * IM - 1
!------------------  
! DECLARE VARIABLES
!------------------ 
    LOGICAL(KIND=L4KIND)                                                                        ::&
    & RUNB
!
    CHARACTER(32)                                                                               ::&
    & LABEL
!
    CHARACTER(40)                                                                               ::&
    & CONTRL  , FILALL  , FILMST  , FILTMP  , FILTKE  , FILUNV  , FILCLD  , FILRAD  , FILSFC
!
    REAL   (KIND=R4KIND), DIMENSION(IDIM1:IDIM2, JDIM1:JDIM2)                                   ::&
    & PSLP
!
    REAL   (KIND=R4KIND), DIMENSION(IM, JM, NSOIL)                                              ::&
    & TEMPSOIL
!
    INTEGER(KIND=I4KIND), DIMENSION(3)                                                          ::&
    & IDATB   
!
    LOGICAL(KIND=L4KIND)                                                                        ::&
    & LDUMMY   
!
    INCLUDE "mpif.h"
!
#include "sp.h"
!
    INTEGER(KIND=I4KIND), DIMENSION(MPI_STATUS_SIZE)                                            ::&
    & ISTAT
!
#ifdef DP_REAL
!
    LOGICAL(KIND=L8KIND)                                                                        ::&
    & RUNX    , FIRSTX
!
    INTEGER(KIND=I8KIND), DIMENSION(3)                                                          ::&
    & IDATX
!
    INTEGER(KIND=I8KIND)                                                                        ::&
    & IHRSTX  , NTSDX   , IOUTX   , NSHDEX
!
    INTEGER(KIND=I8KIND), DIMENSION(IM, JM)                                                     ::&
    & ITEMPX  , ITEMP2X
!
#endif
!
!------------------------
! IMPLICIT NONE VARIABLES
!------------------------
    INTEGER(KIND=I4KIND)                                                                        ::&
    & I       , J       , K       , N       , IER     , IRTN    , IYR     , IMNTH   , IDAY    ,   &
    & LBM2    , IHOUR 
!
    REAL   (KIND=R4KIND)                                                                        ::&
    & TSTART  , PDOMG   , RESOMG  , DUMMY   , TEMP9   , TEMP10  , TEMP11 
!------------------------------------ 
! TSTART IS THE INITIAL TIME IN HOURS
!------------------------------------ 
    TSTART = NSTART * DT / 3600.
!----------------------------------------- 
! READ INITIAL CONDITIONS OR RESTART FILE.
! FIRST, THE .NOT. RESTART FILE CASE.
!----------------------------------------- 
    NFCST = 13
!Andre(RESTRT)    OPEN(UNIT=NFCST,FILE='INIT.file',STATUS='OLD',FORM='UNFORMATTED')
    OPEN(UNIT=NFCST,STATUS='OLD',FORM='UNFORMATTED')
    IF (.NOT. RESTRT) THEN
        IF (MYPE == 0) THEN
!
#ifdef DP_REAL
!   
            READ(NFCST) RUNX, IDATX, IHRSTX, NTSDX
            RUN   = RUNX
            IDAT  = IDATX
            IHRST = IHRSTX
            NTSD  = NTSDX
!
#else
!
            READ(NFCST) RUN, IDAT, IHRST, NTSD
!
#endif
!           
            IF (NTSD == 1 ) NTSD = 0
        ELSE
            READ(NFCST) DUMMY
        END IF
!    
        CALL MPI_BCAST  (RUN    , 1, MPI_LOGICAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST  (IDAT(1), 3, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST  (IHRST  , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST  (NTSD   , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BARRIER(                            MPI_COMM_COMP, IRTN)
!-------------- 
! DISTRIBUTE PD
!-------------- 
        IF (MYPE == 0) THEN
            READ(NFCST)TEMP1
        END IF
!    
        CALL DSTRB(TEMP1, PD, 1, 1, 1)
!--------------- 
! DISTRIBUTE RES
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1
        END IF
!    
        CALL DSTRB(TEMP1, RES, 1, 1, 1)
!---------------
! DISTRIBUTE FIS
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1
        END IF
!    
        CALL DSTRB(TEMP1, FIS, 1, 1, 1)
!------------- 
! DISTRIBUTE U
!------------- 
        DO K=1,LM
            IF (MYPE == 0) THEN
                READ(NFCST) TEMP1
            END IF
            CALL DSTRB(TEMP1, U, 1, LM, K)
        END DO
!------------- 
! DISTRIBUTE V
!------------- 
        DO K=1,LM
            IF (MYPE == 0) THEN
                READ(NFCST) TEMP1
            END IF
            CALL DSTRB(TEMP1, V, 1, LM, K)
        END DO
!------------- 
! DISTRIBUTE T
!------------- 
        DO K=1,LM
            IF (MYPE == 0) THEN
                READ(NFCST) TEMP1
            END IF
            CALL DSTRB(TEMP1, T, 1, LM, K)
        END DO

!------------- 
! DISTRIBUTE Q
!------------- 
        DO K=1,LM
            IF (MYPE == 0) THEN
                READ(NFCST) TEMP1
            END IF
            CALL DSTRB(TEMP1, Q, 1, LM, K)
        END DO
!-------------- 
! DISTRIBUTE SI
!--------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1
        END IF
!    
        CALL DSTRB(TEMP1, SI, 1, 1, 1)
!---------------
! DISTRIBUTE SNO
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1
        END IF
!    
        CALL DSTRB(TEMP1, SNO, 1, 1, 1)
!---------------
! DISTRIBUTE SMC
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMPSOIL
        END IF
!    
        CALL DSTRB(TEMPSOIL, SMC, NSOIL, NSOIL, NSOIL)
!---------------
! DISTRIBUTE CMC
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1
        END IF
!    
        CALL DSTRB(TEMP1, CMC, 1, 1, 1)
!---------------
! DISTRIBUTE STC
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST)TEMPSOIL
        END IF
!    
        CALL DSTRB(TEMPSOIL, STC, NSOIL, NSOIL, NSOIL)
!----------------
! DISTRIBUTE SH2O
!----------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMPSOIL
        END IF
!    
        CALL DSTRB(TEMPSOIL, SH2O, NSOIL, NSOIL, NSOIL)
!------------------
! DISTRIBUTE ALBEDO
!------------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1
        END IF
!    
        CALL DSTRB(TEMP1, ALBEDO, 1, 1, 1)
!
        IYR   = IDAT(3) - 1900
        IMNTH = IDAT(1)
        IDAY  = IDAT(2)
!
        IF (MYPE == 0) WRITE(LIST,*) 'INIT: READ INITIAL CONDITION FILE'
!-------------------------------
! SECOND, THE RESTART FILE CASE.
!-------------------------------    
    ELSE
        IF (MYPE == 0) WRITE(LIST,*)'INIT:  READ RESTART FILE'
!
        IF (MYPE == 0) THEN
!
            READ(NFCST) RUN, IDAT, IHRST, NTSD, LABEL, IHOUR
!
            IF (NTSD == 1) NTSD = 0
!
            READ(NFCST) PDOMG, RESOMG
        END IF
!    
        CALL MPI_BCAST(RUN    , 1, MPI_LOGICAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IDAT(1), 3, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IHRST  , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(NTSD   , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
!------------------ 
! DISTRIBUTE OMGALF
!------------------
        DO K=1,LM
            IF (MYPE == 0) THEN
                READ(NFCST) TEMP1
            END IF
!
            CALL DSTRB(TEMP1, OMGALF, 1, LM, K)
!
        END DO
!
        IF (MYPE == 0) WRITE(LIST,*)'  READ  ',LABEL
!    
        IF (MYPE == 0) THEN
!
            READ(NFCST) RUN, IDAT, IHRST, NTSD, LABEL, IHOUR, FIRST, IOUT, NSHDE
!
            IF (NTSD == 1) NTSD = 0
        END IF
!    
        FIRST = .TRUE. 
!    
        CALL MPI_BCAST(RUN    , 1, MPI_LOGICAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IDAT(1), 3, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IHRST  , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(NTSD   , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(FIRST  , 1, MPI_LOGICAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IOUT   , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(NSHDE  , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
!
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1, TEMP2, TEMP3
        END IF
!    
        CALL DSTRB(TEMP1,PD ,1,1,1)
        CALL DSTRB(TEMP2,RES,1,1,1)
        CALL DSTRB(TEMP3,FIS,1,1,1)
!
        LBM2 = LB * LM * 2
!
        IF (MYPE == 0) THEN
            IF (NINT(TSTART) == 0) THEN
                READ(NFCST) PDB, TB, QB, UB, VB
            ELSE
                READ(NFCST) PDB, TB, QB, UB, VB, Q2B, CWMB
            END IF
        END IF
!    
        CALL MPI_BCAST(PDB(1,1)  , LB  , MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(PDB(1,2)  , LB  , MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(TB (1,1,1), LBM2, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(QB (1,1,1), LBM2, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(UB (1,1,1), LBM2, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(VB (1,1,1), LBM2, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
!    
        IF (NINT(TSTART) > 0) THEN
            CALL MPI_BCAST(Q2B (1,1,1), LBM2, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
            CALL MPI_BCAST(CWMB(1,1,1), LBM2, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        END IF
!----------------------
! PRIMARY 3-D VARIABLES
!----------------------
        DO 300 K=1,LM
            IF (MYPE == 0) THEN
                READ(NFCST) TEMP1 ! T (I,J,K)
                READ(NFCST) TEMP2 ! Q (I,J,K)
                READ(NFCST) TEMP3 ! U (I,J,K)
                READ(NFCST) TEMP4 ! V (I,J,K)
                READ(NFCST) TEMP5 ! Q2(I,J,K)
            END IF
!       
            CALL DSTRB(TEMP1, T , 1, LM, K)
            CALL DSTRB(TEMP2, Q , 1, LM, K)
            CALL DSTRB(TEMP3, U , 1, LM, K)
            CALL DSTRB(TEMP4, V , 1, LM, K)
            CALL DSTRB(TEMP5, Q2, 1, LM, K)
!----------------------------------------------------------------------------------------------------------        
! DUMMY READ OF THE TOTAL RADIATIVE TEMPERATURE TENDENCIES WHICH ARE NOT USED EXPLICITLY IN THE INTEGRATION
!----------------------------------------------------------------------------------------------------------          
            IF (MYPE == 0) THEN
                READ(NFCST)                                ! TTND(I,J,L)
!            
                READ(NFCST)((TEMP6(I,J), I=1,IM), J=1, JM) ! CWM  (I,J,K)
                READ(NFCST)((TEMP7(I,J), I=1,IM), J=1, JM) ! TRAIN(I,J,K)
                READ(NFCST)((TEMP8(I,J), I=1,IM), J=1, JM) ! TCUCN(I,J,K)
!            
            END IF
!        
            CALL DSTRB(TEMP6, CWM  , 1, LM, K)
            CALL DSTRB(TEMP7, TRAIN, 1, LM, K)
            CALL DSTRB(TEMP8, TCUCN, 1, LM, K)
!        
        300 END DO
!
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (3) '
!    
        IF (MYPE == 0) THEN
#ifdef DP_REAL
            READ(NFCST) RUNX, IDATX, IHRSTX, NTSDX, LABEL, TEMP1, TEMP2, TEMP3, TEMP4,            &
    &                   ((TEMP5(I,J),I=1,IM), J=1, JM), TEMP6
            RUN   = RUNX
            IDAT  = IDATX
            IHRST = IHRSTX
            NTSD  = NTSDX
#else
            READ(NFCST) RUN ,IDAT, IHRST, NTSD, LABEL, IHOUR, TEMP1, TEMP2, TEMP3, TEMP4,         &
    &                   ((TEMP5(I,J),I=1,IM), J=1, JM), TEMP6
#endif
            IF (NTSD == 1) NTSD=0
        END IF
!    
        CALL DSTRB(TEMP1, RSWIN , 1, 1, 1)
        CALL DSTRB(TEMP2, RSWOUT, 1, 1, 1)
        CALL DSTRB(TEMP3, TG    , 1, 1, 1)
        CALL DSTRB(TEMP4, Z0    , 1, 1, 1)
        CALL DSTRB(TEMP5, AKMS  , 1, 1, 1)
        CALL DSTRB(TEMP6, CZEN  , 1, 1, 1)
!    
        CALL MPI_BCAST(RUN    , 1, MPI_LOGICAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IDAT(1), 3, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IHRST  , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(NTSD   , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
!
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1, TEMP2, TEMP3, TEMP4, TEMP5, TEMP6, TEMP7
        END IF
!          
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (4) '
!	 
        CALL DSTRB(TEMP1, AKHS  , 1, 1, 1)
        CALL DSTRB(TEMP2, THS   , 1, 1, 1)
        CALL DSTRB(TEMP3, QS    , 1, 1, 1)
        CALL DSTRB(TEMP4, TWBS  , 1, 1, 1)
        CALL DSTRB(TEMP5, QWBS  , 1, 1, 1)
        CALL DSTRB(TEMP6, HBOT  , 1, 1, 1) ! USED TO BE CNVBOT
        CALL DSTRB(TEMP7, CFRACL, 1, 1, 1)
!
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1, TEMP2, ((TEMP3(I,J),I=1,IM), J=1, JM),                             &
    &                   ((TEMP4(I,J),I=1,IM), J=1, JM), TEMP5, TEMP6, TEMP7
        END IF
!
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (5) '
!    
        CALL DSTRB(TEMP1, THZ0  , 1, 1, 1)
        CALL DSTRB(TEMP2, QZ0   , 1, 1, 1)
        CALL DSTRB(TEMP3, UZ0   , 1, 1, 1)
        CALL DSTRB(TEMP4, VZ0   , 1, 1, 1)
        CALL DSTRB(TEMP5, USTAR , 1, 1, 1)
        CALL DSTRB(TEMP6, HTOP  , 1, 1, 1) ! USED TO BE CNVTOP
        CALL DSTRB(TEMP7, CFRACM, 1, 1, 1)
!
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1, TEMP2, TEMP3, TEMP4, TEMP5, TEMP6, TEMP7
        END IF
!
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (6) '
!    
        CALL DSTRB(TEMP1, SNO   , 1, 1, 1)
        CALL DSTRB(TEMP2, SI    , 1, 1, 1)
        CALL DSTRB(TEMP3, CLDEFI, 1, 1, 1)
        CALL DSTRB(TEMP4, RF    , 1, 1, 1)
        CALL DSTRB(TEMP5, PSLP  , 1, 1, 1)
        CALL DSTRB(TEMP6, CUPPT , 1, 1, 1)
        CALL DSTRB(TEMP7, CFRACH, 1, 1, 1)
!
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1, TEMP2, TEMP3, TEMP4, TEMP5, TEMP6
        END IF
!    
        CALL DSTRB(TEMP1, SOILTB, 1, 1, 1)
        CALL DSTRB(TEMP2, SFCEXC, 1, 1, 1)
        CALL DSTRB(TEMP3, SMSTAV, 1, 1, 1)
        CALL DSTRB(TEMP4, SMSTOT, 1, 1, 1)
        CALL DSTRB(TEMP5, GRNFLX, 1, 1, 1)
        CALL DSTRB(TEMP6, PCTSNO, 1, 1, 1)
!
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1, ((TEMP2(I,J),I=1,IM), J=1, JM), TEMP3, TEMP4
        END IF
!    
        CALL DSTRB(TEMP1, RLWIN , 1, 1, 1)
        CALL DSTRB(TEMP2, RADOT , 1, 1, 1)
        CALL DSTRB(TEMP3, CZMEAN, 1, 1, 1)
        CALL DSTRB(TEMP4, SIGT4 , 1, 1, 1)
!--------------------------------------------------------------------------------------------------
! READ OLD ARRAYS FROM ZHAO SCHEME BUT DO NOT DISTRIBUTE. 
! ARRAY SR IS STILL USED ("SNOW RATIO" OR FRACTION OF INSTANTANEOUS PRECIPITATION IN THE FORM OF 
! SNOW).
!--------------------------------------------------------------------------------------------------   
        IF (MYPE == 0) THEN
#ifdef DP_REAL
            READ(NFCST) TEMP1, UL, ITEMPX, TEMP3
            ITEMP = ITEMPX
#else
            READ(NFCST) TEMP1, UL, ITEMP, TEMP3
#endif
        END IF
!    
        CALL DSTRB    (TEMP1, U00, 1, 1, 1) ! U00 ARRAY NOT USED IN NEW G/S SCHEME
        CALL IDSTRB   (ITEMP, LC          ) ! LC ARRAY NOT USED IN NEW G/S SCHEME
        CALL DSTRB    (TEMP3, SR , 1, 1 ,1) ! SR ARRAY *IS* STILL USED
        CALL MPI_BCAST(UL(1), 2*LM, MPI_REAL, 0, MPI_COMM_COMP, IRTN) ! UL ARRAY NOT USED
!
        IF (MYPE == 0) THEN
#ifdef DP_REAL
            READ(NFCST) RUNX, IDATX, IHRSTX, NTSDX, LABEL, TEMP1, TEMP2, TEMP3, TEMP4
            RUN   = RUNX
            IDAT  = IDATX
            IHRST = IHRSTX
            NTSD  = NTSDX
#else
            READ(NFCST) RUN, IDAT, IHRST, NTSD, LABEL, IHOUR, TEMP1, TEMP2, TEMP3, TEMP4
#endif
            IF (NTSD == 1) NTSD=0
        END IF
!    
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (7) '
!
        CALL DSTRB(TEMP1, PREC  , 1, 1, 1)
        CALL DSTRB(TEMP2, ACPREC, 1, 1, 1)
        CALL DSTRB(TEMP3, ACCLIQ, 1, 1, 1)
        CALL DSTRB(TEMP4, CUPREC, 1, 1, 1)
!
        CALL MPI_BCAST(RUN    , 1, MPI_LOGICAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IDAT(1), 3, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(IHRST  , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST(NTSD   , 1, MPI_INTEGER, 0, MPI_COMM_COMP, IRTN)
!
        IF (MYPE == 0) THEN
#ifdef DP_REAL
            READ(NFCST) TEMP1, ITEMPX, TEMP3, ITEMP2X
            ITEMP  = ITEMPX
            ITEMP2 = ITEMP2X
#else
            READ(NFCST) TEMP1, ITEMP, TEMP3, ITEMP2
#endif
        END IF
!    
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (8) '
!
        CALL DSTRB (TEMP1 , ACFRCV, 1, 1, 1)
        CALL IDSTRB(ITEMP , NCFRCV         )
        CALL DSTRB (TEMP3 , ACFRST, 1, 1, 1)
        CALL IDSTRB(ITEMP2, NCFRST         )
!
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1, TEMP2, TEMP3, TEMP4
        END IF
!    
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (9) '
!
        CALL DSTRB(TEMP1, ACSNOW, 1, 1, 1)
        CALL DSTRB(TEMP2, ACSNOM, 1, 1, 1)
        CALL DSTRB(TEMP3, SSROFF, 1, 1, 1)
        CALL DSTRB(TEMP4, BGROFF, 1, 1, 1)
!
        IF (MYPE == 0) THEN
            READ(NFCST)TEMP1, TEMP2, TEMP3, TEMP4, TEMP5, TEMP6, TEMP7
        END IF
!    
        CALL DSTRB(TEMP1, SFCSHX, 1, 1, 1)
        CALL DSTRB(TEMP2, SFCLHX, 1, 1, 1)
        CALL DSTRB(TEMP3, SUBSHX, 1, 1, 1)
        CALL DSTRB(TEMP4, SNOPCX, 1, 1, 1)
        CALL DSTRB(TEMP5, SFCUVX, 1, 1, 1)
        CALL DSTRB(TEMP6, SFCEVP, 1, 1, 1)
        CALL DSTRB(TEMP7, POTEVP, 1, 1, 1)
!
        IF (MYPE == 0) THEN
            READ(NFCST)TEMP1, TEMP2, TEMP3, TEMP4, TEMP5, TEMP6
        END IF
!    
        CALL DSTRB(TEMP1, ASWIN , 1, 1, 1)
        CALL DSTRB(TEMP2, ASWOUT, 1, 1, 1)
        CALL DSTRB(TEMP3, ASWTOA, 1, 1, 1)
        CALL DSTRB(TEMP4, ALWIN , 1, 1, 1)
        CALL DSTRB(TEMP5, ALWOUT, 1, 1, 1)
        CALL DSTRB(TEMP6, ALWTOA, 1, 1, 1)
!
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (10) '
!
        IF (MYPE == 0) THEN
            READ(NFCST) ARDSW, ARDLW, ASRFC, AVRAIN, AVCNVC
        END IF
!    
        CALL MPI_BCAST  (ARDSW , 1, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST  (ARDLW , 1, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST  (ASRFC , 1, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST  (AVRAIN, 1, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BCAST  (AVCNVC, 1, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
        CALL MPI_BARRIER(                        MPI_COMM_COMP, IRTN)
!
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1, TEMP2, TEMP3, TEMP4, TEMP5, TEMP6, TEMP7,                          &
!--------- 
! SM v100M
!--------- 
    &                   TEMP12, TEMP13, TEMP14, TEMP15
        END IF
!
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (11) '
!    
        CALL DSTRB(TEMP1, TH10  , 1, 1, 1)
        CALL DSTRB(TEMP2, Q10   , 1, 1, 1)
        CALL DSTRB(TEMP3, U10   , 1, 1, 1)
        CALL DSTRB(TEMP4, V10   , 1, 1, 1)
        CALL DSTRB(TEMP5, TSHLTR, 1, 1, 1)
        CALL DSTRB(TEMP6, QSHLTR, 1, 1, 1)
        CALL DSTRB(TEMP7, PSHLTR, 1, 1, 1)
!--------- 
! SM v100M
!---------
        CALL DSTRB(TEMP12, TH100, 1, 1, 1)
        CALL DSTRB(TEMP13, Q100 , 1, 1, 1)
        CALL DSTRB(TEMP14, U100 , 1, 1, 1)
        CALL DSTRB(TEMP15, V100 , 1, 1, 1)
!--------- 
! SM v100M
!---------
!
!---------------         
! DISTRIBUTE SMC
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMPSOIL
        END IF
!    
        CALL DSTRB(TEMPSOIL, SMC, NSOIL, NSOIL, NSOIL)
!---------------
! DISTRIBUTE CMC
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1
        END IF
!    
        CALL DSTRB(TEMP1, CMC, 1, 1, 1)
!---------------
! DISTRIBUTE STC
!---------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMPSOIL
        END IF
!    
        CALL DSTRB(TEMPSOIL, STC, NSOIL, NSOIL, NSOIL)
!----------------
! DISTRIBUTE SH2O
!----------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMPSOIL
        END IF
!    
        CALL DSTRB(TEMPSOIL, SH2O, NSOIL, NSOIL, NSOIL)
!------------------
! DISTRIBUTE ALBEDO
!------------------
        IF (MYPE == 0) THEN
            READ(NFCST) TEMP1
        END IF
! 
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (12) '
!   
        CALL DSTRB(TEMP1, ALBEDO, 1, 1, 1)
!--------------------------------------------------------------------------------
! IF FORECAST IS NOT BEGINNING AT TIME 0 THEN WE MUST READ ADDITIONAL INFORMATION
!--------------------------------------------------------------------------------
        IF (NINT(TSTART) /= 0) THEN
!        
            IF (MYPE == 0) THEN
                READ(NFCST) TEMP1, TEMP2, TEMP3, ACUTIM, ARATIM, APHTIM,                          & 
    &                        NHEAT, NPHS, NCNVC, NPREC, NRDSW, NRDLW,                             &
    &                        NSRFC, TPH0D, TLM0D, LDUMMY
            END IF
!
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (13) '
!
            CALL DSTRB(TEMP1, POTFLX, 1, 1, 1)
            CALL DSTRB(TEMP2, TLMIN , 1, 1, 1)
            CALL DSTRB(TEMP3, TLMAX , 1, 1, 1)
!
            CALL MPI_BCAST(ACUTIM, 1, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
            CALL MPI_BCAST(ARATIM, 1, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
            CALL MPI_BCAST(APHTIM, 1, MPI_REAL, 0, MPI_COMM_COMP, IRTN)
!        
            DO K=1,LM
                IF (MYPE == 0) THEN
                    READ(NFCST)TEMP1 ! RSWTT
                    READ(NFCST)TEMP2 ! RLWTT
                END IF
!            
                CALL DSTRB(TEMP1, RSWTT, 1, LM, K)
                CALL DSTRB(TEMP2, RLWTT, 1, LM, K)
            END DO
!        
            IF (MYPE == 0) THEN
                READ(NFCST)TEMP2 ! CNVBOT (USED TO BE HBOT)
                READ(NFCST)TEMP3 ! CNVTOP (USED TO BE HTOP)
                READ(NFCST)TEMP4 ! RSWTOA
                READ(NFCST)TEMP5 ! RLWTOA
            END IF
! 
        IF (MYPE == 0) WRITE(LIST,*)'  READ RESTRT (14) '
!       
            CALL DSTRB(TEMP2, CNVBOT, 1, 1, 1)
            CALL DSTRB(TEMP3, CNVTOP, 1, 1, 1)
            CALL DSTRB(TEMP4, RSWTOA, 1, 1, 1)
            CALL DSTRB(TEMP5, RLWTOA, 1, 1, 1)
        END IF
!-----------------------------------------------------------------------
! CALL RADIATION TO OBTAIN THE SHORT AND LONGWAVE TEMPERATURE TENDENCIES
!-----------------------------------------------------------------------

    END IF
!--------------------------------------------------- 
! DONE READING INITIAL CONDITIONS OR A RESTART FILE.
!---------------------------------------------------
!
!------------------------------ 
! END OF SUBROUTINE READ_RESTRT
!------------------------------ 
    IF (MYPE == 0) THEN
        WRITE(LIST,*) 'INIT:  EXIT READ_RESTRT'
        WRITE(LIST,*) ' '
    END IF
!
    RETURN
!
    END SUBROUTINE READ_RESTRT
