!-------------------------------------- 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 adw_tricub_lag3d_ad - ADJ of adw_tricub_lag3d_tl * #include "model_macros_f.h"*
subroutine adw_tricub_lag3d_ad ( F_out, F_in, F_x, F_y, F_z, 4 % F_inm, F_xm, F_ym, F_zm, % F_num, F_mono_L,i0,in,j0,jn,kn ) * implicit none * logical F_mono_L * integer F_num,i0,in,j0,jn,kn * real F_in(*), F_inm(*) * real F_out (F_num), F_x (F_num), F_y (F_num), F_z (F_num) real F_xm(F_num), F_ym(F_num), F_zm(F_num) * *authors * Monique Tanguay * * (Based on adw_tricub_ad v_3.1.1) * *revision * v3_20 - Tanguay M. - initial version * *object * see id section * *arguments *______________________________________________________________________ * | | | * NAME | DESCRIPTION | I/O | *--------------|-------------------------------------------------|-----| * | | | * F_out | result of interpolation | o | * F_in | field to interpolate | i | * | | | * F_x | interpolation target X coordinate | i | * F_y | interpolation target Y coordinate | i | * F_z | interpolation target Z coordinate | i | * | | | * F_num | number of points to interpolate | i | * | | | * F_mono_L | switch: .true. : monotonic interpolation | i | *______________|_________________________________________________|_____| * *implicits #include "glb_ld.cdk"
#include "adw.cdk"
* ********************************************************************** integer n, nijag,i,j,k,nij,iimax,jjmax,kkmax logical zcubic_L * real prmin, prmax, prminm, prmaxm * real prmin1m, prmax1m,prmin2m, prmax2m real prmin3m, prmax3m,prmin4m, prmax4m real prmin5m, prmax5m,prmin6m, prmax6m real prmin7m, prmax7m,prmin8m, prmax8m * real F_outm * integer o1, o2, o3, o4 * real*8 a1m, a2m, a3m, a4m real*8 b1m, b2m, b3m, b4m real*8 c1m, c2m, c3m, c4m real*8 d1m, d2m, d3m, d4m real*8 p1m, p2m, p3m, p4m * real*8 a1m_z, b1m_z, c1m_z, d1m_z real*8 p1m_y, p2m_y, p3m_y, p4m_y real*8 p1m_z, p2m_z, p3m_z, p4m_z * real*8 a1, a2, a3, a4 real*8 b1, b2, b3, b4 real*8 c1, c2, c3, c4 real*8 d1, d2, d3, d4 real*8 p1, p2, p3, p4 * real*8, parameter :: ZERO_8 = 0.0 * integer ii,jj,kk real *8 triprd,za,zb,zc,zd,rri,rrj,rrk,ra,rb,rc,rd triprd(za,zb,zc,zd)=(za-zb)*(za-zc)*(za-zd) * real *8 triprd_tl,zam,rrim,rrjm,rrkm triprd_tl(za,zam,zb,zc,zd)= %za*(zam-zc)*(zam-zd)+(zam-zb)*za*(zam-zd)+(zam-zb)*(zam-zc)*za * real *8 triprd_ad triprd_ad(za,zam,zb,zc,zd)= %za*(zam-zc)*(zam-zd)+(zam-zb)*za*(zam-zd)+(zam-zb)*(zam-zc)*za * nij = l_ni*l_nj nijag = Adw_nit * Adw_njt * iimax = G_ni+2*Adw_halox-2 jjmax = G_nj+Adw_haloy kkmax = l_nk-1 * * Zero adjoint variables * ---------------------- prmin = ZERO_8 prmax = ZERO_8 * if(F_mono_L) then * do 100 k=1,kn do 90 j=j0,jn do 80 i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * ------------------ * TRAJECTORY (START) * ------------------ rrim= F_xm(n) ii = ( rrim - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 if ( rrim .lt. Adw_bsx_8(ii) ) ii = ii - 1 ii = max(2,min(ii,iimax)) * rrjm= F_ym(n) jj = ( rrjm - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 if ( rrjm .lt. Adw_bsy_8(jj) ) jj = jj - 1 jj = max(Adw_haloy,min(jj,jjmax)) * rrkm= F_zm(n) kk = ( rrkm - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) if ( rrkm .lt. Adw_bsz_8(kk) ) kk = kk - 1 kk = min(kkmax-1,max(0,kk)) * zcubic_L = (kk.gt.0) .and. (kk.lt.kkmax-1) * * ********************************************************************* * x interpolation * ********************************************************************* ra = Adw_bsx_8(ii-1) rb = Adw_bsx_8(ii ) rc = Adw_bsx_8(ii+1) rd = Adw_bsx_8(ii+2) * p1m = triprd(rrim,rb,rc,rd)*Adw_xabcd_8(ii) p2m = triprd(rrim,ra,rc,rd)*Adw_xbacd_8(ii) p3m = triprd(rrim,ra,rb,rd)*Adw_xcabd_8(ii) p4m = triprd(rrim,ra,rb,rc)*Adw_xdabc_8(ii) * o2 = (kk-1)*nijag + (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) o1 = o2-Adw_nit o3 = o2+Adw_nit o4 = o3+Adw_nit * if(zcubic_L) then a1m = p1m * F_inm (o1-1) + p2m * F_inm (o1) + p3m * F_inm (o1+1) + p4m * F_inm (o1+2) a2m = p1m * F_inm (o2-1) + p2m * F_inm (o2) + p3m * F_inm (o2+1) + p4m * F_inm (o2+2) a3m = p1m * F_inm (o3-1) + p2m * F_inm (o3) + p3m * F_inm (o3+1) + p4m * F_inm (o3+2) a4m = p1m * F_inm (o4-1) + p2m * F_inm (o4) + p3m * F_inm (o4+1) + p4m * F_inm (o4+2) endif * o1 = o1 + nijag o2 = o2 + nijag o3 = o3 + nijag o4 = o4 + nijag * prmaxm = F_inm(o2) prmax1m = prmaxm if(F_inm(o2+1).gt.prmax1m) prmaxm = F_inm(o2+1) prmax2m= prmaxm if(F_inm(o3) .gt.prmax2m) prmaxm = F_inm(o3) prmax3m= prmaxm if(F_inm(o3+1).gt.prmax3m) prmaxm = F_inm(o3+1) prmax4m= prmaxm * prminm = F_inm(o2) prmin1m = prminm if(F_inm(o2+1).lt.prmin1m) prminm = F_inm(o2+1) prmin2m = prminm if(F_inm(o3) .lt.prmin2m) prminm = F_inm(o3) prmin3m = prminm if(F_inm(o3+1).lt.prmin3m) prminm = F_inm(o3+1) prmin4m = prminm * b1m = p1m * F_inm (o1-1) + p2m * F_inm (o1) + p3m * F_inm (o1+1) + p4m * F_inm (o1+2) b2m = p1m * F_inm (o2-1) + p2m * F_inm (o2) + p3m * F_inm (o2+1) + p4m * F_inm (o2+2) b3m = p1m * F_inm (o3-1) + p2m * F_inm (o3) + p3m * F_inm (o3+1) + p4m * F_inm (o3+2) b4m = p1m * F_inm (o4-1) + p2m * F_inm (o4) + p3m * F_inm (o4+1) + p4m * F_inm (o4+2) * o1 = o1 + nijag o2 = o2 + nijag o3 = o3 + nijag o4 = o4 + nijag * if(F_inm(o2) .gt.prmax4m) prmaxm = F_inm(o2) prmax5m = prmaxm if(F_inm(o2+1).gt.prmax5m) prmaxm = F_inm(o2+1) prmax6m = prmaxm if(F_inm(o3) .gt.prmax6m) prmaxm = F_inm(o3) prmax7m = prmaxm if(F_inm(o3+1).gt.prmax7m) prmaxm = F_inm(o3+1) prmax8m = prmaxm * if(F_inm(o2) .lt.prmin4m) prminm = F_inm(o2) prmin5m = prminm if(F_inm(o2+1).lt.prmin5m) prminm = F_inm(o2+1) prmin6m = prminm if(F_inm(o3) .lt.prmin6m) prminm = F_inm(o3) prmin7m = prminm if(F_inm(o3+1).lt.prmin7m) prminm = F_inm(o3+1) prmin8m = prminm * c1m = p1m * F_inm (o1-1) + p2m * F_inm (o1) + p3m * F_inm (o1+1) + p4m * F_inm (o1+2) c2m = p1m * F_inm (o2-1) + p2m * F_inm (o2) + p3m * F_inm (o2+1) + p4m * F_inm (o2+2) c3m = p1m * F_inm (o3-1) + p2m * F_inm (o3) + p3m * F_inm (o3+1) + p4m * F_inm (o3+2) c4m = p1m * F_inm (o4-1) + p2m * F_inm (o4) + p3m * F_inm (o4+1) + p4m * F_inm (o4+2) * o1 = o1 + nijag o2 = o2 + nijag o3 = o3 + nijag o4 = o4 + nijag * if(zcubic_L) then d1m = p1m * F_inm (o1-1) + p2m * F_inm (o1) + p3m * F_inm (o1+1) + p4m * F_inm (o1+2) d2m = p1m * F_inm (o2-1) + p2m * F_inm (o2) + p3m * F_inm (o2+1) + p4m * F_inm (o2+2) d3m = p1m * F_inm (o3-1) + p2m * F_inm (o3) + p3m * F_inm (o3+1) + p4m * F_inm (o3+2) d4m = p1m * F_inm (o4-1) + p2m * F_inm (o4) + p3m * F_inm (o4+1) + p4m * F_inm (o4+2) endif * * ********************************************************************* * y interpolation * ********************************************************************* ra = Adw_bsy_8(jj-1) rb = Adw_bsy_8(jj ) rc = Adw_bsy_8(jj+1) rd = Adw_bsy_8(jj+2) * p1m_y = triprd(rrjm,rb,rc,rd)*Adw_yabcd_8(jj) p2m_y = triprd(rrjm,ra,rc,rd)*Adw_ybacd_8(jj) p3m_y = triprd(rrjm,ra,rb,rd)*Adw_ycabd_8(jj) p4m_y = triprd(rrjm,ra,rb,rc)*Adw_ydabc_8(jj) * if(zcubic_L)a1m_z = p1m_y * a1m + p2m_y * a2m + p3m_y * a3m + p4m_y * a4m b1m_z = p1m_y * b1m + p2m_y * b2m + p3m_y * b3m + p4m_y * b4m c1m_z = p1m_y * c1m + p2m_y * c2m + p3m_y * c3m + p4m_y * c4m if(zcubic_L)d1m_z = p1m_y * d1m + p2m_y * d2m + p3m_y * d3m + p4m_y * d4m * ********************************************************************* * z interpolation * ********************************************************************* if(zcubic_L) then ra = Adw_bsz_8(kk-1) rb = Adw_bsz_8(kk ) rc = Adw_bsz_8(kk+1) rd = Adw_bsz_8(kk+2) * p1m_z = triprd(rrkm,rb,rc,rd)*Adw_zabcd_8(kk+1) p2m_z = triprd(rrkm,ra,rc,rd)*Adw_zbacd_8(kk+1) p3m_z = triprd(rrkm,ra,rb,rd)*Adw_zcabd_8(kk+1) p4m_z = triprd(rrkm,ra,rb,rc)*Adw_zdabc_8(kk+1) * F_outm = p1m_z * a1m_z + p2m_z * b1m_z + p3m_z * c1m_z + p4m_z * d1m_z * else * p3m_z = (rrkm-Adw_bsz_8(kk))*Adw_zbc_8(kk+1) p2m_z = 1. - p3m_z * F_outm = p2m_z * b1m_z + p3m_z * c1m_z endif * * ---------------- * TRAJECTORY (END) * ---------------- * * ADJOINT CALCULATIONS * -------------------- * if(F_outm.lt.prmin8m) then prmin = F_out(n) + prmin F_out(n) = ZERO_8 endif if(F_outm.gt.prmax8m) then prmax = F_out(n) + prmax F_out(n) = ZERO_8 endif * * ADJ of ******************************************************************************** * z interpolation ******************************************************************************** if(zcubic_L) then p1 = F_out(n) * a1m_z p2 = F_out(n) * b1m_z p3 = F_out(n) * c1m_z p4 = F_out(n) * d1m_z a1 = p1m_z * F_out(n) b1 = p2m_z * F_out(n) c1 = p3m_z * F_out(n) d1 = p4m_z * F_out(n) * else p2 = F_out(n) * b1m_z p3 = F_out(n) * c1m_z b1 = p2m_z * F_out(n) c1 = p3m_z * F_out(n) endif * F_out(n) = ZERO_8 * if(zcubic_L) then rrk = triprd_ad(p4,rrkm,ra,rb,rc)*Adw_zdabc_8(kk+1) rrk = triprd_ad(p3,rrkm,ra,rb,rd)*Adw_zcabd_8(kk+1) + rrk rrk = triprd_ad(p2,rrkm,ra,rc,rd)*Adw_zbacd_8(kk+1) + rrk rrk = triprd_ad(p1,rrkm,rb,rc,rd)*Adw_zabcd_8(kk+1) + rrk * else p3 = -p2 + p3 rrk = (p3)*Adw_zbc_8(kk+1) endif * * ADJ of ******************************************************************************** * y interpolation ******************************************************************************** if(zcubic_L) then p1 = d1 * d1m + c1 * c1m + b1 * b1m + a1 * a1m p2 = d1 * d2m + c1 * c2m + b1 * b2m + a1 * a2m p3 = d1 * d3m + c1 * c3m + b1 * b3m + a1 * a3m p4 = d1 * d4m + c1 * c4m + b1 * b4m + a1 * a4m * else p1 = c1 * c1m + b1 * b1m p2 = c1 * c2m + b1 * b2m p3 = c1 * c3m + b1 * b3m p4 = c1 * c4m + b1 * b4m endif * if(zcubic_L) then d2 = p2m_y * d1 d3 = p3m_y * d1 d4 = p4m_y * d1 d1 = p1m_y * d1 endif * c2 = p2m_y * c1 c3 = p3m_y * c1 c4 = p4m_y * c1 c1 = p1m_y * c1 * b2 = p2m_y * b1 b3 = p3m_y * b1 b4 = p4m_y * b1 b1 = p1m_y * b1 * if(zcubic_L) then a2 = p2m_y * a1 a3 = p3m_y * a1 a4 = p4m_y * a1 a1 = p1m_y * a1 endif * ra = Adw_bsy_8(jj-1) rb = Adw_bsy_8(jj ) rc = Adw_bsy_8(jj+1) rd = Adw_bsy_8(jj+2) * rrj = triprd_ad(p4,rrjm,ra,rb,rc)*Adw_ydabc_8(jj) rrj = triprd_ad(p3,rrjm,ra,rb,rd)*Adw_ycabd_8(jj) + rrj rrj = triprd_ad(p2,rrjm,ra,rc,rd)*Adw_ybacd_8(jj) + rrj rrj = triprd_ad(p1,rrjm,rb,rc,rd)*Adw_yabcd_8(jj) + rrj * * ADJ of * ********************************************************************* * x interpolation * ********************************************************************* if(zcubic_L) then p1 = F_inm (o4-1) * d4 + F_inm (o3-1) * d3 + F_inm (o2-1) * d2 + F_inm (o1-1) * d1 p2 = F_inm (o4) * d4 + F_inm (o3) * d3 + F_inm (o2) * d2 + F_inm (o1) * d1 p3 = F_inm (o4+1) * d4 + F_inm (o3+1) * d3 + F_inm (o2+1) * d2 + F_inm (o1+1) * d1 p4 = F_inm (o4+2) * d4 + F_inm (o3+2) * d3 + F_inm (o2+2) * d2 + F_inm (o1+2) * d1 * F_in(o4-1) = p1m * d4 + F_in(o4-1) F_in(o4) = p2m * d4 + F_in(o4) F_in(o4+1) = p3m * d4 + F_in(o4+1) F_in(o4+2) = p4m * d4 + F_in(o4+2) * F_in(o3-1) = p1m * d3 + F_in(o3-1) F_in(o3) = p2m * d3 + F_in(o3) F_in(o3+1) = p3m * d3 + F_in(o3+1) F_in(o3+2) = p4m * d3 + F_in(o3+2) * F_in(o2-1) = p1m * d2 + F_in(o2-1) F_in(o2) = p2m * d2 + F_in(o2) F_in(o2+1) = p3m * d2 + F_in(o2+1) F_in(o2+2) = p4m * d2 + F_in(o2+2) * F_in(o1-1) = p1m * d1 + F_in(o1-1) F_in(o1) = p2m * d1 + F_in(o1) F_in(o1+1) = p3m * d1 + F_in(o1+1) F_in(o1+2) = p4m * d1 + F_in(o1+2) else p1 = ZERO_8 p2 = ZERO_8 p3 = ZERO_8 p4 = ZERO_8 endif * o1 = o1 - nijag o2 = o2 - nijag o3 = o3 - nijag o4 = o4 - nijag * p1 = F_inm (o4-1) * c4 + F_inm (o3-1) * c3 + F_inm (o2-1) * c2 + F_inm (o1-1) * c1 + p1 p2 = F_inm (o4) * c4 + F_inm (o3) * c3 + F_inm (o2) * c2 + F_inm (o1) * c1 + p2 p3 = F_inm (o4+1) * c4 + F_inm (o3+1) * c3 + F_inm (o2+1) * c2 + F_inm (o1+1) * c1 + p3 p4 = F_inm (o4+2) * c4 + F_inm (o3+2) * c3 + F_inm (o2+2) * c2 + F_inm (o1+2) * c1 + p4 * F_in(o4-1) = p1m * c4 + F_in(o4-1) F_in(o4) = p2m * c4 + F_in(o4) F_in(o4+1) = p3m * c4 + F_in(o4+1) F_in(o4+2) = p4m * c4 + F_in(o4+2) * F_in(o3-1) = p1m * c3 + F_in(o3-1) F_in(o3) = p2m * c3 + F_in(o3) F_in(o3+1) = p3m * c3 + F_in(o3+1) F_in(o3+2) = p4m * c3 + F_in(o3+2) * F_in(o2-1) = p1m * c2 + F_in(o2-1) F_in(o2) = p2m * c2 + F_in(o2) F_in(o2+1) = p3m * c2 + F_in(o2+1) F_in(o2+2) = p4m * c2 + F_in(o2+2) * F_in(o1-1) = p1m * c1 + F_in(o1-1) F_in(o1) = p2m * c1 + F_in(o1) F_in(o1+1) = p3m * c1 + F_in(o1+1) F_in(o1+2) = p4m * c1 + F_in(o1+2) * if(F_inm(o3+1).lt.prmin7m) then F_in(o3+1) = prmin + F_in(o3+1) prmin = ZERO_8 endif if(F_inm(o3) .lt.prmin6m) then F_in(o3) = prmin + F_in(o3) prmin = ZERO_8 endif if(F_inm(o2+1).lt.prmin5m) then F_in(o2+1) = prmin + F_in(o2+1) prmin = ZERO_8 endif if(F_inm(o2) .lt.prmin4m) then F_in(o2) = prmin + F_in(o2) prmin = ZERO_8 endif * if(F_inm(o3+1).gt.prmax7m) then F_in(o3+1) = prmax + F_in(o3+1) prmax = ZERO_8 endif if(F_inm(o3) .gt.prmax6m) then F_in(o3) = prmax + F_in(o3) prmax = ZERO_8 endif if(F_inm(o2+1).gt.prmax5m) then F_in(o2+1) = prmax + F_in(o2+1) prmax = ZERO_8 endif if(F_inm(o2) .gt.prmax4m) then F_in(o2) = prmax + F_in(o2) prmax = ZERO_8 endif * o1 = o1 - nijag o2 = o2 - nijag o3 = o3 - nijag o4 = o4 - nijag * p1 = F_inm (o4-1) * b4 + F_inm (o3-1) * b3 + F_inm (o2-1) * b2 + F_inm (o1-1) * b1 + p1 p2 = F_inm (o4) * b4 + F_inm (o3) * b3 + F_inm (o2) * b2 + F_inm (o1) * b1 + p2 p3 = F_inm (o4+1) * b4 + F_inm (o3+1) * b3 + F_inm (o2+1) * b2 + F_inm (o1+1) * b1 + p3 p4 = F_inm (o4+2) * b4 + F_inm (o3+2) * b3 + F_inm (o2+2) * b2 + F_inm (o1+2) * b1 + p4 * F_in(o4-1) = p1m * b4 + F_in(o4-1) F_in(o4) = p2m * b4 + F_in(o4) F_in(o4+1) = p3m * b4 + F_in(o4+1) F_in(o4+2) = p4m * b4 + F_in(o4+2) * F_in(o3-1) = p1m * b3 + F_in(o3-1) F_in(o3) = p2m * b3 + F_in(o3) F_in(o3+1) = p3m * b3 + F_in(o3+1) F_in(o3+2) = p4m * b3 + F_in(o3+2) * F_in(o2-1) = p1m * b2 + F_in(o2-1) F_in(o2) = p2m * b2 + F_in(o2) F_in(o2+1) = p3m * b2 + F_in(o2+1) F_in(o2+2) = p4m * b2 + F_in(o2+2) * F_in(o1-1) = p1m * b1 + F_in(o1-1) F_in(o1) = p2m * b1 + F_in(o1) F_in(o1+1) = p3m * b1 + F_in(o1+1) F_in(o1+2) = p4m * b1 + F_in(o1+2) * if(F_inm(o3+1).lt.prmin3m) then F_in(o3+1) = prmin + F_in(o3+1) prmin = ZERO_8 endif if(F_inm(o3) .lt.prmin2m) then F_in(o3) = prmin + F_in(o3) prmin = ZERO_8 endif if(F_inm(o2+1).lt.prmin1m) then F_in(o2+1) = prmin + F_in(o2+1) prmin = ZERO_8 endif F_in(o2) = prmin + F_in(o2) prmin = ZERO_8 * if(F_inm(o3+1).gt.prmax3m) then F_in(o3+1) = prmax + F_in(o3+1) prmax = ZERO_8 endif if(F_inm(o3) .gt.prmax2m) then F_in(o3) = prmax + F_in(o3) prmax = ZERO_8 endif if(F_inm(o2+1).gt.prmax1m) then F_in(o2+1) = prmax + F_in(o2+1) prmax = ZERO_8 endif F_in(o2) = prmax + F_in(o2) prmax = ZERO_8 * o1 = o1 - nijag o2 = o2 - nijag o3 = o3 - nijag o4 = o4 - nijag * if(zcubic_L) then p1 = F_inm (o4-1) * a4 + F_inm (o3-1) * a3 + F_inm (o2-1) * a2 + F_inm (o1-1) * a1 + p1 p2 = F_inm (o4) * a4 + F_inm (o3) * a3 + F_inm (o2) * a2 + F_inm (o1) * a1 + p2 p3 = F_inm (o4+1) * a4 + F_inm (o3+1) * a3 + F_inm (o2+1) * a2 + F_inm (o1+1) * a1 + p3 p4 = F_inm (o4+2) * a4 + F_inm (o3+2) * a3 + F_inm (o2+2) * a2 + F_inm (o1+2) * a1 + p4 * F_in(o4-1) = p1m * a4 + F_in(o4-1) F_in(o4) = p2m * a4 + F_in(o4) F_in(o4+1) = p3m * a4 + F_in(o4+1) F_in(o4+2) = p4m * a4 + F_in(o4+2) * F_in(o3-1) = p1m * a3 + F_in(o3-1) F_in(o3) = p2m * a3 + F_in(o3) F_in(o3+1) = p3m * a3 + F_in(o3+1) F_in(o3+2) = p4m * a3 + F_in(o3+2) * F_in(o2-1) = p1m * a2 + F_in(o2-1) F_in(o2) = p2m * a2 + F_in(o2) F_in(o2+1) = p3m * a2 + F_in(o2+1) F_in(o2+2) = p4m * a2 + F_in(o2+2) * F_in(o1-1) = p1m * a1 + F_in(o1-1) F_in(o1) = p2m * a1 + F_in(o1) F_in(o1+1) = p3m * a1 + F_in(o1+1) F_in(o1+2) = p4m * a1 + F_in(o1+2) endif * ra = Adw_bsx_8(ii-1) rb = Adw_bsx_8(ii ) rc = Adw_bsx_8(ii+1) rd = Adw_bsx_8(ii+2) * rri = triprd_ad(p4,rrim,ra,rb,rc)*Adw_xdabc_8(ii) rri = triprd_ad(p3,rrim,ra,rb,rd)*Adw_xcabd_8(ii) + rri rri = triprd_ad(p2,rrim,ra,rc,rd)*Adw_xbacd_8(ii) + rri rri = triprd_ad(p1,rrim,rb,rc,rd)*Adw_xabcd_8(ii) + rri * F_z(n) = rrk + F_z(n) F_y(n) = rrj + F_y(n) F_x(n) = rri + F_x(n) * 80 continue 90 continue 100 continue * else * do 101 k=1,kn do 91 j=j0,jn do 81 i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * ------------------ * TRAJECTORY (START) * ------------------ rrim= F_xm(n) ii = ( rrim - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 if ( rrim .lt. Adw_bsx_8(ii) ) ii = ii - 1 ii = max(2,min(ii,iimax)) * rrjm= F_ym(n) jj = ( rrjm - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 if ( rrjm .lt. Adw_bsy_8(jj) ) jj = jj - 1 jj = max(Adw_haloy,min(jj,jjmax)) * rrkm= F_zm(n) kk = ( rrkm - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) if ( rrkm .lt. Adw_bsz_8(kk) ) kk = kk - 1 kk = min(kkmax-1,max(0,kk)) * zcubic_L = (kk.gt.0) .and. (kk.lt.kkmax-1) * * ********************************************************************* * x interpolation * ********************************************************************* ra = Adw_bsx_8(ii-1) rb = Adw_bsx_8(ii ) rc = Adw_bsx_8(ii+1) rd = Adw_bsx_8(ii+2) * p1m = triprd(rrim,rb,rc,rd)*Adw_xabcd_8(ii) p2m = triprd(rrim,ra,rc,rd)*Adw_xbacd_8(ii) p3m = triprd(rrim,ra,rb,rd)*Adw_xcabd_8(ii) p4m = triprd(rrim,ra,rb,rc)*Adw_xdabc_8(ii) * o2 = (kk-1)*nijag + (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) o1 = o2-Adw_nit o3 = o2+Adw_nit o4 = o3+Adw_nit * if(zcubic_L) then a1m = p1m * F_inm (o1-1) + p2m * F_inm (o1) + p3m * F_inm (o1+1) + p4m * F_inm (o1+2) a2m = p1m * F_inm (o2-1) + p2m * F_inm (o2) + p3m * F_inm (o2+1) + p4m * F_inm (o2+2) a3m = p1m * F_inm (o3-1) + p2m * F_inm (o3) + p3m * F_inm (o3+1) + p4m * F_inm (o3+2) a4m = p1m * F_inm (o4-1) + p2m * F_inm (o4) + p3m * F_inm (o4+1) + p4m * F_inm (o4+2) endif * o1 = o1 + nijag o2 = o2 + nijag o3 = o3 + nijag o4 = o4 + nijag * b1m = p1m * F_inm (o1-1) + p2m * F_inm (o1) + p3m * F_inm (o1+1) + p4m * F_inm (o1+2) b2m = p1m * F_inm (o2-1) + p2m * F_inm (o2) + p3m * F_inm (o2+1) + p4m * F_inm (o2+2) b3m = p1m * F_inm (o3-1) + p2m * F_inm (o3) + p3m * F_inm (o3+1) + p4m * F_inm (o3+2) b4m = p1m * F_inm (o4-1) + p2m * F_inm (o4) + p3m * F_inm (o4+1) + p4m * F_inm (o4+2) * o1 = o1 + nijag o2 = o2 + nijag o3 = o3 + nijag o4 = o4 + nijag * c1m = p1m * F_inm (o1-1) + p2m * F_inm (o1) + p3m * F_inm (o1+1) + p4m * F_inm (o1+2) c2m = p1m * F_inm (o2-1) + p2m * F_inm (o2) + p3m * F_inm (o2+1) + p4m * F_inm (o2+2) c3m = p1m * F_inm (o3-1) + p2m * F_inm (o3) + p3m * F_inm (o3+1) + p4m * F_inm (o3+2) c4m = p1m * F_inm (o4-1) + p2m * F_inm (o4) + p3m * F_inm (o4+1) + p4m * F_inm (o4+2) * o1 = o1 + nijag o2 = o2 + nijag o3 = o3 + nijag o4 = o4 + nijag * if(zcubic_L) then d1m = p1m * F_inm (o1-1) + p2m * F_inm (o1) + p3m * F_inm (o1+1) + p4m * F_inm (o1+2) d2m = p1m * F_inm (o2-1) + p2m * F_inm (o2) + p3m * F_inm (o2+1) + p4m * F_inm (o2+2) d3m = p1m * F_inm (o3-1) + p2m * F_inm (o3) + p3m * F_inm (o3+1) + p4m * F_inm (o3+2) d4m = p1m * F_inm (o4-1) + p2m * F_inm (o4) + p3m * F_inm (o4+1) + p4m * F_inm (o4+2) endif * * ********************************************************************* * y interpolation * ********************************************************************* ra = Adw_bsy_8(jj-1) rb = Adw_bsy_8(jj ) rc = Adw_bsy_8(jj+1) rd = Adw_bsy_8(jj+2) * p1m_y = triprd(rrjm,rb,rc,rd)*Adw_yabcd_8(jj) p2m_y = triprd(rrjm,ra,rc,rd)*Adw_ybacd_8(jj) p3m_y = triprd(rrjm,ra,rb,rd)*Adw_ycabd_8(jj) p4m_y = triprd(rrjm,ra,rb,rc)*Adw_ydabc_8(jj) * if(zcubic_L)a1m_z = p1m_y * a1m + p2m_y * a2m + p3m_y * a3m + p4m_y * a4m b1m_z = p1m_y * b1m + p2m_y * b2m + p3m_y * b3m + p4m_y * b4m c1m_z = p1m_y * c1m + p2m_y * c2m + p3m_y * c3m + p4m_y * c4m if(zcubic_L)d1m_z = p1m_y * d1m + p2m_y * d2m + p3m_y * d3m + p4m_y * d4m * ********************************************************************* * z interpolation * ********************************************************************* if(zcubic_L) then ra = Adw_bsz_8(kk-1) rb = Adw_bsz_8(kk ) rc = Adw_bsz_8(kk+1) rd = Adw_bsz_8(kk+2) * p1m_z = triprd(rrkm,rb,rc,rd)*Adw_zabcd_8(kk+1) p2m_z = triprd(rrkm,ra,rc,rd)*Adw_zbacd_8(kk+1) p3m_z = triprd(rrkm,ra,rb,rd)*Adw_zcabd_8(kk+1) p4m_z = triprd(rrkm,ra,rb,rc)*Adw_zdabc_8(kk+1) * else * p3m_z = (rrkm-Adw_bsz_8(kk))*Adw_zbc_8(kk+1) p2m_z = 1. - p3m_z * endif * * ---------------- * TRAJECTORY (END) * ---------------- * * ADJOINT CALCULATIONS * -------------------- * * ADJ of ******************************************************************************** * z interpolation ******************************************************************************** if(zcubic_L) then p1 = F_out(n) * a1m_z p2 = F_out(n) * b1m_z p3 = F_out(n) * c1m_z p4 = F_out(n) * d1m_z a1 = p1m_z * F_out(n) b1 = p2m_z * F_out(n) c1 = p3m_z * F_out(n) d1 = p4m_z * F_out(n) * else p2 = F_out(n) * b1m_z p3 = F_out(n) * c1m_z b1 = p2m_z * F_out(n) c1 = p3m_z * F_out(n) endif * F_out(n) = ZERO_8 * if(zcubic_L) then rrk = triprd_ad(p4,rrkm,ra,rb,rc)*Adw_zdabc_8(kk+1) rrk = triprd_ad(p3,rrkm,ra,rb,rd)*Adw_zcabd_8(kk+1) + rrk rrk = triprd_ad(p2,rrkm,ra,rc,rd)*Adw_zbacd_8(kk+1) + rrk rrk = triprd_ad(p1,rrkm,rb,rc,rd)*Adw_zabcd_8(kk+1) + rrk * else p3 = -p2 + p3 rrk = (p3)*Adw_zbc_8(kk+1) endif * * ADJ of ******************************************************************************** * y interpolation ******************************************************************************** if(zcubic_L) then p1 = d1 * d1m + c1 * c1m + b1 * b1m + a1 * a1m p2 = d1 * d2m + c1 * c2m + b1 * b2m + a1 * a2m p3 = d1 * d3m + c1 * c3m + b1 * b3m + a1 * a3m p4 = d1 * d4m + c1 * c4m + b1 * b4m + a1 * a4m * else p1 = c1 * c1m + b1 * b1m p2 = c1 * c2m + b1 * b2m p3 = c1 * c3m + b1 * b3m p4 = c1 * c4m + b1 * b4m endif * if(zcubic_L) then d2 = p2m_y * d1 d3 = p3m_y * d1 d4 = p4m_y * d1 d1 = p1m_y * d1 endif * c2 = p2m_y * c1 c3 = p3m_y * c1 c4 = p4m_y * c1 c1 = p1m_y * c1 * b2 = p2m_y * b1 b3 = p3m_y * b1 b4 = p4m_y * b1 b1 = p1m_y * b1 * if(zcubic_L) then a2 = p2m_y * a1 a3 = p3m_y * a1 a4 = p4m_y * a1 a1 = p1m_y * a1 endif * ra = Adw_bsy_8(jj-1) rb = Adw_bsy_8(jj ) rc = Adw_bsy_8(jj+1) rd = Adw_bsy_8(jj+2) * rrj = triprd_ad(p4,rrjm,ra,rb,rc)*Adw_ydabc_8(jj) rrj = triprd_ad(p3,rrjm,ra,rb,rd)*Adw_ycabd_8(jj) + rrj rrj = triprd_ad(p2,rrjm,ra,rc,rd)*Adw_ybacd_8(jj) + rrj rrj = triprd_ad(p1,rrjm,rb,rc,rd)*Adw_yabcd_8(jj) + rrj * * ADJ of * ********************************************************************* * x interpolation * ********************************************************************* if(zcubic_L) then p1 = F_inm (o4-1) * d4 + F_inm (o3-1) * d3 + F_inm (o2-1) * d2 + F_inm (o1-1) * d1 p2 = F_inm (o4) * d4 + F_inm (o3) * d3 + F_inm (o2) * d2 + F_inm (o1) * d1 p3 = F_inm (o4+1) * d4 + F_inm (o3+1) * d3 + F_inm (o2+1) * d2 + F_inm (o1+1) * d1 p4 = F_inm (o4+2) * d4 + F_inm (o3+2) * d3 + F_inm (o2+2) * d2 + F_inm (o1+2) * d1 * F_in(o4-1) = p1m * d4 + F_in(o4-1) F_in(o4) = p2m * d4 + F_in(o4) F_in(o4+1) = p3m * d4 + F_in(o4+1) F_in(o4+2) = p4m * d4 + F_in(o4+2) * F_in(o3-1) = p1m * d3 + F_in(o3-1) F_in(o3) = p2m * d3 + F_in(o3) F_in(o3+1) = p3m * d3 + F_in(o3+1) F_in(o3+2) = p4m * d3 + F_in(o3+2) * F_in(o2-1) = p1m * d2 + F_in(o2-1) F_in(o2) = p2m * d2 + F_in(o2) F_in(o2+1) = p3m * d2 + F_in(o2+1) F_in(o2+2) = p4m * d2 + F_in(o2+2) * F_in(o1-1) = p1m * d1 + F_in(o1-1) F_in(o1) = p2m * d1 + F_in(o1) F_in(o1+1) = p3m * d1 + F_in(o1+1) F_in(o1+2) = p4m * d1 + F_in(o1+2) else p1 = ZERO_8 p2 = ZERO_8 p3 = ZERO_8 p4 = ZERO_8 endif * o1 = o1 - nijag o2 = o2 - nijag o3 = o3 - nijag o4 = o4 - nijag * p1 = F_inm (o4-1) * c4 + F_inm (o3-1) * c3 + F_inm (o2-1) * c2 + F_inm (o1-1) * c1 + p1 p2 = F_inm (o4) * c4 + F_inm (o3) * c3 + F_inm (o2) * c2 + F_inm (o1) * c1 + p2 p3 = F_inm (o4+1) * c4 + F_inm (o3+1) * c3 + F_inm (o2+1) * c2 + F_inm (o1+1) * c1 + p3 p4 = F_inm (o4+2) * c4 + F_inm (o3+2) * c3 + F_inm (o2+2) * c2 + F_inm (o1+2) * c1 + p4 * F_in(o4-1) = p1m * c4 + F_in(o4-1) F_in(o4) = p2m * c4 + F_in(o4) F_in(o4+1) = p3m * c4 + F_in(o4+1) F_in(o4+2) = p4m * c4 + F_in(o4+2) * F_in(o3-1) = p1m * c3 + F_in(o3-1) F_in(o3) = p2m * c3 + F_in(o3) F_in(o3+1) = p3m * c3 + F_in(o3+1) F_in(o3+2) = p4m * c3 + F_in(o3+2) * F_in(o2-1) = p1m * c2 + F_in(o2-1) F_in(o2) = p2m * c2 + F_in(o2) F_in(o2+1) = p3m * c2 + F_in(o2+1) F_in(o2+2) = p4m * c2 + F_in(o2+2) * F_in(o1-1) = p1m * c1 + F_in(o1-1) F_in(o1) = p2m * c1 + F_in(o1) F_in(o1+1) = p3m * c1 + F_in(o1+1) F_in(o1+2) = p4m * c1 + F_in(o1+2) * o1 = o1 - nijag o2 = o2 - nijag o3 = o3 - nijag o4 = o4 - nijag * p1 = F_inm (o4-1) * b4 + F_inm (o3-1) * b3 + F_inm (o2-1) * b2 + F_inm (o1-1) * b1 + p1 p2 = F_inm (o4) * b4 + F_inm (o3) * b3 + F_inm (o2) * b2 + F_inm (o1) * b1 + p2 p3 = F_inm (o4+1) * b4 + F_inm (o3+1) * b3 + F_inm (o2+1) * b2 + F_inm (o1+1) * b1 + p3 p4 = F_inm (o4+2) * b4 + F_inm (o3+2) * b3 + F_inm (o2+2) * b2 + F_inm (o1+2) * b1 + p4 * F_in(o4-1) = p1m * b4 + F_in(o4-1) F_in(o4) = p2m * b4 + F_in(o4) F_in(o4+1) = p3m * b4 + F_in(o4+1) F_in(o4+2) = p4m * b4 + F_in(o4+2) * F_in(o3-1) = p1m * b3 + F_in(o3-1) F_in(o3) = p2m * b3 + F_in(o3) F_in(o3+1) = p3m * b3 + F_in(o3+1) F_in(o3+2) = p4m * b3 + F_in(o3+2) * F_in(o2-1) = p1m * b2 + F_in(o2-1) F_in(o2) = p2m * b2 + F_in(o2) F_in(o2+1) = p3m * b2 + F_in(o2+1) F_in(o2+2) = p4m * b2 + F_in(o2+2) * F_in(o1-1) = p1m * b1 + F_in(o1-1) F_in(o1) = p2m * b1 + F_in(o1) F_in(o1+1) = p3m * b1 + F_in(o1+1) F_in(o1+2) = p4m * b1 + F_in(o1+2) * o1 = o1 - nijag o2 = o2 - nijag o3 = o3 - nijag o4 = o4 - nijag * if(zcubic_L) then p1 = F_inm (o4-1) * a4 + F_inm (o3-1) * a3 + F_inm (o2-1) * a2 + F_inm (o1-1) * a1 + p1 p2 = F_inm (o4) * a4 + F_inm (o3) * a3 + F_inm (o2) * a2 + F_inm (o1) * a1 + p2 p3 = F_inm (o4+1) * a4 + F_inm (o3+1) * a3 + F_inm (o2+1) * a2 + F_inm (o1+1) * a1 + p3 p4 = F_inm (o4+2) * a4 + F_inm (o3+2) * a3 + F_inm (o2+2) * a2 + F_inm (o1+2) * a1 + p4 * F_in(o4-1) = p1m * a4 + F_in(o4-1) F_in(o4) = p2m * a4 + F_in(o4) F_in(o4+1) = p3m * a4 + F_in(o4+1) F_in(o4+2) = p4m * a4 + F_in(o4+2) * F_in(o3-1) = p1m * a3 + F_in(o3-1) F_in(o3) = p2m * a3 + F_in(o3) F_in(o3+1) = p3m * a3 + F_in(o3+1) F_in(o3+2) = p4m * a3 + F_in(o3+2) * F_in(o2-1) = p1m * a2 + F_in(o2-1) F_in(o2) = p2m * a2 + F_in(o2) F_in(o2+1) = p3m * a2 + F_in(o2+1) F_in(o2+2) = p4m * a2 + F_in(o2+2) * F_in(o1-1) = p1m * a1 + F_in(o1-1) F_in(o1) = p2m * a1 + F_in(o1) F_in(o1+1) = p3m * a1 + F_in(o1+1) F_in(o1+2) = p4m * a1 + F_in(o1+2) endif * ra = Adw_bsx_8(ii-1) rb = Adw_bsx_8(ii ) rc = Adw_bsx_8(ii+1) rd = Adw_bsx_8(ii+2) * rri = triprd_ad(p4,rrim,ra,rb,rc)*Adw_xdabc_8(ii) rri = triprd_ad(p3,rrim,ra,rb,rd)*Adw_xcabd_8(ii) + rri rri = triprd_ad(p2,rrim,ra,rc,rd)*Adw_xbacd_8(ii) + rri rri = triprd_ad(p1,rrim,rb,rc,rd)*Adw_xabcd_8(ii) + rri * F_z(n) = rrk + F_z(n) F_y(n) = rrj + F_y(n) F_x(n) = rri + F_x(n) * 81 continue 91 continue 101 continue * endif * return end