*IF DEF,OCEAN                                                              ORH1F305.261    
C ******************************COPYRIGHT******************************    GTS2F400.667    
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.668    
C                                                                          GTS2F400.669    
C Use, duplication or disclosure of this code is subject to the            GTS2F400.670    
C restrictions as set forth in the contract.                               GTS2F400.671    
C                                                                          GTS2F400.672    
C                Meteorological Office                                     GTS2F400.673    
C                London Road                                               GTS2F400.674    
C                BRACKNELL                                                 GTS2F400.675    
C                Berkshire UK                                              GTS2F400.676    
C                RG12 2SZ                                                  GTS2F400.677    
C                                                                          GTS2F400.678    
C If no contract has been raised with this copy of the code, the use,      GTS2F400.679    
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.680    
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.681    
C Modelling at the above address.                                          GTS2F400.682    
C ******************************COPYRIGHT******************************    GTS2F400.683    
C                                                                          GTS2F400.684    
C*LL  Subroutine CALCESAV                                                  CALCESAV.3      
CLL                                                                        CALCESAV.4      
CLL   Can run on any compiler accepting lower case variables.              CALCESAV.5      
CLL                                                                        CALCESAV.6      
CLL   The code must be precompiled by the UPDOC system.                    CALCESAV.7      
CLL   Option L selects the code for Isopycnal Diffusion.                   CALCESAV.8      
CLL   Option X selects code necessary when I.P.D. is combined with         CALCESAV.9      
CLL              Mixed Layer scheme                                        CALCESAV.10     
CLL                                                                        CALCESAV.11     
CLL   Author:  R.Hill                                                      CALCESAV.12     
CLL   Reviewer:                                                            CALCESAV.13     
CLL   Date:    01.09.94                                                    CALCESAV.14     
CLL   Version: 3.4                                                         CALCESAV.15     
CLL                                                                        CALCESAV.16     
CLL   External documentation:                                              CALCESAV.17     
CLL     Unified Model Documentation Paper No. 51.                          CALCESAV.18     
CLL                                                                        CALCESAV.19     
CLL   Naming convention of variables: Cox naming convention is used,       CALCESAV.20     
CLL     with the addition that lower-case variables are                    CALCESAV.21     
CLL     introduced by the Isopycnal Diffusion scheme.                      CALCESAV.22     
CLL                                                                        CALCESAV.23     
CLL   Purpose of Subroutine:                                               CALCESAV.24     
CLL     Calculates isopycnal diffusion coefficients for 1st                CALCESAV.25     
CLL     row in a block of rows when performing ocean computations          CALCESAV.26     
CLL     over several "blocks of rows" in parallel.                         CALCESAV.27     
CLL                                                                        CALCESAV.28     
!     Modification History:                                                ORH1F305.264    
!   Version    Date     Details                                            ORH1F305.265    
!   -------  -------    ------------------------------------------         ORH1F305.266    
!     3.5    16.01.95   Remove *IF dependency. R.Hill                      ORH1F305.267    
!     4.1    03.04.96   Include arguments required by Gent &               OLA0F401.121    
!                       McWilliams eddy transport scheme. C. Roberts       OLA0F401.122    
CLL  4.3  18/03/97  4.3  Introduce the Visbeck scheme. C. Roberts          OLA2F403.260    
!     4.3    24.10.97   Modify visopn calculations for consistency         OOM1F404.68     
!                       with IPDGMVEL changes. R. Hill                     OOM1F404.69     
!   4.4  15/08/97  Remove SKIPLAND code. R. Hill                           ORH7F404.73     
!   4.5  26/01/98  Change logicals and arguments for use with              ODC1F405.131    
!        the freedrift sea_ice advection scheme. D.Cresswell.              ODC1F405.132    
CLLEND------------------------------------------------------------------   CALCESAV.29     
C*                                                                         CALCESAV.30     
C*L---- Arguments ------------------------------------------------------   CALCESAV.31     
C                                                                          CALCESAV.32     

      SUBROUTINE CALCESAV                                                   1,12CALCESAV.33     
     & (J,JMT,IMT,IMTM1,KM,KMT,KMP,KMP1,KMP2,NT,NTMIN2,KMM1,               CALCESAV.34     
     &  T,TP,TDIF,TB,TBP,TBM,                                              CALCESAV.35     
     &  UB,VB,UBM,VBM,                                                     CALCESAV.36     
     &  DXUR,DXU2RQ,DXT4RQ,DYUR,DYT4R,DZ2RQ,DZZ2RQ,ZDZ,DYTR,               CALCESAV.37     
     &  NERGY,CS,CSR,CSTR,ITT,FM,FMP,FMM,                                  CALCESAV.38     
     &  RHOS,RHON,ahi,                                                     CALCESAV.39     
     &  WSX,WSY,WSXM,WSYM,                                                 OLA3F403.203    
     &  ISX,ISY,WSX_LEADS,WSY_LEADS,                                       OLA0F404.88     
     &  ISXM,ISYM,WSX_LEADSM,WSY_LEADSM,                                   OLA0F404.89     
     &  ZDZZ,DZ,L_OBULKRI,L_OWINDMIX,L_OBULKMAXMLD,                        OOM1F405.491    
     &  LAMBDA_LARGE,MAX_LARGE_LEVELS,                                     OOM1F405.492    
     &  NO_LAYERS_IN_LEV,HTN,PME,WATERFLUX_ICE,SOL,WME,                    OOM1F405.493    
     &  PHIT,OCEANHEATFLUX,CARYHEAT,FLXTOICE,                              OOM1F405.494    
     &  JFT0,                                                              CALCESAV.40     
     &  rxp,ry,rrzp,esav                                                   CALCESAV.41     
     &,J_OFFSET                                                            ORH7F402.279    
     & ,drhob1p,drhob2p,DZZ,KMTP,KMTPP,VISOPN,ATHKDF,DZ2R                  OLA0F401.123    
     & ,ATHKDFTU,ATHKDFTV                                                  OLA2F403.261    
     &  ,mld                                                               CALCESAV.46     
     & ,DIAG_MLD                                                           CALCESAV.48     
     & ,KAPPA_B_SI                                                         CALCESAV.50     
     & )                                                                   CALCESAV.51     
C                                                                          CALCESAV.52     
      IMPLICIT NONE                                                        CALCESAV.53     
C                                                                          CALCESAV.54     
*CALL UMSCALAR                                                             CALCESAV.55     
*CALL CNTLOCN                                                              ORH1F305.268    
*CALL OARRYSIZ                                                             ORH1F305.269    
C                                                                          CALCESAV.56     
      INTEGER                                                              CALCESAV.57     
     &  I,J,K,M,N,L,                                                       CALCESAV.58     
     &  JMT,IMT,IMTM1,KM,KMP,KMP1,KMP2,NT,NTMIN2,                          OLA0F401.124    
     &  KMM1,                                                              CALCESAV.60     
     &  NERGY,ITT,KS,JFT0                                                  CALCESAV.61     
     &,J_OFFSET                                                            ORH7F402.280    
C                                                                          CALCESAV.65     
      REAL                                                                 CALCESAV.66     
     &  TB(IMT,KM,NT),TBP(IMT,KM,NT),TBM(IMT,KM,NT),TA(IMT,KM,NT),         CALCESAV.67     
     &  UB(IMT,KM),VB(IMT,KM),UBM(IMT,KM),VBM(IMT,KM),                     CALCESAV.68     
     &  DYTR(JMT),                                                         CALCESAV.69     
     &  CS(JMT),FMM(IMT,KM),                                               CALCESAV.70     
     &  T(IMT,KM,NT),TP(IMT,KM,NT),TDIF(IMT,KMP2,NTMIN2),                  CALCESAV.71     
     &  DXUR(IMT),DXU2RQ(IMT,KM),DXT4RQ(IMT,KM),                           CALCESAV.72     
     &  DYUR(JMT),DYT4R(JMT),DZ2RQ(IMT,KM),DZZ2RQ(IMT,KM),ZDZ(KM),         CALCESAV.73     
     &  RHOS(IMT,KM),RHON(IMT,KM),                                         CALCESAV.74     
     &  FM(IMT,KM),FMP(IMT,KM),CSR(JMT),CSTR(JMT),                         CALCESAV.75     
     &  ahi(KM),          ! IN   along-isopycnal coeff. of diffusion       CALCESAV.76     
C                                  Ai in Eq.1.8 (cm2/s)                    CALCESAV.77     
     &  gnu(IMT,KM),      ! IN   coeff. of vertical diffusion at TOP of    CALCESAV.78     
C                                  box. Av in Eq.1.10 (cm2/s)              CALCESAV.79     
     &  fk1(IMT,KM,3),    ! OUT } Rows 1,2,3 of diffusion matrix (Eq1.8)   CALCESAV.80     
     &  fk2(IMT,KM,3),    ! OUT } fk1 is on EAST face, fk2 on NORTH face   CALCESAV.81     
     &  fk3(IMT,KM,3),    ! OUT } & fk3 on TOP face of grid box (i,j,k)    CALCESAV.82     
     &  rxp(IMT,KM),      ! INOUT delta-rho in x dirn, row J+1 (E face)    CALCESAV.83     
     &  ry(IMT,KM),       ! INOUT delta-rho in y dirn, row J   (N face)    CALCESAV.84     
     &  rrzp(IMT,KMP1),   ! INOUT delta-rho in z dirn, row J+1 (top face   CALCESAV.85     
     &  esav(IMT,KM,NT)   ! OUT  used to save e(I,K,2) in                  CALCESAV.86     
C                                  subroutine IPDFLXCL                     CALCESAV.87     
     &, RHOSRN(IMT,KM),RHOSRNA(IMT,KM+1),RHOSRNB(IMT,KM+1)                 OOM1F405.495    
     &, KAPPA_B_SI(KM)    ! IN Depth dependent backgnd vert diffusivity    CALCESAV.89     
     &,MLD(IMT_IPD_MIX,JMT_IPD_MIX) ! IN Mixed layer depth (m)             ORH1F305.274    
     &,DIAG_MLD(1,JMT_IPD_NOMIX)                                           ORH1F305.275    
C                                                                          CALCESAV.98     
      REAL                                                                 OLA0F404.91     
     & RiT(imt,kmm1)  ! OUT Richardson number for tracer grid              OLA0F404.92     
     &,hT(imt_qlarge) ! OUT Depth Large scheme applied to (T grid)         OLA0F404.93     
     &,WSX(IMT),WSY(IMT)   ! IN wind stress on row j                       OLA0F404.94     
     &,WSXM(IMT),WSYM(IMT) ! IN wind stress on row j-1                     OLA0F404.95     
     &,ZDZZ(KM+1)       ! IN DEPTH OF MIDDLE OF LAYER (CM)                 OOM1F405.496    
     &,DZ(KM)         ! IN distance between half-levels (cm)               OLA0F404.97     
     &,ISX(IMT_idr)        ! IN Stress under sea ice fraction, row j       ODC1F405.133    
     &,ISY(IMT_idr)        ! IN Stress under sea ice fraction, row j       ODC1F405.134    
     &,WSX_LEADS(IMT_idr)  ! IN Stress under leads fraction, row j         ODC1F405.135    
     &,WSY_LEADS(IMT_idr)  ! IN Stress under leads fraction, row j         ODC1F405.136    
     &,ISXM(IMT_idr)       ! IN Stress under sea ice fraction, row j-1     ODC1F405.137    
     &,ISYM(IMT_idr)       ! IN Stress under sea ice fraction, row j-1     ODC1F405.138    
     &,WSX_LEADSM(IMT_idr) ! IN Stress under leads fraction, row j-1       ODC1F405.139    
     &,WSY_LEADSM(IMT_idr) ! IN Stress under leads fraction, row j-1       ODC1F405.140    
       REAL                                                                OOM1F405.497    
     & OCEANHEATFLUX(IMT) !:NON-PEN SURFACE HEATFLUX INTO OCEAN BUDGET     OOM1F405.498    
     &,CARYHEAT(IMT) !MISCELLANEOUS HEATFLUX FROM ICE                      OOM1F405.499    
     &,FLXTOICE(IMT) !OCEAN TO ICE HEATFLUX                                OOM1F405.500    
      REAL                                                                 OOM1F405.501    
     &  L_T(IMT)  ! MONIN OBUKHOV LENGTH, LARGE SCHEME (TRACER)            OOM1F405.502    
     &, HTN(IMT)  ! IN NON-PENETRATING HEAT FLUX (W/M2) ON ROW J           OOM1F405.503    
     &, PME(IMT)  ! IN PRECIP MINUS EVAP (KG/M2/S) ON ROW J                OOM1F405.504    
     &, RIMLDCALC(IMT,KMM1) ! RICHARDSON NO FROM MLD CALCULATION           OOM1F405.505    
     &, SOL(IMT)  ! IN SOLAR IRRADIANCE (W/M2) AT SURFACE ON ROW J         OOM1F405.506    
     &, WME(IMT)  ! IN WIND MIXING POWER ON ROW J  (W M^-2)                OOM1F405.507    
     &, MLD_LARGE(IMT)  ! MIXED LAYER DEPTH ON T GRID, ROW J, (CM)         OOM1F405.508    
     &, WATERFLUX_ICE(IMT)  ! IN WATER FLUX FROM ICE (KG/M2/S)             OOM1F405.509    
                                 ! ON ROW J                                OOM1F405.510    
     &, LAMBDA_LARGE,CGFLUX(IMT,KM,NT)                                     OOM1F405.511    
     &, PHIT ! IN LATITUDE OF ROW J ON TRACER GRID (RADIANS)               OOM1F405.512    
      INTEGER                                                              OOM1F405.513    
     &  MAX_LARGE_LEVELS ! IN MAX NO OF LEVS FOR LARGE SCHEME              OOM1F405.514    
     &, NO_LAYERS_IN_LEV ! IN NO OF LAYERS IN A LEVEL TO CALC MLD_LARGE    OOM1F405.515    
      LOGICAL L_OBULKRI,L_OWINDMIX,L_OBULKMAXMLD                           OOM1F405.516    
      REAL drhob1p(IMT_GM)                                                 OLA0F401.125    
     &    ,drhob2p(IMT_GM,2)                                               OLA0F401.126    
     &    ,DZZ(KMP1)                                                       OLA0F401.127    
     &    ,VISOPN(IMT_GM,KM_GM) ! G&McW v* at N face of T gridbox          OLA0F401.128    
     &    ,DZ2R(KM)                                                        OLA0F401.129    
     &    ,ATHKDF(KM)                                                      OLA0F401.130    
     &,ATHKDFTU(IMT_VIS,JMT_VIS) ! thickness diffusion coeff (u* pts)      OLA2F403.262    
     &,ATHKDFTV(IMT_VIS,JMT_VIS) ! thickness diffusion coeff (v* pts)      OLA2F403.263    
                                                                           OLA0F401.131    
      REAL FXA                                                             OLA0F401.132    
                                                                           OLA0F401.133    
      INTEGER KMT(IMT),KMTP(IMT),KMTPP(IMT)                                OLA0F401.134    
C                                                                          CALCESAV.99     
*IF DEF,OISOPYC                                                            ORH1F305.262    
C        Declare local variables                                           CALCESAV.100    
C                                                                          CALCESAV.101    
      REAL                                                                 CALCESAV.102    
     &  worka(IMT,KM),    !      workspace                                 CALCESAV.103    
     &  workb(IMT,KM),    !      workspace                                 CALCESAV.104    
     &  workc(IMT,KM)     !      workspace                                 CALCESAV.105    
      REAL DUMMY_MLD(IMT)                                                  ORW1F400.73     
      REAL                                                                 OLA0F404.106    
     & XSTRESS_ICE(IMT_idr)  !IN Total stress under sea ice row j          ODC1F405.141    
     &,YSTRESS_ICE(IMT_idr)  ! (Wind stress at ice free points)            ODC1F405.142    
     &,XSTRESS_ICEM(IMT_idr) !IN Total stress under sea ice row j-1        ODC1F405.143    
     &,YSTRESS_ICEM(IMT_idr) ! (Wind stress at ice free points)            ODC1F405.144    
C                                                                          CALCESAV.106    
C                                                                          CALCESAV.107    
C*                                                                         CALCESAV.108    
C*L---- External subroutines called ------------------------------------   CALCESAV.109    
C     VERTCOFT                                                             CALCESAV.110    
C     IPDCOFCL                                                             CALCESAV.111    
C     IPDCLXCL                                                             CALCESAV.112    
C     STATED                                                               CALCESAV.113    
C ----------------------------------------------------------------         CALCESAV.114    
C  First we must calculate gnu                                             CALCESAV.115    
C ----------------------------------------------------------------         CALCESAV.116    
C                                                                          CALCESAV.117    
      IF (L_ORICHARD) THEN                                                 ORH1F305.276    
C                                                                          CALCESAV.119    
C ----------------------------------------------------------------         CALCESAV.120    
C  Compute rhosrn in preparation for call to VERTCOFT                      CALCESAV.121    
C ----------------------------------------------------------------         CALCESAV.122    
C                                                                          OOM1F405.517    
       IF(L_OSTATEC)THEN                                                   OOM1F405.518    
C                                                                          OOM1F405.519    
C--------------- USE STATEC TO FIND VALUES FOR RHO                         OOM1F405.520    
      CALL STATEC(TB(1,1,1),TB(1,1,2),RHOSRNA,WORKA,WORKB,1,               OOM1F405.521    
     &            IMT,KM,J,JMT)                                            OOM1F405.522    
      CALL STATEC(TB(1,1,1),TB(1,1,2),RHOSRNB,WORKA,WORKB,2,               OOM1F405.523    
     &            IMT,KM,J,JMT)                                            OOM1F405.524    
C                                                                          OOM1F405.525    
      DO I=1,IMT                                                           OOM1F405.526    
      RHOSRNA(I,KM+1)=RHOSRNA(I,KM)                                        OOM1F405.527    
      RHOSRNB(I,KM+1)=RHOSRNB(I,KM)                                        OOM1F405.528    
      ENDDO                                                                OOM1F405.529    
C                                                                          OOM1F405.530    
       ELSE                                                                OOM1F405.531    
C                                                                          OOM1F405.532    
C--------------- USE STATED TO FIND VALUES FOR RHO                         OOM1F405.533    
      CALL STATED(TB(1,1,1),TB(1,1,2),rhosrn,worka,workb,IMT,KM            CALCESAV.123    
     &  ,J,KM,JMT                                                          ORH7F404.74     
     & )                                                                   CALCESAV.127    
C                                                                          OOM1F405.534    
       ENDIF   ! L_OSTATEC                                                 OOM1F405.535    
C                                                                          OOM1F405.536    
C                                                                          CALCESAV.128    
C                                                                          OOM1F405.537    
C CALCULATE MIXED LAYER DEPTH                                              OOM1F405.538    
      IF (L_OFULARGE) THEN                                                 OOM1F405.539    
        IF (L_OBULKRI) THEN                                                OOM1F405.540    
        CALL CALC_MLD_LARGEB(J,KM,IMT,NT                                   OOM1F405.541    
     &, RHO_WATER_SI,GRAV_SI,SPECIFIC_HEAT_SI,CRIT_RI_FL                   OOM1F405.542    
     &, ZDZ,DZ,ZDZZ,DZZ,L_OCYCLIC,L_SEAICE                                 OOM1F405.543    
     &, UB,VB,UBM,VBM,TB,RHOSRN,HTN                                        OOM1F405.544    
     &, PME,WATERFLUX_ICE,SOL,WME,OCEANHEATFLUX,CARYHEAT,FLXTOICE          OOM1F405.545    
     &, FM,MLD_LARGE,RIMLDCALC                                             OOM1F405.546    
     &  )                                                                  OOM1F405.547    
        ELSE                                                               OOM1F405.548    
        CALL CALC_MLD_LARGEG(J,KM,IMT                                      OOM1F405.549    
     &, RHO_WATER_SI,GRAV_SI,CRIT_RI_FL,NO_LAYERS_IN_LEV                   OOM1F405.550    
     &, ZDZ,DZ,DZZ,L_OCYCLIC                                               OOM1F405.551    
     &, UB,VB,UBM,VBM                                                      OOM1F405.552    
     &, FM,RHOSRN,MLD_LARGE,RIMLDCALC                                      OOM1F405.553    
     &  )                                                                  OOM1F405.554    
        ENDIF                                                              OOM1F405.555    
      ENDIF      ! L_OFULARGE                                              OOM1F405.556    
C                                                                          OOM1F405.557    
C ----------------------------------------------------------------         CALCESAV.129    
C  Call subroutine to calculate vertical coefficient of diffusion          CALCESAV.130    
C ----------------------------------------------------------------         CALCESAV.131    
C                                                                          CALCESAV.132    
      IF (L_SEAICE.AND.L_ICEFREEDR) THEN                                   ODC1F405.145    
      do i=1,imt                                                           OLA0F404.112    
        XSTRESS_ICE(I) = WSX_LEADS(I)+ISX(I)                               OLA0F404.113    
        YSTRESS_ICE(I) = WSY_LEADS(I)+ISY(I)                               OLA0F404.114    
        XSTRESS_ICEM(I) = WSX_LEADSM(I)+ISXM(I)                            OLA0F404.115    
        YSTRESS_ICEM(I) = WSY_LEADSM(I)+ISYM(I)                            OLA0F404.116    
      enddo                                                                OLA0F404.117    
      CALL VERTCOFT                                                        OLA0F404.118    
     &  ( J,IMT,KM,KMM1,NT,                                                OLA0F404.119    
     &  IMT_QLARGE,L_OQLARGE,L_OCYCLIC,                                    OLA0F404.120    
     &  IMT_FULARGE,L_OFULARGE,L_OUSTARWME,L_OWINDMIX,L_OBULKMAXMLD,       OOM1F405.559    
     &  L_OROTATE,L_OSTATEC,L_SEAICE,L_OPANDP,PHIT,TB,                     OOM1F405.560    
     &  UB,VB,UBM,VBM,                                                     OLA0F404.121    
     &  XSTRESS_ICE,YSTRESS_ICE,XSTRESS_ICEM,YSTRESS_ICEM,                 OLA0F404.122    
     &  ZDZZ,ZDZ,DZ,DZZ,                                                   OOM1F405.561    
     &  DZZ2RQ,DZ2RQ,                                                      OLA0F404.124    
     &  NERGY,GRAV_SI,FM,                                                  OLA0F404.125    
     &  RHOSRN,RHOSRNA,RHOSRNB,                                            OOM1F405.558    
     &  hT,RiT,max_qLarge_depth,crit_Ri,                                   OLA0F404.127    
     &  MLD_LARGE,MAX_LARGE_DEPTH,MAX_LARGE_LEVELS,RHO_WATER_SI,           OOM1F405.562    
     &  HTN,PME,WATERFLUX_ICE,SOL,WME,L_T,LAMBDA_LARGE,                    OOM1F405.563    
     &  SPECIFIC_HEAT_SI,                                                  OOM1F405.564    
     &  gnu(1,1),FNU0_SI,FNUB_SI,STABLM_SI,FKAPB_SI,GNUMINT_SI             OLA0F404.128    
     &  ,KAPPA_B_SI,OCEANHEATFLUX,CARYHEAT,FLXTOICE,CGFLUX )               OOM1F405.565    
      ELSE                                                                 OLA0F404.130    
      CALL VERTCOFT                                                        CALCESAV.133    
     & (J,IMT,KM,KMM1,NT,                                                  CALCESAV.134    
     &  IMT_QLARGE,L_OQLARGE,L_OCYCLIC,                                    OLA3F403.212    
     &  IMT_FULARGE,L_OFULARGE,L_OUSTARWME,L_OWINDMIX,L_OBULKMAXMLD,       OOM1F405.567    
     &  L_OROTATE,L_OSTATEC,L_SEAICE,L_OPANDP,PHIT,TB,                     OOM1F405.568    
     &  UB,VB,UBM,VBM,                                                     CALCESAV.135    
     &  WSX, WSY,WSXM,WSYM,                                                OLA3F403.210    
     &  ZDZZ,ZDZ,DZ,DZZ,                                                   OOM1F405.569    
     &  DZZ2RQ,DZ2RQ,                                                      OLA3F403.213    
     &  NERGY,GRAV_SI,FM,                                                  CALCESAV.137    
     &  RHOSRN,RHOSRNA,RHOSRNB,                                            OOM1F405.566    
     &  hT,RiT,max_qLarge_depth,crit_Ri,                                   OLA0F404.132    
     &  MLD_LARGE,MAX_LARGE_DEPTH,MAX_LARGE_LEVELS,RHO_WATER_SI,           OOM1F405.570    
     &  HTN,PME,WATERFLUX_ICE,SOL,WME,L_T,LAMBDA_LARGE,                    OOM1F405.571    
     &  SPECIFIC_HEAT_SI,                                                  OOM1F405.572    
     &  gnu(1,1),FNU0_SI,FNUB_SI,STABLM_SI,FKAPB_SI,GNUMINT_SI,            CALCESAV.139    
     &  KAPPA_B_SI,OCEANHEATFLUX,CARYHEAT,FLXTOICE,CGFLUX )                OOM1F405.573    
      ENDIF                                                                OLA0F404.133    
C                                                                          CALCESAV.141    
      ELSE                                                                 ORH1F305.277    
      DO K=1,KM                                                            CALCESAV.144    
         DO I=1,IMT                                                        CALCESAV.145    
            gnu(I,K)=FKPH                                                  CALCESAV.146    
         ENDDO   ! Over I                                                  CALCESAV.147    
      ENDDO      ! Over K                                                  CALCESAV.148    
      ENDIF                                                                ORH1F305.278    
C ------------------------------------------------------------------       CALCESAV.150    
C  Having obtained required values of gnu,                                 CALCESAV.151    
C  call subroutine to calculate isopycnal diffusion tensor                 CALCESAV.152    
C ------------------------------------------------------------------       CALCESAV.153    
C                                                                          CALCESAV.154    
C                                                                          OJG0F403.67     
      IF (L_SLOPEMAX) THEN                                                 OJG0F403.68     
C                                                                          OJG0F403.69     
C      Old isopycnal diffusion scheme, with a maximum slope                OJG0F403.70     
C                                                                          OJG0F403.71     
        IF (L_OMIXLAY) THEN                                                OJG0F403.72     
C                                                                          OJG0F403.73     
      CALL IPDCOFCO                                                        OJG0F403.74     
     &  ( J,JMT,IMT,IMTM1,KM,KMT,KMP,KMP1,KMP2,NT,NTMIN2,                  OJG0F403.75     
     &    J_OFFSET,                                                        ORH7F404.75     
     &  T,TP,TDIF,                                                         OJG0F403.78     
     &  DXUR,DXU2RQ,DXT4RQ,DYUR,DYT4R,DZ2RQ,DZZ2RQ,ZDZ,DTTS,               OJG0F403.79     
     &  NERGY,CSR,CSTR,ITT,FM,FMP,                                         OJG0F403.80     
     &  RHOS,RHON,AH,ahi,                                                  OJG0F403.81     
     &  gnu(1,1),JFT0,esav,fk1,fk2,fk3(1,1,1),                             OJG0F403.82     
     &  rxp,ry,rrzp,                                                       OJG0F403.83     
     &  MLD                                                                OJG0F403.84     
     &  ,SLOPE_MAX                                                         OJG0F403.85     
     &  )                                                                  OJG0F403.86     
C                                                                          OJG0F403.87     
        ELSE                                                               OJG0F403.88     
C                                                                          OJG0F403.89     
      CALL IPDCOFCO                                                        OJG0F403.90     
     &  ( J,JMT,IMT,IMTM1,KM,KMT,KMP,KMP1,KMP2,NT,NTMIN2,                  OJG0F403.91     
     &    J_OFFSET,                                                        ORH7F404.76     
     &  T,TP,TDIF,                                                         OJG0F403.94     
     &  DXUR,DXU2RQ,DXT4RQ,DYUR,DYT4R,DZ2RQ,DZZ2RQ,ZDZ,DTTS,               OJG0F403.95     
     &  NERGY,CSR,CSTR,ITT,FM,FMP,                                         OJG0F403.96     
     &  RHOS,RHON,AH,ahi,                                                  OJG0F403.97     
     &  gnu(1,1),JFT0,esav,fk1,fk2,fk3(1,1,1),                             OJG0F403.98     
     &  rxp,ry,rrzp,                                                       OJG0F403.99     
     &  DIAG_MLD                                                           OJG0F403.100    
     &  ,SLOPE_MAX                                                         OJG0F403.101    
     &  )                                                                  OJG0F403.102    
C                                                                          OJG0F403.103    
        ENDIF                                                              OJG0F403.104    
C                                                                          OJG0F403.105    
      ELSE                                                                 OJG0F403.106    
      IF (L_OMIXLAY) THEN                                                  ORH1F305.279    
C                                                                          ORW1F400.74     
C  IPD is switched off in top 50m, for numerical stability reasons.        ORW1F400.75     
C  This is instead of switching it off throughout the mixed layer,         ORW1F400.76     
C  as in previous (<4.0) versions of the code.                             ORW1F400.77     
C                                                                          ORW1F400.78     
C  To revert to switching off IPD throughout mixed layer, pass MLD         ORW1F400.79     
C  instead of DUMMY_MLD into IPDCOFCL.                                     ORW1F400.80     
C                                                                          ORW1F400.81     
      DO I=1,IMT                                                           ORW1F400.82     
        DUMMY_MLD(I)=50.0                                                  ORW1F400.83     
      END DO                                                               ORW1F400.84     
C                                                                          ORW1F400.85     
          CALL IPDCOFCL                                                    ORH1F305.280    
     &  ( J,JMT,IMT,IMTM1,KM,KMP,KMP1,KMP2,NT,NTMIN2,                      OLA0F401.135    
     & J_OFFSET,                                                           ORH7F402.281    
     &     T,TP,TDIF,                                                      ORH1F305.283    
     &  DZZ,KMT,KMTP,KMTPP,                                                OLA0F401.136    
     &     DXUR,DXU2RQ,DXT4RQ,DYUR,DYT4R,DZ2RQ,DZZ2RQ,ZDZ,DTTS,            ORH1F305.284    
     &  NERGY,CSR,CSTR,ITT,FM,FMP,FMM,                                     OLA0F401.137    
     &     RHOS,RHON,AH,ahi,                                               ORH1F305.286    
     &     gnu(1,1),JFT0,esav,fk1,fk2,fk3(1,1,1),                          ORH1F305.287    
     &     rxp,ry,rrzp,                                                    ORH1F305.288    
     &  drhob1p,drhob2p,                                                   OLA0F401.138    
     &  DUMMY_MLD                                                          ORW1F400.86     
     &     ,SLOPE_MAX                                                      ORH1F305.290    
     &     ,dslope,slopec                                                  OLA0F401.139    
     &    )                                                                ORH1F305.291    
      ELSE                                                                 ORH1F305.292    
          CALL IPDCOFCL                                                    ORH1F305.293    
     &  ( J,JMT,IMT,IMTM1,KM,KMP,KMP1,KMP2,NT,NTMIN2,                      OLA0F401.140    
     & J_OFFSET,                                                           ORH7F402.282    
     &     T,TP,TDIF,                                                      ORH1F305.296    
     &  DZZ,KMT,KMTP,KMTPP,                                                OLA0F401.141    
     &     DXUR,DXU2RQ,DXT4RQ,DYUR,DYT4R,DZ2RQ,DZZ2RQ,ZDZ,DTTS,            ORH1F305.297    
     &  NERGY,CSR,CSTR,ITT,FM,FMP,FMM,                                     OLA0F401.142    
     &     RHOS,RHON,AH,ahi,                                               ORH1F305.299    
     &     gnu(1,1),JFT0,esav,fk1,fk2,fk3(1,1,1),                          ORH1F305.300    
     &     rxp,ry,rrzp,                                                    ORH1F305.301    
     &  drhob1p,drhob2p,                                                   OLA0F401.143    
     &     DIAG_MLD                                                        ORH1F305.302    
     &     ,SLOPE_MAX                                                      ORH1F305.303    
     &     ,dslope,slopec                                                  OLA0F401.144    
     &    )                                                                ORH1F305.304    
      ENDIF                                                                ORH1F305.305    
C                                                                          OJG0F403.107    
      ENDIF                                                                OJG0F403.108    
C                                                                          CALCESAV.173    
C --------------------------------------------------------------           CALCESAV.174    
C Calculate esav ready for calculations involving the first                CALCESAV.175    
C row in this parallel block.                                              CALCESAV.176    
C (Tracer values are unavoidably populated with spurious figures           CALCESAV.177    
C  here but since they are kept local to this subroutine, the              CALCESAV.178    
C  only problem should be one of performance.)                             CALCESAV.179    
C --------------------------------------------------------------           CALCESAV.180    
      ! Initialise TA and ESAV                                             ORH2F305.5      
      DO M  = 1, NT                                                        ORH2F305.6      
         DO K = 1, KM                                                      ORH2F305.7      
            DO I = 1, IMT                                                  ORH2F305.8      
               TA(I,K,M) = 0.0                                             ORH2F305.9      
               ESAV(I,K,M) = 0.0                                           ORH2F305.10     
            ENDDO ! over I                                                 ORH2F305.11     
         ENDDO    ! over K                                                 ORH2F305.12     
      ENDDO       ! over M                                                 ORH2F305.13     
C                                                                          CALCESAV.181    
      DO M=1,NT                                                            CALCESAV.182    
C                                                                          CALCESAV.183    
         CALL IPDFLXCL                                                     CALCESAV.184    
     &   (M,J,JMT,IMT,IMTM1,KM,KMP1,KMM1,NT,                               CALCESAV.185    
     &    TB,TBP,TBM,TA,                                                   CALCESAV.186    
     &    DXU2RQ,DXT4RQ,DYUR,DYTR,DYT4R,DZ2RQ,                             CALCESAV.187    
     &    CS,CSR,CSTR,FM,FMP,FMM,                                          CALCESAV.188    
     &    esav,fk1,fk2,fk3,worka,workb,workc)                              CALCESAV.189    
C                                                                          CALCESAV.190    
C                                                                          CALCESAV.191    
      ENDDO                                                                CALCESAV.192    
                                                                           OLA0F401.145    
      IF (L_OISOPYCGM) THEN                                                OLA0F401.146    
                                                                           OLA2F403.264    
      IF (L_OVISBECK) THEN                                                 OLA2F403.265    
                                                                           OLA2F403.266    
c Compute the meridional component of the isopycnal mixing velocity        OLA2F403.267    
c at the centre of the northern face of the tracer grid box.               OLA2F403.268    
        do k=2,kmm1                                                        OLA2F403.269    
          DO I=1,IMT                                                       OOM1F404.70     
            visopn(i,k) = -dz2r(k)*fm(i,k)*fmp(i,k)*(fk2(i,k-1,3)*         OOM1F404.71     
     &                    (ATHKDFTV(i,j)/ahi(k-1))-fk2(i,k+1,3)*           OOM1F404.72     
     &                    (ATHKDFTV(i,j)/ahi(k+1)))                        OOM1F404.73     
          ENDDO                                                            OOM1F404.74     
        enddo                                                              OLA2F403.275    
c Consider the top and bottom levels. "fk2" is assumed to be zero          OLA2F403.276    
c at the ocean top and bottom.                                             OLA2F403.277    
        k = 1                                                              OLA2F403.278    
        DO I=1,IMT                                                         OOM1F404.75     
          visopn(i,k) = dz2r(k)*fm(i,k)*fmp(i,k)                           OOM1F404.76     
     &                  *(fk2(i,k,3)*(ATHKDFTV(i,j)/ahi(k)) +              OOM1F404.77     
     &                  fk2(i,k+1,3)*(ATHKDFTV(i,j)/ahi(k+1)))             OOM1F404.78     
        ENDDO                                                              OOM1F404.79     
        do i=1,imt                                                         OLA2F403.284    
          visopn(i,km) = 0.                                                OLA2F403.285    
        enddo                                                              OLA2F403.286    
        do i=1,imt                                                         OLA2F403.287    
          k = min(kmt(i),kmtp(i))                                          OLA2F403.288    
          if (k .ne. 0) then                                               OLA2F403.289    
            visopn(i,k) = -dz2r(k)*fm(i,k)*fmp(i,k)                        OOM1F404.80     
     &                    *(fk2(i,k,3)*(ATHKDFTV(i,j)/ahi(k))+             OOM1F404.81     
     &                     fk2(i,k-1,3)*(ATHKDFTV(i,j)/ahi(k-1)))          OOM1F404.82     
          endif                                                            OLA2F403.293    
        enddo                                                              OLA2F403.294    
                                                                           OLA2F403.295    
      ELSE                                                                 OLA2F403.296    
                                                                           OLA2F403.297    
c The following occurs if the Visbeck Scheme is not chosen                 OLA2F403.298    
                                                                           OLA0F401.147    
c                                                                          OLA0F401.148    
c     compute the meridional component of the isopycnal mixing velocity    OLA0F401.149    
c     at the center of the northern face of the "t" grid box.              OLA0F401.150    
c                                                                          OLA0F401.151    
c     the top and bottom levels will be considered later.                  OLA0F401.152    
c                                                                          OLA0F401.153    
                                                                           OLA0F401.154    
      DO k=2,kmm1                                                          OLA0F401.155    
          DO I=1,IMT                                                       OOM1F404.83     
           visopn(i,k) = -dz2r(k)*fm(i,k)*fmp(i,k)*(fk2(i,k-1,3)*          OOM1F404.84     
     &       (athkdf(k-1)/ahi(k-1))-fk2(i,k+1,3)*                          OOM1F404.85     
     &                              (athkdf(k+1)/ahi(k+1)))                OOM1F404.86     
         ENDDO                                                             OLA0F401.160    
      ENDDO                                                                OLA0F401.161    
c     consider the top and bottom levels. "fk2" is assumed to be zero      OLA0F401.162    
c     at the ocean top and bottom.                                         OLA0F401.163    
c                                                                          OLA0F401.164    
      K = 1                                                                OLA0F401.165    
      DO I=1,IMT                                                           OOM1F404.87     
        visopn(i,k) = dz2r(k)*fm(i,k)*fmp(i,k)                             OOM1F404.88     
     &                *(fk2(i,k,3)*(athkdf(k)/ahi(k))+fk2(i,k+1,3)*        OOM1F404.89     
     &                 (athkdf(k+1)/ahi(k+1)))                             OOM1F404.90     
      ENDDO                                                                OLA0F401.170    
                                                                           OLA0F401.171    
      DO i=1,imt                                                           OLA0F401.172    
        visopn(i,km) = 0.                                                  OLA0F401.173    
      ENDDO                                                                OLA0F401.174    
                                                                           OLA0F401.175    
                                                                           OLA0F401.176    
      DO i=1,imt                                                           OLA0F401.177    
        k = min(kmt(i),kmtp(i))                                            OLA0F401.178    
        if (k .ne. 0) then                                                 OLA0F401.179    
          visopn(i,k) = -dz2r(k)*fm(i,k)*fmp(i,k)                          OOM1F404.91     
     &                  *(fk2(i,k,3)*(athkdf(k)/ahi(k))+fk2(i,k-1,3)*      OOM1F404.92     
     &                   (athkdf(k-1)/ahi(k-1)))                           OOM1F404.93     
        endif                                                              OLA0F401.183    
      ENDDO                                                                OLA0F401.184    
                                                                           OLA0F401.185    
                                                                           OLA2F403.299    
      ENDIF ! if L_OVISBECK                                                OLA2F403.300    
                                                                           OLA2F403.301    
      ENDIF ! if L_OISOPYCGM                                               OLA0F401.186    
*ENDIF   OISOPYC                                                           ORH1F305.263    
      RETURN                                                               CALCESAV.193    
      END                                                                  CALCESAV.194    
*ENDIF                                                                     CALCESAV.195