C $Header: /u/gcmpack/MITgcm/pkg/zonal_filt/zonal_filt_init.F,v 1.8 2012/08/06 16:55:37 jmc Exp $
C $Name: $
#include "ZONAL_FILT_OPTIONS.h"
CBOP
C !ROUTINE: ZONAL_FILT_INIT
C !INTERFACE:
SUBROUTINE ZONAL_FILT_INIT( myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | S/R ZONAL_FILT_INIT
C | o Initialise FFT filter for latitude circle.
C *==========================================================*
C | The details of particular FFT libraries may differ.
C | Changing to a different library may entail modifying the
C | code here. However, the broad process is usually the
C | same.
C | Note - Fourier modes for sNx and sNx+1 are damped in the
C | same way. This is because we have not implemented
C | a scheme that sets the damping factor for the
C | highest wave number for odd sNx. Instead the
C | highest wave number for odd sNx. Instead only
C | wave numbers 1:INT(sNx/2) are partially damped.
C | Wave number sNx/2 (if it exists) is removed
C | altogether.
C *==========================================================*
C \ev
C !USES:
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "ZONAL_FILT.h"
#include "FFTPACK.h"
C !INPUT/OUTPUT PARAMETERS:
C == Routine arguments ==
C myThid :: my Thread Id number
INTEGER myThid
CEOP
#ifdef ALLOW_ZONAL_FILT
C !LOCAL VARIABLES:
C == Local variables ==
C alpha :: Used to evaluate frequency and latitude dependent
C amplitude damping factor.
C wvNum :: Wave number
C lat :: Temporary holding latitude
C nWv :: No. of waves that fit on grid.
C msgBuf :: Informational/error message buffer
c _RL alpha, wvNum
c INTEGER nWv
INTEGER i, j, bi, bj
CHARACTER*(MAX_LEN_MBUF) msgBuf
C !FUNCTIONS:
_RL ampfact
_RS lat
ampfact(lat,i) = MIN( oneRL,
& ( COS( ABS(lat)*deg2rad )
& /COS( zonal_filt_lat*deg2rad ) )**zonal_filt_cospow
& /(SIN( PI*FLOAT(i)/FLOAT(Nx) ) )**zonal_filt_sinpow
& )
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
IF ( sNx.NE.Nx ) THEN
WRITE(msgBuf,'(A,I3,A)')
& 'S/R ZONAL_FILT_INIT: Multi-tiles ( nSx*nPx=', nSx*nPx, ' )'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A)')
& ' in Zonal (X) dir. not implemented in Zonal-Filter code'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R ZONAL_FILT_INIT'
ENDIF
_BEGIN_MASTER(myThid)
C o Initialise specific library FFT package
DO bj=1,nSy
c CALL R8FFTI( Nx, FFTPACKWS(1,bj) )
CALL R8FFTI1( Nx, FFTPACKWS2(1,bj), FFTPACKWS3(1,bj) )
ENDDO
C o Set amplitude scale factor as function of latitude and mode number
DO bj=1,nSy
DO bi=1,nSx
DO j=1-oLy,sNy+Oly
ampFactor(1,j,bi,bj) = oneRL
ampFactorV(1,j,bi,bj) = oneRL
DO i=1,Nx/2-1
ampFactor(2*i,j,bi,bj) = ampfact( yC(1,j,bi,bj) , I )
c IF (ampFactor(2*i,j,bi,bj).LE..9) ampFactor(2*i,j,bi,bj)=0.
ampFactor(2*I+1,j,bi,bj) = ampFactor(2*i,j,bi,bj)
ampFactorV(2*i,j,bi,bj) = ampfact( yG(1,j,bi,bj) , I )
c IF (ampFactorV(2*i,j,bi,bj).LE..9) ampFactorV(2*i,j,bi,bj)=0.
ampFactorV(2*I+1,j,bi,bj) = ampFactorV(2*i,j,bi,bj)
ENDDO
i=Nx/2
IF ( zonal_filt_mode2dx.EQ.0 ) THEN
ampFactor(Nx,j,bi,bj) = ampfact( yC(1,j,bi,bj) , i )
ampFactorV(Nx,j,bi,bj) = ampfact( yG(1,j,bi,bj) , i )
ELSE
ampFactor(Nx,j,bi,bj) = 0.
ampFactorV(Nx,j,bi,bj) = 0.
ENDIF
ENDDO
ENDDO
ENDDO
_END_MASTER(myThid)
CALL BAR2(myThid)
CALL WRITE_REC_XY_RL( 'ampFactor', ampFactor, 1, 0, myThid )
#endif /* ALLOW_ZONAL_FILT */
RETURN
END