*IF DEF,OCEAN                                                              ISOPYC_A.2      
C ******************************COPYRIGHT******************************    ISOPYC_A.3      
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved.    ISOPYC_A.4      
C                                                                          ISOPYC_A.5      
C Use, duplication or disclosure of this code is subject to the            ISOPYC_A.6      
C restrictions as set forth in the contract.                               ISOPYC_A.7      
C                                                                          ISOPYC_A.8      
C                Meteorological Office                                     ISOPYC_A.9      
C                London Road                                               ISOPYC_A.10     
C                BRACKNELL                                                 ISOPYC_A.11     
C                Berkshire UK                                              ISOPYC_A.12     
C                RG12 2SZ                                                  ISOPYC_A.13     
C                                                                          ISOPYC_A.14     
C If no contract has been raised with this copy of the code, the use,      ISOPYC_A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      ISOPYC_A.16     
C to do so must first be obtained in writing from the Head of Numerical    ISOPYC_A.17     
C Modelling at the above address.                                          ISOPYC_A.18     
C ******************************COPYRIGHT******************************    ISOPYC_A.19     
C                                                                          ISOPYC_A.20     
CLL   Subroutine ISOPYC_A                                                  ISOPYC_A.21     
CLL                                                                        ISOPYC_A.22     
CLL   Author: M J Roberts                                                  ISOPYC_A.23     
CLL                                                                        ISOPYC_A.24     
CLL   Description: Compute isopycnal transport velocities (for the         ISOPYC_A.25     
CLL                Gent and McWilliams scheme).                            ISOPYC_A.26     
CLL                                                                        ISOPYC_A.27     
CLL   External documentation:                                              ISOPYC_A.28     
CLL       Modular Ocean Model 2 manual and code                            ISOPYC_A.29     
CLL                                                                        ISOPYC_A.30     
CLL   Implemented at UM vn 4.5 26 June 1998                                ISOPYC_A.31     
CLL                                                                        ISOPYC_A.32     
CLL   Modification History  :                                              ISOPYC_A.33     
CLL   Version   Date     Comment & Name                                    ISOPYC_A.34     
CLL   ------- --------  --------------------------------------------       ISOPYC_A.35     
CLL                                                                        ISOPYC_A.36     
CLL   Subroutine dependencies.                                             ISOPYC_A.37     
CLL   Called by ISOPYC_M                                                   ISOPYC_A.38     
CLL                                                                        ISOPYC_A.39     
CLLEND------------------------------------------------------------------   ISOPYC_A.40     
C                                                                          ISOPYC_A.41     

      SUBROUTINE ISOPYC_A (                                                 1,14ISOPYC_A.42     
*CALL ARGSIZE                                                              ISOPYC_A.43     
*CALL COCAWRKA                                                             ISOPYC_A.44     
     & ,j,dtxsqr,slmxr,dz2r,csu,dzt,athkdftu,athkdftv,athkdf,              ISOPYC_A.45     
     & cstr,dxtr,dytr,adv_vetiso,adv_vbtiso,slopec,dslope,dxur,dyur,       ISOPYC_A.46     
     & cst,csr,J_OFFSET,athkdf_bi,srho)                                    ISOPYC_A.47     
c                                                                          ISOPYC_A.48     
c=======================================================================   ISOPYC_A.49     
c     compute isopycnal transport velocities.                              ISOPYC_A.50     
c=======================================================================   ISOPYC_A.51     
c                                                                          ISOPYC_A.52     
      IMPLICIT NONE                                                        ISOPYC_A.53     
                                                                           ISOPYC_A.54     
*CALL OARRYSIZ                                                             ISOPYC_A.55     
*CALL TYPSIZE                                                              ISOPYC_A.56     
*CALL CNTLOCN                                                              ISOPYC_A.57     
*CALL COCTWRKA                                                             ISOPYC_A.58     
                                                                           ISOPYC_A.59     
C Input variables                                                          ISOPYC_A.60     
      INTEGER j,J_OFFSET                                                   ISOPYC_A.61     
      REAL dtxsqr(km),slmxr,dz2r(km),csu(jmt),dzt(km),                     ISOPYC_A.62     
     &     cstr(jmt),dxtr(imt),dytr(jmt),slopec,dslope,dxur(imt),          ISOPYC_A.63     
     &     dyur(jmt),cst(jmt),csr(jmt),kappa                               ISOPYC_A.64     
      REAL athkdftu(imt_vis,jmt_vis),athkdftv(imt_vis,jmt_vis)             ISOPYC_A.65     
       REAL athkdf(km),athkdftu_bi,athkdftv_bi,athkdf_bi                   ISOPYC_A.66     
       REAL athkdftu_mom(imt,km),athkdftv_mom(imt,km)                      ISOPYC_A.67     
c      REAL fmpp(imt,km)                                                   ISOPYC_A.68     
                                                                           ISOPYC_A.69     
C output variables                                                         ISOPYC_A.70     
      REAL adv_vetiso(imt_gmm,km_gmm),   ! GM eastern velocity             ISOPYC_A.71     
     &     adv_vbtiso(imt_gmm,0:km_gmm)  ! GM vertical velocity            ISOPYC_A.72     
      REAL srho(imt,km)                                                    ISOPYC_A.73     
                                                                           ISOPYC_A.74     
C Local variables                                                          ISOPYC_A.75     
      INTEGER k,km1,kp1,i                                                  ISOPYC_A.76     
      REAL sc,Ath0,at,bt,epsln,ab,bb,absstn,abssbn,                        ISOPYC_A.77     
     &     c0,c1,p5,absste,abssbe,                                         ISOPYC_A.78     
     &     ath_t(imt,km),   ! scaling factor for eastern top slopes        ISOPYC_A.79     
     &     ath_b(imt,km)    ! scaling factor for eastern bottom slopes     ISOPYC_A.80     
      REAL rhoz(imt,km),rhotmp,rhotmp1                                     ISOPYC_A.81     
                                                                           ISOPYC_A.82     
C top and bottom boundary conditions                                       ISOPYC_A.83     
      REAL top_bc(km), bot_bc(km)                                          ISOPYC_A.84     
                                                                           ISOPYC_A.85     
C ratio of zonal to vertical density gradients                             ISOPYC_A.86     
      REAL ste(imt,km),sbe(imt,km)                                         ISOPYC_A.87     
                                                                           ISOPYC_A.88     
C grad^2 (ste,stn) etc for biharmonic GM scheme                            ISOPYC_A.89     
      REAL ste_d2(imt,km),sbe_d2(imt,km),                                  ISOPYC_A.90     
     &     stn_d2(imt,km),sbn_d2(imt,km)                                   ISOPYC_A.91     
                                                                           ISOPYC_A.92     
! Temporary values used in optimised tanh calculations                     ISOPYC_A.93     
      REAL tanh_temp(imt*2)                                                ISOPYC_A.94     
                                                                           ISOPYC_A.95     
      REAL part1, part2, Ath0_j, Ath0_jp1                                  ISOPYC_A.96     
                                                                           ISOPYC_A.97     
      c0=0.                                                                ISOPYC_A.98     
      c1=1.                                                                ISOPYC_A.99     
      p5=.5                                                                ISOPYC_A.100    
      epsln=1.0e-25                                                        ISOPYC_A.101    
c      do k=1,km                                                           ISOPYC_A.102    
c      do i=1,imt                                                          ISOPYC_A.103    
c        fmpp(i,k)=0.                                                      ISOPYC_A.104    
c      enddo                                                               ISOPYC_A.105    
c      enddo                                                               ISOPYC_A.106    
c                                                                          ISOPYC_A.107    
C coefficient for biharmonic GM scheme                                     ISOPYC_A.108    
      athkdftu_bi=athkdf_bi                                                ISOPYC_A.109    
      athkdftv_bi=athkdf_bi                                                ISOPYC_A.110    
                                                                           ISOPYC_A.111    
      IF (.NOT.L_OVISBECK) THEN                                            ISOPYC_A.112    
        do k=1,km                                                          ISOPYC_A.113    
         do i=1,imt                                                        ISOPYC_A.114    
          athkdftu_mom(i,k)=athkdf(k)                                      ISOPYC_A.115    
          athkdftv_mom(i,k)=athkdf(k)                                      ISOPYC_A.116    
         enddo                                                             ISOPYC_A.117    
        enddo                                                              ISOPYC_A.118    
      ELSE                                                                 ISOPYC_A.119    
        do k=1,km                                                          ISOPYC_A.120    
         do i=1,imt                                                        ISOPYC_A.121    
          athkdftu_mom(i,k)=athkdftu(i,j)                                  ISOPYC_A.122    
          athkdftv_mom(i,k)=athkdftv(i,j)                                  ISOPYC_A.123    
         enddo                                                             ISOPYC_A.124    
        enddo                                                              ISOPYC_A.125    
      ENDIF  ! L_OVISBECK                                                  ISOPYC_A.126    
                                                                           ISOPYC_A.127    
      IF (L_OISOGM) THEN                                                   ISOPYC_A.128    
                                                                           ISOPYC_A.129    
      do k=1,km                                                            ISOPYC_A.130    
        top_bc(k) = c1                                                     ISOPYC_A.131    
        bot_bc(k) = c1                                                     ISOPYC_A.132    
      enddo                                                                ISOPYC_A.133    
      top_bc(1)  = c0                                                      ISOPYC_A.134    
      bot_bc(km) = c0                                                      ISOPYC_A.135    
                                                                           ISOPYC_A.136    
      IF (J+J_OFFSET.eq.2) THEN                                            ISOPYC_A.137    
                                                                           ISOPYC_A.138    
        do k=1,km                                                          ISOPYC_A.139    
          km1 = max(k-1,1)                                                 ISOPYC_A.140    
          kp1 = min(k+1,km)                                                ISOPYC_A.141    
          do i=1,imt                                                       ISOPYC_A.142    
            at =  ((alphai(i,k,0) + alphai(i,k,1)) + alphai(i,km1,0))      ISOPYC_A.143    
     &              + alphai(i,km1,1)                                      ISOPYC_A.144    
            bt =  ((betai(i,k,0) + betai(i,k,1)) + betai(i,km1,0))         ISOPYC_A.145    
     &              + betai(i,km1,1)                                       ISOPYC_A.146    
            stn(i,k,1) = -(at*(ddyt(i,k,1,1) + ddyt(i,km1,1,1))            ISOPYC_A.147    
     &               + bt*(ddyt(i,k,2,1) + ddyt(i,km1,2,1)))               ISOPYC_A.148    
     &               / (at*(ddzt(i,km1,1,0) + ddzt(i,km1,1,1))             ISOPYC_A.149    
     &               + bt*(ddzt(i,km1,2,0) + ddzt(i,km1,2,1))+epsln)       ISOPYC_A.150    
c                                                                          ISOPYC_A.151    
            ab =  ((alphai(i,k,0) + alphai(i,k,1)) + alphai(i,kp1,0))      ISOPYC_A.152    
     &              + alphai(i,kp1,1)                                      ISOPYC_A.153    
            bb =  ((betai(i,k,0) + betai(i,k,1)) + betai(i,kp1,0))         ISOPYC_A.154    
     &              + betai(i,kp1,1)                                       ISOPYC_A.155    
            sbn(i,k,1) = -(ab*(ddyt(i,k,1,1) + ddyt(i,kp1,1,1))            ISOPYC_A.156    
     &               + bb*(ddyt(i,k,2,1) + ddyt(i,kp1,2,1)))               ISOPYC_A.157    
     &               / (ab*(ddzt(i,k,1,0) + ddzt(i,k,1,1))                 ISOPYC_A.158    
     &               + bb*(ddzt(i,k,2,0) + ddzt(i,k,2,1))+epsln)           ISOPYC_A.159    
                                                                           ISOPYC_A.160    
            stn(i,k,0)=c0                                                  ISOPYC_A.161    
            sbn(i,k,0)=c0                                                  ISOPYC_A.162    
          enddo                                                            ISOPYC_A.163    
        enddo                                                              ISOPYC_A.164    
                                                                           ISOPYC_A.165    
      IF (L_OISOTAPER) THEN                                                ISOPYC_A.166    
        do k=1,km                                                          ISOPYC_A.167    
          kp1 = min(k+1,km)                                                ISOPYC_A.168    
          do i=1,imt                                                       ISOPYC_A.169    
            Ath0 = c1                                                      ISOPYC_A.170    
c            Ath0 = athkdftv_bi(i,k)                                       ISOPYC_A.171    
            ath_tn(i,k,0) = c0                                             ISOPYC_A.172    
            ath_bn(i,k,0) = c0                                             ISOPYC_A.173    
            absstn = abs(stn(i,k,1))                                       ISOPYC_A.174    
            abssbn = abs(sbn(i,k,1))                                       ISOPYC_A.175    
            tanh_temp(i) = (absstn-slopec)/dslope                          ISOPYC_A.176    
            tanh_temp(i+imt) = (abssbn-slopec)/dslope                      ISOPYC_A.177    
          enddo                                                            ISOPYC_A.178    
                                                                           ISOPYC_A.179    
          call fast_tanh(imt*2,tanh_temp)                                  ISOPYC_A.180    
                                                                           ISOPYC_A.181    
          do i=1,imt                                                       ISOPYC_A.182    
            ath_tn(i,k,1) = (((Ath0*fm(i,k))*fmp(i,k))                     ISOPYC_A.183    
     &             *p5)*(c1-tanh_temp(i))                                  ISOPYC_A.184    
            ath_bn(i,k,1) = (((Ath0*fm(i,kp1))*fmp(i,kp1))                 ISOPYC_A.185    
     &             *p5)*(c1-tanh_temp(i+imt))                              ISOPYC_A.186    
          enddo                                                            ISOPYC_A.187    
        enddo                                                              ISOPYC_A.188    
                                                                           ISOPYC_A.189    
      ELSE                                                                 ISOPYC_A.190    
                                                                           ISOPYC_A.191    
        do k=1,km                                                          ISOPYC_A.192    
          sc = c1/(slmxr*dtxsqr(k))                                        ISOPYC_A.193    
          kp1 = min(k+1,km)                                                ISOPYC_A.194    
          do i=1,imt                                                       ISOPYC_A.195    
            Ath0 = c1                                                      ISOPYC_A.196    
c            Ath0 = athkdftv_bi(i,k)                                       ISOPYC_A.197    
            absstn = abs(stn(i,k,1))                                       ISOPYC_A.198    
            abssbn = abs(sbn(i,k,1))                                       ISOPYC_A.199    
            if (absstn .gt. sc) then                                       ISOPYC_A.200    
              ath_tn(i,k,1) = ((Ath0*fm(i,k))*fmp(i,k))                    ISOPYC_A.201    
     &              *(sc/(absstn + epsln))**2                              ISOPYC_A.202    
            else                                                           ISOPYC_A.203    
              ath_tn(i,k,1) = (Ath0*fm(i,k))*fmp(i,k)                      ISOPYC_A.204    
            endif                                                          ISOPYC_A.205    
            if (abssbn .gt. sc) then                                       ISOPYC_A.206    
              ath_bn(i,k,1) = ((Ath0*fm(i,kp1))*fmp(i,kp1))                ISOPYC_A.207    
     &              *(sc/(abssbn + epsln))**2                              ISOPYC_A.208    
            else                                                           ISOPYC_A.209    
              ath_bn(i,k,1) = (Ath0*fm(i,kp1))*fmp(i,kp1)                  ISOPYC_A.210    
            endif                                                          ISOPYC_A.211    
          enddo                                                            ISOPYC_A.212    
        enddo                                                              ISOPYC_A.213    
      ENDIF ! taper                                                        ISOPYC_A.214    
                                                                           ISOPYC_A.215    
      ELSE  ! j.ne.2                                                       ISOPYC_A.216    
                                                                           ISOPYC_A.217    
      do k=1,km                                                            ISOPYC_A.218    
        do i=1,imt                                                         ISOPYC_A.219    
          stn(i,k,0)=stn(i,k,1)                                            ISOPYC_A.220    
          ath_tn(i,k,0)=ath_tn(i,k,1)                                      ISOPYC_A.221    
          sbn(i,k,0)=sbn(i,k,1)                                            ISOPYC_A.222    
          ath_bn(i,k,0)=ath_bn(i,k,1)                                      ISOPYC_A.223    
        enddo                                                              ISOPYC_A.224    
      enddo                                                                ISOPYC_A.225    
                                                                           ISOPYC_A.226    
      IF (L_OBIHARMGM) THEN                                                ISOPYC_A.227    
      do k=1,km                                                            ISOPYC_A.228    
        do i=1,imt                                                         ISOPYC_A.229    
            stn(i,k,1)=stn(i,k,2)                                          ISOPYC_A.230    
            stn(i,k,2)=c0                                                  ISOPYC_A.231    
            ath_tn(i,k,1)=ath_tn(i,k,2)                                    ISOPYC_A.232    
            ath_tn(i,k,2)=c0                                               ISOPYC_A.233    
            sbn(i,k,1)=sbn(i,k,2)                                          ISOPYC_A.234    
            sbn(i,k,2)=c0                                                  ISOPYC_A.235    
            ath_bn(i,k,1)=ath_bn(i,k,2)                                    ISOPYC_A.236    
            ath_bn(i,k,2)=c0                                               ISOPYC_A.237    
        enddo                                                              ISOPYC_A.238    
      enddo                                                                ISOPYC_A.239    
      ENDIF                                                                ISOPYC_A.240    
                                                                           ISOPYC_A.241    
      ENDIF  ! j=2                                                         ISOPYC_A.242    
                                                                           ISOPYC_A.243    
C update old meridional GM velocity                                        ISOPYC_A.244    
      do k=1,km                                                            ISOPYC_A.245    
        do i=1,imt                                                         ISOPYC_A.246    
          adv_vntiso(i,k,0)=adv_vntiso(i,k,1)                              ISOPYC_A.247    
        enddo                                                              ISOPYC_A.248    
      enddo                                                                ISOPYC_A.249    
c                                                                          ISOPYC_A.250    
c-----------------------------------------------------------------------   ISOPYC_A.251    
c     compute the meridional component of the isopycnal mixing velocity    ISOPYC_A.252    
c     at the center of the northern face of the "T" cells.                 ISOPYC_A.253    
c-----------------------------------------------------------------------   ISOPYC_A.254    
c                                                                          ISOPYC_A.255    
        IF (L_OBIHARMGM) THEN                                              ISOPYC_A.256    
        do k=1,km                                                          ISOPYC_A.257    
          km1 = max(k-1,1)                                                 ISOPYC_A.258    
          kp1 = min(k+1,km)                                                ISOPYC_A.259    
          do i=1,imt                                                       ISOPYC_A.260    
            at = ((alphai(i,k,1) + alphai(i,k,2)) + alphai(i,km1,1))       ISOPYC_A.261    
     &            + alphai(i,km1,2)                                        ISOPYC_A.262    
            bt = ((betai(i,k,1) + betai(i,k,2)) + betai(i,km1,1))          ISOPYC_A.263    
     &            + betai(i,km1,2)                                         ISOPYC_A.264    
            stn(i,k,2) = -(at*(ddyt(i,k,1,2) + ddyt(i,km1,1,2))            ISOPYC_A.265    
     &               + bt*(ddyt(i,k,2,2) + ddyt(i,km1,2,2)))               ISOPYC_A.266    
     &               / (at*(ddzt(i,km1,1,1) + ddzt(i,km1,1,2))             ISOPYC_A.267    
     &               + bt*(ddzt(i,km1,2,1) + ddzt(i,km1,2,2))+epsln)       ISOPYC_A.268    
                                                                           ISOPYC_A.269    
            ab =  ((alphai(i,k,1) + alphai(i,k,2)) + alphai(i,kp1,1))      ISOPYC_A.270    
     &            + alphai(i,kp1,2)                                        ISOPYC_A.271    
            bb =  ((betai(i,k,1) + betai(i,k,2)) + betai(i,kp1,1))         ISOPYC_A.272    
     &            + betai(i,kp1,2)                                         ISOPYC_A.273    
            sbn(i,k,2) = -(ab*(ddyt(i,k,1,2) + ddyt(i,kp1,1,2))            ISOPYC_A.274    
     &               + bb*(ddyt(i,k,2,2) + ddyt(i,kp1,2,2)))               ISOPYC_A.275    
     &               / (ab*(ddzt(i,k,1,1) + ddzt(i,k,1,2))                 ISOPYC_A.276    
     &               + bb*(ddzt(i,k,2,1) + ddzt(i,k,2,2))+epsln)           ISOPYC_A.277    
          enddo                                                            ISOPYC_A.278    
        enddo                                                              ISOPYC_A.279    
                                                                           ISOPYC_A.280    
        ELSE                                                               ISOPYC_A.281    
                                                                           ISOPYC_A.282    
        do k=1,km                                                          ISOPYC_A.283    
          km1 = max(k-1,1)                                                 ISOPYC_A.284    
          kp1 = min(k+1,km)                                                ISOPYC_A.285    
          do i=1,imt                                                       ISOPYC_A.286    
            at =   ((alphai(i,k,0) + alphai(i,k,1))+alphai(i,km1,0))       ISOPYC_A.287    
     &            + alphai(i,km1,1)                                        ISOPYC_A.288    
            bt =   ((betai(i,k,0) + betai(i,k,1)) + betai(i,km1,0))        ISOPYC_A.289    
     &            + betai(i,km1,1)                                         ISOPYC_A.290    
            stn(i,k,1) = -(at*(ddyt(i,k,1,1) + ddyt(i,km1,1,1))            ISOPYC_A.291    
     &               + bt*(ddyt(i,k,2,1) + ddyt(i,km1,2,1)))               ISOPYC_A.292    
     &               / (at*(ddzt(i,km1,1,0) + ddzt(i,km1,1,1))             ISOPYC_A.293    
     &               + bt*(ddzt(i,km1,2,0) + ddzt(i,km1,2,1))+epsln)       ISOPYC_A.294    
                                                                           ISOPYC_A.295    
            ab =   ((alphai(i,k,0) + alphai(i,k,1))+alphai(i,kp1,0))       ISOPYC_A.296    
     &            + alphai(i,kp1,1)                                        ISOPYC_A.297    
            bb =   ((betai(i,k,0) + betai(i,k,1)) + betai(i,kp1,0))        ISOPYC_A.298    
     &            + betai(i,kp1,1)                                         ISOPYC_A.299    
            sbn(i,k,1) = -(ab*(ddyt(i,k,1,1) + ddyt(i,kp1,1,1))            ISOPYC_A.300    
     &               + bb*(ddyt(i,k,2,1) + ddyt(i,kp1,2,1)))               ISOPYC_A.301    
     &               / (ab*(ddzt(i,k,1,0) + ddzt(i,k,1,1))                 ISOPYC_A.302    
     &               + bb*(ddzt(i,k,2,0) + ddzt(i,k,2,1))+epsln)           ISOPYC_A.303    
          enddo                                                            ISOPYC_A.304    
        enddo                                                              ISOPYC_A.305    
        ENDIF  ! L_OBIHARMGM                                               ISOPYC_A.306    
                                                                           ISOPYC_A.307    
        do k=1,km                                                          ISOPYC_A.308    
          km1 = max(k-1,1)                                                 ISOPYC_A.309    
          kp1 = min(k+1,km)                                                ISOPYC_A.310    
          do i=1,imt                                                       ISOPYC_A.311    
            at = (alphai(i,k,0) + alphai(i,km1,0))                         ISOPYC_A.312    
            bt = (betai(i,k,0) + betai(i,km1,0))                           ISOPYC_A.313    
            rhoz(i,k)=-(at*(ddzt(i,km1,1,0))                               ISOPYC_A.314    
     &             + bt*(ddzt(i,km1,2,0))+epsln)/4.                        ISOPYC_A.315    
          enddo                                                            ISOPYC_A.316    
        enddo                                                              ISOPYC_A.317    
                                                                           ISOPYC_A.318    
      IF (L_OISOTAPER) THEN                                                ISOPYC_A.319    
                                                                           ISOPYC_A.320    
        IF (L_OBIHARMGM) THEN                                              ISOPYC_A.321    
        do k=1,km                                                          ISOPYC_A.322    
          kp1 = min(k+1,km)                                                ISOPYC_A.323    
          do i=1,imt                                                       ISOPYC_A.324    
              Ath0 = c1                                                    ISOPYC_A.325    
c              Ath0 = athkdftv_bi(i,k)                                     ISOPYC_A.326    
              absstn = abs(stn(i,k,2))                                     ISOPYC_A.327    
              abssbn = abs(sbn(i,k,2))                                     ISOPYC_A.328    
              tanh_temp(i) = (absstn-slopec)/dslope                        ISOPYC_A.329    
              tanh_temp(i+imt) = (abssbn-slopec)/dslope                    ISOPYC_A.330    
          enddo                                                            ISOPYC_A.331    
                                                                           ISOPYC_A.332    
          call fast_tanh(imt*2,tanh_temp)                                  ISOPYC_A.333    
                                                                           ISOPYC_A.334    
          do i=1,imt                                                       ISOPYC_A.335    
              ath_tn(i,k,2) = (((Ath0*fmp(i,k))*fmpp(i,k))                 ISOPYC_A.336    
     &             *p5)*(c1-tanh_temp(i))                                  ISOPYC_A.337    
              ath_bn(i,k,2) = (((Ath0*fmp(i,kp1))*fmpp(i,kp1))             ISOPYC_A.338    
     &             *p5)*(c1-tanh_temp(i+imt))                              ISOPYC_A.339    
          enddo                                                            ISOPYC_A.340    
        enddo                                                              ISOPYC_A.341    
        ELSE                                                               ISOPYC_A.342    
        do k=1,km                                                          ISOPYC_A.343    
          kp1 = min(k+1,km)                                                ISOPYC_A.344    
          do i=1,imt                                                       ISOPYC_A.345    
              Ath0 = c1                                                    ISOPYC_A.346    
c              Ath0 = athkdftv_bi(i,k)                                     ISOPYC_A.347    
              absstn = abs(stn(i,k,1))                                     ISOPYC_A.348    
              abssbn = abs(sbn(i,k,1))                                     ISOPYC_A.349    
                                                                           ISOPYC_A.350    
              tanh_temp(i) = (absstn-slopec)/dslope                        ISOPYC_A.351    
              tanh_temp(i+imt) = (abssbn-slopec)/dslope                    ISOPYC_A.352    
          enddo                                                            ISOPYC_A.353    
                                                                           ISOPYC_A.354    
          call fast_tanh(imt*2,tanh_temp)                                  ISOPYC_A.355    
                                                                           ISOPYC_A.356    
          do i=1,imt                                                       ISOPYC_A.357    
              ath_tn(i,k,1) = (((Ath0*fm(i,k))*fmp(i,k))                   ISOPYC_A.358    
     &               *p5)*(c1-tanh_temp(i))                                ISOPYC_A.359    
              ath_bn(i,k,1) = (((Ath0*fm(i,kp1))*fmp(i,kp1))               ISOPYC_A.360    
     &               *p5)*(c1-tanh_temp(i+imt))                            ISOPYC_A.361    
          enddo                                                            ISOPYC_A.362    
        enddo                                                              ISOPYC_A.363    
        ENDIF  !L_OBIHARMGM                                                ISOPYC_A.364    
                                                                           ISOPYC_A.365    
      ELSE                                                                 ISOPYC_A.366    
                                                                           ISOPYC_A.367    
        do k=1,km                                                          ISOPYC_A.368    
          sc = c1/(slmxr*dtxsqr(k))                                        ISOPYC_A.369    
          kp1 = min(k+1,km)                                                ISOPYC_A.370    
          do i=1,imt                                                       ISOPYC_A.371    
             IF (L_OBIHARMGM) THEN                                         ISOPYC_A.372    
               Ath0 = c1                                                   ISOPYC_A.373    
c               Ath0 = athkdftv_bi(i,k)                                    ISOPYC_A.374    
               absstn = abs(stn(i,k,2))                                    ISOPYC_A.375    
               abssbn = abs(sbn(i,k,2))                                    ISOPYC_A.376    
               if (absstn .gt. sc) then                                    ISOPYC_A.377    
                 ath_tn(i,k,2) = ((Ath0*fmp(i,k))*fmpp(i,k))               ISOPYC_A.378    
     &                 *(sc/(absstn + epsln))**2                           ISOPYC_A.379    
               else                                                        ISOPYC_A.380    
                 ath_tn(i,k,2) = (Ath0*fmp(i,k))*fmpp(i,k)                 ISOPYC_A.381    
               endif                                                       ISOPYC_A.382    
               if (abssbn .gt. sc) then                                    ISOPYC_A.383    
                 ath_bn(i,k,2) = ((Ath0*fmp(i,kp1))*fmpp(i,kp1))           ISOPYC_A.384    
     &                 *(sc/(abssbn + epsln))**2                           ISOPYC_A.385    
               else                                                        ISOPYC_A.386    
                 ath_bn(i,k,2) = Ath0*fmp(i,kp1)*fmpp(i,kp1)               ISOPYC_A.387    
               endif                                                       ISOPYC_A.388    
             ELSE                                                          ISOPYC_A.389    
               Ath0 = c1                                                   ISOPYC_A.390    
c               Ath0 = athkdftv_bi(i,k)                                    ISOPYC_A.391    
               absstn = abs(stn(i,k,1))                                    ISOPYC_A.392    
               abssbn = abs(sbn(i,k,1))                                    ISOPYC_A.393    
               if (absstn .gt. sc) then                                    ISOPYC_A.394    
                 ath_tn(i,k,1) = ((Ath0*fm(i,k))*fmp(i,k))                 ISOPYC_A.395    
     &                 *(sc/(absstn + epsln))**2                           ISOPYC_A.396    
               else                                                        ISOPYC_A.397    
                 ath_tn(i,k,1) = (Ath0*fm(i,k))*fmp(i,k)                   ISOPYC_A.398    
               endif                                                       ISOPYC_A.399    
               if (abssbn .gt. sc) then                                    ISOPYC_A.400    
                 ath_bn(i,k,1) = ((Ath0*fm(i,kp1))*fmp(i,kp1))             ISOPYC_A.401    
     &                 *(sc/(abssbn + epsln))**2                           ISOPYC_A.402    
               else                                                        ISOPYC_A.403    
                 ath_bn(i,k,1) = (Ath0*fm(i,kp1))*fmp(i,kp1)               ISOPYC_A.404    
               endif                                                       ISOPYC_A.405    
             ENDIF  ! L_OBIHARMGM                                          ISOPYC_A.406    
          enddo                                                            ISOPYC_A.407    
        enddo                                                              ISOPYC_A.408    
      ENDIF ! taper                                                        ISOPYC_A.409    
                                                                           ISOPYC_A.410    
        do k=1,km                                                          ISOPYC_A.411    
          do i=1,imt                                                       ISOPYC_A.412    
            Ath0 = (athkdftv_mom(i,k)*(2.*dz2r(k)))*csu(j)                 ISOPYC_A.413    
            adv_vntiso(i,k,1) = -((ath_tn(i,k,1)*stn(i,k,1))*top_bc(k)-    ISOPYC_A.414    
     &         (ath_bn(i,k,1)*sbn(i,k,1))*bot_bc(k))*                      ISOPYC_A.415    
     &         Ath0                                                        ISOPYC_A.416    
          enddo                                                            ISOPYC_A.417    
        enddo                                                              ISOPYC_A.418    
                                                                           ISOPYC_A.419    
       IF (L_OBIHARMGM) THEN                                               ISOPYC_A.420    
                                                                           ISOPYC_A.421    
        do k=1,km                                                          ISOPYC_A.422    
          do i=1,imt                                                       ISOPYC_A.423    
            Ath0_j = (athkdftv_bi*dytr(j))*cst(j)                          ISOPYC_A.424    
            Ath0_jp1 = (athkdftv_bi*dytr(j+1))*cst(j+1)                    ISOPYC_A.425    
                                                                           ISOPYC_A.426    
            part1 = (ath_tn(i,k,2)*stn(i,k,2)) -                           ISOPYC_A.427    
     &                      (ath_tn(i,k,1)*stn(i,k,1))*Ath0_jp1            ISOPYC_A.428    
            part2 = (ath_tn(i,k,1)*stn(i,k,1)) -                           ISOPYC_A.429    
     &                      (ath_tn(i,k,0)*stn(i,k,0))*Ath0_j              ISOPYC_A.430    
            stn_d2(i,k) = ((((part2-part1)                                 ISOPYC_A.431    
     &         *dyur(j))*csr(j))*fm(i,k))*fmp(i,k)                         ISOPYC_A.432    
                                                                           ISOPYC_A.433    
                                                                           ISOPYC_A.434    
                                                                           ISOPYC_A.435    
            part1 = (ath_bn(i,k,2)*sbn(i,k,2)                              ISOPYC_A.436    
     &                    - ath_bn(i,k,1)*sbn(i,k,1))*Ath0_jp1             ISOPYC_A.437    
            part2 = (ath_bn(i,k,1)*sbn(i,k,1)                              ISOPYC_A.438    
     &                    - ath_bn(i,k,0)*sbn(i,k,0))*Ath0_j               ISOPYC_A.439    
            sbn_d2(i,k) = ((((part2-part1)                                 ISOPYC_A.440    
     &         *dyur(j))*csr(j))*fm(i,k))*fmp(i,k)                         ISOPYC_A.441    
          enddo                                                            ISOPYC_A.442    
        enddo                                                              ISOPYC_A.443    
                                                                           ISOPYC_A.444    
        do k=1,km                                                          ISOPYC_A.445    
          do i=1,imt                                                       ISOPYC_A.446    
         adv_vntiso(i,k,1) = adv_vntiso(i,k,1) -                           ISOPYC_A.447    
     &      (((stn_d2(i,k)*top_bc(k))-(sbn_d2(i,k)*bot_bc(k)))*            ISOPYC_A.448    
     &      (2.*dz2r(k)))*csu(j)                                           ISOPYC_A.449    
          enddo                                                            ISOPYC_A.450    
        enddo                                                              ISOPYC_A.451    
                                                                           ISOPYC_A.452    
       ENDIF ! L_OBIHARMGM                                                 ISOPYC_A.453    
c                                                                          ISOPYC_A.454    
c-----------------------------------------------------------------------   ISOPYC_A.455    
c     compute the zonal component of the isopycnal mixing velocity         ISOPYC_A.456    
c     at the center of the eastern face of the "T" grid cell.              ISOPYC_A.457    
c-----------------------------------------------------------------------   ISOPYC_A.458    
c                                                                          ISOPYC_A.459    
        do k=1,km                                                          ISOPYC_A.460    
          km1 = max(k-1,1)                                                 ISOPYC_A.461    
          kp1 = min(k+1,km)                                                ISOPYC_A.462    
          do i=1,imt-1                                                     ISOPYC_A.463    
c                                                                          ISOPYC_A.464    
            at =   (alphai(i,k,0) + alphai(i+1,k,0) + alphai(i,km1,0)      ISOPYC_A.465    
     &            + alphai(i+1,km1,0))                                     ISOPYC_A.466    
            bt =   (betai(i,k,0) + betai(i+1,k,0) + betai(i,km1,0)         ISOPYC_A.467    
     &            + betai(i+1,km1,0))                                      ISOPYC_A.468    
            ste(i,k) =-(at*(ddxt(i,k,1,0) + ddxt(i,km1,1,0))               ISOPYC_A.469    
     &           + bt*(ddxt(i,k,2,0) + ddxt(i,km1,2,0)))                   ISOPYC_A.470    
     &          / (at*(ddzt(i,km1,1,0) + ddzt(i+1,km1,1,0))                ISOPYC_A.471    
     &           + bt*(ddzt(i,km1,2,0) + ddzt(i+1,km1,2,0))+epsln)         ISOPYC_A.472    
c                                                                          ISOPYC_A.473    
            ab =   (alphai(i,k,0) + alphai(i+1,k,0) + alphai(i,kp1,0)      ISOPYC_A.474    
     &            + alphai(i+1,kp1,0))                                     ISOPYC_A.475    
            bb =   (betai(i,k,0) + betai(i+1,k,0) + betai(i,kp1,0)         ISOPYC_A.476    
     &            + betai(i+1,kp1,0))                                      ISOPYC_A.477    
            sbe(i,k) =-(ab*(ddxt(i,k,1,0) + ddxt(i,kp1,1,0))               ISOPYC_A.478    
     &           + bb*(ddxt(i,k,2,0) + ddxt(i,kp1,2,0)))                   ISOPYC_A.479    
     &          / (ab*(ddzt(i,k,1,0) + ddzt(i+1,k,1,0))                    ISOPYC_A.480    
     &           + bb*(ddzt(i,k,2,0) + ddzt(i+1,k,2,0))+epsln)             ISOPYC_A.481    
                                                                           ISOPYC_A.482    
          enddo                                                            ISOPYC_A.483    
        enddo                                                              ISOPYC_A.484    
                                                                           ISOPYC_A.485    
        call SETBCX(ste(1,1),imt,km)                                       ISOPYC_A.486    
        call SETBCX(sbe(1,1),imt,km)                                       ISOPYC_A.487    
                                                                           ISOPYC_A.488    
      IF (L_OISOTAPER) THEN                                                ISOPYC_A.489    
        do k=1,km                                                          ISOPYC_A.490    
          kp1 = min(k+1,km)                                                ISOPYC_A.491    
          do i=2,imt-1                                                     ISOPYC_A.492    
            Ath0 = c1                                                      ISOPYC_A.493    
c            Ath0 = athkdftu_bi(i,k)                                       ISOPYC_A.494    
            absste = abs(ste(i,k))                                         ISOPYC_A.495    
            abssbe = abs(sbe(i,k))                                         ISOPYC_A.496    
            tanh_temp(i) = (absste-slopec)/dslope                          ISOPYC_A.497    
            tanh_temp(i+imt) = (abssbe-slopec)/dslope                      ISOPYC_A.498    
          enddo                                                            ISOPYC_A.499    
                                                                           ISOPYC_A.500    
          call fast_tanh(imt-2,tanh_temp(2))                               ISOPYC_A.501    
          call fast_tanh(imt-2,tanh_temp(2+imt))                           ISOPYC_A.502    
                                                                           ISOPYC_A.503    
          do i= 2, imt-1                                                   ISOPYC_A.504    
            ath_t(i,k) = Ath0*fm(i,k)*fm(i+1,k)                            ISOPYC_A.505    
     &             *p5*(c1-tanh_temp(i))                                   ISOPYC_A.506    
            ath_b(i,k) = Ath0*fm(i,kp1)*fm(i+1,kp1)                        ISOPYC_A.507    
     &             *p5*(c1-tanh_temp(i+imt))                               ISOPYC_A.508    
          enddo                                                            ISOPYC_A.509    
        enddo                                                              ISOPYC_A.510    
                                                                           ISOPYC_A.511    
      ELSE                                                                 ISOPYC_A.512    
                                                                           ISOPYC_A.513    
        do k=1,km                                                          ISOPYC_A.514    
          sc = c1/(slmxr*dtxsqr(k))                                        ISOPYC_A.515    
          kp1 = min(k+1,km)                                                ISOPYC_A.516    
          do i=2,imt-1                                                     ISOPYC_A.517    
            Ath0 = c1                                                      ISOPYC_A.518    
c            Ath0 = athkdftu_bi(i,k)                                       ISOPYC_A.519    
            absste = abs(ste(i,k))                                         ISOPYC_A.520    
            abssbe = abs(sbe(i,k))                                         ISOPYC_A.521    
            if (absste .gt. sc) then                                       ISOPYC_A.522    
              ath_t(i,k) = Ath0*fm(i,k)*fm(i+1,k)                          ISOPYC_A.523    
     &              *(sc/(absste + epsln))**2                              ISOPYC_A.524    
            else                                                           ISOPYC_A.525    
              ath_t(i,k) = Ath0*fm(i,k)*fm(i+1,k)                          ISOPYC_A.526    
            endif                                                          ISOPYC_A.527    
            if (abssbe .gt. sc) then                                       ISOPYC_A.528    
              ath_b(i,k) = Ath0*fm(i,kp1)*fm(i+1,kp1)                      ISOPYC_A.529    
     &              *(sc/(abssbe + epsln))**2                              ISOPYC_A.530    
            else                                                           ISOPYC_A.531    
              ath_b(i,k) = Ath0*fm(i,kp1)*fm(i+1,kp1)                      ISOPYC_A.532    
            endif                                                          ISOPYC_A.533    
          enddo                                                            ISOPYC_A.534    
        enddo                                                              ISOPYC_A.535    
      ENDIF ! taper                                                        ISOPYC_A.536    
                                                                           ISOPYC_A.537    
        call SETBCX(ath_t(1,1),imt,km)                                     ISOPYC_A.538    
        call SETBCX(ath_b(1,1),imt,km)                                     ISOPYC_A.539    
                                                                           ISOPYC_A.540    
        do k=1,km                                                          ISOPYC_A.541    
          do i=2,imt-1                                                     ISOPYC_A.542    
            rhotmp=(((ste(i,k)+ste(i-1,k))/2.)**2.+                        ISOPYC_A.543    
     &               ((stn(i,k,1)+stn(i,k,0))/2.)**2.)                     ISOPYC_A.544    
            rhotmp1=sqrt(rhotmp)                                           ISOPYC_A.545    
            if (rhoz(i,k).lt.0.) rhoz(i,k)=0.                              ISOPYC_A.546    
            srho(i,k)=fm(i,k)*rhotmp1*p5*sqrt(rhoz(i,k))*                  ISOPYC_A.547    
     &                         (c1-tanh((rhotmp1-slopec)/dslope))          ISOPYC_A.548    
          enddo                                                            ISOPYC_A.549    
        enddo                                                              ISOPYC_A.550    
        call SETBCX(srho(1,1),imt,km)                                      ISOPYC_A.551    
                                                                           ISOPYC_A.552    
        do k=1,km                                                          ISOPYC_A.553    
          do i=2,imt-1                                                     ISOPYC_A.554    
           Ath0 = athkdftu_mom(i,k)                                        ISOPYC_A.555    
           adv_vetiso(i,k) = -((ath_t(i,k)*ste(i,k))*Ath0*top_bc(k) -      ISOPYC_A.556    
     &              (ath_b(i,k)*sbe(i,k))*Ath0*bot_bc(k))*(2.*dz2r(k))     ISOPYC_A.557    
          enddo                                                            ISOPYC_A.558    
        enddo                                                              ISOPYC_A.559    
                                                                           ISOPYC_A.560    
        IF (L_OBIHARMGM) THEN                                              ISOPYC_A.561    
                                                                           ISOPYC_A.562    
        do k=1,km                                                          ISOPYC_A.563    
          do i=2,imt-1                                                     ISOPYC_A.564    
          Ath0=athkdftu_bi                                                 ISOPYC_A.565    
          ste_d2(i,k)=(-((ath_t(i+1,k)*ste(i+1,k)                          ISOPYC_A.566    
     &       -  ath_t(i,k)*ste(i,k))*Ath0*dxtr(i+1)                        ISOPYC_A.567    
     &       - (ath_t(i,k)*ste(i,k) - ath_t(i-1,k)*ste(i-1,k))*Ath0*       ISOPYC_A.568    
     &        dxtr(i))*dxur(i))*fm(i,k)*fm(i+1,k)                          ISOPYC_A.569    
                                                                           ISOPYC_A.570    
          sbe_d2(i,k)=(-((ath_b(i+1,k)*sbe(i+1,k)                          ISOPYC_A.571    
     &       -  ath_b(i,k)*sbe(i,k))*Ath0*dxtr(i+1)                        ISOPYC_A.572    
     &       - (ath_b(i,k)*sbe(i,k) - ath_b(i-1,k)*sbe(i-1,k))*Ath0*       ISOPYC_A.573    
     &        dxtr(i))*dxur(i))*fm(i,k)*fm(i+1,k)                          ISOPYC_A.574    
          enddo                                                            ISOPYC_A.575    
        enddo                                                              ISOPYC_A.576    
                                                                           ISOPYC_A.577    
        call SETBCX(ste_d2(1,1),imt,km)                                    ISOPYC_A.578    
        call SETBCX(sbe_d2(1,1),imt,km)                                    ISOPYC_A.579    
                                                                           ISOPYC_A.580    
        do k=1,km                                                          ISOPYC_A.581    
          do i=2,imt-1                                                     ISOPYC_A.582    
c           adv_vetiso(i,k) = -(ste_d2(i,k)*top_bc(k) -                    ISOPYC_A.583    
          adv_vetiso(i,k) = adv_vetiso(i,k) -(ste_d2(i,k)*top_bc(k) -      ISOPYC_A.584    
     &                      sbe_d2(i,k)*bot_bc(k))*(2.*dz2r(k))            ISOPYC_A.585    
          enddo                                                            ISOPYC_A.586    
        enddo                                                              ISOPYC_A.587    
                                                                           ISOPYC_A.588    
       ENDIF !L_OBIHARMGM)                                                 ISOPYC_A.589    
c                                                                          ISOPYC_A.590    
c     set the boundary conditions                                          ISOPYC_A.591    
c                                                                          ISOPYC_A.592    
       call SETBCX (adv_vetiso(1,1), imt, km)                              ISOPYC_A.593    
                                                                           ISOPYC_A.594    
c                                                                          ISOPYC_A.595    
c-----------------------------------------------------------------------   ISOPYC_A.596    
c     compute the vertical component of the isopycnal mixing velocity      ISOPYC_A.597    
c     at the center of the bottom face of the "T" cells, using the         ISOPYC_A.598    
c     continuity equation for the isopycnal mixing velocities              ISOPYC_A.599    
c-----------------------------------------------------------------------   ISOPYC_A.600    
c                                                                          ISOPYC_A.601    
        do i=1,imt                                                         ISOPYC_A.602    
          adv_vbtiso(i,0) = c0                                             ISOPYC_A.603    
        enddo                                                              ISOPYC_A.604    
c                                                                          ISOPYC_A.605    
        do k=1,km-1                                                        ISOPYC_A.606    
          do i=2,imt                                                       ISOPYC_A.607    
            adv_vbtiso(i,k) = dzt(k)*cstr(j)*(                             ISOPYC_A.608    
     &      (adv_vetiso(i,k) - adv_vetiso(i-1,k))*dxtr(i) +                ISOPYC_A.609    
     &      (adv_vntiso(i,k,1) - adv_vntiso(i,k,0))*dytr(j))               ISOPYC_A.610    
          enddo                                                            ISOPYC_A.611    
        enddo                                                              ISOPYC_A.612    
c                                                                          ISOPYC_A.613    
        do k=1,km-1                                                        ISOPYC_A.614    
          do i=2,imt                                                       ISOPYC_A.615    
            adv_vbtiso(i,k) = adv_vbtiso(i,k) + adv_vbtiso(i,k-1)          ISOPYC_A.616    
          enddo                                                            ISOPYC_A.617    
        enddo                                                              ISOPYC_A.618    
c                                                                          ISOPYC_A.619    
        do i=2,imt                                                         ISOPYC_A.620    
          adv_vbtiso(i,kmt(i)) = c0                                        ISOPYC_A.621    
        enddo                                                              ISOPYC_A.622    
c                                                                          ISOPYC_A.623    
c     set the boundary conditions                                          ISOPYC_A.624    
c                                                                          ISOPYC_A.625    
        call SETBCX (adv_vbtiso(1,0), imt, km+1)                           ISOPYC_A.626    
                                                                           ISOPYC_A.627    
      ENDIF ! GM                                                           ISOPYC_A.628    
                                                                           ISOPYC_A.629    
      RETURN                                                               ISOPYC_A.630    
      END                                                                  ISOPYC_A.631    
*ENDIF                                                                     ISOPYC_A.632