#include <misc.h>
#include <params.h>
subroutine scm0(n ,deli ,df1 ,df2 ) 1,2
!-----------------------------------------------------------------------
!
! Purpose:
! Apply SCM0 limiter to derivative estimates.
! See Rasch and Williamson (1990)
!
! Method:
!
! Author: J. Olson
!
!-----------------------------------------------------------------------
!
! $Id: scm0.F90,v 1.1.2.2 2002/06/15 13:47:00 erik Exp $
! $Author: erik $
!
!-----------------------------------------------------------------------
use shr_kind_mod
, only: r8 => shr_kind_r8
use pmgrid
implicit none
!------------------------------Arguments--------------------------------
integer , intent(in) :: n ! length of vectors
real(r8), intent(in) :: deli(n) ! discrete derivative
real(r8), intent(inout) :: df1(n) ! limited left -edge derivative
real(r8), intent(inout) :: df2(n) ! limited right-edge derivative
!
! n Dimension of input arrays.
! deli deli(i) is the discrete derivative on interval i, i.e.,
! deli(i) = ( f(i+1) - f(i) )/( x(i+1) - x(i) ).
! df1 df1(i) is the limited derivative at the left edge of interval
! df2 df2(i) is the limited derivative at the right edge of interval
!-----------------------------------------------------------------------
!---------------------------Local variables-----------------------------
integer i ! index
real(r8) fac ! factor applied in limiter
real(r8) tmp1 ! derivative factor
real(r8) tmp2 ! abs(tmp1)
!-----------------------------------------------------------------------
!
fac = 3.*(1. - 10.*epsilon(fac))
do i = 1,n
tmp1 = fac*deli(i)
tmp2 = abs( tmp1 )
if( deli(i)*df1(i) <= 0.0 ) df1(i) = 0.
if( deli(i)*df2(i) <= 0.0 ) df2(i) = 0.
if( abs( df1(i) ) > tmp2 ) df1(i) = tmp1
if( abs( df2(i) ) > tmp2 ) df2(i) = tmp1
end do
return
end subroutine scm0