!-------------------------------------- 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_delpwr - initialisation et factorisation LU * de l'operateur unidimensionnel. * direction de travail: suivant la latitude. * #include "model_macros_f.h"*
subroutine hzd_delpwr (F_a_8,F_c_8,F_deltai_8,F_pwr, 5,1 $ minx2,maxx2,nx3,nx2,n20,F_opsyp0_8, $ F_opsyp2_8,F_opsypm_8,F_eival_8,F_cdiff) * #include "impnone.cdk"
* integer n20,F_pwr,minx2,maxx2,nx3,nx2 real F_cdiff real*8 F_a_8(1:F_pwr,1:F_pwr,minx2:maxx2,nx3), $ F_c_8(1:F_pwr,1:F_pwr,minx2:maxx2,nx3), $ F_deltai_8(1:F_pwr,1:F_pwr,minx2:maxx2,nx3), $ F_opsypm_8(*),F_opsyp0_8(*),F_opsyp2_8(*),F_eival_8(*) * *Author * Abdessamad Qaddouri * *revision * v2_10 - Qaddouri A. - initial version * v2_31 - Desgagne M. - remove stkmemw * v3_00 - Desgagne & Lee - Lam configuration * *object * *arguments * Name I/O Description *--------------------------------------------------------------------- * a_8 I/0 Sub (block) diagonal part of matrix and LU * c_8 I/0 super (block) part of matrix and LU * F_deltai_8_8 0 diagonal(block) part of LU *--------------------------------------------------------------------- * #include "glb_ld.cdk"
#include "glb_pil.cdk"
** real*8 ZERO_8 parameter( ZERO_8 = 0.0 ) * integer i, j, ii, o1, o2, l_pil_w,l_pil_e real*8 b_8(1:F_pwr,1:F_pwr,minx2:maxx2,nx3) * * __________________________________________________________________ * * The I vector lies on the Y processor so, l_pil_w and l_pil_e will * represent the pilot region along I * l_pil_w=0 l_pil_e=0 if (l_south) l_pil_w= Lam_pil_w if (l_north) l_pil_e= Lam_pil_e do j=1,nx3 do i=minx2, maxx2 do o1=1,F_pwr do o2=1,F_pwr F_a_8(o1,o2,i,j)=ZERO_8 b_8(o1,o2,i,j) =ZERO_8 F_c_8(o1,o2,i,j)=ZERO_8 enddo enddo enddo enddo * * Calcul des matrices * if(F_pwr.eq.1) then * j=1+Lam_pil_s do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 F_c_8(1,1,i,j)= F_opsyp2_8(2*nx3+j) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) $ - dble(F_cdiff)*F_opsyp0_8(nx3+j) enddo * do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 do j=2+Lam_pil_s, nx3-1-Lam_pil_n F_a_8(1,1,i,j)= F_opsyp2_8(2*nx3+j-1) F_c_8(1,1,i,j)= F_opsyp2_8(2*nx3+j) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) $ - dble(F_cdiff)*F_opsyp0_8(nx3+j) enddo enddo * j=nx3-Lam_pil_n do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 F_a_8(1,1,i,j)= F_opsyp2_8(2*nx3+j-1) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) $ - dble(F_cdiff)*F_opsyp0_8(nx3+j) enddo * endif * if (F_pwr.eq.2) then * j=1+Lam_pil_s do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 F_c_8(1,1,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(2,2,i,j)= F_opsyp2_8(2*nx3+j) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,1,i,j)= - F_opsyp0_8(nx3+j) b_8(1,2,i,j)= dble(F_cdiff)*F_opsyp0_8(nx3+j) enddo * do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 do j=2+Lam_pil_s, nx3-1-Lam_pil_n F_a_8(1,1,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(2,2,i,j)= F_opsyp2_8(2*nx3+j-1) F_c_8(1,1,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(2,2,i,j)= F_opsyp2_8(2*nx3+j) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,1,i,j)= - F_opsyp0_8(nx3+j) b_8(1,2,i,j)= dble(F_cdiff)*F_opsyp0_8(nx3+j) enddo enddo * j=nx3-Lam_pil_n do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 F_a_8(1,1,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(2,2,i,j)= F_opsyp2_8(2*nx3+j-1) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,1,i,j)= - F_opsyp0_8(nx3+j) b_8(1,2,i,j)= dble(F_cdiff)*F_opsyp0_8(nx3+j) enddo * endif * if(F_pwr.eq.3) then j=1+Lam_pil_s do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 F_c_8(1,1,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(2,2,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(3,3,i,j)= F_opsyp2_8(2*nx3+j) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(3,3,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(1,3,i,j)= -dble(F_cdiff)*F_opsyp0_8(nx3+j) b_8(2,1,i,j)= -F_opsyp0_8(nx3+j) b_8(3,2,i,j)= -F_opsyp0_8(nx3+j) enddo * do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 do j=2+Lam_pil_s, nx3-1-Lam_pil_n F_a_8(1,1,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(2,2,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(3,3,i,j)= F_opsyp2_8(2*nx3+j-1) F_c_8(1,1,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(2,2,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(3,3,i,j)= F_opsyp2_8(2*nx3+j) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(3,3,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(1,3,i,j)= -dble(F_cdiff)*F_opsyp0_8(nx3+j) b_8(2,1,i,j)= -F_opsyp0_8(nx3+j) b_8(3,2,i,j)= -F_opsyp0_8(nx3+j) enddo enddo * j=nx3-Lam_pil_n do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 F_a_8(1,1,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(2,2,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(3,3,i,j)= F_opsyp2_8(2*nx3+j-1) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(3,3,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(1,3,i,j)= -dble(F_cdiff)*F_opsyp0_8(nx3+j) b_8(2,1,i,j)= -F_opsyp0_8(nx3+j) b_8(3,2,i,j)= -F_opsyp0_8(nx3+j) enddo * endif * if(F_pwr.eq.4) then * j=1+Lam_pil_s do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 F_c_8(1,1,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(2,2,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(3,3,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(4,4,i,j)= F_opsyp2_8(2*nx3+j) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(3,3,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(4,4,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(1,4,i,j)= dble(F_cdiff)*F_opsyp0_8(nx3+j) b_8(2,1,i,j)= - F_opsyp0_8(nx3+j) b_8(3,2,i,j)= - F_opsyp0_8(nx3+j) b_8(4,3,i,j)= - F_opsyp0_8(nx3+j) enddo * do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 do j=2+Lam_pil_s, nx3-1-Lam_pil_n F_a_8(1,1,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(2,2,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(3,3,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(4,4,i,j)= F_opsyp2_8(2*nx3+j-1) F_c_8(1,1,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(2,2,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(3,3,i,j)= F_opsyp2_8(2*nx3+j) F_c_8(4,4,i,j)= F_opsyp2_8(2*nx3+j) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(3,3,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(4,4,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(1,4,i,j)= dble(F_cdiff)*F_opsyp0_8(nx3+j) b_8(2,1,i,j)= - F_opsyp0_8(nx3+j) b_8(3,2,i,j)= - F_opsyp0_8(nx3+j) b_8(4,3,i,j)= - F_opsyp0_8(nx3+j) enddo enddo * j=nx3-Lam_pil_n do i = 1+l_pil_w, nx2-l_pil_e ii = i + n20 - 1 F_a_8(1,1,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(2,2,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(3,3,i,j)= F_opsyp2_8(2*nx3+j-1) F_a_8(4,4,i,j)= F_opsyp2_8(2*nx3+j-1) b_8(1,1,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(2,2,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(3,3,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(4,4,i,j)= F_opsyp2_8(nx3+j) $ + F_eival_8(ii)*F_opsypm_8(nx3+j) b_8(1,4,i,j)= dble(F_cdiff)*F_opsyp0_8(nx3+j) b_8(2,1,i,j)= - F_opsyp0_8(nx3+j) b_8(3,2,i,j)= - F_opsyp0_8(nx3+j) b_8(4,3,i,j)= - F_opsyp0_8(nx3+j) enddo * endif * * Factorisation * call hzd_bfct
(F_a_8,b_8,F_c_8,F_deltai_8,F_pwr,minx2, $ maxx2,nx3, nx2) * do o1=1,F_pwr do o2=1,F_pwr do i= minx2,0+l_pil_w do j=1,nx3 F_deltai_8(o1,o2,i,j)= ZERO_8 enddo enddo enddo enddo * do o1=1,F_pwr do o2=1,F_pwr do i= nx2+1-l_pil_e,maxx2 do j=1,nx3 F_deltai_8(o1,o2,i,j)= ZERO_8 enddo enddo enddo enddo * * __________________________________________________________________ * return end