<HTML> <BODY BGCOLOR=#ccccdd LINK=#0000aa VLINK=#0000ff ALINK=#ff0000 ><BASE TARGET="bottom_target"><PRE>
#ifdef A2C
<A NAME='DA_INTERP_LIN_3D'><A href='../../html_code/interpolation/da_interp_lin_3d.inc.html#DA_INTERP_LIN_3D' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>

subroutine da_interp_lin_3d(fm3d, info, fo3d,string) 322,2
#else
<A NAME='DA_INTERP_LIN_3D'><A href='../../html_code/interpolation/da_interp_lin_3d.inc.html#DA_INTERP_LIN_3D' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>

subroutine da_interp_lin_3d(fm3d, info, fo3d) 322,2
#endif

   !-----------------------------------------------------------------------
   ! Purpose: TBD
   !    Updated for Analysis on Arakawa-C grid
   !    Author: Syed RH Rizvi,  MMM/ESSL/NCAR,  Date: 10/22/2008
   !-----------------------------------------------------------------------

   implicit none

   real,            intent(in)    :: fm3d(ims:ime,jms:jme,kms:kme) ! Input variable 
   type(infa_type), intent(in)    :: info       
   real,            intent(inout) :: fo3d(1:info%max_lev,info%n1:info%n2)           ! Output variable 
#ifdef A2C
   character*1, optional, intent(in) :: string
#endif

   integer :: n, k
   real    :: fmz(kms:kme)
#ifdef A2C
   integer :: ii,jj                 
   real    :: dx,dy,dxm,dym         
#endif

   if (trace_use) call da_trace_entry("da_interp_lin_3d")

   fo3d(:,:) = 0.0

   !$OMP PARALLEL DO &amp;
   !$OMP PRIVATE ( n, fmz, k )
   do n=info%n1,info%n2
      fmz(:)=0.0

      do k = kts,kte
#ifdef A2C
        ii =  info%i  (k,n) 
        jj =  info%j  (k,n) 
        dx =  info%dx (k,n) 
        dy =  info%dy (k,n) 
        dxm=  info%dxm(k,n) 
        dym=  info%dym(k,n) 

        if(present(string) .and. string == 'u' ) then
         if( dx &lt;= 0.5 ) then
           dx  = dx + 0.5
           dxm = 1.0 - dx
         else 
          dx  = dx - 0.5
          dxm = 1.0 - dx
           ii = ii + 1
         end if 
        endif
        if(present(string) .and. string == 'v' ) then
         if( dy &lt;= 0.5 ) then
           dy  = dy + 0.5
           dym = 1.0 - dy
         else  
          dy  = dy - 0.5
          dym = 1.0 - dy
          jj = jj + 1
         end if 
        endif
         fmz(k) = dym * (dxm*fm3d(ii,  jj, k) + dx * fm3d(ii+1, jj  , k)) &amp;
                 +dy  * (dxm*fm3d(ii,jj+1, k) + dx * fm3d(ii+1, jj+1, k))
#else
         fmz(k) = &amp;
              info%dym(k,n) * (info%dxm(k,n)*fm3d(info%i(k,n), info%j(k,n), k) &amp;
            + info%dx (k,n) * fm3d(info%i(k,n)+1,info%j(k,n), k)) &amp;
            + info%dy (k,n) * (info%dxm(k,n)*fm3d(info%i(k,n), info%j(k,n)+1, k) &amp;
            + info%dx (k,n) * fm3d(info%i(k,n)+1, info%j(k,n)+1, k))
#endif
      end do
      do k = 1, info%levels(n)
         if (info%k(k,n) &gt; 0) then
            fo3d(k,n) = info%dzm(k,n)*fmz(info%k(k,n)) + info%dz(k,n)*fmz(info%k(k,n)+1)
         end if
      end do
   end do
   !$OMP END PARALLEL DO

   if (trace_use) call da_trace_exit("da_interp_lin_3d")

end subroutine da_interp_lin_3d