!-------------------------------------- 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 set_poic_par - preparation of projection matrices in the * east-west, C grid model using reflexion symmetry * of grid (global) * #include "model_macros_f.h"*
subroutine set_poic_par ( F_eival_8, F_evvec_8, F_odvec_8, F_xg_8, 1,2 % F_ni, NSTOR ) * #include "impnone.cdk"
* integer F_ni, NSTOR real*8 F_eival_8(F_ni), F_evvec_8(NSTOR,NSTOR) real*8 F_odvec_8(NSTOR,NSTOR), F_xg_8(F_ni) * *author * jean cote - oct 2000 - from set_poic * *revision * v3_01 - Qaddouri & Toviessi - initial version * *object * See above id * *arguments * Name I/O Description *---------------------------------------------------------------- * F_eival_8 O - eigenvalue vector * F_evvec_8 O - even eigenvector matrix * F_odvec_8 O - od eigenvector matrix * F_xg_8 I - scalar grid points * F_ni I - number of points * NSTOR I - storage dimension * *implicits #include "dcst.cdk"
* integer i, j, nev, nod real*8 x0e_8 (NSTOR,NSTOR), x0o_8 (NSTOR,NSTOR), $ d_8 (3*F_ni-1) , r_8 (NSTOR) * real*8 ZERO, HALF, ONE, TWO, FOUR parameter( ZERO = 0.0 , HALF = 0.5, ONE = 1.0, $ TWO = 2.0 , FOUR = 4.0 ) *notes * * NSTOR = (F_ni+2)/2 + ( 1 - mod((F_ni+2)/2,2) ) * to minimize memory bank conflicts * -------------------------------------------------------------------- * * memory allocation at 64 bits * * Prepare even and odd matrices for generalized eigenvalue problems * do i=1,NSTOR do j=1,NSTOR F_evvec_8(i,j) = ZERO F_odvec_8(i,j) = ZERO x0e_8 (i,j) = ZERO x0o_8 (i,j) = ZERO end do end do * nev = ( F_ni + 2 )/2 nod = F_ni - nev * * even operators (upper triangular part only) * do i=1, nev - 1 F_evvec_8(i,i+1) = TWO / ( F_xg_8(i+1) - F_xg_8(i) ) end do x0e_8(1,1) = HALF * ( ( F_xg_8(2) + TWO * Dcst_pi_8 ) - $ F_xg_8(F_ni) ) F_evvec_8(1,1) = - F_evvec_8(1,2) do i=2, nev - 1 x0e_8(i,i) = F_xg_8(i+1) - F_xg_8(i-1) F_evvec_8(i,i) = - ( F_evvec_8(i-1,i) + F_evvec_8(i,i+1) ) end do F_evvec_8(nev,nev) = - F_evvec_8(nev-1,nev) if ( F_ni .eq. 2 * ( F_ni/2 ) ) then x0e_8(nev,nev) = HALF * ( F_xg_8(nev+1) - F_xg_8(nev-1) ) else x0e_8(nev,nev) = F_xg_8(nev+1) - F_xg_8(nev-1) end if * * odd operators (upper triangular part only) * do i=1,nod do j=i,nod F_odvec_8(i,j) = F_evvec_8(1+i,1+j) x0o_8(i,j) = x0e_8(1+i,1+j) end do end do * if ( F_ni .ne. 2 * ( F_ni/2 ) ) then F_odvec_8(nod,nod) = F_odvec_8(nod,nod) - $ FOUR/( F_xg_8(nev+1) - F_xg_8(nev) ) end if * * even modes and eigeivalues * call geneigl
( r_8, F_evvec_8, x0e_8, d_8, -ONE, % 1, nev, NSTOR, 3*F_ni-1 ) do i=1,nev F_eival_8(i) = r_8(i) end do * * odd modes and eigeivalues * call geneigl
( r_8, F_odvec_8, x0o_8, d_8, -ONE, % 1, nod, NSTOR, 3*F_ni-1 ) do i=1,nod F_eival_8(nev+i) = r_8(i) end do * *------------------------------------------------------------------- * return end