C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/salt_fill.F,v 1.5 2009/12/08 21:41:01 jmc Exp $
C $Name: $
#include "GAD_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: SALT_FILL
C !INTERFACE: ==========================================================
SUBROUTINE SALT_FILL(
I uVel, vVel,
U salt,
I flag,myTime,myIter,myThid)
C !DESCRIPTION:
C Fills in negatives for the salt (specific humidity) field
C
C The algorithm is as follows:
C
C Simplest scheme (flag = 1) -> borrow from below and create
C salt if needed at bottom level
C 'Get it back' (flag = 2) -> Fill negative of salt by getting it
C back from where it went
C If no immediate surrounding value is large enough to fill negative,
C the sum of immediate surrounding positive values is tried.
C If sum is not large enough, salt is simply set to zero.
C NOTE AS OF 6/2/06 -- DO NOT USE FLAG=2 OPTION - NOT WORKING
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
C !INPUT PARAMETERS: ===================================================
C uVel :: zonal velocity component
C vVel :: meridional velocity component
C salt :: salt field
C flag :: integer flag telling scheme how to fill
C myTime :: current time
C myIter :: iteration number
C myThid :: thread number
C !OUTPUT PARAMETERS: ==================================================
C salt :: salt array is replaced
_RL uVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
_RL vVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
_RL salt (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
INTEGER flag
_RL myTime
INTEGER myIter
INTEGER myThid
CEOP
C !FUNCTIONS:
c#ifdef ALLOW_DIAGNOSTICS
c LOGICAL DIAGNOSTICS_IS_ON
c EXTERNAL DIAGNOSTICS_IS_ON
c#endif
C !LOCAL VARIABLES:
INTEGER bi,bj,i,j,L,LM1
_RL dpratio
#ifdef ALLOW_DIAGNOSTICS
_RL tmpFac
#endif
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
#ifdef ALLOW_DIAGNOSTICS
C Fill diagnostic for filling with negative of salt
IF (useDiagnostics)THEN
tmpFac = -1. _d 0
CALL DIAGNOSTICS_SCALE_FILL(salt,tmpFac,1,'SALTFILL',
& 0,Nr,-1,bi,bj,myThid)
ENDIF
#endif
c Flag = 1:
c ---------------------------------
if(flag.eq.1) then
do L=Nr,2,-1
LM1 = L-1
dpratio= rC(L)/rC(LM1)
do j=1,sNy
do i=1,sNx
if( salt(i,j,L,bi,bj).lt.0.0 _d 0) then
salt(i,j,LM1,bi,bj) = salt(i,j,LM1,bi,bj) +
. salt(i,j,L,bi,bj)*dpratio
salt(i,j,L,bi,bj) = 0.0 _d 0
endif
enddo
enddo
enddo
do j=1,sNy
do i=1,sNx
if(salt(i,j,1,bi,bj).lt.0.0 _d 0)
. salt(i,j,1,bi,bj) = 0.0 _d 0
enddo
enddo
else
print *,'Invalid Flag in salt_fill - nothing done '
endif
#ifdef ALLOW_DIAGNOSTICS
C Fill diagnostic for filling with salt - get tendency
IF ( useDiagnostics ) THEN
CALL DIAGNOSTICS_FILL(salt,'SALTFILL',0,Nr,1,bi,bj,myThid)
ENDIF
#endif
ENDDO
ENDDO
RETURN
END