!-------------------------------------- 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 - sets localization and interpolation parameters * #include "model_macros_f.h"*
subroutine adw_setint ( F_n, 16 % F_capx, F_xgg, F_xdd, % F_capy, F_ygg, F_ydd, % F_capz, F_cz, % F_x, F_y, F_z, % 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 * *author * alain patoine * *revision * v3_00 - Desgagne & Lee - Lam configuration * v3_03 - Lee V. (from IBM) - added min,max on index calcs * v3_10 - Corbeil & Desgagne & Lee - AIXport+Opti+OpenMP * v3_20 - Tanguay M. - Correction for haloy.gt.2 * *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 | *______________|_________________________________________________|_____| * *Notes on computations of positions in the 3D volume of interpolation * boxes for adw_trilin or adw_tricub * * The same algorithm applies to finding the positions in the interpolation * box for each X,Y,Z upstream position. * For example, say a given F_x(i), we try to find "ii" on advection * axis X (Adw_xg_8) where F_x(i) is closest to the gridpoint Adw_xg_8(ii) * and Adw_xg_8(ii) must be less than or equal to F_x(i). * The 3-D positions (ii,jj,kk) are stored in F_n, a folded 3-D array. * *implicits #include "glb_ld.cdk"
#include "adw.cdk"
************************************************************************ integer n, ii, jj, kk, ij, nijag, nij,i, j, k real*8 prd, prdt * ! call tmg_start ( 31, 'adw_setint' ) nij = l_ni * l_nj nijag = Adw_nit * Adw_njt ************************************************************************ !$omp parallel private(n,prd,ii,prdt,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 prd = dble(F_x(n)) ii = ( prd - 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) * prdt = prd - Adw_bsx_8(ii) if ( prdt .lt. 0.0 ) then ii = max(2,ii - 1) prdt = prd - Adw_bsx_8(ii) endif F_capx(n) = prdt * Adw_dix_8(ii) prd = dble(F_y(n)) jj = ( prd - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdt = prd - Adw_bsy_8(jj) if ( prdt .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) prdt = prd - Adw_bsy_8(jj) endif F_capy(n) = prdt * Adw_diy_8(jj) prd = dble(F_z(n)) kk = ( prd - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prd = prd - Adw_bsz_8(kk) if ( prd .lt. 0.0 ) kk = kk - 1 F_capz(n) = prd * Adw_diz_8(kk) if ( prd .lt. 0.0 ) F_capz(n) = 1.0 + F_capz(n) ij = (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) F_n(n) = kk*nijag + ij 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 prd = dble(F_x(n)) ii = ( prd - 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) * prdt = prd - Adw_bsx_8(ii) if ( prdt .lt. 0.0 ) then ii = max(2,ii - 1) prdt = prd - Adw_bsx_8(ii) endif F_capx(n) = prdt * Adw_dix_8(ii) prd = dble(F_y(n)) jj = ( prd - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdt = prd - Adw_bsy_8(jj) if ( prdt .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) prdt = prd - Adw_bsy_8(jj) endif F_capy(n) = prdt * Adw_diy_8(jj) prd = dble(F_z(n)) kk = ( prd - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prd = prd - Adw_bsz_8(kk) if ( prd .lt. 0.0 ) kk = kk - 1 F_capz(n) = prd * Adw_diz_8(kk) if ( prd .lt. 0.0 ) F_capz(n) = 1.0 + F_capz(n) F_xgg(n) = Adw_dlx_8(ii-1) * Adw_dix_8(ii) F_xdd(n) = Adw_dlx_8(ii+1) * Adw_dix_8(ii) F_ygg(n) = Adw_dly_8(jj-1) * Adw_diy_8(jj) F_ydd(n) = Adw_dly_8(jj+1) * Adw_diy_8(jj) F_cz (n) = (F_capz(n)-1.0)*F_capz(n)*Adw_dbz_8(kk) ij = (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) F_n(n) = kk*nijag + ij 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 kk = ( F_n(n) - (mod ( F_n(n), nijag ))) / nijag prd = dble(F_x(n)) ii = ( prd - 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) * prdt = prd - Adw_bsx_8(ii) if ( prdt .lt. 0.0 ) then ii = max(2,ii - 1) prdt = prd - Adw_bsx_8(ii) endif F_capx(n) = prdt * Adw_dix_8(ii) prd = dble(F_y(n)) jj = ( prd - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdt = prd - Adw_bsy_8(jj) if ( prdt .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) prdt = prd - Adw_bsy_8(jj) endif F_capy(n) = prdt * Adw_diy_8(jj) ij = (jj-Adw_int_j_off-1)*Adw_nit + (ii-Adw_int_i_off) F_n(n) = kk*nijag + ij 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 kk = ( F_n(n) - (mod ( F_n(n), nijag ))) / nijag prd = dble(F_x(n)) ii = ( prd - 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) * prdt = prd - Adw_bsx_8(ii) if ( prdt .lt. 0.0 ) then ii = max(2,ii - 1) prdt = prd - Adw_bsx_8(ii) endif F_capx(n) = prdt * Adw_dix_8(ii) prd = dble(F_y(n)) jj = ( prd - Adw_y00_8 ) * Adw_ovdy_8 jj = Adw_lcy( jj+1 ) + 1 * jj = max(Adw_haloy,jj) jj = min(jj,G_nj+Adw_haloy) * prdt = prd - Adw_bsy_8(jj) if ( prdt .lt. 0.0 ) then jj = max(Adw_haloy,jj - 1) prdt = prd - Adw_bsy_8(jj) endif F_capy(n) = prdt * Adw_diy_8(jj) F_xgg(n) = Adw_dlx_8(ii-1) * Adw_dix_8(ii) F_xdd(n) = Adw_dlx_8(ii+1) * Adw_dix_8(ii) F_ygg(n) = Adw_dly_8(jj-1) * Adw_diy_8(jj) F_ydd(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_n(n) = kk*nijag + ij 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 ij = mod ( F_n(n), nijag ) prd = dble(F_z(n)) kk = ( prd - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prd = prd - Adw_bsz_8(kk) if ( prd .lt. 0.0 ) kk = kk - 1 F_capz(n) = prd * Adw_diz_8(kk) if ( prd .lt. 0.0 ) F_capz(n) = 1.0 + F_capz(n) F_n(n) = kk*nijag + ij 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 ij = mod ( F_n(n), nijag ) prd = dble(F_z(n)) kk = ( prd - Adw_z00_8 ) * Adw_ovdz_8 kk = Adw_lcz( kk+1 ) prd = prd - Adw_bsz_8(kk) if ( prd .lt. 0.0 ) kk = kk - 1 F_capz(n) = prd * Adw_diz_8(kk) if ( prd .lt. 0.0 ) F_capz(n) = 1.0 + F_capz(n) F_cz(n) = (F_capz(n)-1.0)*F_capz(n)*Adw_dbz_8(kk) F_n(n) = kk*nijag + ij enddo enddo enddo !$omp enddo endif ************************************************************************ endif !$omp end parallel ************************************************************************ ! call tmg_stop (31) return end