C $Header: /u/gcmpack/MITgcm/pkg/profiles/profiles_interp.F,v 1.16 2017/01/10 15:40:59 gforget Exp $
C $Name:  $

#include "PROFILES_OPTIONS.h"
#ifdef ALLOW_ECCO
# include "ECCO_OPTIONS.h"
#endif

C     o==========================================================o
C     | subroutine profiles_interp                               |
C     | o 3D interpolation of model counterparts                 |
C     |   for netcdf profiles data                               |
C     | started: Gael Forget 15-March-2006                       |
C     o==========================================================o

      SUBROUTINE PROFILES_INTERP(
     O traj_cur_out,
     I i_cur,
     I j_cur,
     I weights_cur,
     I var_cur,
     I itr_cur,
     I file_cur,
     I mytime,
     I bi,
     I bj,
     I myThid
     & )

      implicit none

C ==================== Global Variables ===========================
#include "EEPARAMS.h"
#include "SIZE.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "PARAMS.h"
#ifdef ALLOW_CAL
# include "cal.h"
#endif
#ifdef ALLOW_ECCO
# include "ecco.h"
#endif
#ifdef ALLOW_PROFILES
# include "PROFILES_SIZE.h"
# include "profiles.h"
#endif
#ifdef ALLOW_PTRACERS
#include "PTRACERS_SIZE.h"
#include "PTRACERS_FIELDS.h"
#endif
C ==================== Routine Variables ==========================
      _RL  mytime
      integer mythid
      integer file_cur, itr_cur
      character*(8) var_cur
#ifndef ALLOW_PROFILES
      _RL  traj_cur_out, weights_cur
      integer  i_cur, j_cur
#else
      _RL  traj_cur_out(NLEVELMAX)
      _RL  weights_cur(NUM_INTERP_POINTS)
      integer  i_cur(NUM_INTERP_POINTS)
      integer  j_cur(NUM_INTERP_POINTS)
#endif

C ==================== Local Variables ==========================
      _RL tab_coeffs1(NUM_INTERP_POINTS)
      _RL tab_coeffs3(NUM_INTERP_POINTS)
      _RL ponderations(NUM_INTERP_POINTS),pondsSUM
      integer q,k,kk,kcur,bi,bj
      _RL traj_cur(nR),mask_cur(nR)
      _RL tmp_coeff

c     == external functions ==
      integer ILNBLNK
      EXTERNAL 

c--   == end of interface ==

c horizontal interpolation:
      do k=1,nr
        pondsSUM=0. _d 0
        do q=1,NUM_INTERP_POINTS
        if (var_cur.EQ.'theta') then
               tab_coeffs1(q)=theta(i_cur(q),j_cur(q),k,bi,bj)
        elseif (var_cur.EQ.'salt') then
               tab_coeffs1(q)=salt(i_cur(q),j_cur(q),k,bi,bj)
        elseif (var_cur.EQ.'pTracer') then
#ifdef ALLOW_PTRACERS
               tab_coeffs1(q)=pTracer(i_cur(q),j_cur(q),k,bi,bj,
     &            itr_cur)
#else
               tab_coeffs1(q)=0. _d 0
#endif
#ifdef ALLOW_ECCO
        elseif (var_cur.EQ.'eta') then
               tab_coeffs1(q)=m_eta(i_cur(q),j_cur(q),bi,bj)
        elseif (var_cur.EQ.'UE') then
               tab_coeffs1(q)=m_UE(i_cur(q),j_cur(q),k,bi,bj)
        elseif (var_cur.EQ.'VN') then
               tab_coeffs1(q)=m_VN(i_cur(q),j_cur(q),k,bi,bj)
#endif
        else
               tab_coeffs1(q)=0. _d 0
        endif
        tab_coeffs3(q)=maskC(i_cur(q),j_cur(q),k,bi,bj)

        ponderations(q)=tab_coeffs3(q)*weights_cur(q)
        pondsSUM=pondsSUM+ponderations(q)
        enddo

        if (pondsSUM.GT.0) then
         traj_cur(k)=0. _d 0
         mask_cur(k)=1. _d 0
         do q=1,NUM_INTERP_POINTS
           traj_cur(k)=traj_cur(k)
     &     +tab_coeffs1(q)*ponderations(q)/pondsSUM
         enddo
        else
         traj_cur(k)=0. _d 0
         mask_cur(k)=0. _d 0
        endif
      enddo

c vertical interpolation:
      do kk=1,NLEVELMAX
         traj_cur_out(kk)=0
         prof_mask1D_cur(kk,bi,bj)=0
      enddo
      do kk=1,ProfDepthNo(file_cur,bi,bj)
c case 1: above first grid center=> first grid center value
        if (prof_depth(file_cur,kk,bi,bj).LT.-rC(1)) then
          traj_cur_out(kk)=traj_cur(1)
          prof_mask1D_cur(kk,bi,bj)=mask_cur(1)
c case 2: just below last grid center=> last cell value
        elseif (prof_depth(file_cur,kk,bi,bj).GE.-rC(nr)) then
          if ( prof_depth(file_cur,kk,bi,bj) .LT.
     &    (-rC(nr)+drC(nr)/2) ) then
            traj_cur_out(kk)=traj_cur(nr)
            prof_mask1D_cur(kk,bi,bj)=mask_cur(nr)
          endif
c case 3: between two grid centers
        else
          kcur=0
          do k=1,nr-1
            if ((prof_depth(file_cur,kk,bi,bj).GE.-rC(k)).AND.
     &      (prof_depth(file_cur,kk,bi,bj).LT.-rC(k+1))) then
              kcur=k
            endif
          enddo
          if (kcur.EQ.0) then
            WRITE(errorMessageUnit,'(A)')
     &        'ERROR in PROFILES_INTERP: unexpected case 1'
            CALL ALL_PROC_DIE( myThid )
            STOP 'ABNORMAL END: S/R PROFILES_INTERP'
          endif
          if (mask_cur(kcur+1).EQ.1.) then
c  subcase 1: 2 wet points=>linear interpolation
            tmp_coeff=(prof_depth(file_cur,kk,bi,bj)+rC(kcur))/
     &      (-rC(kcur+1)+rC(kcur))
            traj_cur_out(kk)=(1-tmp_coeff)*traj_cur(kcur)
     &      +tmp_coeff*traj_cur(kcur+1)
            prof_mask1D_cur(kk,bi,bj)=1
            if (mask_cur(kcur).EQ.0.) then
            WRITE(errorMessageUnit,'(A)')
     &        'ERROR in PROFILES_INTERP: unexpected case 2'
            CALL ALL_PROC_DIE( myThid )
            STOP 'ABNORMAL END: S/R PROFILES_INTERP'
            endif
          elseif (prof_depth(file_cur,kk,bi,bj).LT.-rF(kcur+1)) then
c  subcase 2: only 1 wet point just above=>upper cell value
            traj_cur_out(kk)=traj_cur(kcur)
            prof_mask1D_cur(kk,bi,bj)=mask_cur(kcur)
          endif
        endif
      enddo

      RETURN
      END