!-------------------------------------- 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_setint_tl - TLM of adw_setint * #include "model_macros_f.h"*
subroutine adw_setint_tl ( F_n, 5 % F_capx, F_xgg, F_xdd, % F_capy, F_ygg, F_ydd, % F_capz, F_cz, % F_x, F_y, F_z, % F_nm, % F_capxm,F_xggm,F_xddm, % F_capym,F_yggm,F_yddm, % F_capzm,F_czm, % F_xm, F_ym, F_zm, % F_h_L, F_z_L, F_lin_L, F_num,i0,in,j0,jn,kn) * implicit none * integer F_num, F_n(F_num),i0,in,j0,jn,kn * real F_capx(F_num), F_xgg(F_num), F_xdd(F_num) real F_capy(F_num), F_ygg(F_num), F_ydd(F_num) real F_capz(F_num), F_cz (F_num) real F_x (F_num), F_y (F_num), F_z (F_num) * logical F_h_L, F_z_L, F_lin_L * integer F_nm(F_num) real F_capxm(F_num), F_xggm(F_num), F_xddm(F_num) real F_capym(F_num), F_yggm(F_num), F_yddm(F_num) real F_capzm(F_num), F_czm (F_num) real F_xm (F_num), F_ym (F_num), F_zm (F_num) * *author * monique tanguay * *revision * v2_31 - Tanguay M. - initial MPI version * v3_00 - Tanguay M. - adapt to restructured adw_main * v3_11 - Tanguay M. - AIXport+Opti+OpenMP for TLM-ADJ * v3_20 - Tanguay M. - Correction for haloy.gt.2 * *language * fortran 77 * *object * see id section * * *arguments *______________________________________________________________________ * | | | * NAME | DESCRIPTION | I/O | *--------------|-------------------------------------------------|-----| * | | | * F_n | positions in the 3D volume of interpolation | o | * | boxes | | * | | | * F_capx | \ | o | * F_xgg | precomputed displacements and interpolation | o | * F_xdd | / terms along the x-direction | o | * | | | * F_capy | \ | o | * F_ygg | precomputed displacements and interpolation | o | * F_ydd | / terms along the y-direction | o | * | | | * F_capz | \ precomputed displacements and interpolation | o | * F_cz | / terms along the z-direction | o | * | | | * F_x | x coordinate of upstream position | i | * F_y | y coordinate of upstream position | i | * F_z | z coordinate of upstream position | i | * | | | * F_h_L | switch: .true. :compute horizontal parameters | i | * F_z_L | switch: .true. :compute vertical parameters | i | * F_lin_L | switch: .true. :compute interpolation parameters| i | * | only for linear interpolation | | * | | | * F_num | number of points to treat | i | *______________|_________________________________________________|_____| *implicits #include "glb_ld.cdk"
#include "adw.cdk"
* ************************************************************************ integer n, ii, jj, kk, ij, nijag, nij,i, j, k real*8 prd_8, prdt_8 real*8 prdm_8,prdtm_8 * nij = l_ni * l_nj nijag = Adw_nit * Adw_njt ************************************************************************ * !$omp parallel private(n,prd_8,prdm_8,ii,prdt_8,prdtm_8,jj,kk,ij) * if ( F_h_L .and. F_z_L ) then ************************************************************************ if ( F_lin_L ) then !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- prdm_8 = dble(F_xm(n)) ii = ( prdm_8 - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 * ii = max(2,ii) ii = min(ii,G_ni+2*Adw_halox-2) * prdtm_8 = prdm_8 - Adw_bsx_8(ii) if ( prdtm_8 .lt. 0.0 ) then ii = max(2,ii - 1) prdtm_8 = prdm_8 - Adw_bsx_8(ii) endif F_capxm(n) = prdtm_8 * Adw_dix_8(ii) * * TLM * --- prd_8 = dble(F_x(n)) prdt_8 = prd_8 F_capx(n) = prdt_8 * Adw_dix_8(ii) * * TRAJECTORY * ---------- prdm_8 = dble(F_ym(n)) jj = ( prdm_8 - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdtm_8 = prdm_8 - Adw_bsy_8(jj) if ( prdtm_8 .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) prdtm_8 = prdm_8 - Adw_bsy_8(jj) endif F_capym(n) = prdtm_8 * Adw_diy_8(jj) * * TLM * --- prd_8 = dble(F_y(n)) prdt_8 = prd_8 F_capy(n) = prdt_8 * Adw_diy_8(jj) * * TRAJECTORY * ---------- prdm_8 = dble(F_zm(n)) kk = ( prdm_8 - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prdm_8 = prdm_8 - Adw_bsz_8(kk) if ( prdm_8 .lt. 0.0 ) kk = kk - 1 F_capzm(n) = prdm_8 * Adw_diz_8(kk) if ( prdm_8 .lt. 0.0 ) F_capzm(n) = 1.0 + F_capzm(n) ij = (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) F_nm(n) = kk*nijag + ij * * TLM * --- prd_8 = dble(F_z(n)) C prd_8 = prd_8 F_capz(n) = prd_8 * Adw_diz_8(kk) F_n(n) = 0. * enddo enddo enddo !$omp enddo else !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- prdm_8 = dble(F_xm(n)) ii = ( prdm_8 - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 * ii = max(2,ii) ii = min(ii,G_ni+2*Adw_halox-2) * prdtm_8 = prdm_8 - Adw_bsx_8(ii) if ( prdtm_8 .lt. 0.0 ) then ii = max(2,ii - 1) prdtm_8 = prdm_8 - Adw_bsx_8(ii) endif F_capxm(n) = prdtm_8 * Adw_dix_8(ii) * * TLM * --- prd_8 = dble(F_x(n)) prdt_8 = prd_8 F_capx(n) = prdt_8 * Adw_dix_8(ii) * * TRAJECTORY * ---------- prdm_8 = dble(F_ym(n)) jj = ( prdm_8 - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdtm_8 = prdm_8 - Adw_bsy_8(jj) if ( prdtm_8 .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) prdtm_8 = prdm_8 - Adw_bsy_8(jj) endif F_capym(n) = prdtm_8 * Adw_diy_8(jj) * * TLM * --- prd_8 = dble(F_y(n)) prdt_8 = prd_8 F_capy(n) = prdt_8 * Adw_diy_8(jj) * * TRAJECTORY * ---------- prdm_8 = dble(F_zm(n)) kk = ( prdm_8 - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prdm_8 = prdm_8 - Adw_bsz_8(kk) if ( prdm_8 .lt. 0.0 ) kk = kk - 1 F_capzm(n) = prdm_8 * Adw_diz_8(kk) if ( prdm_8 .lt. 0.0 ) F_capzm(n) = 1.0 + F_capzm(n) * F_xggm(n) = Adw_dlx_8(ii-1) * Adw_dix_8(ii) F_xddm(n) = Adw_dlx_8(ii+1) * Adw_dix_8(ii) F_yggm(n) = Adw_dly_8(jj-1) * Adw_diy_8(jj) F_yddm(n) = Adw_dly_8(jj+1) * Adw_diy_8(jj) F_czm (n) = (F_capzm(n)-1.0)*F_capzm(n)*Adw_dbz_8(kk) ij = (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) F_nm(n) = kk*nijag + ij * * TLM * --- prd_8 = dble(F_z(n)) C prd_8 = prd_8 F_capz(n) = prd_8 * Adw_diz_8(kk) F_xgg(n) = 0. F_xdd(n) = 0. F_ygg(n) = 0. F_ydd(n) = 0. F_cz (n) = (F_capzm(n)-1.0)*F_capz (n)*Adw_dbz_8(kk) + % (F_capz (n) )*F_capzm(n)*Adw_dbz_8(kk) F_n(n) = 0. * enddo enddo enddo !$omp enddo endif ************************************************************************ elseif (F_h_L) then ************************************************************************ if ( F_lin_L ) then !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- kk = ( F_nm(n) - (mod ( F_nm(n), nijag ))) / nijag prdm_8 = dble(F_xm(n)) ii = ( prdm_8 - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 * ii = max(2,ii) ii = min(ii,G_ni+2*Adw_halox-2) * prdtm_8 = prdm_8 - Adw_bsx_8(ii) if ( prdtm_8 .lt. 0.0 ) then ii = max(2,ii - 1) prdtm_8 = prdm_8 - Adw_bsx_8(ii) endif F_capxm(n) = prdtm_8 * Adw_dix_8(ii) * * TLM * --- C kk = ( F_n(n) - (mod ( F_n(n), nijag ))) / nijag prd_8 = dble(F_x(n)) prdt_8 = prd_8 F_capx(n) = prdt_8 * Adw_dix_8(ii) * * TRAJECTORY * ---------- prdm_8 = dble(F_ym(n)) jj = ( prdm_8 - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdtm_8 = prdm_8 - Adw_bsy_8(jj) if ( prdtm_8 .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) prdtm_8 = prdm_8 - Adw_bsy_8(jj) endif F_capym(n) = prdtm_8 * Adw_diy_8(jj) ij = (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) F_nm(n) = kk*nijag + ij * * TLM * --- prd_8 = dble(F_y(n)) prdt_8 = prd_8 F_capy(n) = prdt_8 * Adw_diy_8(jj) F_n(n) = 0. * enddo enddo enddo !$omp enddo else !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- kk = ( F_nm(n) - (mod ( F_nm(n), nijag ))) / nijag prdm_8 = dble(F_xm(n)) ii = ( prdm_8 - Adw_x00_8 ) * Adw_ovdx_8 ii = Adw_lcx( ii+1 ) + 1 * ii = max(2,ii) ii = min(ii,G_ni+2*Adw_halox-2) * prdtm_8 = prdm_8 - Adw_bsx_8(ii) if ( prdtm_8 .lt. 0.0 ) then ii = max(2,ii - 1) prdtm_8 = prdm_8 - Adw_bsx_8(ii) endif F_capxm(n) = prdtm_8 * Adw_dix_8(ii) * * TLM * --- C kk = ( F_n(n) - (mod ( F_n(n), nijag ))) / nijag prd_8 = dble(F_x(n)) prdt_8 = prd_8 F_capx(n) = prdt_8 * Adw_dix_8(ii) * * TRAJECTORY * ---------- prdm_8 = dble(F_ym(n)) jj = ( prdm_8 - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdtm_8 = prdm_8 - Adw_bsy_8(jj) if ( prdtm_8 .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) prdtm_8 = prdm_8 - Adw_bsy_8(jj) endif F_capym(n) = prdtm_8 * Adw_diy_8(jj) F_xggm(n) = Adw_dlx_8(ii-1) * Adw_dix_8(ii) F_xddm(n) = Adw_dlx_8(ii+1) * Adw_dix_8(ii) F_yggm(n) = Adw_dly_8(jj-1) * Adw_diy_8(jj) F_yddm(n) = Adw_dly_8(jj+1) * Adw_diy_8(jj) ij = (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) F_nm(n) = kk*nijag + ij * * TLM * --- prd_8 = dble(F_y(n)) prdt_8 = prd_8 F_capy(n) = prdt_8 * Adw_diy_8(jj) F_xgg(n) = 0. F_xdd(n) = 0. F_ygg(n) = 0. F_ydd(n) = 0. F_n(n) = 0. * enddo enddo enddo !$omp enddo endif ************************************************************************ elseif (F_z_L) then ************************************************************************ if ( F_lin_L ) then !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- ij = mod ( F_nm(n), nijag ) prdm_8 = dble(F_zm(n)) kk = ( prdm_8 - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prdm_8 = prdm_8 - Adw_bsz_8(kk) if ( prdm_8 .lt. 0.0 ) kk = kk - 1 F_capzm(n) = prdm_8 * Adw_diz_8(kk) if ( prdm_8 .lt. 0.0 ) F_capzm(n) = 1.0 + F_capzm(n) F_nm(n) = kk*nijag + ij * * TLM * --- prd_8 = dble(F_z(n)) C prd_8 = prd_8 F_capz(n) = prd_8 * Adw_diz_8(kk) F_n(n) = 0. * enddo enddo enddo !$omp enddo else !$omp do do k=1,kn do j=j0,jn do i=i0,in n = (k-1)*nij + ((j-1)*l_ni) + i * * TRAJECTORY * ---------- ij = mod ( F_nm(n), nijag ) prdm_8 = dble(F_zm(n)) kk = ( prdm_8 - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prdm_8 = prdm_8 - Adw_bsz_8(kk) if ( prdm_8 .lt. 0.0 ) kk = kk - 1 F_capzm(n) = prdm_8 * Adw_diz_8(kk) if ( prdm_8 .lt. 0.0 ) F_capzm(n) = 1.0 + F_capzm(n) F_czm(n) = (F_capzm(n)-1.0)*F_capzm(n)*Adw_dbz_8(kk) F_nm(n) = kk*nijag + ij * * TLM * --- prd_8 = dble(F_z(n)) C prd_8 = prd_8 F_capz(n) = prd_8 * Adw_diz_8(kk) F_cz(n) = (F_capzm(n)-1.0)*F_capz (n)*Adw_dbz_8(kk) + % (F_capz (n) )*F_capzm(n)*Adw_dbz_8(kk) F_n(n) = 0. * enddo enddo enddo !$omp enddo endif ************************************************************************ endif !$omp end parallel ************************************************************************ * return end