!-------------------------------------- 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/p adw_trilin_turbo_tl - TLM of adw_trilin_turbo * #include "model_macros_f.h"*
subroutine adw_trilin_turbo_tl ( F_out, F_in, F_dt, F_x, F_y, F_z, 6 % F_outm, F_inm, F_xm,F_ym,F_zm, % F_capxm, F_capym, F_capzm, % Fn_I, F_num,i0,in,j0,jn,kn) * implicit none * integer F_num,i0,in,j0,jn,kn, Fn_I(F_num) * real F_dt, F_in(*), F_inm(*) * real F_out (F_num),F_x (F_num),F_y (F_num),F_z (F_num) real F_outm(F_num),F_xm(F_num),F_ym(F_num),F_zm(F_num) * real F_capxm(F_num),F_capym(F_num),F_capzm(F_num) * *authors * Monique Tanguay * * (Based on adw_trilin_tl v_3.1.1) * *revision * v3_20 - Tanguay M. - initial version * *object * see id section * *arguments *______________________________________________________________________ * | | | * NAME | DESCRIPTION | I/O | *--------------|-------------------------------------------------|-----| * | | | * F_out | F_dt * result of interpolation | o | * F_in | field to interpolate | i | * | | | * F_dt | multiplicative constant (1.0 or timestep lenght)| i | * | | | * F_n | positions in the 3D volume of interpolation | i | * | boxes | | * | | | * F_capx | \ | i | * F_capy | precomputed displacements | i | * F_capz | / along the x,y,z directions | i | * | | | * F_num | number of points to interpolate | i | *______________|_________________________________________________|_____| * *implicits #include "glb_ld.cdk"
#include "adw.cdk"
* ************************************************************************ integer n, n0, nijag, nij, o1, o2, i, j, k, iimax, jjmax, kkmax * integer ii,jj,kk real*8 rri, rrj, rrk,rb, rc real*8 rrim,rrjm,rrkm * real capx, capy, capz, capxm, capym, capzm * real*8 prf1_8, prf2_8, prf3_8, prf4_8, prf1_y_8, prf2_y_8 real*8 prf1m_8,prf2m_8,prf3m_8,prf4m_8,prf1m_y_8,prf2m_y_8 * ------------------------------------------------------------------ * nijag = Adw_nit * Adw_njt nij = l_ni*l_nj * iimax = G_ni+2*Adw_halox-1 jjmax = G_nj+Adw_haloy kkmax = l_nk-1 * !$omp parallel private(n,n0,o1,o2,i,j,k,ii,jj,kk, !$omp& rri, rrj, rrk,rb, rc, rrim,rrjm,rrkm, !$omp& capx, capy, capz, capxm, capym, capzm, !$omp& prf1_8,prf2_8,prf3_8,prf4_8,prf1_y_8,prf2_y_8, !$omp& prf1m_8,prf2m_8,prf3m_8,prf4m_8,prf1m_y_8,prf2m_y_8) !$omp do do 100 k=1,kn do 90 j=j0,jn n0 = (k-1)*nij + ((j-1)*l_ni) * * ------------------ * TRAJECTORY (START) * ------------------ if ( Adw_hor_L ) then do i=i0,in n = n0 + i * 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)) * F_capxm(n) = (rrim-Adw_bsx_8(ii)) *Adw_xbc_8(ii) * 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)) * F_capym(n) = (rrjm-Adw_bsy_8(jj)) *Adw_ybc_8(jj) * kk = ishft(Fn_I(n) , -24) Fn_I(n) = ior( ior(ishft(jj,12) , ii) , ishft( kk , 24) ) * enddo endif if ( Adw_ver_L ) then do i=i0,in n = n0 + i * rrkm= F_zm(n) kk = ( rrkm - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) rrkm = rrkm - Adw_bsz_8(kk) if ( rrkm .lt. 0.0 ) kk = kk - 1 * F_capzm(n) = rrkm * Adw_diz_8(kk) if ( rrkm .lt. 0.0 ) F_capzm(n) = 1.0 + F_capzm(n) * ii = and( Fn_I(n) , 4095 ) jj = and( ishft( Fn_I(n) , -12 ) , 4095 ) Fn_I(n) = ior( ior(ishft(jj,12) , ii) , ishft( kk , 24) ) * enddo endif * ---------------- * TRAJECTORY (END) * ---------------- * do 80 i=i0,in n = n0 + i * * TRAJECTORY * ---------- ii = and( Fn_I(n) , 4095 ) jj = and( ishft( Fn_I(n) , -12 ) , 4095 ) kk = ishft(Fn_I(n) , -24) * * TRAJECTORY * ---------- C rrim= F_xm(n) C rrjm= F_ym(n) C rrkm= F_zm(n) * * TLM * --- rri= F_x(n) rrj= F_y(n) rrk= F_z(n) * * TRAJECTORY * ---------- o1 = (kk)*nijag + (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) o2 = o1 + Adw_nit * ************************************************************************ * x interpolation ************************************************************************ * * TRAJECTORY * ---------- c capxm = (rrim-Adw_bsx_8(ii)) *Adw_xbc_8(ii) capxm = F_capxm(n) * prf1m_8 = (1.0 - capxm) * F_inm(o1) + capxm * F_inm(o1+1) prf2m_8 = (1.0 - capxm) * F_inm(o2) + capxm * F_inm(o2+1) * * TLM * --- capx = rri *Adw_xbc_8(ii) * prf1_8 = (1.0 - capxm) * F_in (o1) + capxm * F_in (o1+1) + % ( F_inm(o1+1) - F_inm(o1))* capx prf2_8 = (1.0 - capxm) * F_in (o2) + capxm * F_in (o2+1) + % ( F_inm(o2+1) - F_inm(o2))* capx * * TRAJECTORY * ---------- o1 = o1 + nijag o2 = o2 + nijag * * TRAJECTORY * ---------- prf3m_8 = (1.0 - capxm) * F_inm(o1) + capxm * F_inm(o1+1) prf4m_8 = (1.0 - capxm) * F_inm(o2) + capxm * F_inm(o2+1) * * TLM * --- prf3_8 = (1.0 - capxm) * F_in (o1) + capxm * F_in (o1+1) + % ( F_inm(o1+1) - F_inm(o1))* capx prf4_8 = (1.0 - capxm) * F_in (o2) + capxm * F_in (o2+1) + % ( F_inm(o2+1) - F_inm(o2))* capx ************************************************************************ * y interpolation ************************************************************************ * TRAJECTORY * ---------- c capym = (rrjm-Adw_bsy_8(jj)) *Adw_ybc_8(jj) capym = F_capym(n) * prf1m_y_8= (1.0 - capym) * prf1m_8 + capym * prf2m_8 prf2m_y_8= (1.0 - capym) * prf3m_8 + capym * prf4m_8 * * TLM * --- capy = rrj *Adw_ybc_8(jj) * prf1_y_8 = (1.0 - capym) * prf1_8 + capym * prf2_8 + % ( prf2m_8 - prf1m_8)* capy prf2_y_8 = (1.0 - capym) * prf3_8 + capym * prf4_8 + % ( prf4m_8 - prf3m_8)* capy ************************************************************************ * z interpolation ************************************************************************ * TRAJECTORY * ---------- capzm = F_capzm(n) * F_outm(n) = ( (1.0 - capzm) * prf1m_y_8 + capzm * prf2m_y_8 ) * F_dt * * TLM * --- capz = rrk * Adw_diz_8(kk) * F_out(n) = ( (1.0 - capzm) * prf1_y_8 + capzm * prf2_y_8 + % (prf2m_y_8 - prf1m_y_8) * capz ) * F_dt * 80 continue 90 continue 100 continue !$omp enddo !$omp end parallel * Adw_hor_L = .false. Adw_ver_L = .false. * return end