!-------------------------------------- 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 hzd_abc -- Prepares matrices aix,bix,cix,dix,aiy,biy,ciy * #include "model_macros_f.h"*
subroutine hzd_abc (F_aix_8, F_bix_8, F_cix_8, F_dix_8 , 17,2 $ F_aiy_8, F_biy_8, F_ciy_8, F_coef_8, $ F_cy2_8, F_xp0_8, F_xp2_8, F_yp0_8 , $ F_yp2_8, Gni, Gnj, lnjs_nh, lnj, $ ni22s, ni22, PYDIST_DIM, F_gnjv, lnjv) * #include "impnone.cdk"
* integer Gni,Gnj,lnjs_nh,lnj,ni22s,ni22,PYDIST_DIM, $ F_gnjv, lnjv real*8 F_aix_8(*), F_bix_8(*), F_cix_8(*), F_dix_8(*), $ F_aiy_8(*), F_biy_8(*), F_ciy_8(*), F_coef_8, $ F_cy2_8(PYDIST_SHAPE) , F_xp0_8(Gni,3), F_xp2_8(Gni,3), $ F_yp0_8(Gnj,3), F_yp2_8(Gnj,3) * *author * J.P. Toviessi * *revision * v2_00 - Desgagne M. - initial MPI version * v2_10 - J.P. Toviessi - reset V grid operator * v2_10 latitudinal modulation of hor. diffusion * v2_11 - Desgagne M. - remove vertical modulation * v3_00 - Desgagne & Lee - replace geomd.cdk by grd.cdk * v3_10 - Corbeil & Desgagne & Lee - AIXport+Opti+OpenMP * *object * *arguments * Name I/O Description *---------------------------------------------------------------- * F_aix_8 *---------------------------------------------------------------- * *implicit #include "glb_ld.cdk"
#include "hzd.cdk"
#include "grd.cdk"
#include "trp.cdk"
* integer i, j, k, ii, jj real*8 ax_8(lnjs_nh,G_ni), bx_8(lnjs_nh,G_ni), cx_8(lnjs_nh,G_ni), $ ay_8( ni22s,G_nj), by_8(n i22s,G_nj), cy_8( ni22s,G_nj), $ difvx_8(G_ni,l_nj), difvy_8(ni22,G_nj), diy_8 real*8 ZERO_8,ONE_8,HALF_8 parameter ( ZERO_8 = 0.0 , ONE_8 = 1.0 , HALF_8 = 0.5 ) ** * --------------------------------------------------------------- * * Calcul le long de X * !$omp parallel private(jj,ii) if (Hzd_difva_L) then if (Grd_uniform_L) then !$omp do do j = 1, l_nj do i = 1, G_ni difvx_8 (i,j) = 0.0 end do end do !$omp enddo if (l_south) then !$omp do do i = 1, G_ni difvx_8 (i,1) = ONE_8 difvx_8 (i,2) = HALF_8 end do !$omp enddo endif if (l_north) then !$omp do do i = 1, G_ni difvx_8 (i,lnjv) = ONE_8 difvx_8 (i,lnjv-1) = HALF_8 end do !$omp enddo end if else !$omp do do j = 1, l_nj jj = j + l_j0 - 1 do i = 1, G_ni difvx_8 (i,j) = $ ( (G_xg_8(i+1)-G_xg_8(i-1))*(G_yg_8(jj+1)-G_yg_8(jj-1))/ $ ( (G_xg_8(G_ni/2+2)-G_xg_8(G_ni/2)) $ *(G_yg_8(G_nj/2+2)-G_yg_8(G_nj/2)) ) ) **HALF_8 end do end do !$omp enddo endif else !$omp do do j = 1, l_nj do i = 1, G_ni difvx_8 (i,j) = 1.0 end do end do !$omp enddo endif * !$omp do do j = 1, lnjv do i = 1, G_ni ax_8(j,i) = F_xp0_8(i,1) - difvx_8(i,j)* $ F_xp2_8(i,1)*F_coef_8/F_cy2_8(j) bx_8(j,i) = F_xp0_8(i,2) - difvx_8(i,j)* $ F_xp2_8(i,2)*F_coef_8/F_cy2_8(j) cx_8(j,i) = F_xp0_8(i,3) - difvx_8(i,j)* $ F_xp2_8(i,3)*F_coef_8/F_cy2_8(j) enddo enddo !$omp enddo * !$omp do do j = lnjv+1, lnjs_nh do i = 1, G_ni bx_8(j,i)= ONE_8 cx_8(j,i)= ZERO_8 ax_8(j,i)= ZERO_8 enddo enddo !$omp enddo * !$omp single call set_trig21
(F_aix_8,F_bix_8,F_cix_8,F_dix_8, ax_8,bx_8,cx_8, $ lnjs_nh, 1, G_ni, lnjs_nh, .true.) !$omp end single * * Calcul le long de Y * if (Hzd_difva_L) then if (Grd_uniform_L) then !$omp do do i = 1, ni22 do j = 3, G_nj difvy_8 (i,j) = 0.0 end do end do !$omp enddo !$omp do do i = 1, ni22 difvy_8 (i,1) = ONE_8 difvy_8 (i,2) = HALF_8 difvy_8 (i,F_gnjv) = ONE_8 difvy_8 (i,F_gnjv-1) = HALF_8 end do !$omp enddo else !$omp do do i = 1, ni22 ii = i + trp_22n0 - 1 do j = 1, G_nj difvy_8 (i,j) = $ ( (G_xg_8(ii+1)-G_xg_8(ii-1))*(G_yg_8(j+1)-G_yg_8(j-1))/ $ ( (G_xg_8(G_ni/2+2)-G_xg_8(G_ni/2)) $ *(G_yg_8(G_nj/2+2)-G_yg_8(G_nj/2)) ) ) **HALF_8 end do end do !$omp enddo endif else !$omp do do i = 1, ni22 do j = 1, G_nj difvy_8 (i,j) = 1.0 end do end do !$omp enddo endif * !$omp do do i= 1, ni22 do j= 1, F_gnjv ay_8(i,j) = F_yp0_8(j,1) - difvy_8(i,j)* % F_yp2_8(j,1) * F_coef_8 by_8(i,j) = F_yp0_8(j,2) - difvy_8(i,j)* % F_yp2_8(j,2) * F_coef_8 cy_8(i,j) = F_yp0_8(j,3) - difvy_8(i,j)* % F_yp2_8(j,3) * F_coef_8 enddo ay_8(i,1) = ZERO_8 enddo !$omp enddo * !$omp do do i = ni22+1, ni22s do j = 1, F_gnjv by_8(i,j)= ONE_8 cy_8(i,j)= ZERO_8 ay_8(i,j)= ZERO_8 enddo enddo !$omp enddo !$omp end parallel * call set_trig21
(F_aiy_8,F_biy_8,F_ciy_8,diy_8, ay_8,by_8,cy_8, $ ni22s, 1, F_gnjv, ni22s, .false.) * * --------------------------------------------------------------- * return end