!-------------------------------------- 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_interp2 - Interpolation of one rhs * #include "model_macros_f.h"#if defined (NEC) #define ADW_TRITRUNC_LAG3D adw_tritrunc_lag3d_vec #define ADW_TRICUB_LAG3D adw_tricub_lag3d_vec #endif *
subroutine adw_interp2 ( F_out, F_in, F_u, F_v, F_wind_L, 8,12 % F_mono_L, DIST_DIM, Nk,i0,in,j0,jn ) * implicit none * logical F_wind_L, F_mono_L * integer DIST_DIM, Nk, i0,in,j0,jn * real F_out (DIST_SHAPE, Nk), F_in (DIST_SHAPE, Nk) real F_u(*), F_v(*) * *author * alain patoine * *revision * v2_31 - Tanguay M. - correction parameters adw_vder * v3_00 - Desgagne & Lee - Lam configuration * v3_10 - Corbeil & Desgagne & Lee - AIXport+Opti+OpenMP * v3_20 - Gravel & Valin & Tanguay - Lagrange 3D * v3_21 - Desgagne M. - Revision Openmp * v3_30 - McTaggart-Cowan - Add truncated lag3d interpolator * v3_30 - McTaggart-Cowan - Vectorization subroutines *_vec * v3_30 - Tanguay M. - adjust OPENMP for LAM * *object * see id section * *arguments *______________________________________________________________________ * | | | * NAME | DESCRIPTION | I/O | *--------------|-------------------------------------------------|-----| * | | | * F_out | interpolated field | o | * F_in | field to interpolate | i | * F_wind_L | switch: .true. : field to interpolate is a wind | i | * | like quantity | i | * F_mono_L | switch: .true. : monotonic interpolation | i | *______________|_________________________________________________|_____| * *implicits #include "glb_ld.cdk"
#include "adw.cdk"
* ************************************************************************ integer i, j, k, nij, nijk, nijkag, n, dest_ni * real dummy * nij = l_ni *l_nj nijk = l_ni *l_nj *l_nk nijkag = Adw_nit*Adw_njt*l_nk * ************************************************************************ * * Adjust field to advection grid * * Compute extension beyond the pole if appropriate * ************************************************************************ !$omp single if (G_lam) then n=0 dest_ni=l_ni else n=999 dest_ni=G_ni endif * call rpn_comm_xch_halox (F_in, LDIST_DIM, l_ni, l_nj, l_nk, % Adw_halox, Adw_haloy, G_periodx, G_periody, F_u, -Adw_halox+1, % Adw_nic+Adw_halox, -Adw_haloy+1, Adw_njc+Adw_haloy, dest_ni, n) !$omp end single * if (.not.G_lam) then if ( l_south ) then * if ( F_wind_L ) then call adw_pol0
(F_u, 0, Adw_nic,Adw_halox,Adw_njc, % Adw_haloy,l_nk) else call adw_pols
(F_u,Adw_wx_8, 0, Adw_nic,Adw_halox, % Adw_njc,Adw_haloy,l_nk) endif call adw_polx
(F_u,Adw_xg_8,.true.,Adw_nic,Adw_halox, % Adw_njc,Adw_haloy,l_nk) endif * if ( l_north ) then * if ( F_wind_L ) then call adw_pol0
(F_u,Adw_njc+1,Adw_nic,Adw_halox,Adw_njc, % Adw_haloy,l_nk) else call adw_pols
(F_u,Adw_wx_8, Adw_njc+1,Adw_nic,Adw_halox, % Adw_njc,Adw_haloy,l_nk) endif call adw_polx
(F_u,Adw_xg_8,.false.,Adw_nic,Adw_halox, % Adw_njc,Adw_haloy,l_nk) endif endif ************************************************************************ * * Interpolate * ************************************************************************ select case (trim(Adw_interp_type_S)) case ('LAG3D_TRUNC') call ADW_TRITRUNC_LAG3D
( Adw_wrkc, F_u, % Adw_capx1, Adw_capy1, Adw_capz1, % nijk, F_mono_L,i0,in,j0,jn,l_nk) case DEFAULT call ADW_TRICUB_LAG3D
( Adw_wrkc, F_u, % Adw_capx1, Adw_capy1, Adw_capz1, % nijk, F_mono_L,i0,in,j0,jn,l_nk) end select * if (.not.G_lam) then if ( Adw_fro_a .gt. 0 ) then select case (trim(Adw_interp_type_S)) case ('LAG3D_TRUNC') call ADW_TRITRUNC_LAG3D
( Adw_wrka, F_u, % Adw_capx2, Adw_capy2, Adw_capz2, % Adw_fro_a, F_mono_L,1,Adw_fro_a,1,1,1) case DEFAULT call ADW_TRICUB_LAG3D
( Adw_wrka, F_u, % Adw_capx2, Adw_capy2, Adw_capz2, % Adw_fro_a, F_mono_L,1,Adw_fro_a,1,1,1) end select endif * !$omp single call adw_exch_2
( Adw_wrkb, dummy, dummy, % Adw_wrka, dummy, dummy, % Adw_for_n, Adw_for_s, Adw_for_a, % Adw_fro_n, Adw_fro_s, Adw_fro_a, 1) * if ( Adw_for_a .gt. 0 ) % call adw_exch_3
( Adw_wrkc, dummy, Adw_wrkb, dummy, Adw_c1, 1 ) !$omp end single * endif !$omp do do k = 1, l_nk do j = j0,jn do i = i0,in F_out(i,j,k) = Adw_wrkc ( (k-1)*nij+(j-1)*l_ni+i ) enddo enddo enddo !$omp enddo * return end