!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer, 
!                     version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms 
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer 
!version 3 or (at your option) any later version that should be found at: 
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html 
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software; 
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), 
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
***S/P DIFUVD4
*

      SUBROUTINE DIFUVD4 (D, KU, GU, S, SK, TYPE, N, NK)
*
#include "impnone.cdk"
      INTEGER N, NK
      REAL KU(N,NK), GU(N,NK), S(n,NK), SK(n,NK)
      CHARACTER TYPE*(*)
      REAL D(N, NK)
*
*Author
*          R. Benoit (Mar 89)
*
*Object
*          to calculate a vertical derivative consistent with
*          DIFUVDF; D/DS (KU*GU)
*
*Revisions
* 001      R. Benoit (Aug 93) Local sigma
* 002      M. Lepine (March 2003) -  CVMG... Replacements
*
*Arguments
*
*          - Output -
* D        vertical derivative
*
*          - Input -
* KU       diffusion coefficient
* GU       optional countergradient term
* S        sigma levels for U
* SK       sigma coordinates of diffusion coefficient levels
* TYPE     type of variable for U ('U', 'UT', 'E')
* N        number of columns to process
* NK       vertical dimension
*
**
*
      INTEGER I, K, NKX
      REAL ST, SB, HM, HP, HD, KUM, KUP, SCK1
      LOGICAL DEBUG
      SAVE DEBUG
      DATA DEBUG /.FALSE./
*
      logical typeisut
*
      sb(i)=sk(i,nk)
*
      IF (DEBUG) THEN
         PRINT *,' S/R DIFUVD4..TYPE,N,NK=',
     %   TYPE,N,NK
*        PRINT *,' S=',S
*        PRINT *,' SK=',SK
         I=1
         PRINT *,' KU(',I,',*)=',(K,KU(I,K),K=1,NK)
         PRINT *,' GU(',I,',*)=',(K,GU(I,K),K=1,NK)
      ENDIF
*
*     ST=S(1)-0.5*(S(2)-S(1))
*     SB=SK(NK)
*
      typeisut=.false.
      IF (TYPE(1:1).EQ.'U') THEN
         NKX=NK
         SCK1=1
         IF (LEN(TYPE).GT.1) THEN
            IF (TYPE(2:2).EQ.'T') THEN
               SCK1=0
               typeisut=.true.
*              ST=S(1)
*           ELSE
*              PRINT *,' S/R DIFUVD4. TYPE INCONNU= ',TYPE,' STOP...'
*              CALL QQEXIT(1)
            ENDIF
         ENDIF
      ELSE IF (TYPE.EQ.'E') THEN
         NKX=NK-1
      ELSE
         PRINT *,' S/R DIFUVD4. TYPE INCONNU= ',TYPE,' STOP...'
         CALL QQEXIT(1)
      ENDIF
*
*     CONSTRUIRE LE TERME CONTRE-GRADIENT (DANS D)
*
      IF (TYPE(1:1).EQ.'U') THEN
*
*     K=1
*
         HM=0
         DO 10 I=1,N
            HP=S(i,2)-S(i,1)
!            HD=0.5*(S(i,1)+S(i,2))-ST(i)
            if (typeisut) then
               HD=0.5*(S(i,1)+S(i,2))-s(i,1)
            else
               HD=0.5*(S(i,1)+S(i,2))-
     %            (S(i,1)-0.5*(S(i,2)-S(i,1)))
            endif
10          D(I,1)=SCK1*KU(I,1)*GU(I,1)/HD
*
*     K=2...NK-1
*
         DO 11 K=2,NK-1,1
            DO 11 I=1,N
               HM=S(i,K)-S(i,K-1)
               HP=S(i,K+1)-S(i,K)
               HD=0.5*(HM+HP)
11             D(I,K)=(KU(I,K)*GU(I,K)-KU(I,K-1)*GU(I,K-1))/HD
*
*     K=NK
*
         HP=0
         DO 12 I=1,N
            HM=S(i,NK)-S(i,NK-1)
            HD=SB(i)-0.5*(S(i,NK-1)+S(i,NK))
12          D(I,NK)=(0-KU(I,NK-1)*GU(I,NK-1))/HD
      ELSE
*
*     TYPE='E'
*
*     K=1
*
         DO 13 I=1,N
            HM=S(i,2)-S(i,1)
            HP=SK(i,2)-SK(i,1)
            HD=0.5*(SK(i,2)+SK(i,1)) -S(i,1)
            KUM=0.5*KU(I,1)
            KUP=0.5*(KU(I,1)+KU(I,2))
13          D(I,1)=(KUP*(GU(I,1)+GU(I,2))-KUM*GU(I,1))/(2*HD)
*
*     K=2...NK-2
*
         DO 14 K=2,NK-2,1
            DO 14 I=1,N
               HM=SK(i,K)-SK(i,K-1)
               HP=SK(i,K+1)-SK(i,K)
               HD=0.5*(HM+HP)
               KUM=0.5*(KU(I,K-1)+KU(I,K))
               KUP=0.5*(KU(I,K+1)+KU(I,K))
14             D(I,K)=(KUP*(GU(I,K)+GU(I,K+1))
     %                -KUM*(GU(I,K-1)+GU(I,K)))/(2*HD)
*
*     K=NK-1=NKX
*
         HP=0
         DO 15 I=1,N
            HM=SK(i,NK-1)-SK(i,NK-2)
            HD=SB(i)-0.5*(SK(i,NK-1)+SK(i,NK-2))
            KUM=0.5*(KU(I,NK-1)+KU(I,NK-2))
            KUP=0
15          D(I,NKX)=(0-KUM*(GU(I,NK-1)+GU(I,NK-2)))/(2*HD)  !NK=>NKX 14
*
      ENDIF
*
      RETURN
      END