#!/bin/ksh
set -x

# compiler

if [ $# -ne 1 ]
then
echo "NEED TO SPECIFY FORECAST HOUR TO COMPARE"
exit
fi

FC=f90
FOPTS="-O2"

# forecast hour to compare

HR=${1}

# paths

ROOTDIR=`pwd`
BENCHDIR=$ROOTDIR
TSTRUNDIR=$ROOTDIR
CNSTFILE=$ROOTDIR/cnst.file

FILE1=$BENCHDIR/restrt${HR}.t00s
FILE2=$TSTRUNDIR/12h_coldstart/restrt${HR}.t00s

###############################################################
###############################################################

cd $BENCHDIR

rm -f code.f diffrest.x core

cat <<\codeEOF >code.f

       program compare

	PARAMETER (IM=60,JM=91,LM=38,NSOIL=4)
	PARAMETER (LB=2*IM+JM-3)

       integer(4) idat(3)
       logical run,first
       real(4),allocatable::a(:,:),b(:,:),dum2da(:,:),dum2db(:,:)
       real(4),allocatable::c(:,:,:),d(:,:,:)

	REAL,ALLOCATABLE::TEMP1(:,:),TEMP2(:,:),TEMP3(:,:),
     +		TEMP4(:,:),TEMP5(:,:),TEMP6(:,:),TEMP7(:,:)
	REAL,ALLOCATABLE::TEMP1b(:,:),TEMP2b(:,:),TEMP3b(:,:),
     +		TEMP4b(:,:),TEMP5b(:,:),TEMP6b(:,:),TEMP7b(:,:)

	real(4),allocatable::pdb(:,:),tb(:,:,:),qb(:,:,:),
     +			     ub(:,:,:),vb(:,:,:)
	real(4),allocatable::pdb2(:,:),tb2(:,:,:),qb2(:,:,:),
     +			     ub2(:,:,:),vb2(:,:,:)

	REAL :: TRMS,QRMS,URMS,
     +		VRMS,Q2RMS
	REAL :: TMAXDF,QMAXDF,UMAXDF,
     +		VMAXDF,Q2MAXDF,UL(2*LM),ULB(2*LM)

	INTEGER,ALLOCATABLE :: ITEMP(:,:),ITEMP2(:,:),LMH(:,:),
     +			       LMV(:,:),ITEMPB(:,:),ITEMP2B(:,:)

       character(4) icmeta,jcmeta,lcmeta
       character(32) label
	logical sigma


	ALLOCATE(LMH(IM,JM),LMV(IM,JM))

	READ(30) 
     1     NFCST,NBC,LIST
     2,    DT,IDTAD,SIGMA
     3,    KHLA,KHHA,KVLA,KVHA,KHL2,KHH2,KVL2,KVH2
	READ(30) LMH
	READ(30) LMV


	LMH=LM

	close(30)

       rewind 10
       rewind 20

       read(10)run,idat,ihrst,ntsd,label
       print *,' 1st file run,idat,ihrst,ntsd=',run,idat,ihrst,ntsd
       read(20)run,idat,ihrst,ntsd,label
       print *,' 2nd file run,idat,ihrst,ntsd=',run,idat,ihrst,ntsd


       print *,' compare restart files for im,jm,lm=',im,jm,lm

       allocate(dum2da(im,jm))
       allocate(dum2db(im,jm))
       allocate(a(im,jm))
       allocate(b(im,jm))
	ALLOCATE(TEMP1(IM,JM),TEMP1B(IM,JM),TEMP2(IM,JM),TEMP2B(IM,JM))
	ALLOCATE(TEMP3(IM,JM),TEMP3B(IM,JM),TEMP4(IM,JM),TEMP4B(IM,JM))
	ALLOCATE(TEMP5(IM,JM),TEMP5B(IM,JM),TEMP6(IM,JM),TEMP6B(IM,JM))
	ALLOCATE(TEMP7(IM,JM),TEMP7B(IM,JM))

C
C* PDOMG,RESOMG
C
       READ(10)TEMP1,TEMP2
       READ(20)TEMP1B,TEMP2B
      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'PDOMG, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'RESOMG, rmsdf: ', rms,extrem
C
C* OMGALF
C
       DO L=1,LM
        READ(10) DUM2DA
        READ(20) DUM2DB
	   CALL RMSDIFF(DUM2DA,DUM2DB,IM,JM,LMH,L,RMS,VMAXDIF,extrem)
	if (vmaxdif .gt. 0) write(6,*) 'L, rms OMGALF dif: ',L,rms,extrem
       ENDDO

C
C* header stuff
C
      READ(10) run,idat,ihrst,ntsd,label,first,iout,nshde
      READ(20) run,idat,ihrst,ntsd,label,first,iout,nshde

C
C* PD,RES,FIS
C
      READ(10) A,TEMP1,TEMP2
      READ(20) B,TEMP1B,TEMP2B

      CALL RMSDIFF2D(A,B,im,jm,rms,rmaxdf,extrem)

	if (rmaxdf .gt. 0) then
      WRITE(6,633) rms,rmaxdf,extrem
	endif
  633 FORMAT(' PD rms, max diffs, maxval: ',e9.4,1x,e9.4,1x,e9.4)
      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'RES, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'FIS, rmsdf: ', rms,extrem

C
C* PDB,TB,QB,UB,VB
C
	ALLOCATE (PDB(LB,2),TB(LB,LM,2),QB(LB,LM,2),
     +				UB(LB,LM,2),VB(LB,LM,2))
	ALLOCATE (PDB2(LB,2),TB2(LB,LM,2),QB2(LB,LM,2),
     +				UB2(LB,LM,2),VB2(LB,LM,2))
	READ(10) PDB,TB,QB,UB,VB
	READ(20) PDB2,TB2,QB2,UB2,VB2

	rmax1=0.

	do J=1,2
	 do N=1,LB
	  if (abs(PDB(N,J)-PDB2(N,J)) .gt. rmax1) then
	   rmax1=abs(PDB(N,J)-PDB2(N,J))
	  endif
	 enddo
	enddo

	if (rmax1 .gt. 0) write(6,*) 'PDB, rmsdf: ', rmax1
	
	do J=1,2
	 do L=1,LM
	rmax1=0.
	rmax2=0.
	rmax3=0.
	rmax4=0.
          do N=1,LB 
	dif1=abs(TB(N,L,J)-TB2(N,L,J))
	dif2=abs(QB(N,L,J)-QB2(N,L,J))
	dif3=abs(UB(N,L,J)-UB2(N,L,J))
	dif4=abs(VB(N,L,J)-VB2(N,L,J))

        if(dif1 .gt. rmax1) rmax1=dif1
        if(dif2 .gt. rmax2) rmax2=dif2
        if(dif3 .gt. rmax3) rmax3=dif3
        if(dif4 .gt. rmax4) rmax4=dif4
	  enddo
         enddo
	if (rmax1 .gt. 0) write(6,*) 'TB, rmsdf: ', rmax1
	if (rmax2 .gt. 0) write(6,*) 'QB, rmsdf: ', rmax2
	if (rmax3 .gt. 0) write(6,*) 'UB, rmsdf: ', rmax3
	if (rmax4 .gt. 0) write(6,*) 'VB, rmsdf: ', rmax4
        enddo

	DEALLOCATE(PDB,TB,QB,UB,VB)
	DEALLOCATE(PDB2,TB2,QB2,UB2,VB2)
C
C* T,Q,U,V,Q2
C


      DO L=1,LM

	if (L .eq. 1) then
	write(6,*) '********************************************'
	write(6,*) 'NOTE:  DIFFERENCES COMPUTED FOR ATMOSPHERIC '
	write(6,*) '       GRIDPOINTS ONLY'
	write(6,*) '********************************************'
	endif

           READ(10) DUM2DA
	   READ(20) DUM2DB
	
	   CALL RMSDIFF(DUM2DA,DUM2DB,IM,JM,LMH,L,RMS,VMAXDIF,extrem)
	
	   TRMS=RMS
           TMAXDF=VMAXDIF
	   TEXRM=EXTREM

C	if (tmaxdf .gt. 6.) then
C	call extreme (dum2da,dum2db,im,jm,ipt,jpt)

C	write(6,*) 'extreme diff centered at ', ipt,jpt

C	JMAX=AMIN0(JM,JPT+5)
C	JMIN=AMAX0(1,JPT-5)
C	IMAX=AMIN0(IM,IPT+5)
C	IMIN=AMAX0(1,IPT-5)
	
	
C	DO J=JMAX,JMIN,-1
C	write(6,693) (dum2da(I,J),I=IMIN,IMAX)
C	ENDDO

C	write(6,*) 'and the other file'

C	DO J=JMAX,JMIN,-1
C	write(6,693) (dum2db(I,J),I=IMIN,IMAX)
C	ENDDO

C	endif

  693	format(11(f5.1,1x))

C------------------------------------------------

           READ(10) DUM2DA
           READ(20) DUM2DB

           CALL RMSDIFF(DUM2DA,DUM2DB,IM,JM,LMH,L,RMS,VMAXDIF,extrem)
        
           QRMS=RMS
           QMAXDF=VMAXDIF
	   QEXRM=EXTREM

C------------------------------------------------

           READ(10) DUM2DA
           READ(20) DUM2DB

           CALL RMSDIFF(DUM2DA,DUM2DB,IM,JM,LMV,L,RMS,VMAXDIF,extrem)
        
           URMS=RMS
           UMAXDF=VMAXDIF
	   UEXRM=EXTREM

C------------------------------------------------

           READ(10) DUM2DA
           READ(20) DUM2DB

           CALL RMSDIFF(DUM2DA,DUM2DB,IM,JM,LMV,L,RMS,VMAXDIF,extrem)
        
           VRMS=RMS
           VMAXDF=VMAXDIF
	   VEXRM=EXTREM

C------------------------------------------------

           READ(10) DUM2DA
           READ(20) DUM2DB

           CALL RMSDIFF(DUM2DA,DUM2DB,IM,JM,LMH,L,RMS,VMAXDIF,extrem)
        
           Q2RMS=RMS
           Q2MAXDF=VMAXDIF
	   Q2EXRM=EXTREM

C------------------------------------------------

	IF (TMAXDF .gt. 0) WRITE(6,644) L,TRMS,TMAXDF,TEXRM
	IF (QMAXDF .gt. 0) WRITE(6,645) L,QRMS,QMAXDF,QEXRM
	IF (UMAXDF .gt. 0) WRITE(6,646) L,URMS,UMAXDF,UEXRM
	IF (VMAXDF .gt. 0) WRITE(6,647) L,VRMS,VMAXDF,VEXRM
	IF (Q2MAXDF .gt. 0) WRITE(6,643) L,Q2RMS,Q2MAXDF,Q2EXRM
	IF (TMAXDF .gt. 0) then
	WRITE(6,*) '----------------------------------------------------'
	endif

  643 FORMAT('Q2 AT LEV: ',I2,2x,'RMS DIFF: ',e8.3,2x,
     +	     'ABS MX DIFF:',e8.3,2x,'ABS LRG VAL: ', e8.3)
  644 FORMAT('T  AT LEV: ',I2,2x,'RMS DIFF: ',e8.3,2x,
     +	     'ABS MX DIFF:',e8.3,2x,'ABS LRG VAL: ', e8.3)
  645 FORMAT('Q  AT LEV: ',I2,2x,'RMS DIFF: ',e8.3,2x,
     +	     'ABS MX DIFF:',e8.3,2x,'ABS LRG VAL: ', e8.3)
  646 FORMAT('U  AT LEV: ',I2,2x,'RMS DIFF: ',e8.3,2x,
     +	     'ABS MX DIFF:',e8.3,2x,'ABS LRG VAL: ', e8.3)
  647 FORMAT('V  AT LEV: ',I2,2x,'RMS DIFF: ',e8.3,2x,
     +	     'ABS MX DIFF:',e8.3,2x,'ABS LRG VAL: ', e8.3)


C
C*  RAD TEND,CWM,TRAIN,TCUCN
C
	READ(10) TEMP1
	READ(10) TEMP2
	READ(10) TEMP3
	READ(10) TEMP4
	READ(20) TEMP1B
        READ(20) TEMP2B
        READ(20) TEMP3B
        READ(20) TEMP4B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
C	if (rmaxdf .gt. 0) write(6,*) 'RADTEND, rmsdf: ', rmaxdf
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
C	if (rmaxdf .gt. 0) write(6,*) 'CWM, rmsdf: ', rmaxdf
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
C	if (rmaxdf .gt. 0) write(6,*) 'TRAIN, rmsdf: ', rmaxdf
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
C	if (rmaxdf .gt. 0) write(6,*) 'TCUCN, rmsdf: ', rmaxdf

      ENDDO

	write(6,*) 'past 3D reads'
C
C*  RSWIN,RSWOUT,TG,Z0,AKMS,CZEN
C

	READ(10) RUN,IDAT,IHRST,NTSD,LABEL,TEMP1,TEMP2,TEMP3,
     +		 TEMP4,((TEMP5(I,J),I=1,IM),J=1,JM),TEMP6
	READ(20) RUN,IDAT,IHRST,NTSD,LABEL,TEMP1B,TEMP2B,TEMP3B,
     +		 TEMP4B,((TEMP5B(I,J),I=1,IM),J=1,JM),TEMP6B


      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'RSWIN, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'RSWOUT, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'TG, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'Z0, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP5,TEMP5B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'AKMS, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP6,TEMP6B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'CZEN, rmsdf: ', rms,extrem
C
C*  AKHS,THS,QS,TWBS,QWBS,HBOT,CFRACL
C

	READ(10) TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6,TEMP7
	READ(20) TEMP1B,TEMP2B,TEMP3B,TEMP4B,TEMP5B,TEMP6B,
     +	 	 TEMP7B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'AKHS, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'THS, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'QS, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'TWBS, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP5,TEMP5B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'QWBS, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP6,TEMP6B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'HBOT, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP7,TEMP7B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'CFRACL, rmsdf: ', rms,extrem

C
C*  THZ0,QZ0,UZ0,VZ0,USTAR,HTOP,CFRACM
C
	READ(10) TEMP1,TEMP2,((TEMP3(I,J),I=1,IM),J=1,JM),
     +		 ((TEMP4(I,J),I=1,IM),J=1,JM),TEMP5,TEMP6,TEMP7
	READ(20) TEMP1B,TEMP2B,((TEMP3B(I,J),I=1,IM),J=1,JM),
     +		 ((TEMP4B(I,J),I=1,IM),J=1,JM),TEMP5B,TEMP6B,TEMP7B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'THZ0, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'QZ0, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'UZ0, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'VZ0, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP5,TEMP5B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'USTAR, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP6,TEMP6B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'HTOP, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP7,TEMP7B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'CFRACM, rmsdf: ', rms,extrem

C
C*  SNO,WET,CLDEFI,RF,PSLP,CUPPT,CFRACH
C

	READ(10) TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6,TEMP7
	READ(20) TEMP1B,TEMP2B,TEMP3B,TEMP4B,TEMP5B,TEMP6B,TEMP7B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SNO, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'WET, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'CLDEFI, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'RF, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP5,TEMP5B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'PSLP, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP6,TEMP6B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'CUPPT, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP7,TEMP7B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'CFRACH, rmsdf: ', rms,extrem

C
C*  SOILTB,SFCEXC,SMSTAV,SMSTOT,GRNFLX,PCTSNO
C

        READ(10) TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6
        READ(20) TEMP1B,TEMP2B,TEMP3B,TEMP4B,TEMP5B,TEMP6B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SOILTB, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SFCEXC, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SMSTAV, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SMSTOT, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP5,TEMP5B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'GRNFLX, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP6,TEMP6B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'PCTSNO, rmsdf: ', rms,extrem

C
C*  RLWIN,RADOT,CZMEAN,SIGT4
C

	READ(10) TEMP1,((TEMP2(I,J),I=1,IM),J=1,JM),TEMP3,TEMP4
	READ(20) TEMP1B,((TEMP2B(I,J),I=1,IM),J=1,JM),TEMP3B,TEMP4B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'RLWIN, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'RADOT, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'CZMEAN, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SIGT4, rmsdf: ', rms,extrem

C
C*  U00,UL,LC,SR

	ALLOCATE(ITEMP(IM,JM),ITEMPB(IM,JM))

	READ(10) TEMP1,UL,ITEMP,TEMP3
	READ(20) TEMP1B,ULB,ITEMPB,TEMP3B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'U00, rmsdf: ', rms,extrem
	
	rmax1=0.
	do L=1,2*LM
	if (abs(UL(L)-ULB(L)) .gt. rmax1) rmax1=abs(UL(L)-ULB(L))
	enddo
	if (rmax1 .gt. 0) write(6,*) 'UL, rmsdf: ', rmax1

      CALL RMSDIFF2D(ITEMP,ITEMPB,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'LC, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SR, rmsdf: ', rms,extrem

	DEALLOCATE(ITEMP,ITEMPB)

C
C*   PREC,ACPREC,ACCLIQ,CUPREC
C
	READ(10) RUN,IDAT,IHRST,NTSD,LABEL,TEMP1,DUM2DA,TEMP3,TEMP4
	READ(20) RUN,IDAT,IHRST,NTSD,LABEL,TEMP1B,DUM2DB,TEMP3B,TEMP4B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'PREC, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(DUM2DA,DUM2DB,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ACPREC, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ACCLIQ, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'CUPREC, rmsdf: ', rms,extrem


C
C*  ACFRCV,NCFRCV,ACFRST,NCFRST
C
	ALLOCATE(ITEMP(IM,JM),ITEMP2(IM,JM),ITEMPB(IM,JM),ITEMP2B(IM,JM))

	READ(10) TEMP1,ITEMP,TEMP3,ITEMP2
	READ(20) TEMP1B,ITEMPB,TEMP3B,ITEMP2B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ACFRCV, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(ITEMP,ITEMPB,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'NCFRCV, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ACFRST, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'NCFRST, rmsdf: ', rms,extrem

	DEALLOCATE(ITEMP,ITEMP2,ITEMPB,ITEMP2B)

C
C*  ACSNOW,ACSNOM,SSROFF,BGROFF
C

	READ(10) TEMP1,TEMP2,TEMP3,TEMP4
	READ(20) TEMP1B,TEMP2B,TEMP3B,TEMP4B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ACSNOW, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ACSNOM, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SSROFF, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'BGROFF, rmsdf: ', rms,extrem
C
C*  SFCSHX,SFCLHX,SUBSHX,SNOPCX,SFCUVX,SFCEVP,POTEVP
C

	READ(10) TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6,TEMP7
	READ(20) TEMP1B,TEMP2B,TEMP3B,TEMP4B,TEMP5B,TEMP6B,TEMP7B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SFCSHX, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SFCLHX, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SUBSHX, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SNOPCX, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP5,TEMP5B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SFCUVX, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP6,TEMP6B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'SFCEVP, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP7,TEMP7B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'POTEVP, rmsdf: ', rms,extrem
C
C*  ASWIN,ASWOUT,ASWTOA,ALWIN,ALWOUT,ALWTOA
C

	READ(10) TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6
	READ(20) TEMP1B,TEMP2B,TEMP3B,TEMP4B,TEMP5B,TEMP6B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ASWIN, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ASWOUT, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ASWTOA, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ALWIN, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP5,TEMP5B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ALWOUT, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP6,TEMP6B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'ALWTOA, rmsdf: ', rms,extrem

C
C*  ARDSW,ARDLW,ASRFC,AVRAIN,AVCNVC
C

	READ(10) ARDSW,ARDLW,ASRFC,AVRAIN,AVCNVC
	READ(20) ARDSWB,ARDLWB,ASRFCB,AVRAINB,AVCNVCB
	
	if (ARDSW .ne. ARDSWB) write(6,*) 'ARDSW: ', ARDSW,ARDSWB
	if (ARDLW .ne. ARDLWB) write(6,*) 'ARDLW: ', ARDLW,ARDSLB
	if (ASRFC .ne. ASRFCB) write(6,*) 'ASRFC: ', ASRFC,ASRFCB
	if (AVRAIN .ne. AVRAINB) write(6,*) 'AVRAIN: ', 
     +			AVRAIN,AVRAINB
	if (AVCNVC .ne. AVCNVCB) write(6,*) 'AVCNVC: ', 
     +			AVCNVC,AVCNVCB

C
C*  TH10,Q10,U10,V10,TSHLTR,QSHLTR,PSHLTR
C

	READ(10) TEMP1, TEMP2, TEMP3, TEMP4, TEMP5, TEMP6, TEMP7
	READ(20) TEMP1B,TEMP2B,TEMP3B,TEMP4B,TEMP5B,TEMP6B,TEMP7B

      CALL RMSDIFF2D(TEMP1,TEMP1B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'TH10, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP2B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'Q10, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP3B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'U10, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP4,TEMP4B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'V10, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP5,TEMP5B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'TSHLTR, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP6,TEMP6B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'QSHLTR, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP7,TEMP7B,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'PSHLTR, rmsdf: ', rms,extrem


       allocate(c(im,jm,nsoil))
       allocate(d(im,jm,nsoil))

C
C*  SMC
C
	READ(10) C
	READ(20) D

	DO II=1,NSOIL
         DO J=1,JM
          DO I=1,IM
	    TEMP1(I,J)=C(I,J,II)
	    TEMP2(I,J)=D(I,J,II)
          ENDDO
         ENDDO

	CALL RMSDIFF2D(TEMP1,TEMP2,IM,JM,RMS,VMAXDIF,extrem)
	if (vmaxdif .gt. 0) write(6,*) 'SMC at level ', II, RMS,extrem
	ENDDO
C
C*  CMC
C
	READ(10) TEMP1
	READ(20) TEMP2
	
	CALL RMSDIFF2D(TEMP1,TEMP2,IM,JM,RMS,VMAXDIF,extrem)
	if (vmaxdif .gt. 0) write(6,*) 'CMC, rmsdf: ', rms,extrem

C
C*  STC
C
	READ(10) C
	READ(20) D

	DO II=1,NSOIL
         DO J=1,JM
          DO I=1,IM
	    TEMP1(I,J)=C(I,J,II)
	    TEMP2(I,J)=D(I,J,II)
          ENDDO
         ENDDO

	CALL RMSDIFF2D(TEMP1,TEMP2,IM,JM,RMS,VMAXDIF,extrem)

	if (VMAXDIF .gt. 0) then
	write(6,649) II,RMS,VMAXDIF,extrem
	endif

	ENDDO
  649	format('SOIL T, LEV: ', I2,1x,'RMS DIFF: ', e9.3,2x,
     +	       'MAX DIFF: ', e9.3,2x,' MAX VAL: ', e8.3)

	
Cnew
	READ(10) TEMP1,TEMP2,TEMP3
     1,             ACUTIM,ARATIM,APHTIM
     2,             NHEAT,NPHS,NCNVC,NPREC,NRDSW,NRDLW,NSRFC
     3,             TPH0D,TLM0D,RESTRT

	READ(20) TEMP4,TEMP5,TEMP6
     1,             ACUTIM,ARATIM,APHTIM
     2,             NHEAT,NPHS,NCNVC,NPREC,NRDSW,NRDLW,NSRFC
     3,             TPH0D,TLM0D,RESTRT

      CALL RMSDIFF2D(TEMP1,TEMP4,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'POTFLX, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP2,TEMP5,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'TLMIN, rmsdf: ', rms,extrem
      CALL RMSDIFF2D(TEMP3,TEMP6,im,jm,rms,rmaxdf,extrem)
	if (rmaxdf .gt. 0) write(6,*) 'TLMAX, rmsdf: ', rms,extrem

	
C** T0,Q0

	DO L=1,LM

           READ(10) DUM2DA
           READ(20) DUM2DB
           CALL RMSDIFF(DUM2DA,DUM2DB,IM,JM,LMH,L,RMS,VMAXDIF,extrem)
	if (vmaxdif .gt. 0) write(6,*) 'T0, rmsdf: ', rms,extrem
           READ(10) DUM2DA
           READ(20) DUM2DB
           CALL RMSDIFF(DUM2DA,DUM2DB,IM,JM,LMH,L,RMS,VMAXDIF,extrem)
	if (vmaxdif .gt. 0) write(6,*) 'Q0, rmsdf: ', rms,extrem

	ENDDO

C** P0,HBOT,HTOP,RSWTOA,RLWTOA

	READ(10) TEMP1
	READ(20) TEMP2
	  CALL RMSDIFF2D(TEMP1,TEMP2,im,jm,rms,rmaxdf,extrem)
        if (rmaxdf .gt. 0) write(6,*) 'P0, rmsdf: ', rms,extrem
	READ(10) TEMP1
	READ(20) TEMP2
	  CALL RMSDIFF2D(TEMP1,TEMP2,im,jm,rms,rmaxdf,extrem)
        if (rmaxdf .gt. 0) write(6,*) 'HBOT, rmsdf: ', rms,extrem
	READ(10) TEMP1
	READ(20) TEMP2
	  CALL RMSDIFF2D(TEMP1,TEMP2,im,jm,rms,rmaxdf,extrem)
        if (rmaxdf .gt. 0) write(6,*) 'HTOP, rmsdf: ', rms,extrem
	READ(10) TEMP1
	READ(20) TEMP2
	  CALL RMSDIFF2D(TEMP1,TEMP2,im,jm,rms,rmaxdf,extrem)
        if (rmaxdf .gt. 0) write(6,*) 'RSWTOA, rmsdf: ', rms,extrem
	READ(10) TEMP1
	READ(20) TEMP2
	  CALL RMSDIFF2D(TEMP1,TEMP2,im,jm,rms,rmaxdf,extrem)
        if (rmaxdf .gt. 0) write(6,*) 'RLWTOA, rmsdf: ', rms,extrem

	

	STOP
	END

C23456789012345678901234567890123456789012345678901234567890123456789012

      SUBROUTINE RMSDIFF (ar,br,idim,jdim,lmh,l,rmsval,rmax,extrem)

       real ar(idim,jdim),br(idim,jdim)
	integer lmh(idim,jdim)

	extrem=-999999.
	rmax=-999999.
        rsum=0.
	NPOINTS=0

       do j=1,jdim
       do i=1,idim
	IF (L .le. LMH(I,J)) THEN
	NPOINTS=NPOINTS+1
	aval=amax1(abs(ar(i,j)),abs(br(i,j)))
	if (aval .gt. extrem) extrem=aval
	adif=abs(ar(i,j)-br(i,j))
	if (adif .gt. rmax) rmax=adif
           rsum=rsum+(ar(i,j)-br(i,j))**2.
	ENDIF
       enddo
       enddo

C	write(6,*) 'FOR LEVEL L found ', NPOINTS, ' points above ground'
        rmsval=(rsum/NPOINTS)**0.5
Cold       rmsval=(rsum)**0.5/NPOINTS

       return
       end

C23456789012345678901234567890123456789012345678901234567890123456789012

      SUBROUTINE RMSDIFF2D (ar,br,idim,jdim,rmsval,rmax,extrem)

       real ar(idim,jdim),br(idim,jdim)

        extrem=-999999.
        rmax=-999999.
        rsum=0.

       do j=1,jdim
       do i=1,idim
        aval=amax1(abs(ar(i,j)),abs(br(i,j)))
        if (aval .gt. extrem) extrem=aval
        adif=abs(ar(i,j)-br(i,j))
        if (adif .gt. rmax) rmax=adif
           rsum=rsum+(ar(i,j)-br(i,j))**2.
       enddo
       enddo

       rmsval=(rsum/(idim*jdim))**0.5

       return
       end


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      SUBROUTINE extreme (ar,br,idim,jdim,ipt,jpt)

       real ar(idim,jdim),br(idim,jdim)

	rmax=-999999.

       do j=1,jdim
       do i=1,idim
	adif=abs(ar(i,j)-br(i,j))
	if (adif .gt. rmax) then
	 rmax=adif
	 ipt=i
	 jpt=j
	endif
       enddo
       enddo

       return
       end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

codeEOF

$FC $FOPTS -o diffrest.x code.f

ln -sf  $FILE1                 ftn10
ln -sf  $FILE2                 ftn20
ln -sf  $CNSTFILE	       ftn30

./diffrest.x

exit
