!-------------------------------------- LICENCE BEGIN ------------------------------------ !Environment Canada - Atmospheric Science and Technology License/Disclaimer, ! version 3; Last Modified: May 7, 2008. !This is free but copyrighted software; you can use/redistribute/modify it under the terms !of the Environment Canada - Atmospheric Science and Technology License/Disclaimer !version 3 or (at your option) any later version that should be found at: !http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html ! !This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; !without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. !See the above mentioned License/Disclaimer for more details. !You should have received a copy of the License/Disclaimer along with this software; !if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec), !CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca !-------------------------------------- LICENCE END -------------------------------------- ***s/r v4d_irgdint_3_w_ad - ADJ of v4d_irgdint_3_w *subroutine v4d_irgdint_3_w_ad (zo,px,py,npts,ax,ay,cx,cy,zi,ni,j1,j2,nk) 7 * #include "impnone.cdk"
* integer npts,ni,j1,j2,nk real zo(nk,npts),zi(ni,j1:j2,nk), % px(npts),py(npts),ax(ni),ay(j1:j2),cx(ni,6),cy(j1:j2,6) * *author Tanguay M. * *revision * v3_00 - Tanguay M. - initial MPI version * *object * see id section * *Adjoint of *arguments * Name I/O Description *---------------------------------------------------------------- * zo O Interpolated field at positions px,py * px I Position x in INPUT grid * py I Position y in INPUT grid * npts I Number of positions in zo * zi I Field on INPUT grid * ax I X axe of INPUT grid * ay I Y axe of INPUT grid * cx I AX difference on INPUT grid * cy I AY difference on INPUT grid * ni I Dimension x in INPUT grid * j1-j2 I Dimension y in INPUT grid * nk I Dimension z in INPUT grid *---------------------------------------------------------------- * integer i,j,n,k,iplus1,iplus2,imoins1, % tabplus1(ni),tabplus2(ni),tabmoins1(ni) real*8 a12_8,a13_8,a14_8,a22_8,a23_8,a24_8, % a32_8,a33_8,a34_8,a42_8,a43_8,a44_8, % b12_8,b13_8,b14_8 * real*8 x1_8,x2_8,x3_8,x4_8,y1_8,y2_8,y3_8,y4_8, % b1_8,b2_8,b3_8,b4_8,z1_8,z2_8,z3_8,z4_8, % za_8,zb_8,zc_8,wa_8,wb_8,wc_8,wd_8, % x_8,y_8 * real*8, parameter :: ZERO_8 = 0.0 * real ax_ext(0:ni+2) * * Define tables to restaure vectorization * --------------------------------------- do i=1,ni ax_ext(i) = ax(i) enddo ax_ext(0 ) = ax(ni)-360.0 ax_ext(ni+1) = ax( 1)+360.0 ax_ext(ni+2) = ax( 2)+360.0 * do i=1,ni-1 tabplus1(i) = i+1 enddo tabplus1(ni) = 1 * do i=1,ni-2 tabplus2(i) = i+2 enddo tabplus2(ni-1) = 1 tabplus2(ni ) = 2 * do i=2,ni tabmoins1(i) = i-1 enddo tabmoins1(1) = ni * * Interpolation * ------------- do n=npts,1,-1 do k=nk,1,-1 * * ----- * FIXED * ----- i = min(ni, max(1, max(0,ifix(px(n))))) j = min(j2-2,max(j1+1, ifix(py(n)))) * imoins1 = tabmoins1(i) iplus1 = tabplus1 (i) iplus2 = tabplus2 (i) * x1_8=ax_ext(i-1) x2_8=ax_ext(i ) x3_8=ax_ext(i+1) x4_8=ax_ext(i+2) * y1_8=ay(j-1) y2_8=ay(j) y3_8=ay(j+1) y4_8=ay(j+2) * x_8 = x2_8 + (x3_8-x2_8)*(px(n)-i) y_8 = ay(j) + (ay(j+1)-ay(j))*(py(n)-j) * * Adjoint of * interpolation column * -------------------- b12_8 = (y_8-y1_8)*zo(k,n) b13_8 = (y_8-y2_8)*b12_8 b14_8 = (y_8-y3_8)*b13_8 * za_8 = b14_8 * cy(j,4) zb_8 =-za_8 + b13_8 wa_8 = cy(j,1) * cy(j,2) wb_8 = cy(j,5) * cy(j,6) wc_8 = cy(j,3) * cy(j,5) wd_8 = cy(j,2) * cy(j,3) * b1_8 = wa_8 * zb_8 b4_8 = wb_8 * za_8 b2_8 =(wc_8 * za_8 - wd_8 * zb_8) - b1_8 b3_8 =(wd_8 * zb_8 - wc_8 * za_8) - b4_8 * zc_8 = cy(j,1) * b12_8 * b2_8 = zc_8 + b2_8 b1_8 =-zc_8 + b1_8 + zo(k,n) * zo(k,n)= ZERO_8 * * Adjoint of * interpolation row 4 * ------------------- a42_8 = (x_8-x1_8)*b4_8 a43_8 = (x_8-x2_8)*a42_8 a44_8 = (x_8-x3_8)*a43_8 * za_8 = a44_8* cx(i,4) zb_8 =-za_8 + a43_8 wa_8 = cx(i,1) * cx(i,2) wb_8 = cx(i,5) * cx(i,6) wc_8 = cx(i,3) * cx(i,5) wd_8 = cx(i,2) * cx(i,3) * z1_8 = wa_8 * zb_8 z4_8 = wb_8 * za_8 z2_8 =(wc_8 * za_8 - wd_8 * zb_8) - z1_8 z3_8 =(wd_8 * zb_8 - wc_8 * za_8) - z4_8 * zc_8 = cx(i,1) * a42_8 * z2_8 = zc_8 + z2_8 z1_8 =-zc_8 + z1_8 + b4_8 * zi(iplus2 ,j+2,k) = z4_8 + zi(iplus2 ,j+2,k) zi(iplus1 ,j+2,k) = z3_8 + zi(iplus1 ,j+2,k) zi(i ,j+2,k) = z2_8 + zi(i ,j+2,k) zi(imoins1,j+2,k) = z1_8 + zi(imoins1,j+2,k) * * Adjoint of * interpolation row 3 * ------------------- a32_8 = (x_8-x1_8)*b3_8 a33_8 = (x_8-x2_8)*a32_8 a34_8 = (x_8-x3_8)*a33_8 * za_8 = a34_8 * cx(i,4) zb_8 =-za_8 + a33_8 * z1_8 = wa_8 * zb_8 z4_8 = wb_8 * za_8 z2_8 =(wc_8 * za_8 - wd_8 * zb_8) - z1_8 z3_8 =(wd_8 * zb_8 - wc_8 * za_8) - z4_8 * zc_8 = cx(i,1) * a32_8 * z2_8 = zc_8 + z2_8 z1_8 =-zc_8 + z1_8 + b3_8 * zi(iplus2 ,j+1,k) = z4_8 + zi(iplus2 ,j+1,k) zi(iplus1 ,j+1,k) = z3_8 + zi(iplus1 ,j+1,k) zi(i ,j+1,k) = z2_8 + zi(i ,j+1,k) zi(imoins1,j+1,k) = z1_8 + zi(imoins1,j+1,k) * * Adjoint of * interpolation row 2 * ------------------- a22_8 = (x_8-x1_8)*b2_8 a23_8 = (x_8-x2_8)*a22_8 a24_8 = (x_8-x3_8)*a23_8 * za_8 = a24_8 * cx(i,4) zb_8 =-za_8 + a23_8 * z1_8 = wa_8 * zb_8 z4_8 = wb_8 * za_8 z2_8 =(wc_8 * za_8 - wd_8 * zb_8) - z1_8 z3_8 =(wd_8 * zb_8 - wc_8 * za_8) - z4_8 * zc_8 = cx(i,1) * a22_8 * z2_8 = zc_8 + z2_8 z1_8 =-zc_8 + z1_8 + b2_8 * zi(iplus2 ,j,k) = z4_8 + zi(iplus2 ,j,k) zi(iplus1 ,j,k) = z3_8 + zi(iplus1 ,j,k) zi(i ,j,k) = z2_8 + zi(i ,j,k) zi(imoins1,j,k) = z1_8 + zi(imoins1,j,k) * * Adjoint of * interpolation row 1 * ------------------- a12_8 = (x_8-x1_8)*b1_8 a13_8 = (x_8-x2_8)*a12_8 a14_8 = (x_8-x3_8)*a13_8 * za_8 = a14_8 * cx(i,4) zb_8 =-za_8 + a13_8 * z1_8 = wa_8 * zb_8 z4_8 = wb_8 * za_8 z2_8 =(wc_8 * za_8 - wd_8 * zb_8) - z1_8 z3_8 =(wd_8 * zb_8 - wc_8 * za_8) - z4_8 * zc_8 = cx(i,1) * a12_8 * z2_8 = zc_8 + z2_8 z1_8 =-zc_8 + z1_8 + b1_8 * zi(iplus2 ,j-1,k) = z4_8 + zi(iplus2 ,j-1,k) zi(iplus1 ,j-1,k) = z3_8 + zi(iplus1 ,j-1,k) zi(i ,j-1,k) = z2_8 + zi(i ,j-1,k) zi(imoins1,j-1,k) = z1_8 + zi(imoins1,j-1,k) * end do end do * return end