!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    SUBROUTINE READ_RESTRT
!     ******************************************************************
!$$$  SUBPROGRAM DOCUMENTATION BLOCK
!                .      .    .

! SUBPROGRAM:    READ_RESTRT READ AND DISTRIBUTE RESTRT FILE
!   PRGRMMR: 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:
!   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

! USAGE: CALL READ_RESTRT FROM SUBROUTINE INIT
!   INPUT ARGUMENT LIST:
!     NONE

!   OUTPUT ARGUMENT LIST:
!     NONE

!   OUTPUT FILES:
!     NONE

!   SUBPROGRAMS CALLED:
!     UNIQUE: DSTRB
!             IDSTRB

!     LIBRARY: NONE

!   COMMON BLOCKS: CTLBLK
!                  LOOPS
!                  MASKS
!                  DYNAM
!                  PHYS2
!                  MAPOT1
!                  VRBLS
!                  CONTIN
!                  PVRBLS
!                  BOCO
!                  ACMCLH
!                  ACMCLD
!                  ACMPRE
!                  ACMRDL
!                  ACMRDS
!                  ACMSFC
!                  PRFHLD
!                  CLDWTR
!                  CNVCLD
!                  SOIL
!                  INDX

!   ATTRIBUTES:
!     LANGUAGE: FORTRAN 90
!     MACHINE : IBM SP
!$$$
!-----------------------------------------------------------------------
!     INCLUDE/SET PARAMETERS.
!-----------------------------------------------------------------------
    INCLUDE "parmeta.f90"
    INCLUDE "parm.tbl.f90"
    INCLUDE "parmsoil.f90"
!-----------------------------------------------------------------------
    PARAMETER &
    (D00=0.0,D50=.50,H1=1.0,G=9.8 &
    , CM1=2937.4,CM2=4.9283,CM3=23.5518,EPS=0.622 &

! VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
!    &, Q2INI=.01E0,EPSQ2=1.E-4,EPSQ=2.E-12,EPSWET=1.E-4
!    &, Q2INI=1.0E0,EPSQ2=1.E-4,EPSQ=2.E-12,EPSWET=1.E-4
!    &, Q2INI=.50E0,EPSQ2=1.E-4,EPSQ=2.E-12,EPSWET=1.E-4
!    &, Q2INI=.01E0,EPSQ2=1.E-4,EPSQ=2.E-12,EPSWET=0.0E0
    , Q2INI=.50,EPSQ2=2.E-2,EPSQ=2.E-12,EPSWET=0.0 &
! AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    , Z0LAND=.10,Z0SEA=.001,FCM=.00001 &
    , DTR=0.1745329E-1,H360=360.0 &
    , H1905=190.5,H105=105.0)

!-----------------------------------------------------------------------
    PARAMETER &
    (IMJM=IM*JM-JM/2,JMP1=JM+1,JAM=6+2*(JM-10),LB=2*IM+JM-3 &
    , LM1=LM-1,LP1=LM+1,IMT=2*IM-1)

!-----------------------------------------------------------------------

!                            DECLARE VARIABLES

!-----------------------------------------------------------------------
    LOGICAL :: &
    RUN,RUNB,FIRST,RESTRT,SIGMA
!-----------------------------------------------------------------------
    CHARACTER (32) :: &
    LABEL
    CHARACTER (40) :: &
    CONTRL,FILALL,FILMST,FILTMP,FILTKE,FILUNV &
    ,FILCLD,FILRAD,FILSFC
!-----------------------------------------------------------------------
    REAL :: &
    PSLP(IDIM1:IDIM2,JDIM1:JDIM2)
    REAL :: &
    TEMPSOIL(IM,JM,NSOIL)
!-----------------------------------------------------------------------
    INTEGER :: &
    IDATB(3)
!-----------------------------------------------------------------------

!     INCLUDE COMMON BLOCKS.

    INCLUDE "COMM_CTLBLK.f90"
    INCLUDE "COMM_LOOPS.f90"
    INCLUDE "COMM_MASKS.f90"
    INCLUDE "COMM_DYNAM.f90"
    INCLUDE "COMM_PHYS2.f90"
    INCLUDE "COMM_MAPOT1.f90"
    INCLUDE "COMM_VRBLS.f90"
    INCLUDE "COMM_CONTIN.f90"
    INCLUDE "COMM_PVRBLS.f90"
    INCLUDE "COMM_BOCO.f90"
    INCLUDE "COMM_ACMCLH.f90"
    INCLUDE "COMM_ACMCLD.f90"
    INCLUDE "COMM_ACMPRE.f90"
    INCLUDE "COMM_ACMRDL.f90"
    INCLUDE "COMM_ACMRDS.f90"
    INCLUDE "COMM_ACMSFC.f90"
    INCLUDE "COMM_PRFHLD.f90"
    INCLUDE "COMM_CLDWTR.f90"
    INCLUDE "COMM_CNVCLD.f90"
    INCLUDE "COMM_SOIL.f90"
    INCLUDE "COMM_INDX.f90"
!-----------------------------------------------------------------------
    INCLUDE "mpif.h"
    INCLUDE "mpp.h"
#include "sp.h"
!-----------------------------------------------------------------------
    INTEGER :: ISTAT(MPI_STATUS_SIZE)

#ifdef DP_REAL
    LOGICAL*8 RUNX,FIRSTX
    INTEGER*8 :: IDATX(3),IHRSTX,NTSDX
    INTEGER*8 :: IOUTX,NSHDEX
    INTEGER*8 :: ITEMPX(IM,JM),ITEMP2X(IM,JM)
#endif

!***********************************************************************
!***********************************************************************

!***  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
    open(unit=NFCST,file='init.file',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
        ENDIF
    
        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
        !         WRITE(0,*)'READ PD'
        ENDIF
    
        CALL DSTRB(TEMP1,PD,1,1,1)
    
    ! 345678901234567890123456789012345678901234567890123456789012345678901
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE RES
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1
        !         WRITE(0,*)'READ RES'
        ENDIF
    
        CALL DSTRB(TEMP1,RES,1,1,1)
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE FIS
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1
        !         WRITE(0,*)'READ FIS'
        ENDIF
    
        CALL DSTRB(TEMP1,FIS,1,1,1)
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE U
    !***
        DO L=1,LM
            IF(MYPE == 0)THEN
                READ(NFCST)TEMP1
            !           WRITE(0,*)'READ U'
            ENDIF
            CALL DSTRB(TEMP1,U,1,LM,L)
        ENDDO
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE V
    !***
        DO L=1,LM
            IF(MYPE == 0)THEN
                READ(NFCST)TEMP1
            !           WRITE(0,*)'READ V'
            ENDIF
            CALL DSTRB(TEMP1,V,1,LM,L)
        ENDDO
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE T
    !***
        DO L=1,LM
            IF(MYPE == 0)THEN
                READ(NFCST)TEMP1
            !           WRITE(0,*)'READ T'
            ENDIF
            CALL DSTRB(TEMP1,T,1,LM,L)
        ENDDO
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE Q
    !***
        DO L=1,LM
            IF(MYPE == 0)THEN
                READ(NFCST)TEMP1
            !           WRITE(0,*)'READ Q'
            ENDIF
            CALL DSTRB(TEMP1,Q,1,LM,L)
        ENDDO
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE SI
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1
        !         WRITE(0,*)'READ SI'
        ENDIF
    
        CALL DSTRB(TEMP1,SI,1,1,1)
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE SNO
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1
        !         WRITE(0,*)'READ SNO'
        ENDIF
    
        CALL DSTRB(TEMP1,SNO,1,1,1)
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE SMC
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMPSOIL
        !         WRITE(0,*)'READ SMC'
        ENDIF
    
        CALL DSTRB(TEMPSOIL,SMC,NSOIL,NSOIL,NSOIL)
    !----------------------------------------------------------------------
    !***
    !***
    !***  DISTRIBUTE CMC
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1
        !         WRITE(0,*)'READ CMC'
        ENDIF
    
        CALL DSTRB(TEMP1,CMC,1,1,1)
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE STC
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMPSOIL
        !         WRITE(0,*)'READ STC'
        ENDIF
    
        CALL DSTRB(TEMPSOIL,STC,NSOIL,NSOIL,NSOIL)
    !----------------------------------------------------------------------
    !***
    !***  DISTRIBUTE SH2O
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMPSOIL
        !         WRITE(0,*)'READ SH2O'
        ENDIF
    
        CALL DSTRB(TEMPSOIL,SH2O,NSOIL,NSOIL,NSOIL)
    !-------------------------------------------------------------------
    !***
    !***
    !***  DISTRIBUTE ALBEDO
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1
        !         WRITE(0,*)'READ ALBEDO'
        ENDIF
    
        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
#ifdef DP_REAL
            READ(NFCST)RUNX,IDATX,IHRSTX,NTSDX,LABEL
            RUN=RUNX
            IDAT=IDATX
            IHRST=IHRSTX
            NTSD=NTSDX
#else
            READ(NFCST)RUN,IDAT,IHRST,NTSD,LABEL
#endif
            IF(NTSD == 1)NTSD=0
            READ(NFCST)PDOMG,RESOMG
        ENDIF
    
        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(LABEL,1,MPI_CHARACTER,0,MPI_COMM_COMP,IRTN)
    !       CALL MPI_BCAST(PDOMG,1,MPI_REAL,0,MPI_COMM_COMP,IRTN)
    !       CALL MPI_BCAST(RESOMG,1,MPI_REAL,0,MPI_COMM_COMP,IRTN)
    
    !-------------------------------------------------------------------
    !***
    !***  DISTRIBUTE OMGALF
    !***
        DO L=1,LM
            IF(MYPE == 0)THEN
                READ(NFCST)TEMP1
            !           WRITE(0,*)'READ OMGALF'
            ENDIF
            CALL DSTRB(TEMP1,OMGALF,1,LM,L)
        ENDDO
    !-------------------------------------------------------------------
    
        IF(MYPE == 0)WRITE(LIST,*)'  READ  ',LABEL
    
        IF(MYPE == 0)THEN
#ifdef DP_REAL
            READ(NFCST)RUNX,IDATX,IHRSTX,NTSDX,LABEL,FIRSTX,IOUTX,NSHDEX
            RUN=RUNX
            IDAT=IDATX
            IHRST=IHRSTX
            NTSD=NTSDX
            FIRST=FIRSTX
            IOUT=IOUTX
            NSHDE=NSHDEX
#else
            READ(NFCST)RUN,IDAT,IHRST,NTSD,LABEL,FIRST,IOUT,NSHDE
#endif
            IF(NTSD == 1)NTSD=0
        ENDIF
    
        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(LABEL,1,MPI_CHARACTER,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
        !         WRITE(0,*)'READ PD'
        ENDIF
    
        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
            ENDIF
        ENDIF
    
        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)
        ENDIF
    !-------------------------------------------------------------------
    !***
    !***  PRIMARY 3-D VARIABLES
    !***
        DO 300 L=1,LM
            IF(MYPE == 0)THEN
                READ(NFCST)TEMP1   ! T(I,J,L)
                READ(NFCST)TEMP2   ! Q(I,J,L)
                READ(NFCST)TEMP3   ! U(I,J,L)
                READ(NFCST)TEMP4   ! V(I,J,L)
                READ(NFCST)TEMP5   ! Q2(I,J,L)
            ENDIF
        
            CALL DSTRB(TEMP1,T,1,LM,L)
            CALL DSTRB(TEMP2,Q,1,LM,L)
            CALL DSTRB(TEMP3,U,1,LM,L)
            CALL DSTRB(TEMP4,V,1,LM,L)
            CALL DSTRB(TEMP5,Q2,1,LM,L)
        
        !     DUMMY READ OF THE TOTAL RADIATIVE TEMPERATURE TENDENCIES
        !     WHICH ARE NOT USED EXPLICITLY IN THE INTEGRATION
        
            IF(MYPE == 0)THEN
                READ(NFCST)
            
                READ(NFCST)((TEMP6(I,J),I=1,IM),J=1,JM)  ! CWM(I,J,L)
                READ(NFCST)((TEMP7(I,J),I=1,IM),J=1,JM)  ! TRAIN(I,J,L)
                READ(NFCST)((TEMP8(I,J),I=1,IM),J=1,JM)   ! TCUCN(I,J,L)
            
            ENDIF
        
            CALL DSTRB(TEMP6,CWM,1,LM,L)
            CALL DSTRB(TEMP7,TRAIN,1,LM,L)
            CALL DSTRB(TEMP8,TCUCN,1,LM,L)
        
        300 END DO
    !-------------------------------------------------------------------
    
        IF(MYPE == 0)WRITE(LIST,*)'  READ  ',LABEL
    
        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 &
            ,              TEMP1,TEMP2,TEMP3 &
            ,              TEMP4,((TEMP5(I,J),I=1,IM),J=1,JM),TEMP6
#endif
            IF(NTSD == 1)NTSD=0
        ENDIF
    
        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)
    !       CALL MPI_BCAST(LABEL,1,MPI_CHARACTER,0,MPI_COMM_COMP,IRTN)
    
    !-------------------------------------------------------------------
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6,TEMP7
        ENDIF
    
        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
        ENDIF
    
        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
        ENDIF
    
        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
        ENDIF
    
        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
        ENDIF
    
        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
        ENDIF
    
        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 &
            ,              TEMP1,TEMP2,TEMP3,TEMP4
#endif
            IF(NTSD == 1)NTSD=0
        ENDIF
    
        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)
    !       CALL MPI_BCAST(LABEL,1,MPI_CHARACTER,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
        ENDIF
    
        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
        ENDIF
    
        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
        ENDIF
    
        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
        ENDIF
    
        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)THEN
            READ(NFCST)ARDSW,ARDLW,ASRFC,AVRAIN,AVCNVC
        ENDIF
    
        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
            ,              TEMP8,TEMP9,TEMP10,TEMP11
        ! SM v100m
        ENDIF
    
        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(TEMP8,TH100,1,1,1)
        CALL DSTRB(TEMP9,Q100,1,1,1)
        CALL DSTRB(TEMP10,U100,1,1,1)
        CALL DSTRB(TEMP11,V100,1,1,1)
    ! SM v100m
    !-------------------------------------------------------------------
    !***
    !***  DISTRIBUTE SMC
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMPSOIL
        ENDIF
    
        CALL DSTRB(TEMPSOIL,SMC,NSOIL,NSOIL,NSOIL)
    !-------------------------------------------------------------------
    !***
    !***  DISTRIBUTE CMC
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1
        ENDIF
    
        CALL DSTRB(TEMP1,CMC,1,1,1)
    !-------------------------------------------------------------------
    !***
    !***  DISTRIBUTE STC
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMPSOIL
        ENDIF
    
        CALL DSTRB(TEMPSOIL,STC,NSOIL,NSOIL,NSOIL)
    !-------------------------------------------------------------------
    !***
    !***  DISTRIBUTE SH2O
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMPSOIL
        !         WRITE(0,*)'READ SH2O'
        ENDIF
    
        CALL DSTRB(TEMPSOIL,SH2O,NSOIL,NSOIL,NSOIL)
    !-------------------------------------------------------------------
    !***
    !***
    !***  DISTRIBUTE ALBEDO
    !***
        IF(MYPE == 0)THEN
            READ(NFCST)TEMP1
        !         WRITE(0,*)'READ ALBEDO'
        ENDIF
    
        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
            ENDIF
            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 L=1,LM
                IF(MYPE == 0)THEN
                    READ(NFCST)TEMP1         ! RSWTT
                    READ(NFCST)TEMP2         ! RLWTT
                ENDIF
            
                CALL DSTRB(TEMP1,RSWTT,1,LM,L)
                CALL DSTRB(TEMP2,RLWTT,1,LM,L)
            ENDDO
        
            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
            ENDIF
        
            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)
        ENDIF
    !-------------------------------------------------------------------
    
    !       IF(MYPE.EQ.0)WRITE(LIST,*)'  READ  ',LABEL
    
    !-------------------------------------------------------------------
    !***  CALL RADIATION TO OBTAIN THE SHORT AND LONGWAVE
    !***  TEMPERATURE TENDENCIES
    !***
    
    !       CALL RADTN
    
    ENDIF

!     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,*)' '
    ENDIF

    RETURN
    END SUBROUTINE READ_RESTRT
