C $Header: /u/gcmpack/MITgcm/pkg/ebm/ebm_wind_perturb.F,v 1.4 2011/08/28 22:18:13 jmc Exp $
C $Name:  $

#include "EBM_OPTIONS.h"

CStartOfInterface
      SUBROUTINE EBM_WIND_PERTURB( myTime, myIter, myThid )
C     *==========================================================*
C     | S/R EBM_WIND_PERTURB
C     | o Calculated random wind perturbations.
C     *==========================================================*
      IMPLICIT NONE

C     == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "FFIELDS.h"
#ifdef ALLOW_EBM
# include "EBM.h"
#endif

C     == Routine arguments ==
      _RL    myTime
      INTEGER myIter
      INTEGER myThid
CEndOfInterface

#ifdef ALLOW_EBM
# ifdef EBM_WIND_PERT

C     == Local variables ==
C     Loop counters
      INTEGER i, j, bi, bj
      _RS ya(1-OLy:sNy+OLy), ya2(1-OLy:sNy+OLy)
      _RS xa(1-OLx:sNx+OLx), xa2(1-OLx:sNx+OLx)
      _RS y(1-OLy:sNy+OLy), x(1-OLx:sNx+OLx)
      _RS temp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      _RS temp2(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
      _RS stdev(1-OLy:sNy+OLy)
      _RS std(1:40)
      data std /0.030, 0.035, 0.045, 0.053, 0.059, 0.060, 0.056,
     &          0.048, 0.041, 0.038, 0.034, 0.029, 0.023, 0.018,
     &          0.016, 0.015, 0.013, 0.011, 0.008, 0.005, 0.005,
     &          0.005, 0.008, 0.011, 0.014, 0.014, 0.017, 0.019,
     &          0.023, 0.029, 0.032, 0.038, 0.048, 0.058, 0.065,
     &          0.067, 0.063, 0.060, 0.062, 0.064 /


      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)

      DO j = 1-OLy, sNy+OLy
         y(j) = 0.0
         ya(j) = 0.0
         ya2(j) =  0.0
         stdev(j) = 0.0
      ENDDO
      DO i = 1-OLx, sNx+OLx
         x(i) = 0.0
         xa(i) = 0.0
         xa2(i) =  0.0
      ENDDO
      DO i = 1-OLx, sNx+OLx
        DO j = 1-OLy, sNy+OLy
         temp(i,j) = 0.0
         temp2(i,j) = 0.0
        ENDDO
      ENDDO
      DO j = 1, sNy
         stdev(j) = std(j)
      ENDDO

cph   Generate random numbers
cph   Need to get this from somewhere!
      call RANDOM_NUMBER (temp)

C     interpolation in first dimension
C     scaling to get a process with a standard deviation of 1
      DO j = jMin, jMax
       DO i = iMin, iMax
         temp(i,j) = 1.73*(2.0*temp(i,j) - 1.0)
       ENDDO
      ENDDO

      DO j = jMin, jMax
       DO i = iMin, iMax
         x(i) = i
         xa(i) = x(i) - MOD(x(i),10.0)
         xa2(i) = xa(i)+10.0
        if ( xa2(i) .gt. sNx+Olx ) then
           xa2(i) = 0.0
         endif
         temp2(i,j) = 0.1*( (x(i)-xa(i))*temp(INT(xa2(i)),j)+
     &        (10.0-x(i)+xa(i))*temp(INT(xa(i)),j) )
       ENDDO
      ENDDO

C     interpolation in second dimension
C     multiplication with observation zonal wind stress standard deviation
C     add AR1 process
      DO i = iMin, iMax
       DO j = jMin, jMax
         y(j) = j
         ya(j) = y(j) - MOD(y(j),6.0)
         ya2(j) = ya(j)+6.0
         if ( ya2(j) .gt. sNy+Oly ) then
            ya2(j) = 0.0
         endif
c     time lag correlation coefficient, use 0.75 for temperature timescale,
c     0.98 for the momentum timescale.
         winPert(i,j,bi,bj) = maskW(i,j,k,bi,bj)*
     &        (1.0/1.66)*(0.75*winPert(i,j,bi,bj) +
     &        stdev(j)*(1.0/6.0)*
     &        ((y(j)-ya(j))*temp2(i,INT(ya2(j)))+
     &        (6.0-y(j)+ya(j))*temp2(i,INT(ya(j)))))
       ENDDO
      ENDDO

       ENDDO
      ENDDO

C      CALL PLOT_FIELD_XYRS( winPert, 'winPert',1,myThid)

      _EXCH_XY_RS(winPert  , myThid )

      DO bj=myByLo(myThid),myByHi(myThid)
       DO bi=myBxLo(myThid),myBxHi(myThid)
         DO j = 1-OLy, sNy+OLy
          DO i = 1-OLx, sNx+OLx
            fu(i,j,bi,bj) = fu(i,j,bi,bj)
     &                    + winPert(i,j,bi,bj)*rUnit2mass
     &                     *drF(1)*hFacW(i,j,1,bi,bj)
          ENDDO
         ENDDO
       ENDDO
      ENDDO

# endif /* EBM_WIND_PERT */
#endif /* ALLOW_EBM */

      RETURN
      END