!-------------------------------------- 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_interp - Interpolation of one rhs * #include "model_macros_f.h"*
subroutine adw_interp ( F_out, F_in, F_u, F_v, 8,11 % F_wind_L, 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_20 - McTaggart-Cowan - Add semi-cubic Lagrangian interpolation * v3_30 - Desgagne - Moved semi-cubic Lag interp to adw_interp2 * *language * fortran 77 * *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 * ************************************************************************ 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) * 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 * ************************************************************************ call adw_vder
( F_v, F_u, Adw_nit, Adw_njt, l_nk ) !2nd deriv for spline call adw_tricub
( Adw_wrkc, F_u, F_v, % Adw_n1, Adw_capx1, Adw_xgg1, % Adw_xdd1, Adw_capy1, Adw_ygg1, % Adw_ydd1, Adw_capz1,Adw_cz1, % nijk, F_mono_L,i0,in,j0,jn,l_nk) * if (.not.G_lam) then if ( Adw_fro_a .gt. 0 ) then call adw_tricub
( Adw_wrka, F_u, F_v, % Adw_n2, Adw_capx2, Adw_xgg2, % Adw_xdd2, Adw_capy2, Adw_ygg2, % Adw_ydd2, Adw_capz2, Adw_cz2, % Adw_fro_a, F_mono_L,1,Adw_fro_a,1,1,1) endif * 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 ) * endif !$omp parallel !$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 !$omp end parallel * return end