*IF DEF,OCEAN                                                              MED_CALC.2      
C *****************************COPYRIGHT******************************     MED_CALC.3      
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved.    MED_CALC.4      
C                                                                          MED_CALC.5      
C Use, duplication or disclosure of this code is subject to the            MED_CALC.6      
C restrictions as set forth in the contract.                               MED_CALC.7      
C                                                                          MED_CALC.8      
C                Meteorological Office                                     MED_CALC.9      
C                London Road                                               MED_CALC.10     
C                BRACKNELL                                                 MED_CALC.11     
C                Berkshire UK                                              MED_CALC.12     
C                RG12 2SZ                                                  MED_CALC.13     
C                                                                          MED_CALC.14     
C If no contract has been raised with this copy of the code, the use,      MED_CALC.15     
C duplication or disclosure of it is strictly prohibited.  Permission      MED_CALC.16     
C to do so must first be obtained in writing from the Head of Numerical    MED_CALC.17     
C Modelling at the above address.                                          MED_CALC.18     
C ******************************COPYRIGHT******************************    MED_CALC.19     
CLL                                                                        MED_CALC.20     
CLL   Subroutine : MED_CALC                                                MED_CALC.21     
CLL                                                                        MED_CALC.22     
CLL   Author : M J Roberts                                                 MED_CALC.23     
CLL                                                                        MED_CALC.24     
CLL   Modification history:                                                MED_CALC.25     
CLL   Implemented at UM vn 4.5 20 May 1998                                 MED_CALC.26     
CLL                                                                        MED_CALC.27     
CLL   Programming standards use Cox naming convention for Cox variables    MED_CALC.28     
CLL   with the addition that lower case variables are local to the         MED_CALC.29     
CLL   routine.                                                             MED_CALC.30     
CLL                                                                        MED_CALC.31     
CLL   This routine takes two tracer points each in the Atlantic and        MED_CALC.32     
CLL   Mediterranean, calculates an average value, and then calculates      MED_CALC.33     
CLL   a tendency based on the difference between the average value and     MED_CALC.34     
CLL   the value at each point. This tendency is then passed down to        MED_CALC.35     
CLL   subroutine TRACER for updating the tracer values.                    MED_CALC.36     
CLL                                                                        MED_CALC.37     
CLL   The points to be mixed are hardwired in OSETCON. This routine will   MED_CALC.38     
CLL   work for any set of four (as in HADCM3) or two (HADCM2) points.      MED_CALC.39     
CLL                                                                        MED_CALC.40     
CLLEND-----------------------------------------------------------------    MED_CALC.41     
C*                                                                         MED_CALC.42     
C*L   -----------------Arguments---------------------------------------    MED_CALC.43     
C                                                                          MED_CALC.44     

      SUBROUTINE MED_CALC(                                                  2,5MED_CALC.45     
*CALL ARGSIZE                                                              MED_CALC.46     
*CALL ARGD1                                                                MED_CALC.47     
*CALL ARGDUMO                                                              MED_CALC.48     
*CALL ARGPTRO                                                              MED_CALC.49     
*CALL ARGOCALL                                                             MED_CALC.50     
*CALL ARGOINDX                                                             MED_CALC.51     
     &  NSLAB_ARG                                                          MED_CALC.52     
     & ,TENDIN,ATTEND,HUDTEND                                              MED_CALC.53     
     & ,tendfrc,imsend,jmsend,lev_top,lev_bot,inflow_top                   MED_CALC.54     
     &,L_OMEDADV,J_PE_IND_OUT,medorhud                                     MED_CALC.55     
     &  )                                                                  MED_CALC.56     
C                                                                          MED_CALC.57     
c  Subroutine med_outflow. Calculate the tracer tendencies produced        MED_CALC.58     
C  by the Mediterranean outflow parameterization. These tendencies are     MED_CALC.59     
C  passed to TRACER to update TA.                                          MED_CALC.60     
c                                                                          MED_CALC.61     
c                                                                          MED_CALC.62     
      IMPLICIT NONE                                                        MED_CALC.63     
C                                                                          MED_CALC.64     
*CALL TYPSIZE                                                              MED_CALC.65     
*CALL OARRYSIZ                                                             MED_CALC.66     
*CALL TYPD1                                                                MED_CALC.67     
*CALL TYPDUMO                                                              MED_CALC.68     
*CALL TYPPTRO                                                              MED_CALC.69     
*CALL TYPOINDX                                                             PXORDER.26     
*CALL TYPOCALL                                                             MED_CALC.70     
*CALL OTIMER                                                               MED_CALC.72     
                                                                           MED_CALC.73     
C Input and Output variables                                               MED_CALC.74     
       REAL TENDIN(KM,NT,4)  ! Will contain the tracer tendencies for      MED_CALC.75     
C                               both Atlantic and Med points               MED_CALC.76     
       REAL ATTEND(KM,NT,4)  ! Will contain the tracer tendencies for      MED_CALC.77     
       REAL HUDTEND(KM,NT,4)  ! Will contain the tracer tendencies for     MED_CALC.78     
                                                                           MED_CALC.79     
C Input variables                                                          MED_CALC.80     
       INTEGER NSLAB_ARG,J_PE_IND_OUT(4),medorhud                          MED_CALC.81     
       REAL tendfrc   ! Fraction of gridboxes mixed                        MED_CALC.82     
                                                                           MED_CALC.83     
C Local variables                                                          MED_CALC.84     
       INTEGER PE_RECV,PE_SEND,tag,info  ! variables used in MPP coding    MED_CALC.85     
                                                                           MED_CALC.86     
       INTEGER                                                             MED_CALC.87     
     +  m,k,n,i         ! indexing variables                               MED_CALC.88     
     +, index_med(4)  ! used for indexing points in slab                   MED_CALC.89     
     +, jread_med     ! local row to read data from dump                   MED_CALC.90     
     +, LABS_MED      ! Unit number for disk, depends if mixing timestep   MED_CALC.91     
     &, nmedpt        ! Number of points mixed                             MED_CALC.92     
     &, imedpt        ! Loop index over such points                        MED_CALC.93     
     &, kmoffset      ! Offset into slab of data                           MED_CALC.94     
     &, imsend(4),jmsend(4)  ! values of imout,jmout to search for         MED_CALC.95     
c                            ! in READ_REM                                 MED_CALC.96     
       INTEGER                                                             MED_CALC.97     
     &  lev_top       ! top levels in which there is flow                  MED_CALC.98     
     & ,lev_bot       ! bottom level in which there is flow                MED_CALC.99     
                                                                           MED_CALC.100    
       REAL                                                                MED_CALC.101    
     +  FXA1,FXA2,FXB1,FXB2,FX  ! local constants                          MED_CALC.102    
     +, TMED(KM,NT)           ! mean tracer value of Atl and Med points    MED_CALC.103    
                                                                           MED_CALC.104    
       REAL                                                                MED_CALC.105    
     &  TBMED(NSLAB_ARG),TBPMED(NSLAB_ARG)   !  slabs read from dump for   MED_CALC.106    
     &, TBPPMED(NSLAB_ARG),TBPPPMED(NSLAB_ARG)  ! rows needed for calc     MED_CALC.107    
                                                                           MED_CALC.108    
       REAL                                                                MED_CALC.109    
     &  dytcst2,dytcst3,dytcst4  !  dyt*cst for j's on their PE's          MED_CALC.110    
                                                                           MED_CALC.111    
       LOGICAL L_OMEDADV  ! advective Med outflow param                    MED_CALC.112    
     &        ,inflow_top ! true if inflow to marginal sea is at           MED_CALC.113    
C                         ! surface                                        MED_CALC.114    
C*--------------------------------------------------------------------     MED_CALC.115    
C  BEGIN EXECUTABLE CODE                                                   MED_CALC.116    
C---------------------------------------------------------------------     MED_CALC.117    
      IF (L_OTIMER) CALL TIMER('MED_CALC',103)                             MED_CALC.118    
                                                                           MED_CALC.119    
C these variables will hold tracer values from possibly remote PE's        MED_CALC.120    
         do n=1,nslab                                                      MED_CALC.121    
          TBMED(n)=0.                                                      MED_CALC.122    
          TBPMED(n)=0.                                                     MED_CALC.123    
          TBPPMED(n)=0.                                                    MED_CALC.124    
          TBPPPMED(n)=0.                                                   MED_CALC.125    
         enddo                                                             MED_CALC.126    
C                                                                          MED_CALC.127    
C set label of disk to read, dependent on mixing timestep                  MED_CALC.128    
          IF (MIX.EQ.1) THEN                                               MED_CALC.129    
            LABS_MED=LABS(NDISK)                                           MED_CALC.130    
          ELSE                                                             MED_CALC.131    
            LABS_MED=LABS(NDISKB)                                          MED_CALC.132    
          ENDIF                                                            MED_CALC.133    
                                                                           MED_CALC.134    
C need to read rows for each application of the overflow process           MED_CALC.135    
                                                                           MED_CALC.136    
          CALL READ_REM(                                                   MED_CALC.137    
*CALL ARGSIZE                                                              MED_CALC.138    
*CALL ARGD1                                                                MED_CALC.139    
*CALL ARGDUMO                                                              MED_CALC.140    
*CALL ARGPTRO                                                              MED_CALC.141    
*CALL ARGOCALL                                                             MED_CALC.142    
*CALL ARGOINDX                                                             MED_CALC.143    
     &  NSLAB_ARG                                                          MED_CALC.144    
     & ,tendfrc,imsend,jmsend,TBPMED,TBPPMED,TBPPPMED                      MED_CALC.145    
     & ,dytcst2,dytcst3,dytcst4,labs_med,J_PE_IND_OUT )                    MED_CALC.146    
                                                                           MED_CALC.147    
*IF DEF,MPP                                                                MED_CALC.148    
C do the Med outflow calculation on this PE                                MED_CALC.149    
        if ((jst.le.jmsend(1)).and.(jfin.ge.jmsend(1))) then               MED_CALC.150    
        jread_med=jmsend(1)-J_OFFSET                                       MED_CALC.151    
*ELSE                                                                      MED_CALC.152    
        jread_med=jmsend(1)                                                MED_CALC.153    
*ENDIF                                                                     MED_CALC.154    
C                                                                          MED_CALC.155    
C  Get tracers for J=jmsend(1)                                             MED_CALC.156    
C                                                                          MED_CALC.157    
             CALL UMREAD(                                                  MED_CALC.158    
*CALL ARGSIZE                                                              MED_CALC.159    
*CALL ARGD1                                                                MED_CALC.160    
*CALL ARGDUMO                                                              MED_CALC.161    
*CALL ARGPTRO                                                              MED_CALC.162    
     &            LABS_MED,jread_med,TBMED                                 MED_CALC.163    
     &,           NDISKB,NDISK,NDISKA,FKMP,FKMQ )                          MED_CALC.164    
                                                                           MED_CALC.165    
C                                                                          MED_CALC.166    
C Do Mediterranean Outflow calculations                                    MED_CALC.167    
C--------------------------------------                                    MED_CALC.168    
                                                                           MED_CALC.169    
C On first row with a med mixing point, calculate areas                    MED_CALC.170    
C of each box.                                                             MED_CALC.171    
c                                                                          MED_CALC.172    
         FXA1=DXT(imsend(1))*DYT(jread_med)*CST(jread_med)                 MED_CALC.173    
         FXA2=DXT(imsend(2))*dytcst2                                       MED_CALC.174    
         if (jmsend(3).eq.0) then                                          MED_CALC.175    
           nmedpt=2                                                        MED_CALC.176    
           FX=1.0/(FXA1+FXA2)                                              MED_CALC.177    
         else                                                              MED_CALC.178    
           FXB1=DXT(imsend(3))*dytcst3                                     MED_CALC.179    
           FXB2=DXT(imsend(4))*dytcst4                                     MED_CALC.180    
           nmedpt=4                                                        MED_CALC.181    
           FX=1.0/(FXA1+FXA2+FXB1+FXB2)                                    MED_CALC.182    
         endif                                                             MED_CALC.183    
                                                                           MED_CALC.184    
      IF (.NOT.L_OMEDADV) THEN                                             MED_CALC.185    
C apply the old HADCM3-type Mediterranean outflow param                    MED_CALC.186    
C                                                                          MED_CALC.187    
C  Define mixed value (lagged one timestep), and compute mixing            MED_CALC.188    
C  tendencies at Atlantic and Med points.                                  MED_CALC.189    
C                                                                          MED_CALC.190    
         DO M=1,NT                                                         MED_CALC.191    
           DO K=1,NMEDLEV                                                  MED_CALC.192    
             kmoffset=((k-1)*imt)+((m-1)*imt*km)                           MED_CALC.193    
             do imedpt=1,nmedpt                                            MED_CALC.194    
               index_med(imedpt)=imsend(imedpt)+kmoffset                   MED_CALC.195    
             enddo                                                         MED_CALC.196    
             tendin(k,m,1)=TBMED(index_med(1))                             MED_CALC.197    
             tendin(k,m,2)=TBPMED(index_med(2))                            MED_CALC.198    
             if (nmedpt.eq.2) then                                         MED_CALC.199    
               tmed(k,m)=FX*(FXA1*TENDIN(k,m,1)+FXA2*TENDIN(k,m,2))        MED_CALC.200    
             else                                                          MED_CALC.201    
               tendin(k,m,3)=TBPPMED(index_med(3))                         MED_CALC.202    
               tendin(k,m,4)=TBPPPMED(index_med(4))                        MED_CALC.203    
               tmed(k,m)=FX*(FXA1*TENDIN(k,m,1)+FXA2*TENDIN(k,m,2)         MED_CALC.204    
     &         + FXB1*TENDIN(k,m,3)+FXB2*TENDIN(k,m,4))                    MED_CALC.205    
             endif                                                         MED_CALC.206    
             do imedpt=1,nmedpt                                            MED_CALC.207    
               tendin(k,m,imedpt)=tendfrc*(TMED(K,M)-TENDIN(k,m,imedpt))   MED_CALC.208    
             enddo                                                         MED_CALC.209    
           ENDDO                                                           MED_CALC.210    
         ENDDO                                                             MED_CALC.211    
                                                                           MED_CALC.212    
       do m=1,nt                                                           MED_CALC.213    
         do i=1,4                                                          MED_CALC.214    
           do k=1,km                                                       MED_CALC.215    
             ATTEND(k,m,i)=TENDIN(k,m,i)                                   MED_CALC.216    
           enddo                                                           MED_CALC.217    
         enddo                                                             MED_CALC.218    
       enddo                                                               MED_CALC.219    
                                                                           MED_CALC.220    
      ELSE        ! L_OMEDADV=true                                         MED_CALC.221    
                                                                           MED_CALC.222    
C apply the new, HADCM4-type advective inflow/outflow param                MED_CALC.223    
                                                                           MED_CALC.224    
C set up the upstream temperature values which will be used                MED_CALC.225    
C to calculate the zonal flux divergence for the Med outflow               MED_CALC.226    
                                                                           MED_CALC.227    
c if the inflow is at the surface                                          MED_CALC.228    
      if (inflow_top) then                                                 MED_CALC.229    
                                                                           MED_CALC.230    
         DO M=1,NT                                                         MED_CALC.231    
           DO K=1,NMEDLEV                                                  MED_CALC.232    
             kmoffset=((k-1)*imt)+((m-1)*imt*km)                           MED_CALC.233    
             do imedpt=1,nmedpt                                            MED_CALC.234    
               index_med(imedpt)=imsend(imedpt)+kmoffset                   MED_CALC.235    
             enddo                                                         MED_CALC.236    
             if (k.le.lev_top) then                                        MED_CALC.237    
               TENDIN(k,m,1)=(TBMED(index_med(1)))*FXB1*4.*FX              MED_CALC.238    
               TENDIN(k,m,2)=(TBPMED(index_med(2)))*FXB2*4.*FX             MED_CALC.239    
               TENDIN(k,m,3)=TENDIN(k,m,1)*FXA1/FXB1                       MED_CALC.240    
               TENDIN(k,m,4)=TENDIN(k,m,2)*FXA2/FXB2                       MED_CALC.241    
             else if (k.eq.lev_bot) then                                   MED_CALC.242    
               TENDIN(k,m,1)=TBPPMED(index_med(3))*FXB1*4.*FX              MED_CALC.243    
               TENDIN(k,m,2)=TBPPPMED(index_med(4))*FXB2*4.*FX             MED_CALC.244    
             else                                                          MED_CALC.245    
               TENDIN(k,m,1)=TBMED(index_med(1))*FXB1*4.*FX                MED_CALC.246    
               TENDIN(k,m,2)=TBPMED(index_med(2))*FXB2*4.*FX               MED_CALC.247    
               TENDIN(k,m,3)=TBPPMED(index_med(3))*FXA1*4.*FX              MED_CALC.248    
               TENDIN(k,m,4)=TBPPPMED(index_med(4))*FXA2*4.*FX             MED_CALC.249    
             endif                                                         MED_CALC.250    
           ENDDO                                                           MED_CALC.251    
           TENDIN(lev_bot,m,3)=TENDIN(lev_bot,m,1)*FXA1/FXB1               MED_CALC.252    
           TENDIN(lev_bot,m,4)=TENDIN(lev_bot,m,2)*FXA2/FXB2               MED_CALC.253    
         ENDDO                                                             MED_CALC.254    
                                                                           MED_CALC.255    
       do m=1,nt                                                           MED_CALC.256    
         do i=1,4                                                          MED_CALC.257    
           do k=1,km                                                       MED_CALC.258    
             ATTEND(k,m,i)=TENDIN(k,m,i)                                   MED_CALC.259    
           enddo                                                           MED_CALC.260    
         enddo                                                             MED_CALC.261    
       enddo                                                               MED_CALC.262    
                                                                           MED_CALC.263    
      else  ! inflow at bottom                                             MED_CALC.264    
                                                                           MED_CALC.265    
         DO M=1,NT                                                         MED_CALC.266    
           DO K=1,NMEDLEV                                                  MED_CALC.267    
             kmoffset=((k-1)*imt)+((m-1)*imt*km)                           MED_CALC.268    
             do imedpt=1,nmedpt                                            MED_CALC.269    
               index_med(imedpt)=imsend(imedpt)+kmoffset                   MED_CALC.270    
             enddo                                                         MED_CALC.271    
c properties of near-surface flow                                          MED_CALC.272    
             if (k.le.lev_top) then                                        MED_CALC.273    
               TENDIN(k,m,1)=(TBMED(index_med(1)))*FXB1*4.*FX              MED_CALC.274    
               TENDIN(k,m,2)=(TBPMED(index_med(2)))*FXB2*4.*FX             MED_CALC.275    
               TENDIN(k,m,3)=TENDIN(k,m,1)*FXA1/FXB1                       MED_CALC.276    
               TENDIN(k,m,4)=TENDIN(k,m,2)*FXA2/FXB2                       MED_CALC.277    
             else if (k.eq.lev_bot) then                                   MED_CALC.278    
               TENDIN(k,m,1)=TBPPMED(index_med(3))*FXB1*4.*FX              MED_CALC.279    
               TENDIN(k,m,2)=TBPPPMED(index_med(4))*FXB2*4.*FX             MED_CALC.280    
             else                                                          MED_CALC.281    
               TENDIN(k,m,1)=TBMED(index_med(1))*FXB1*4.*FX                MED_CALC.282    
               TENDIN(k,m,2)=TBPMED(index_med(2))*FXB2*4.*FX               MED_CALC.283    
               TENDIN(k,m,3)=TBPPMED(index_med(3))*FXA1*4.*FX              MED_CALC.284    
               TENDIN(k,m,4)=TBPPPMED(index_med(4))*FXA2*4.*FX             MED_CALC.285    
             endif                                                         MED_CALC.286    
           ENDDO                                                           MED_CALC.287    
           TENDIN(lev_bot,m,3)=TENDIN(lev_bot,m,1)*FXA1/FXB1               MED_CALC.288    
           TENDIN(lev_bot,m,4)=TENDIN(lev_bot,m,2)*FXA2/FXB2               MED_CALC.289    
         ENDDO                                                             MED_CALC.290    
      endif  ! inflow_top                                                  MED_CALC.291    
      ENDIF  ! L_OMEDADV                                                   MED_CALC.292    
                                                                           MED_CALC.293    
       do m=1,nt                                                           MED_CALC.294    
         do i=1,4                                                          MED_CALC.295    
           do k=1,km                                                       MED_CALC.296    
             HUDTEND(k,m,i)=TENDIN(k,m,i)                                  MED_CALC.297    
           enddo                                                           MED_CALC.298    
         enddo                                                             MED_CALC.299    
       enddo                                                               MED_CALC.300    
                                                                           MED_CALC.301    
*IF DEF,MPP                                                                MED_CALC.302    
         endif ! on processor local to jmsend(1)                           MED_CALC.303    
*ENDIF                                                                     MED_CALC.304    
c then need to send the values in TENDIN,ATTEND and HUDTEND back to the    MED_CALC.305    
c appropriate PE's                                                         MED_CALC.306    
                                                                           MED_CALC.307    
          CALL SEND_REM(                                                   MED_CALC.308    
*CALL ARGSIZE                                                              MED_CALC.309    
*CALL ARGD1                                                                MED_CALC.310    
*CALL ARGDUMO                                                              MED_CALC.311    
*CALL ARGPTRO                                                              MED_CALC.312    
*CALL ARGOCALL                                                             MED_CALC.313    
*CALL ARGOINDX                                                             MED_CALC.314    
     &  NSLAB_ARG                                                          MED_CALC.315    
     & ,TENDIN,ATTEND,HUDTEND                                              MED_CALC.316    
     & ,imsend,jmsend,J_PE_IND_OUT,medorhud )                              MED_CALC.317    
                                                                           MED_CALC.318    
                                                                           MED_CALC.319    
       IF (L_OTIMER) CALL TIMER('MED_CALC',104)                            MED_CALC.320    
                                                                           MED_CALC.321    
       RETURN                                                              MED_CALC.322    
       END                                                                 MED_CALC.323    
                                                                           MED_CALC.324    
*ENDIF                                                                     MED_CALC.325    
                                                                           MED_CALC.326