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