diff options
Diffstat (limited to 'tests/lexers/fortran/example.txt')
| -rw-r--r-- | tests/lexers/fortran/example.txt | 7272 |
1 files changed, 7272 insertions, 0 deletions
diff --git a/tests/lexers/fortran/example.txt b/tests/lexers/fortran/example.txt new file mode 100644 index 00000000..b0d04e4e --- /dev/null +++ b/tests/lexers/fortran/example.txt @@ -0,0 +1,7272 @@ +---input--- +!!$ +!!$ +!!$ MD2P4 +!!$ Multilevel Domain Decomposition Parallel Preconditioner Package for PSBLAS +!!$ for +!!$ Parallel Sparse BLAS v2.0 +!!$ (C) Copyright 2006 Salvatore Filippone University of Rome Tor Vergata +!!$ Alfredo Buttari University of Rome Tor Vergata +!!$ Daniela Di Serafino II University of Naples +!!$ Pasqua D'Ambra ICAR-CNR +!!$ +!!$ Redistribution and use in source and binary forms, with or without +!!$ modification, are permitted provided that the following conditions +!!$ are met: +!!$ 1. Redistributions of source code must retain the above copyright +!!$ notice, this list of conditions and the following disclaimer. +!!$ 2. Redistributions in binary form must reproduce the above copyright +!!$ notice, this list of conditions, and the following disclaimer in the +!!$ documentation and/or other materials provided with the distribution. +!!$ 3. The name of the MD2P4 group or the names of its contributors may +!!$ not be used to endorse or promote products derived from this +!!$ software without specific written permission. +!!$ +!!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +!!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +!!$ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +!!$ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MD2P4 GROUP OR ITS CONTRIBUTORS +!!$ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +!!$ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +!!$ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +!!$ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +!!$ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +!!$ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +!!$ POSSIBILITY OF SUCH DAMAGE. +!!$ +!!$ +subroutine psb_zmlprc_aply(alpha,baseprecv,x,beta,y,desc_data,trans,work,info) + ! + ! Compute Y <- beta*Y + alpha*K^-1 X + ! where K is a multilevel preconditioner stored in baseprecv + ! + ! cfr.: Smith, Biorstad & Gropp + ! Domain Decomposition + ! Cambridge Univ. Press + ! + ! To each level I there corresponds a matrix A(I) and a preconditioner K(I) + ! + ! A notational difference: in the DD reference above the preconditioner for + ! a given level K(I) is written out as a sum over the subdomains + ! + ! SUM_k(R_k^T A_k R_k) + ! + ! whereas in this code the sum is implicit in the parallelization, + ! i.e. each process takes care of one subdomain, and for each level we have + ! as many subdomains as there are processes (except for the coarsest level where + ! we might have a replicated index space). Thus the sum apparently disappears + ! from our code, but only apparently, because it is implicit in the call + ! to psb_baseprc_aply. + ! + ! A bit of description of the baseprecv(:) data structure: + ! 1. Number of levels = NLEV = size(baseprecv(:)) + ! 2. baseprecv(ilev)%av(:) sparse matrices needed for the current level. + ! Includes: + ! 2.1.: baseprecv(ilev)%av(l_pr_) L factor of ILU preconditioners + ! 2.2.: baseprecv(ilev)%av(u_pr_) U factor of ILU preconditioners + ! 2.3.: baseprecv(ilev)%av(ap_nd_) Off-diagonal part of A for Jacobi sweeps + ! 2.4.: baseprecv(ilev)%av(ac_) Aggregated matrix of level ILEV + ! 2.5.: baseprecv(ilev)%av(sm_pr_t_) Smoother prolongator transpose; maps vectors + ! (ilev-1) ---> (ilev) + ! 2.6.: baseprecv(ilev)%av(sm_pr_) Smoother prolongator; maps vectors + ! (ilev) ---> (ilev-1) + ! Shouldn't we keep just one of them and handle transpose in the sparse BLAS? maybe + ! + ! 3. baseprecv(ilev)%desc_data comm descriptor for level ILEV + ! 4. baseprecv(ilev)%base_a Pointer (really a pointer!) to the base matrix + ! of the current level, i.e.: if ILEV=1 then A + ! else the aggregated matrix av(ac_); so we have + ! a unified treatment of residuals. Need this to + ! avoid passing explicitly matrix A to the + ! outer prec. routine + ! 5. baseprecv(ilev)%mlia The aggregation map from (ilev-1)-->(ilev) + ! if no smoother, it is used instead of sm_pr_ + ! 6. baseprecv(ilev)%nlaggr Number of aggregates on the various procs. + ! + + use psb_serial_mod + use psb_descriptor_type + use psb_prec_type + use psb_psblas_mod + use psb_penv_mod + use psb_const_mod + use psb_error_mod + use psb_penv_mod + implicit none + + type(psb_desc_type),intent(in) :: desc_data + type(psb_zbaseprc_type), intent(in) :: baseprecv(:) + complex(kind(1.d0)),intent(in) :: alpha,beta + complex(kind(1.d0)),intent(inout) :: x(:), y(:) + character :: trans + complex(kind(1.d0)),target :: work(:) + integer, intent(out) :: info + + + ! Local variables + integer :: n_row,n_col + complex(kind(1.d0)), allocatable :: tx(:),ty(:),t2l(:),w2l(:),& + & x2l(:),b2l(:),tz(:),tty(:) + character ::diagl, diagu + integer :: ictxt,np,me,i, isz, nrg,nr2l,err_act, iptype, int_err(5) + real(kind(1.d0)) :: omega + real(kind(1.d0)) :: t1, t2, t3, t4, t5, t6, t7, mpi_wtime + logical, parameter :: debug=.false., debugprt=.false. + integer :: ismth, nlev, ilev + external mpi_wtime + character(len=20) :: name, ch_err + + type psb_mlprec_wrk_type + complex(kind(1.d0)), pointer :: tx(:)=>null(),ty(:)=>null(),& + & x2l(:)=>null(),y2l(:)=>null(),& + & b2l(:)=>null(),tty(:)=>null() + end type psb_mlprec_wrk_type + type(psb_mlprec_wrk_type), pointer :: mlprec_wrk(:) + + interface psb_baseprc_aply + subroutine psb_zbaseprc_aply(alpha,prec,x,beta,y,desc_data,trans,work,info) + use psb_descriptor_type + use psb_prec_type + type(psb_desc_type),intent(in) :: desc_data + type(psb_zbaseprc_type), intent(in) :: prec + complex(kind(1.d0)),intent(inout) :: x(:), y(:) + complex(kind(1.d0)),intent(in) :: alpha,beta + character(len=1) :: trans + complex(kind(1.d0)),target :: work(:) + integer, intent(out) :: info + end subroutine psb_zbaseprc_aply + end interface + + name='psb_mlprc_aply' + info = 0 + call psb_erractionsave(err_act) + + + ictxt=desc_data%matrix_data(psb_ctxt_) + call psb_info(ictxt, me, np) + + nlev = size(baseprecv) + allocate(mlprec_wrk(nlev),stat=info) + if (info /= 0) then + call psb_errpush(4010,name,a_err='Allocate') + goto 9999 + end if + + + select case(baseprecv(2)%iprcparm(ml_type_)) + + case(no_ml_) + ! Should not really get here. + call psb_errpush(4010,name,a_err='no_ml_ in mlprc_aply?') + goto 9999 + + + case(add_ml_prec_) + + + ! + ! Additive is very simple. + ! 1. X(1) = Xext + ! 2. DO ILEV=2,NLEV + ! X(ILEV) = AV(PR_SM_T_)*X(ILEV-1) + ! 3. Y(ILEV) = (K(ILEV)**(-1))*X(ILEV) + ! 4. DO ILEV=NLEV-1,1,-1 + ! Y(ILEV) = AV(PR_SM_)*Y(ILEV+1) + ! 5. Yext = beta*Yext + Y(1) + ! + ! Note: level numbering reversed wrt ref. DD, i.e. + ! 1..NLEV <=> (j) <-> 0 + + + call psb_baseprc_aply(alpha,baseprecv(1),x,beta,y,& + & baseprecv(1)%base_desc,trans,work,info) + if(info /=0) goto 9999 + allocate(mlprec_wrk(1)%x2l(size(x)),mlprec_wrk(1)%y2l(size(y))) + mlprec_wrk(1)%x2l(:) = x(:) + + + do ilev = 2, nlev + n_row = baseprecv(ilev-1)%base_desc%matrix_data(psb_n_row_) + n_col = baseprecv(ilev-1)%desc_data%matrix_data(psb_n_col_) + nr2l = baseprecv(ilev)%desc_data%matrix_data(psb_n_col_) + nrg = baseprecv(ilev)%desc_data%matrix_data(psb_n_row_) + allocate(mlprec_wrk(ilev)%x2l(nr2l),mlprec_wrk(ilev)%y2l(nr2l),& + & mlprec_wrk(ilev)%tx(max(n_row,n_col)),& + & mlprec_wrk(ilev)%ty(max(n_row,n_col)), stat=info) + if (info /= 0) then + call psb_errpush(4010,name,a_err='Allocate') + goto 9999 + end if + + mlprec_wrk(ilev)%x2l(:) = zzero + mlprec_wrk(ilev)%y2l(:) = zzero + mlprec_wrk(ilev)%tx(1:n_row) = mlprec_wrk(ilev-1)%x2l(1:n_row) + mlprec_wrk(ilev)%tx(n_row+1:max(n_row,n_col)) = zzero + mlprec_wrk(ilev)%ty(:) = zzero + + ismth=baseprecv(ilev)%iprcparm(smth_kind_) + + if (ismth /= no_smth_) then + ! + ! Smoothed aggregation + ! + + + if (baseprecv(ilev)%iprcparm(glb_smth_) >0) then + call psb_halo(mlprec_wrk(ilev-1)%x2l,baseprecv(ilev-1)%base_desc,& + & info,work=work) + if(info /=0) goto 9999 + else + mlprec_wrk(ilev-1)%x2l(n_row+1:max(n_row,n_col)) = zzero + end if + + call psb_csmm(zone,baseprecv(ilev)%av(sm_pr_t_),mlprec_wrk(ilev-1)%x2l,& + & zzero,mlprec_wrk(ilev)%x2l,info) + if(info /=0) goto 9999 + + else + ! + ! Raw aggregation, may take shortcut + ! + do i=1,n_row + mlprec_wrk(ilev)%x2l(baseprecv(ilev)%mlia(i)) = & + & mlprec_wrk(ilev)%x2l(baseprecv(ilev)%mlia(i)) + & + & mlprec_wrk(ilev-1)%x2l(i) + end do + + end if + + if (baseprecv(ilev)%iprcparm(coarse_mat_)==mat_repl_) Then + call psb_sum(ictxt,mlprec_wrk(ilev)%x2l(1:nrg)) + else if (baseprecv(ilev)%iprcparm(coarse_mat_) /= mat_distr_) Then + write(0,*) 'Unknown value for baseprecv(2)%iprcparm(coarse_mat_) ',& + & baseprecv(ilev)%iprcparm(coarse_mat_) + endif + + call psb_baseprc_aply(zone,baseprecv(ilev),& + & mlprec_wrk(ilev)%x2l,zzero,mlprec_wrk(ilev)%y2l,& + & baseprecv(ilev)%desc_data, 'N',work,info) + + enddo + + do ilev =nlev,2,-1 + + ismth=baseprecv(ilev)%iprcparm(smth_kind_) + n_row = baseprecv(ilev-1)%base_desc%matrix_data(psb_n_row_) + n_col = baseprecv(ilev-1)%desc_data%matrix_data(psb_n_col_) + nr2l = baseprecv(ilev)%desc_data%matrix_data(psb_n_col_) + nrg = baseprecv(ilev)%desc_data%matrix_data(psb_n_row_) + + if (ismth /= no_smth_) then + + call psb_csmm(zone,baseprecv(ilev)%av(sm_pr_),mlprec_wrk(ilev)%y2l,& + & zone,mlprec_wrk(ilev-1)%y2l,info) + if(info /=0) goto 9999 + + else + + do i=1, n_row + mlprec_wrk(ilev-1)%y2l(i) = mlprec_wrk(ilev-1)%y2l(i) + & + & mlprec_wrk(ilev)%y2l(baseprecv(ilev)%mlia(i)) + enddo + + end if + end do + + call psb_geaxpby(alpha,mlprec_wrk(1)%y2l,zone,y,baseprecv(1)%base_desc,info) + if(info /=0) goto 9999 + + + case(mult_ml_prec_) + + ! + ! Multiplicative multilevel + ! Pre/post smoothing versions. + ! + + select case(baseprecv(2)%iprcparm(smth_pos_)) + + case(post_smooth_) + + + ! + ! Post smoothing. + ! 1. X(1) = Xext + ! 2. DO ILEV=2, NLEV :: X(ILEV) = AV(PR_SM_T_,ILEV)*X(ILEV-1) + ! 3. Y(NLEV) = (K(NLEV)**(-1))*X(NLEV) + ! 4. DO ILEV=NLEV-1,1,-1 + ! Y(ILEV) = AV(PR_SM_,ILEV+1)*Y(ILEV+1) + ! Y(ILEV) = Y(ILEV) + (K(ILEV)**(-1))*(X(ILEV)-A(ILEV)*Y(ILEV)) + ! + ! 5. Yext = beta*Yext + Y(1) + ! + ! Note: level numbering reversed wrt ref. DD, i.e. + ! 1..NLEV <=> (j) <-> 0 + ! + ! Also: post smoothing is not spelled out in detail in DD. + ! + ! + + + n_col = desc_data%matrix_data(psb_n_col_) + nr2l = baseprecv(1)%desc_data%matrix_data(psb_n_col_) + + allocate(mlprec_wrk(1)%x2l(nr2l),mlprec_wrk(1)%y2l(nr2l), & + & mlprec_wrk(1)%tx(nr2l), stat=info) + mlprec_wrk(1)%x2l(:) = zzero + mlprec_wrk(1)%y2l(:) = zzero + mlprec_wrk(1)%tx(:) = zzero + + call psb_geaxpby(zone,x,zzero,mlprec_wrk(1)%tx,& + & baseprecv(1)%base_desc,info) + call psb_geaxpby(zone,x,zzero,mlprec_wrk(1)%x2l,& + & baseprecv(1)%base_desc,info) + + do ilev=2, nlev + n_row = baseprecv(ilev-1)%base_desc%matrix_data(psb_n_row_) + n_col = baseprecv(ilev-1)%desc_data%matrix_data(psb_n_col_) + nr2l = baseprecv(ilev)%desc_data%matrix_data(psb_n_col_) + nrg = baseprecv(ilev)%desc_data%matrix_data(psb_n_row_) + ismth = baseprecv(ilev)%iprcparm(smth_kind_) + + allocate(mlprec_wrk(ilev)%tx(nr2l),mlprec_wrk(ilev)%y2l(nr2l),& + & mlprec_wrk(ilev)%x2l(nr2l), stat=info) + + if (info /= 0) then + call psb_errpush(4010,name,a_err='Allocate') + goto 9999 + end if + + mlprec_wrk(ilev)%x2l(:) = zzero + mlprec_wrk(ilev)%y2l(:) = zzero + mlprec_wrk(ilev)%tx(:) = zzero + if (ismth /= no_smth_) then + ! + ! Smoothed aggregation + ! + if (baseprecv(ilev)%iprcparm(glb_smth_) >0) then + call psb_halo(mlprec_wrk(ilev-1)%x2l,& + & baseprecv(ilev-1)%base_desc,info,work=work) + if(info /=0) goto 9999 + else + mlprec_wrk(ilev-1)%x2l(n_row+1:max(n_row,n_col)) = zzero + end if + + call psb_csmm(zone,baseprecv(ilev)%av(sm_pr_t_),mlprec_wrk(ilev-1)%x2l, & + & zzero,mlprec_wrk(ilev)%x2l,info) + if(info /=0) goto 9999 + + else + ! + ! Raw aggregation, may take shortcut + ! + do i=1,n_row + mlprec_wrk(ilev)%x2l(baseprecv(ilev)%mlia(i)) = & + & mlprec_wrk(ilev)%x2l(baseprecv(ilev)%mlia(i)) + & + & mlprec_wrk(ilev-1)%x2l(i) + end do + end if + + if (baseprecv(ilev)%iprcparm(coarse_mat_)==mat_repl_) Then + call psb_sum(ictxt,mlprec_wrk(ilev)%x2l(1:nrg)) + else if (baseprecv(ilev)%iprcparm(coarse_mat_) /= mat_distr_) Then + write(0,*) 'Unknown value for baseprecv(2)%iprcparm(coarse_mat_) ',& + & baseprecv(ilev)%iprcparm(coarse_mat_) + endif + call psb_geaxpby(zone,mlprec_wrk(ilev)%x2l,zzero,mlprec_wrk(ilev)%tx,& + & baseprecv(ilev)%base_desc,info) + if(info /=0) goto 9999 + + enddo + + + call psb_baseprc_aply(zone,baseprecv(nlev),mlprec_wrk(nlev)%x2l, & + & zzero, mlprec_wrk(nlev)%y2l,baseprecv(nlev)%desc_data,'N',work,info) + + if(info /=0) goto 9999 + + + do ilev=nlev-1, 1, -1 + ismth = baseprecv(ilev+1)%iprcparm(smth_kind_) + if (ismth /= no_smth_) then + if (ismth == smth_omg_) & + & call psb_halo(mlprec_wrk(ilev+1)%y2l,baseprecv(ilev+1)%desc_data,& + & info,work=work) + call psb_csmm(zone,baseprecv(ilev+1)%av(sm_pr_),mlprec_wrk(ilev+1)%y2l,& + & zzero,mlprec_wrk(ilev)%y2l,info) + if(info /=0) goto 9999 + + else + n_row = baseprecv(ilev)%base_desc%matrix_data(psb_n_row_) + mlprec_wrk(ilev)%y2l(:) = zzero + do i=1, n_row + mlprec_wrk(ilev)%y2l(i) = mlprec_wrk(ilev)%y2l(i) + & + & mlprec_wrk(ilev+1)%y2l(baseprecv(ilev+1)%mlia(i)) + enddo + + end if + + call psb_spmm(-zone,baseprecv(ilev)%base_a,mlprec_wrk(ilev)%y2l,& + & zone,mlprec_wrk(ilev)%tx,baseprecv(ilev)%base_desc,info,work=work) + + if(info /=0) goto 9999 + + call psb_baseprc_aply(zone,baseprecv(ilev),mlprec_wrk(ilev)%tx,& + & zone,mlprec_wrk(ilev)%y2l,baseprecv(ilev)%base_desc, trans, work,info) + + if(info /=0) goto 9999 + + enddo + + call psb_geaxpby(alpha,mlprec_wrk(1)%y2l,beta,y,baseprecv(1)%base_desc,info) + + if(info /=0) goto 9999 + + + case(pre_smooth_) + + + ! + ! Pre smoothing. + ! 1. X(1) = Xext + ! 2. Y(1) = (K(1)**(-1))*X(1) + ! 3. TX(1) = X(1) - A(1)*Y(1) + ! 4. DO ILEV=2, NLEV + ! X(ILEV) = AV(PR_SM_T_,ILEV)*TX(ILEV-1) + ! Y(ILEV) = (K(ILEV)**(-1))*X(ILEV) + ! TX(ILEV) = (X(ILEV)-A(ILEV)*Y(ILEV)) + ! 5. DO ILEV=NLEV-1,1,-1 + ! Y(ILEV) = Y(ILEV) + AV(PR_SM_,ILEV+1)*Y(ILEV+1) + ! 6. Yext = beta*Yext + Y(1) + ! + ! Note: level numbering reversed wrt ref. DD, i.e. + ! 1..NLEV <=> (j) <-> 0 + ! + ! + + n_col = desc_data%matrix_data(psb_n_col_) + nr2l = baseprecv(1)%desc_data%matrix_data(psb_n_col_) + + allocate(mlprec_wrk(1)%x2l(nr2l),mlprec_wrk(1)%y2l(nr2l), & + & mlprec_wrk(1)%tx(nr2l), stat=info) + if (info /= 0) then + call psb_errpush(4010,name,a_err='Allocate') + goto 9999 + end if + + mlprec_wrk(1)%y2l(:) = zzero + + + mlprec_wrk(1)%x2l(:) = x + + call psb_baseprc_aply(zone,baseprecv(1),mlprec_wrk(1)%x2l,& + & zzero,mlprec_wrk(1)%y2l,& + & baseprecv(1)%base_desc,& + & trans,work,info) + + if(info /=0) goto 9999 + + mlprec_wrk(1)%tx = mlprec_wrk(1)%x2l + + call psb_spmm(-zone,baseprecv(1)%base_a,mlprec_wrk(1)%y2l,& + & zone,mlprec_wrk(1)%tx,baseprecv(1)%base_desc,info,work=work) + if(info /=0) goto 9999 + + do ilev = 2, nlev + n_row = baseprecv(ilev-1)%base_desc%matrix_data(psb_n_row_) + n_col = baseprecv(ilev-1)%desc_data%matrix_data(psb_n_col_) + nr2l = baseprecv(ilev)%desc_data%matrix_data(psb_n_col_) + nrg = baseprecv(ilev)%desc_data%matrix_data(psb_n_row_) + ismth = baseprecv(ilev)%iprcparm(smth_kind_) + allocate(mlprec_wrk(ilev)%tx(nr2l),mlprec_wrk(ilev)%y2l(nr2l),& + & mlprec_wrk(ilev)%x2l(nr2l), stat=info) + + + if (info /= 0) then + call psb_errpush(4010,name,a_err='Allocate') + goto 9999 + end if + + mlprec_wrk(ilev)%x2l(:) = zzero + mlprec_wrk(ilev)%y2l(:) = zzero + mlprec_wrk(ilev)%tx(:) = zzero + + + if (ismth /= no_smth_) then + ! + !Smoothed Aggregation + ! + if (baseprecv(ilev)%iprcparm(glb_smth_) >0) then + + call psb_halo(mlprec_wrk(ilev-1)%tx,baseprecv(ilev-1)%base_desc,& + & info,work=work) + if(info /=0) goto 9999 + else + mlprec_wrk(ilev-1)%tx(n_row+1:max(n_row,n_col)) = zzero + end if + + call psb_csmm(zone,baseprecv(ilev)%av(sm_pr_t_),mlprec_wrk(ilev-1)%tx,zzero,& + & mlprec_wrk(ilev)%x2l,info) + if(info /=0) goto 9999 + + else + ! + ! Raw aggregation, may take shortcuts + ! + mlprec_wrk(ilev)%x2l = zzero + do i=1,n_row + mlprec_wrk(ilev)%x2l(baseprecv(ilev)%mlia(i)) = & + & mlprec_wrk(ilev)%x2l(baseprecv(ilev)%mlia(i)) + & + & mlprec_wrk(ilev-1)%tx(i) + end do + end if + + if (baseprecv(ilev)%iprcparm(coarse_mat_)==mat_repl_) then + call psb_sum(ictxt,mlprec_wrk(ilev)%x2l(1:nrg)) + else if (baseprecv(ilev)%iprcparm(coarse_mat_) /= mat_distr_) then + write(0,*) 'Unknown value for baseprecv(2)%iprcparm(coarse_mat_) ',& + & baseprecv(ilev)%iprcparm(coarse_mat_) + endif + + + call psb_baseprc_aply(zone,baseprecv(ilev),mlprec_wrk(ilev)%x2l,& + & zzero,mlprec_wrk(ilev)%y2l,baseprecv(ilev)%desc_data, 'N',work,info) + + if(info /=0) goto 9999 + + if(ilev < nlev) then + mlprec_wrk(ilev)%tx = mlprec_wrk(ilev)%x2l + call psb_spmm(-zone,baseprecv(ilev)%base_a,mlprec_wrk(ilev)%y2l,& + & zone,mlprec_wrk(ilev)%tx,baseprecv(ilev)%base_desc,info,work=work) + if(info /=0) goto 9999 + endif + + enddo + + do ilev = nlev-1, 1, -1 + + ismth=baseprecv(ilev+1)%iprcparm(smth_kind_) + + if (ismth /= no_smth_) then + + if (ismth == smth_omg_) & + & call psb_halo(mlprec_wrk(ilev+1)%y2l,& + & baseprecv(ilev+1)%desc_data,info,work=work) + call psb_csmm(zone,baseprecv(ilev+1)%av(sm_pr_),mlprec_wrk(ilev+1)%y2l,& + & zone,mlprec_wrk(ilev)%y2l,info) + + if(info /=0) goto 9999 + + else + + n_row = baseprecv(ilev+1)%base_desc%matrix_data(psb_n_row_) + do i=1, n_row + mlprec_wrk(ilev)%y2l(i) = mlprec_wrk(ilev)%y2l(i) + & + & mlprec_wrk(ilev+1)%y2l(baseprecv(ilev+1)%mlia(i)) + enddo + + end if + + enddo + + call psb_geaxpby(alpha,mlprec_wrk(1)%y2l,beta,y,& + & baseprecv(1)%base_desc,info) + + if(info /=0) goto 9999 + + + + case(smooth_both_) + + ! + ! Symmetrized smoothing. + ! 1. X(1) = Xext + ! 2. Y(1) = (K(1)**(-1))*X(1) + ! 3. TX(1) = X(1) - A(1)*Y(1) + ! 4. DO ILEV=2, NLEV + ! X(ILEV) = AV(PR_SM_T_,ILEV)*TX(ILEV-1) + ! Y(ILEV) = (K(ILEV)**(-1))*X(ILEV) + ! TX(ILEV) = (X(ILEV)-A(ILEV)*Y(ILEV)) + ! 5. DO ILEV=NLEV-1,1,-1 + ! Y(ILEV) = Y(ILEV) + AV(PR_SM_,ILEV+1)*Y(ILEV+1) + ! Y(ILEV) = Y(ILEV) + (K(ILEV)**(-1))*(X(ILEV)-A(ILEV)*Y(ILEV)) + ! 6. Yext = beta*Yext + Y(1) + ! + ! Note: level numbering reversed wrt ref. DD, i.e. + ! 1..NLEV <=> (j) <-> 0 + ! + ! + n_col = desc_data%matrix_data(psb_n_col_) + nr2l = baseprecv(1)%desc_data%matrix_data(psb_n_col_) + + allocate(mlprec_wrk(1)%x2l(nr2l),mlprec_wrk(1)%y2l(nr2l), & + & mlprec_wrk(1)%ty(nr2l), mlprec_wrk(1)%tx(nr2l), stat=info) + + mlprec_wrk(1)%x2l(:) = zzero + mlprec_wrk(1)%y2l(:) = zzero + mlprec_wrk(1)%tx(:) = zzero + mlprec_wrk(1)%ty(:) = zzero + + + if (info /= 0) then + call psb_errpush(4010,name,a_err='Allocate') + goto 9999 + end if + + call psb_geaxpby(zone,x,zzero,mlprec_wrk(1)%x2l,& + & baseprecv(1)%base_desc,info) + call psb_geaxpby(zone,x,zzero,mlprec_wrk(1)%tx,& + & baseprecv(1)%base_desc,info) + + call psb_baseprc_aply(zone,baseprecv(1),mlprec_wrk(1)%x2l,& + & zzero,mlprec_wrk(1)%y2l,& + & baseprecv(1)%base_desc,& + & trans,work,info) + + if(info /=0) goto 9999 + + mlprec_wrk(1)%ty = mlprec_wrk(1)%x2l + + call psb_spmm(-zone,baseprecv(1)%base_a,mlprec_wrk(1)%y2l,& + & zone,mlprec_wrk(1)%ty,baseprecv(1)%base_desc,info,work=work) + if(info /=0) goto 9999 + + do ilev = 2, nlev + n_row = baseprecv(ilev-1)%base_desc%matrix_data(psb_n_row_) + n_col = baseprecv(ilev-1)%desc_data%matrix_data(psb_n_col_) + nr2l = baseprecv(ilev)%desc_data%matrix_data(psb_n_col_) + nrg = baseprecv(ilev)%desc_data%matrix_data(psb_n_row_) + ismth=baseprecv(ilev)%iprcparm(smth_kind_) + allocate(mlprec_wrk(ilev)%ty(nr2l),mlprec_wrk(ilev)%y2l(nr2l),& + & mlprec_wrk(ilev)%x2l(nr2l), stat=info) + + mlprec_wrk(ilev)%x2l(:) = zzero + mlprec_wrk(ilev)%y2l(:) = zzero + mlprec_wrk(ilev)%tx(:) = zzero + mlprec_wrk(ilev)%ty(:) = zzero + + + if (info /= 0) then + call psb_errpush(4010,name,a_err='Allocate') + goto 9999 + end if + + + if (ismth /= no_smth_) then + ! + !Smoothed Aggregation + ! + if (baseprecv(ilev)%iprcparm(glb_smth_) >0) then + + call psb_halo(mlprec_wrk(ilev-1)%ty,baseprecv(ilev-1)%base_desc,& + & info,work=work) + if(info /=0) goto 9999 + else + mlprec_wrk(ilev-1)%ty(n_row+1:max(n_row,n_col)) = zzero + end if + + call psb_csmm(zone,baseprecv(ilev)%av(sm_pr_t_),mlprec_wrk(ilev-1)%ty,zzero,& + & mlprec_wrk(ilev)%x2l,info) + if(info /=0) goto 9999 + + else + ! + ! Raw aggregation, may take shortcuts + ! + mlprec_wrk(ilev)%x2l = zzero + do i=1,n_row + mlprec_wrk(ilev)%x2l(baseprecv(ilev)%mlia(i)) = & + & mlprec_wrk(ilev)%x2l(baseprecv(ilev)%mlia(i)) + & + & mlprec_wrk(ilev-1)%ty(i) + end do + end if + + if (baseprecv(ilev)%iprcparm(coarse_mat_)==mat_repl_) then + call psb_sum(ictxt,mlprec_wrk(ilev)%x2l(1:nrg)) + else if (baseprecv(ilev)%iprcparm(coarse_mat_) /= mat_distr_) then + write(0,*) 'Unknown value for baseprecv(2)%iprcparm(coarse_mat_) ',& + & baseprecv(ilev)%iprcparm(coarse_mat_) + endif + + call psb_geaxpby(zone,mlprec_wrk(ilev)%x2l,zzero,mlprec_wrk(ilev)%tx,& + & baseprecv(ilev)%base_desc,info) + if(info /=0) goto 9999 + + call psb_baseprc_aply(zone,baseprecv(ilev),mlprec_wrk(ilev)%x2l,& + & zzero,mlprec_wrk(ilev)%y2l,baseprecv(ilev)%desc_data, 'N',work,info) + + if(info /=0) goto 9999 + + if(ilev < nlev) then + mlprec_wrk(ilev)%ty = mlprec_wrk(ilev)%x2l + call psb_spmm(-zone,baseprecv(ilev)%base_a,mlprec_wrk(ilev)%y2l,& + & zone,mlprec_wrk(ilev)%ty,baseprecv(ilev)%base_desc,info,work=work) + if(info /=0) goto 9999 + endif + + enddo + + + do ilev=nlev-1, 1, -1 + + ismth=baseprecv(ilev+1)%iprcparm(smth_kind_) + if (ismth /= no_smth_) then + if (ismth == smth_omg_) & + & call psb_halo(mlprec_wrk(ilev+1)%y2l,baseprecv(ilev+1)%desc_data,& + & info,work=work) + call psb_csmm(zone,baseprecv(ilev+1)%av(sm_pr_),mlprec_wrk(ilev+1)%y2l,& + & zone,mlprec_wrk(ilev)%y2l,info) + if(info /=0) goto 9999 + + else + n_row = baseprecv(ilev)%base_desc%matrix_data(psb_n_row_) + do i=1, n_row + mlprec_wrk(ilev)%y2l(i) = mlprec_wrk(ilev)%y2l(i) + & + & mlprec_wrk(ilev+1)%y2l(baseprecv(ilev+1)%mlia(i)) + enddo + + end if + + call psb_spmm(-zone,baseprecv(ilev)%base_a,mlprec_wrk(ilev)%y2l,& + & zone,mlprec_wrk(ilev)%tx,baseprecv(ilev)%base_desc,info,work=work) + + if(info /=0) goto 9999 + + call psb_baseprc_aply(zone,baseprecv(ilev),mlprec_wrk(ilev)%tx,& + & zone,mlprec_wrk(ilev)%y2l,baseprecv(ilev)%base_desc, trans, work,info) + + if(info /=0) goto 9999 + + enddo + + call psb_geaxpby(alpha,mlprec_wrk(1)%y2l,beta,y,& + & baseprecv(1)%base_desc,info) + + if(info /=0) goto 9999 + + + case default + + call psb_errpush(4013,name,a_err='wrong smooth_pos',& + & i_Err=(/baseprecv(2)%iprcparm(smth_pos_),0,0,0,0/)) + goto 9999 + + end select + + case default + call psb_errpush(4013,name,a_err='wrong mltype',& + & i_Err=(/baseprecv(2)%iprcparm(ml_type_),0,0,0,0/)) + goto 9999 + + end select + + + call mlprec_wrk_free(mlprec_wrk) + deallocate(mlprec_wrk) + + call psb_erractionrestore(err_act) + return + +9999 continue + call psb_errpush(info,name) + call psb_erractionrestore(err_act) + if (err_act.eq.act_abort) then + call psb_error() + return + end if + return + +contains + subroutine mlprec_wrk_free(wrk) + type(psb_mlprec_wrk_type) :: wrk(:) + ! This will not be needed when we have allocatables, as + ! it is sufficient to deallocate the container, and + ! the compiler is supposed to recursively deallocate the + ! various components. + integer i + + do i=1, size(wrk) + if (associated(wrk(i)%tx)) deallocate(wrk(i)%tx) + if (associated(wrk(i)%ty)) deallocate(wrk(i)%ty) + if (associated(wrk(i)%x2l)) deallocate(wrk(i)%x2l) + if (associated(wrk(i)%y2l)) deallocate(wrk(i)%y2l) + if (associated(wrk(i)%b2l)) deallocate(wrk(i)%b2l) + if (associated(wrk(i)%tty)) deallocate(wrk(i)%tty) + end do + end subroutine mlprec_wrk_free + +end subroutine psb_zmlprc_aply + + +---tokens--- +'!!$\n' Comment + +'!!$\n' Comment + +'!!$ MD2P4\n' Comment + +'!!$ Multilevel Domain Decomposition Parallel Preconditioner Package for PSBLAS\n' Comment + +'!!$ for\n' Comment + +'!!$ Parallel Sparse BLAS v2.0\n' Comment + +'!!$ (C) Copyright 2006 Salvatore Filippone University of Rome Tor Vergata\n' Comment + +'!!$ Alfredo Buttari University of Rome Tor Vergata\n' Comment + +'!!$ Daniela Di Serafino II University of Naples\n' Comment + +"!!$ Pasqua D'Ambra ICAR-CNR\n" Comment + +'!!$\n' Comment + +'!!$ Redistribution and use in source and binary forms, with or without\n' Comment + +'!!$ modification, are permitted provided that the following conditions\n' Comment + +'!!$ are met:\n' Comment + +'!!$ 1. Redistributions of source code must retain the above copyright\n' Comment + +'!!$ notice, this list of conditions and the following disclaimer.\n' Comment + +'!!$ 2. Redistributions in binary form must reproduce the above copyright\n' Comment + +'!!$ notice, this list of conditions, and the following disclaimer in the\n' Comment + +'!!$ documentation and/or other materials provided with the distribution.\n' Comment + +'!!$ 3. The name of the MD2P4 group or the names of its contributors may\n' Comment + +'!!$ not be used to endorse or promote products derived from this\n' Comment + +'!!$ software without specific written permission.\n' Comment + +'!!$\n' Comment + +'!!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n' Comment + +"!!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n" Comment + +'!!$ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n' Comment + +'!!$ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MD2P4 GROUP OR ITS CONTRIBUTORS\n' Comment + +'!!$ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n' Comment + +'!!$ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n' Comment + +'!!$ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n' Comment + +'!!$ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n' Comment + +'!!$ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n' Comment + +'!!$ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n' Comment + +'!!$ POSSIBILITY OF SUCH DAMAGE.\n' Comment + +'!!$\n' Comment + +'!!$\n' Comment + +'subroutine ' Keyword +'psb_zmlprc_aply' Name +'(' Punctuation +'alpha' Name +',' Punctuation +'baseprecv' Name +',' Punctuation +'x' Name +',' Punctuation +'beta' Name +',' Punctuation +'y' Name +',' Punctuation +'desc_data' Name +',' Punctuation +'trans' Name +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'!\n' Comment + +' ' Text +'! Compute Y <- beta*Y + alpha*K^-1 X\n' Comment + +' ' Text +'! where K is a multilevel preconditioner stored in baseprecv\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! cfr.: Smith, Biorstad & Gropp\n' Comment + +' ' Text +'! Domain Decomposition\n' Comment + +' ' Text +'! Cambridge Univ. Press\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! To each level I there corresponds a matrix A(I) and a preconditioner K(I)\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! A notational difference: in the DD reference above the preconditioner for\n' Comment + +' ' Text +'! a given level K(I) is written out as a sum over the subdomains\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! SUM_k(R_k^T A_k R_k)\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! whereas in this code the sum is implicit in the parallelization,\n' Comment + +' ' Text +'! i.e. each process takes care of one subdomain, and for each level we have\n' Comment + +' ' Text +'! as many subdomains as there are processes (except for the coarsest level where\n' Comment + +' ' Text +'! we might have a replicated index space). Thus the sum apparently disappears\n' Comment + +' ' Text +'! from our code, but only apparently, because it is implicit in the call\n' Comment + +' ' Text +'! to psb_baseprc_aply.\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! A bit of description of the baseprecv(:) data structure:\n' Comment + +' ' Text +'! 1. Number of levels = NLEV = size(baseprecv(:))\n' Comment + +' ' Text +'! 2. baseprecv(ilev)%av(:) sparse matrices needed for the current level.\n' Comment + +' ' Text +'! Includes:\n' Comment + +' ' Text +'! 2.1.: baseprecv(ilev)%av(l_pr_) L factor of ILU preconditioners\n' Comment + +' ' Text +'! 2.2.: baseprecv(ilev)%av(u_pr_) U factor of ILU preconditioners\n' Comment + +' ' Text +'! 2.3.: baseprecv(ilev)%av(ap_nd_) Off-diagonal part of A for Jacobi sweeps\n' Comment + +' ' Text +'! 2.4.: baseprecv(ilev)%av(ac_) Aggregated matrix of level ILEV\n' Comment + +' ' Text +'! 2.5.: baseprecv(ilev)%av(sm_pr_t_) Smoother prolongator transpose; maps vectors\n' Comment + +' ' Text +'! (ilev-1) ---> (ilev)\n' Comment + +' ' Text +'! 2.6.: baseprecv(ilev)%av(sm_pr_) Smoother prolongator; maps vectors\n' Comment + +' ' Text +'! (ilev) ---> (ilev-1)\n' Comment + +' ' Text +"! Shouldn't we keep just one of them and handle transpose in the sparse BLAS? maybe\n" Comment + +' ' Text +'!\n' Comment + +' ' Text +'! 3. baseprecv(ilev)%desc_data comm descriptor for level ILEV\n' Comment + +' ' Text +'! 4. baseprecv(ilev)%base_a Pointer (really a pointer!) to the base matrix\n' Comment + +' ' Text +'! of the current level, i.e.: if ILEV=1 then A\n' Comment + +' ' Text +'! else the aggregated matrix av(ac_); so we have\n' Comment + +' ' Text +'! a unified treatment of residuals. Need this to\n' Comment + +' ' Text +'! avoid passing explicitly matrix A to the\n' Comment + +' ' Text +'! outer prec. routine\n' Comment + +' ' Text +'! 5. baseprecv(ilev)%mlia The aggregation map from (ilev-1)-->(ilev)\n' Comment + +' ' Text +'! if no smoother, it is used instead of sm_pr_\n' Comment + +' ' Text +'! 6. baseprecv(ilev)%nlaggr Number of aggregates on the various procs.\n' Comment + +' ' Text +'!\n' Comment + +'\n ' Text +'use ' Keyword +'psb_serial_mod' Name +'\n ' Text +'use ' Keyword +'psb_descriptor_type' Name +'\n ' Text +'use ' Keyword +'psb_prec_type' Name +'\n ' Text +'use ' Keyword +'psb_psblas_mod' Name +'\n ' Text +'use ' Keyword +'psb_penv_mod' Name +'\n ' Text +'use ' Keyword +'psb_const_mod' Name +'\n ' Text +'use ' Keyword +'psb_error_mod' Name +'\n ' Text +'use ' Keyword +'psb_penv_mod' Name +'\n ' Text +'implicit ' Keyword +'none\n\n ' Keyword +'type' Keyword +'(' Punctuation +'psb_desc_type' Name +')' Punctuation +',' Punctuation +'intent' Keyword +'(' Punctuation +'in' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'desc_data' Name +'\n ' Text +'type' Keyword +'(' Punctuation +'psb_zbaseprc_type' Name +')' Punctuation +',' Punctuation +' ' Text +'intent' Keyword +'(' Punctuation +'in' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'baseprecv' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n ' Text +'complex' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +',' Punctuation +'intent' Keyword +'(' Punctuation +'in' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'alpha' Name +',' Punctuation +'beta' Name +'\n ' Text +'complex' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +',' Punctuation +'intent' Keyword +'(' Punctuation +'inout' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'x' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +' ' Text +'y' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n ' Text +'character' Keyword.Type +' ' Text +'::' Keyword.Declaration +' ' Text +'trans' Name +'\n ' Text +'complex' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +',' Punctuation +'target' Keyword +' ' Text +'::' Keyword.Declaration +' ' Text +'work' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n ' Text +'integer' Keyword.Type +',' Punctuation +' ' Text +'intent' Keyword +'(' Punctuation +'out' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'info' Name +'\n\n\n ' Text +'! Local variables\n' Comment + +' ' Text +'integer' Keyword.Type +' ' Text +'::' Keyword.Declaration +' ' Text +'n_row' Name +',' Punctuation +'n_col' Name +'\n ' Text +'complex' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +',' Punctuation +' ' Text +'allocatable' Keyword +' ' Text +'::' Keyword.Declaration +' ' Text +'tx' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +'ty' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +'t2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +'w2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +'b2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +'tz' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +'tty' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n ' Text +'character' Keyword.Type +' ' Text +'::' Keyword.Declaration +'diagl' Name +',' Punctuation +' ' Text +'diagu' Name +'\n ' Text +'integer' Keyword.Type +' ' Text +'::' Keyword.Declaration +' ' Text +'ictxt' Name +',' Punctuation +'np' Name +',' Punctuation +'me' Name +',' Punctuation +'i' Name +',' Punctuation +' ' Text +'isz' Name +',' Punctuation +' ' Text +'nrg' Name +',' Punctuation +'nr2l' Name +',' Punctuation +'err_act' Name +',' Punctuation +' ' Text +'iptype' Name +',' Punctuation +' ' Text +'int_err' Name +'(' Punctuation +'5' Literal.Number.Integer +')' Punctuation +'\n ' Text +'real' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'omega' Name +'\n ' Text +'real' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'t1' Name +',' Punctuation +' ' Text +'t2' Name +',' Punctuation +' ' Text +'t3' Name +',' Punctuation +' ' Text +'t4' Name +',' Punctuation +' ' Text +'t5' Name +',' Punctuation +' ' Text +'t6' Name +',' Punctuation +' ' Text +'t7' Name +',' Punctuation +' ' Text +'mpi_wtime' Name +'\n ' Text +'logical' Keyword.Type +',' Punctuation +' ' Text +'parameter' Keyword +' ' Text +'::' Keyword.Declaration +' ' Text +'debug' Name +'=' Operator +'.' Punctuation +'false' Name +'.' Punctuation +',' Punctuation +' ' Text +'debugprt' Name +'=' Operator +'.' Punctuation +'false' Name +'.' Punctuation +'\n ' Text +'integer' Keyword.Type +' ' Text +'::' Keyword.Declaration +' ' Text +'ismth' Name +',' Punctuation +' ' Text +'nlev' Name +',' Punctuation +' ' Text +'ilev' Name +'\n ' Text +'external ' Keyword +'mpi_wtime' Name +'\n ' Text +'character' Keyword.Type +'(' Punctuation +'len' Name.Builtin +'=' Operator +'20' Literal.Number.Integer +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'name' Name +',' Punctuation +' ' Text +'ch_err' Name +'\n\n ' Text +'type ' Keyword +'psb_mlprec_wrk_type' Name +'\n ' Text +'complex' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +',' Punctuation +' ' Text +'pointer' Keyword +' ' Text +'::' Keyword.Declaration +' ' Text +'tx' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'=' Operator +'>' Operator +'null' Name.Builtin +'(' Punctuation +')' Punctuation +',' Punctuation +'ty' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'=' Operator +'>' Operator +'null' Name.Builtin +'(' Punctuation +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'=' Operator +'>' Operator +'null' Name.Builtin +'(' Punctuation +')' Punctuation +',' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'=' Operator +'>' Operator +'null' Name.Builtin +'(' Punctuation +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'b2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'=' Operator +'>' Operator +'null' Name.Builtin +'(' Punctuation +')' Punctuation +',' Punctuation +'tty' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'=' Operator +'>' Operator +'null' Name.Builtin +'(' Punctuation +')' Punctuation +'\n ' Text +'end ' Keyword +'type ' Keyword +'psb_mlprec_wrk_type' Name +'\n ' Text +'type' Keyword +'(' Punctuation +'psb_mlprec_wrk_type' Name +')' Punctuation +',' Punctuation +' ' Text +'pointer' Keyword +' ' Text +'::' Keyword.Declaration +' ' Text +'mlprec_wrk' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n\n ' Text +'interface ' Keyword +'psb_baseprc_aply' Name +'\n ' Text +'subroutine ' Keyword +'psb_zbaseprc_aply' Name +'(' Punctuation +'alpha' Name +',' Punctuation +'prec' Name +',' Punctuation +'x' Name +',' Punctuation +'beta' Name +',' Punctuation +'y' Name +',' Punctuation +'desc_data' Name +',' Punctuation +'trans' Name +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'use ' Keyword +'psb_descriptor_type' Name +'\n ' Text +'use ' Keyword +'psb_prec_type' Name +'\n ' Text +'type' Keyword +'(' Punctuation +'psb_desc_type' Name +')' Punctuation +',' Punctuation +'intent' Keyword +'(' Punctuation +'in' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'desc_data' Name +'\n ' Text +'type' Keyword +'(' Punctuation +'psb_zbaseprc_type' Name +')' Punctuation +',' Punctuation +' ' Text +'intent' Keyword +'(' Punctuation +'in' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'prec' Name +'\n ' Text +'complex' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +',' Punctuation +'intent' Keyword +'(' Punctuation +'inout' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'x' Name +'(' Punctuation +':' Punctuation +')' Punctuation +',' Punctuation +' ' Text +'y' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n ' Text +'complex' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +',' Punctuation +'intent' Keyword +'(' Punctuation +'in' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'alpha' Name +',' Punctuation +'beta' Name +'\n ' Text +'character' Keyword.Type +'(' Punctuation +'len' Name.Builtin +'=' Operator +'1' Literal.Number.Integer +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'trans' Name +'\n ' Text +'complex' Keyword.Type +'(' Punctuation +'kind' Name.Builtin +'(' Punctuation +'1.d0' Literal.Number.Float +')' Punctuation +')' Punctuation +',' Punctuation +'target' Keyword +' ' Text +'::' Keyword.Declaration +' ' Text +'work' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n ' Text +'integer' Keyword.Type +',' Punctuation +' ' Text +'intent' Keyword +'(' Punctuation +'out' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'info' Name +'\n ' Text +'end ' Keyword +'subroutine ' Keyword +'psb_zbaseprc_aply' Name +'\n ' Text +'end ' Keyword +'interface\n\n ' Keyword +'name' Name +'=' Operator +"'psb_mlprc_aply'" Literal.String.Single +'\n ' Text +'info' Name +' ' Text +'=' Operator +' ' Text +'0' Literal.Number.Integer +'\n ' Text +'call ' Keyword +'psb_erractionsave' Name +'(' Punctuation +'err_act' Name +')' Punctuation +'\n\n\n ' Text +'ictxt' Name +'=' Operator +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_ctxt_' Name +')' Punctuation +'\n ' Text +'call ' Keyword +'psb_info' Name +'(' Punctuation +'ictxt' Name +',' Punctuation +' ' Text +'me' Name +',' Punctuation +' ' Text +'np' Name +')' Punctuation +'\n\n ' Text +'nlev' Name +' ' Text +'=' Operator +' ' Text +'size' Name +'(' Punctuation +'baseprecv' Name +')' Punctuation +'\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'nlev' Name +')' Punctuation +',' Punctuation +'stat' Name.Builtin +'=' Operator +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4010' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'Allocate'" Literal.String.Single +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'end ' Keyword +'if\n\n\n ' Keyword +'select ' Keyword +'case' Keyword +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'2' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'ml_type_' Name +')' Punctuation +')' Punctuation +'\n\n ' Text +'case' Keyword +'(' Punctuation +'no_ml_' Name +')' Punctuation +'\n ' Text +'! Should not really get here.\n' Comment + +' ' Text +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4010' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'no_ml_ in mlprc_aply?'" Literal.String.Single +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n\n ' Text +'case' Keyword +'(' Punctuation +'add_ml_prec_' Name +')' Punctuation +'\n\n\n ' Text +'!\n' Comment + +' ' Text +'! Additive is very simple.\n' Comment + +' ' Text +'! 1. X(1) = Xext\n' Comment + +' ' Text +'! 2. DO ILEV=2,NLEV\n' Comment + +' ' Text +'! X(ILEV) = AV(PR_SM_T_)*X(ILEV-1)\n' Comment + +' ' Text +'! 3. Y(ILEV) = (K(ILEV)**(-1))*X(ILEV)\n' Comment + +' ' Text +'! 4. DO ILEV=NLEV-1,1,-1\n' Comment + +' ' Text +'! Y(ILEV) = AV(PR_SM_)*Y(ILEV+1)\n' Comment + +' ' Text +'! 5. Yext = beta*Yext + Y(1)\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! Note: level numbering reversed wrt ref. DD, i.e.\n' Comment + +' ' Text +'! 1..NLEV <=> (j) <-> 0\n' Comment + +'\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'alpha' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +',' Punctuation +'x' Name +',' Punctuation +'beta' Name +',' Punctuation +'y' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'trans' Name +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'size' Name +'(' Punctuation +'x' Name +')' Punctuation +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'size' Name +'(' Punctuation +'y' Name +')' Punctuation +')' Punctuation +')' Punctuation +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'x' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n\n\n ' Text +'do ' Keyword +'ilev' Name +' ' Text +'=' Operator +' ' Text +'2' Literal.Number.Integer +',' Punctuation +' ' Text +'nlev' Name +'\n ' Text +'n_row' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'n_col' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nr2l' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nrg' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'max' Name.Builtin +'(' Punctuation +'n_row' Name +',' Punctuation +'n_col' Name +')' Punctuation +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'ty' Name +'(' Punctuation +'max' Name.Builtin +'(' Punctuation +'n_row' Name +',' Punctuation +'n_col' Name +')' Punctuation +')' Punctuation +',' Punctuation +' ' Text +'stat' Name.Builtin +'=' Operator +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4010' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'Allocate'" Literal.String.Single +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'1' Literal.Number.Integer +':' Punctuation +'n_row' Name +')' Punctuation +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'1' Literal.Number.Integer +':' Punctuation +'n_row' Name +')' Punctuation +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'n_row' Name +'+' Operator +'1' Literal.Number.Integer +':' Punctuation +'max' Name.Builtin +'(' Punctuation +'n_row' Name +',' Punctuation +'n_col' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'ty' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n\n ' Text +'ismth' Name +'=' Operator +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_kind_' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'no_smth_' Name +')' Punctuation +' ' Text +'then' Keyword +'\n ' Text +'!\n' Comment + +' ' Text +'! Smoothed aggregation\n' Comment + +' ' Text +'!\n' Comment + +'\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'glb_smth_' Name +')' Punctuation +' ' Text +'>' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_halo' Name +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'else\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'n_row' Name +'+' Operator +'1' Literal.Number.Integer +':' Punctuation +'max' Name.Builtin +'(' Punctuation +'n_row' Name +',' Punctuation +'n_col' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'call ' Keyword +'psb_csmm' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'av' Name +'(' Punctuation +'sm_pr_t_' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'else' Keyword +'\n ' Text +'!\n' Comment + +' ' Text +'! Raw aggregation, may take shortcut\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +'n_row' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +' ' Text +'+' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'i' Name +')' Punctuation +'\n ' Text +'end ' Keyword +'do\n\n ' Keyword +'end ' Keyword +'if\n\n ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +'==' Operator +'mat_repl_' Name +')' Punctuation +' ' Text +'Then\n ' Keyword +'call ' Keyword +'psb_sum' Name +'(' Punctuation +'ictxt' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'1' Literal.Number.Integer +':' Punctuation +'nrg' Name +')' Punctuation +')' Punctuation +'\n ' Text +'else ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +' ' Text +'/' Operator +'=' Operator +' ' Text +'mat_distr_' Name +')' Punctuation +' ' Text +'Then\n ' Keyword +'write' Keyword +'(' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'*' Operator +')' Punctuation +' ' Text +"'Unknown value for baseprecv(2)%iprcparm(coarse_mat_) '" Literal.String.Single +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +'\n ' Text +'endif' Name +'\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +',' Punctuation +' ' Text +"'N'" Literal.String.Single +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'enddo' Name +'\n\n ' Text +'do ' Keyword +'ilev' Name +' ' Text +'=' Operator +'nlev' Name +',' Punctuation +'2' Literal.Number.Integer +',' Punctuation +'-' Operator +'1' Literal.Number.Integer +'\n\n ' Text +'ismth' Name +'=' Operator +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_kind_' Name +')' Punctuation +'\n ' Text +'n_row' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'n_col' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nr2l' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nrg' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'no_smth_' Name +')' Punctuation +' ' Text +'then\n\n ' Keyword +'call ' Keyword +'psb_csmm' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'av' Name +'(' Punctuation +'sm_pr_' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'else\n\n ' Keyword +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'n_row' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'i' Name +')' Punctuation +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'i' Name +')' Punctuation +' ' Text +'+' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +'\n ' Text +'enddo' Name +'\n\n ' Text +'end ' Keyword +'if\n ' Keyword +'end ' Keyword +'do\n\n ' Keyword +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'alpha' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'zone' Name +',' Punctuation +'y' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n\n ' Text +'case' Keyword +'(' Punctuation +'mult_ml_prec_' Name +')' Punctuation +'\n\n ' Text +'!\n' Comment + +' ' Text +'! Multiplicative multilevel\n' Comment + +' ' Text +'! Pre/post smoothing versions.\n' Comment + +' ' Text +'!\n' Comment + +'\n ' Text +'select ' Keyword +'case' Keyword +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'2' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_pos_' Name +')' Punctuation +')' Punctuation +'\n\n ' Text +'case' Keyword +'(' Punctuation +'post_smooth_' Name +')' Punctuation +'\n\n\n ' Text +'!\n' Comment + +' ' Text +'! Post smoothing.\n' Comment + +' ' Text +'! 1. X(1) = Xext\n' Comment + +' ' Text +'! 2. DO ILEV=2, NLEV :: X(ILEV) = AV(PR_SM_T_,ILEV)*X(ILEV-1)\n' Comment + +' ' Text +'! 3. Y(NLEV) = (K(NLEV)**(-1))*X(NLEV)\n' Comment + +' ' Text +'! 4. DO ILEV=NLEV-1,1,-1\n' Comment + +' ' Text +'! Y(ILEV) = AV(PR_SM_,ILEV+1)*Y(ILEV+1)\n' Comment + +' ' Text +'! Y(ILEV) = Y(ILEV) + (K(ILEV)**(-1))*(X(ILEV)-A(ILEV)*Y(ILEV))\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! 5. Yext = beta*Yext + Y(1)\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! Note: level numbering reversed wrt ref. DD, i.e.\n' Comment + +' ' Text +'! 1..NLEV <=> (j) <-> 0\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! Also: post smoothing is not spelled out in detail in DD.\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'!\n' Comment + +'\n\n ' Text +'n_col' Name +' ' Text +'=' Operator +' ' Text +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nr2l' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'stat' Name.Builtin +'=' Operator +'info' Name +')' Punctuation +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n\n ' Text +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'zone' Name +',' Punctuation +'x' Name +',' Punctuation +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'zone' Name +',' Punctuation +'x' Name +',' Punctuation +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'do ' Keyword +'ilev' Name +'=' Operator +'2' Literal.Number.Integer +',' Punctuation +' ' Text +'nlev' Name +'\n ' Text +'n_row' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'n_col' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nr2l' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nrg' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'ismth' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_kind_' Name +')' Punctuation +'\n\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'stat' Name.Builtin +'=' Operator +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4010' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'Allocate'" Literal.String.Single +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'no_smth_' Name +')' Punctuation +' ' Text +'then' Keyword +'\n ' Text +'!\n' Comment + +' ' Text +'! Smoothed aggregation\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'glb_smth_' Name +')' Punctuation +' ' Text +'>' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_halo' Name +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'else\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'n_row' Name +'+' Operator +'1' Literal.Number.Integer +':' Punctuation +'max' Name.Builtin +'(' Punctuation +'n_row' Name +',' Punctuation +'n_col' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'call ' Keyword +'psb_csmm' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'av' Name +'(' Punctuation +'sm_pr_t_' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'else' Keyword +'\n ' Text +'!\n' Comment + +' ' Text +'! Raw aggregation, may take shortcut\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +'n_row' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +' ' Text +'+' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'i' Name +')' Punctuation +'\n ' Text +'end ' Keyword +'do\n ' Keyword +'end ' Keyword +'if\n\n ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +'==' Operator +'mat_repl_' Name +')' Punctuation +' ' Text +'Then\n ' Keyword +'call ' Keyword +'psb_sum' Name +'(' Punctuation +'ictxt' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'1' Literal.Number.Integer +':' Punctuation +'nrg' Name +')' Punctuation +')' Punctuation +'\n ' Text +'else ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +' ' Text +'/' Operator +'=' Operator +' ' Text +'mat_distr_' Name +')' Punctuation +' ' Text +'Then\n ' Keyword +'write' Keyword +'(' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'*' Operator +')' Punctuation +' ' Text +"'Unknown value for baseprecv(2)%iprcparm(coarse_mat_) '" Literal.String.Single +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +'\n ' Text +'endif' Name +'\n ' Text +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'enddo' Name +'\n\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'nlev' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'nlev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zzero' Name +',' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'nlev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'nlev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +',' Punctuation +"'N'" Literal.String.Single +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n\n ' Text +'do ' Keyword +'ilev' Name +'=' Operator +'nlev' Name +'-' Operator +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'-' Operator +'1' Literal.Number.Integer +'\n ' Text +'ismth' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_kind_' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'no_smth_' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'==' Operator +' ' Text +'smth_omg_' Name +')' Punctuation +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'call ' Keyword +'psb_halo' Name +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'call ' Keyword +'psb_csmm' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'av' Name +'(' Punctuation +'sm_pr_' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'else\n ' Keyword +'n_row' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'n_row' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'i' Name +')' Punctuation +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'i' Name +')' Punctuation +' ' Text +'+' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +'\n ' Text +'enddo' Name +'\n\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'call ' Keyword +'psb_spmm' Name +'(' Punctuation +'-' Operator +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_a' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +' ' Text +'trans' Name +',' Punctuation +' ' Text +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'enddo' Name +'\n\n ' Text +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'alpha' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'beta' Name +',' Punctuation +'y' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n\n ' Text +'case' Keyword +'(' Punctuation +'pre_smooth_' Name +')' Punctuation +'\n\n\n ' Text +'!\n' Comment + +' ' Text +'! Pre smoothing.\n' Comment + +' ' Text +'! 1. X(1) = Xext\n' Comment + +' ' Text +'! 2. Y(1) = (K(1)**(-1))*X(1)\n' Comment + +' ' Text +'! 3. TX(1) = X(1) - A(1)*Y(1)\n' Comment + +' ' Text +'! 4. DO ILEV=2, NLEV\n' Comment + +' ' Text +'! X(ILEV) = AV(PR_SM_T_,ILEV)*TX(ILEV-1)\n' Comment + +' ' Text +'! Y(ILEV) = (K(ILEV)**(-1))*X(ILEV)\n' Comment + +' ' Text +'! TX(ILEV) = (X(ILEV)-A(ILEV)*Y(ILEV))\n' Comment + +' ' Text +'! 5. DO ILEV=NLEV-1,1,-1\n' Comment + +' ' Text +'! Y(ILEV) = Y(ILEV) + AV(PR_SM_,ILEV+1)*Y(ILEV+1)\n' Comment + +' ' Text +'! 6. Yext = beta*Yext + Y(1)\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! Note: level numbering reversed wrt ref. DD, i.e.\n' Comment + +' ' Text +'! 1..NLEV <=> (j) <-> 0\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'!\n' Comment + +'\n ' Text +'n_col' Name +' ' Text +'=' Operator +' ' Text +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nr2l' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'stat' Name.Builtin +'=' Operator +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4010' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'Allocate'" Literal.String.Single +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n\n\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'x' Name +'\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'trans' Name +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'\n\n ' Text +'call ' Keyword +'psb_spmm' Name +'(' Punctuation +'-' Operator +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_a' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'do ' Keyword +'ilev' Name +' ' Text +'=' Operator +' ' Text +'2' Literal.Number.Integer +',' Punctuation +' ' Text +'nlev' Name +'\n ' Text +'n_row' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'n_col' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nr2l' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nrg' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'ismth' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_kind_' Name +')' Punctuation +'\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'stat' Name.Builtin +'=' Operator +'info' Name +')' Punctuation +'\n\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4010' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'Allocate'" Literal.String.Single +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'no_smth_' Name +')' Punctuation +' ' Text +'then' Keyword +'\n ' Text +'!\n' Comment + +' ' Text +'!Smoothed Aggregation\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'glb_smth_' Name +')' Punctuation +' ' Text +'>' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n\n ' Keyword +'call ' Keyword +'psb_halo' Name +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'else\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'n_row' Name +'+' Operator +'1' Literal.Number.Integer +':' Punctuation +'max' Name.Builtin +'(' Punctuation +'n_row' Name +',' Punctuation +'n_col' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'call ' Keyword +'psb_csmm' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'av' Name +'(' Punctuation +'sm_pr_t_' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'zzero' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'else' Keyword +'\n ' Text +'!\n' Comment + +' ' Text +'! Raw aggregation, may take shortcuts\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +'n_row' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +' ' Text +'+' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'i' Name +')' Punctuation +'\n ' Text +'end ' Keyword +'do\n ' Keyword +'end ' Keyword +'if\n\n ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +'==' Operator +'mat_repl_' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_sum' Name +'(' Punctuation +'ictxt' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'1' Literal.Number.Integer +':' Punctuation +'nrg' Name +')' Punctuation +')' Punctuation +'\n ' Text +'else ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +' ' Text +'/' Operator +'=' Operator +' ' Text +'mat_distr_' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'write' Keyword +'(' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'*' Operator +')' Punctuation +' ' Text +"'Unknown value for baseprecv(2)%iprcparm(coarse_mat_) '" Literal.String.Single +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +'\n ' Text +'endif' Name +'\n\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +',' Punctuation +' ' Text +"'N'" Literal.String.Single +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'if' Keyword +'(' Punctuation +'ilev' Name +' ' Text +'<' Operator +' ' Text +'nlev' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'\n ' Text +'call ' Keyword +'psb_spmm' Name +'(' Punctuation +'-' Operator +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_a' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'endif' Name +'\n\n ' Text +'enddo' Name +'\n\n ' Text +'do ' Keyword +'ilev' Name +' ' Text +'=' Operator +' ' Text +'nlev' Name +'-' Operator +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'-' Operator +'1' Literal.Number.Integer +'\n\n ' Text +'ismth' Name +'=' Operator +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_kind_' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'no_smth_' Name +')' Punctuation +' ' Text +'then\n\n ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'==' Operator +' ' Text +'smth_omg_' Name +')' Punctuation +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'call ' Keyword +'psb_halo' Name +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +',' Punctuation +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'call ' Keyword +'psb_csmm' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'av' Name +'(' Punctuation +'sm_pr_' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'else\n\n ' Keyword +'n_row' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'n_row' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'i' Name +')' Punctuation +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'i' Name +')' Punctuation +' ' Text +'+' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +'\n ' Text +'enddo' Name +'\n\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'enddo' Name +'\n\n ' Text +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'alpha' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'beta' Name +',' Punctuation +'y' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n\n\n ' Text +'case' Keyword +'(' Punctuation +'smooth_both_' Name +')' Punctuation +'\n\n ' Text +'!\n' Comment + +' ' Text +'! Symmetrized smoothing.\n' Comment + +' ' Text +'! 1. X(1) = Xext\n' Comment + +' ' Text +'! 2. Y(1) = (K(1)**(-1))*X(1)\n' Comment + +' ' Text +'! 3. TX(1) = X(1) - A(1)*Y(1)\n' Comment + +' ' Text +'! 4. DO ILEV=2, NLEV\n' Comment + +' ' Text +'! X(ILEV) = AV(PR_SM_T_,ILEV)*TX(ILEV-1)\n' Comment + +' ' Text +'! Y(ILEV) = (K(ILEV)**(-1))*X(ILEV)\n' Comment + +' ' Text +'! TX(ILEV) = (X(ILEV)-A(ILEV)*Y(ILEV))\n' Comment + +' ' Text +'! 5. DO ILEV=NLEV-1,1,-1\n' Comment + +' ' Text +'! Y(ILEV) = Y(ILEV) + AV(PR_SM_,ILEV+1)*Y(ILEV+1)\n' Comment + +' ' Text +'! Y(ILEV) = Y(ILEV) + (K(ILEV)**(-1))*(X(ILEV)-A(ILEV)*Y(ILEV))\n' Comment + +' ' Text +'! 6. Yext = beta*Yext + Y(1)\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'! Note: level numbering reversed wrt ref. DD, i.e.\n' Comment + +' ' Text +'! 1..NLEV <=> (j) <-> 0\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'n_col' Name +' ' Text +'=' Operator +' ' Text +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nr2l' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'ty' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'stat' Name.Builtin +'=' Operator +'info' Name +')' Punctuation +'\n\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'ty' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4010' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'Allocate'" Literal.String.Single +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'zone' Name +',' Punctuation +'x' Name +',' Punctuation +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'zone' Name +',' Punctuation +'x' Name +',' Punctuation +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'trans' Name +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'ty' Name +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'x2l' Name +'\n\n ' Text +'call ' Keyword +'psb_spmm' Name +'(' Punctuation +'-' Operator +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_a' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'ty' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'do ' Keyword +'ilev' Name +' ' Text +'=' Operator +' ' Text +'2' Literal.Number.Integer +',' Punctuation +' ' Text +'nlev' Name +'\n ' Text +'n_row' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'n_col' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nr2l' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_col_' Name +')' Punctuation +'\n ' Text +'nrg' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'ismth' Name +'=' Operator +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_kind_' Name +')' Punctuation +'\n ' Text +'allocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'ty' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'nr2l' Name +')' Punctuation +',' Punctuation +' ' Text +'stat' Name.Builtin +'=' Operator +'info' Name +')' Punctuation +'\n\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'ty' Name +'(' Punctuation +':' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n\n\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4010' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'Allocate'" Literal.String.Single +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'end ' Keyword +'if\n\n\n ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'no_smth_' Name +')' Punctuation +' ' Text +'then' Keyword +'\n ' Text +'!\n' Comment + +' ' Text +'!Smoothed Aggregation\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'glb_smth_' Name +')' Punctuation +' ' Text +'>' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'then\n\n ' Keyword +'call ' Keyword +'psb_halo' Name +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'ty' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'else\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'ty' Name +'(' Punctuation +'n_row' Name +'+' Operator +'1' Literal.Number.Integer +':' Punctuation +'max' Name.Builtin +'(' Punctuation +'n_row' Name +',' Punctuation +'n_col' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'call ' Keyword +'psb_csmm' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'av' Name +'(' Punctuation +'sm_pr_t_' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'ty' Name +',' Punctuation +'zzero' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'else' Keyword +'\n ' Text +'!\n' Comment + +' ' Text +'! Raw aggregation, may take shortcuts\n' Comment + +' ' Text +'!\n' Comment + +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +' ' Text +'=' Operator +' ' Text +'zzero' Name +'\n ' Text +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +'n_row' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +' ' Text +'=' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +' ' Text +'+' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'-' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'ty' Name +'(' Punctuation +'i' Name +')' Punctuation +'\n ' Text +'end ' Keyword +'do\n ' Keyword +'end ' Keyword +'if\n\n ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +'==' Operator +'mat_repl_' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_sum' Name +'(' Punctuation +'ictxt' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'(' Punctuation +'1' Literal.Number.Integer +':' Punctuation +'nrg' Name +')' Punctuation +')' Punctuation +'\n ' Text +'else ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +' ' Text +'/' Operator +'=' Operator +' ' Text +'mat_distr_' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'write' Keyword +'(' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'*' Operator +')' Punctuation +' ' Text +"'Unknown value for baseprecv(2)%iprcparm(coarse_mat_) '" Literal.String.Single +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'coarse_mat_' Name +')' Punctuation +'\n ' Text +'endif' Name +'\n\n ' Text +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zzero' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'desc_data' Name +',' Punctuation +' ' Text +"'N'" Literal.String.Single +',' Punctuation +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'if' Keyword +'(' Punctuation +'ilev' Name +' ' Text +'<' Operator +' ' Text +'nlev' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'ty' Name +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'x2l' Name +'\n ' Text +'call ' Keyword +'psb_spmm' Name +'(' Punctuation +'-' Operator +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_a' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'ty' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n ' Text +'endif' Name +'\n\n ' Text +'enddo' Name +'\n\n\n ' Text +'do ' Keyword +'ilev' Name +'=' Operator +'nlev' Name +'-' Operator +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'-' Operator +'1' Literal.Number.Integer +'\n\n ' Text +'ismth' Name +'=' Operator +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_kind_' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'/' Operator +'=' Operator +' ' Text +'no_smth_' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'if' Keyword +' ' Text +'(' Punctuation +'ismth' Name +' ' Text +'==' Operator +' ' Text +'smth_omg_' Name +')' Punctuation +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'call ' Keyword +'psb_halo' Name +'(' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'desc_data' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n ' Text +'call ' Keyword +'psb_csmm' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'av' Name +'(' Punctuation +'sm_pr_' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'info' Name +')' Punctuation +'\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'else\n ' Keyword +'n_row' Name +' ' Text +'=' Operator +' ' Text +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +'%' Punctuation +'matrix_data' Name +'(' Punctuation +'psb_n_row_' Name +')' Punctuation +'\n ' Text +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'n_row' Name +'\n ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'i' Name +')' Punctuation +' ' Text +'=' Operator +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'i' Name +')' Punctuation +' ' Text +'+' Operator +' ' Text +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +'(' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +'+' Operator +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'mlia' Name +'(' Punctuation +'i' Name +')' Punctuation +')' Punctuation +'\n ' Text +'enddo' Name +'\n\n ' Text +'end ' Keyword +'if\n\n ' Keyword +'call ' Keyword +'psb_spmm' Name +'(' Punctuation +'-' Operator +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_a' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +',' Punctuation +'work' Name +'=' Operator +'work' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'call ' Keyword +'psb_baseprc_aply' Name +'(' Punctuation +'zone' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'tx' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'zone' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'baseprecv' Name +'(' Punctuation +'ilev' Name +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +' ' Text +'trans' Name +',' Punctuation +' ' Text +'work' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'enddo' Name +'\n\n ' Text +'call ' Keyword +'psb_geaxpby' Name +'(' Punctuation +'alpha' Name +',' Punctuation +'mlprec_wrk' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'y2l' Name +',' Punctuation +'beta' Name +',' Punctuation +'y' Name +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'baseprecv' Name +'(' Punctuation +'1' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'base_desc' Name +',' Punctuation +'info' Name +')' Punctuation +'\n\n ' Text +'if' Keyword +'(' Punctuation +'info' Name +' ' Text +'/' Operator +'=' Operator +'0' Literal.Number.Integer +')' Punctuation +' ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n\n ' Text +'case ' Keyword +'default' Name +'\n\n ' Text +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4013' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'wrong smooth_pos'" Literal.String.Single +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'i_Err' Name +'=' Operator +'(' Punctuation +'/' Operator +'baseprecv' Name +'(' Punctuation +'2' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'smth_pos_' Name +')' Punctuation +',' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'0' Literal.Number.Integer +'/' Operator +')' Punctuation +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'end ' Keyword +'select\n\n ' Keyword +'case ' Keyword +'default' Name +'\n ' Text +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'4013' Literal.Number.Integer +',' Punctuation +'name' Name +',' Punctuation +'a_err' Name +'=' Operator +"'wrong mltype'" Literal.String.Single +',' Punctuation +'&' Punctuation +'\n ' Text +'&' Punctuation +' ' Text +'i_Err' Name +'=' Operator +'(' Punctuation +'/' Operator +'baseprecv' Name +'(' Punctuation +'2' Literal.Number.Integer +')' Punctuation +'%' Punctuation +'iprcparm' Name +'(' Punctuation +'ml_type_' Name +')' Punctuation +',' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'0' Literal.Number.Integer +',' Punctuation +'0' Literal.Number.Integer +'/' Operator +')' Punctuation +')' Punctuation +'\n ' Text +'goto ' Keyword +'9999' Literal.Number.Integer +'\n\n ' Text +'end ' Keyword +'select\n\n\n ' Keyword +'call ' Keyword +'mlprec_wrk_free' Name +'(' Punctuation +'mlprec_wrk' Name +')' Punctuation +'\n ' Text +'deallocate' Keyword +'(' Punctuation +'mlprec_wrk' Name +')' Punctuation +'\n\n ' Text +'call ' Keyword +'psb_erractionrestore' Name +'(' Punctuation +'err_act' Name +')' Punctuation +'\n ' Text +'return\n\n' Keyword + +'9999' Literal.Number.Integer +' ' Text +'continue\n ' Keyword +'call ' Keyword +'psb_errpush' Name +'(' Punctuation +'info' Name +',' Punctuation +'name' Name +')' Punctuation +'\n ' Text +'call ' Keyword +'psb_erractionrestore' Name +'(' Punctuation +'err_act' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'err_act' Name +'.' Punctuation +'eq' Name +'.' Punctuation +'act_abort' Name +')' Punctuation +' ' Text +'then\n ' Keyword +'call ' Keyword +'psb_error' Name +'(' Punctuation +')' Punctuation +'\n ' Text +'return\n ' Keyword +'end ' Keyword +'if\n ' Keyword +'return\n\n' Keyword + +'contains\n ' Keyword +'subroutine ' Keyword +'mlprec_wrk_free' Name +'(' Punctuation +'wrk' Name +')' Punctuation +'\n ' Text +'type' Keyword +'(' Punctuation +'psb_mlprec_wrk_type' Name +')' Punctuation +' ' Text +'::' Keyword.Declaration +' ' Text +'wrk' Name +'(' Punctuation +':' Punctuation +')' Punctuation +'\n ' Text +'! This will not be needed when we have allocatables, as\n' Comment + +' ' Text +'! it is sufficient to deallocate the container, and\n' Comment + +' ' Text +'! the compiler is supposed to recursively deallocate the\n' Comment + +' ' Text +'! various components.\n' Comment + +' ' Text +'integer ' Keyword.Type +'i' Name +'\n\n ' Text +'do ' Keyword +'i' Name +'=' Operator +'1' Literal.Number.Integer +',' Punctuation +' ' Text +'size' Name +'(' Punctuation +'wrk' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'associated' Name.Builtin +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'tx' Name +')' Punctuation +')' Punctuation +' ' Text +'deallocate' Keyword +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'tx' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'associated' Name.Builtin +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'ty' Name +')' Punctuation +')' Punctuation +' ' Text +'deallocate' Keyword +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'ty' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'associated' Name.Builtin +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'x2l' Name +')' Punctuation +')' Punctuation +' ' Text +'deallocate' Keyword +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'x2l' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'associated' Name.Builtin +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'y2l' Name +')' Punctuation +')' Punctuation +' ' Text +'deallocate' Keyword +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'y2l' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'associated' Name.Builtin +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'b2l' Name +')' Punctuation +')' Punctuation +' ' Text +'deallocate' Keyword +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'b2l' Name +')' Punctuation +'\n ' Text +'if' Keyword +' ' Text +'(' Punctuation +'associated' Name.Builtin +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'tty' Name +')' Punctuation +')' Punctuation +' ' Text +'deallocate' Keyword +'(' Punctuation +'wrk' Name +'(' Punctuation +'i' Name +')' Punctuation +'%' Punctuation +'tty' Name +')' Punctuation +'\n ' Text +'end ' Keyword +'do\n ' Keyword +'end ' Keyword +'subroutine ' Keyword +'mlprec_wrk_free' Name +'\n\n' Text + +'end ' Keyword +'subroutine ' Keyword +'psb_zmlprc_aply' Name +'\n' Text |
