34 integer(kind=kint),
intent(in) :: n, m, nb, naggr
35 real(kind=
kreal),
intent(in) :: bfine(n, m)
36 integer(kind=kint),
intent(in) :: aggr(:)
37 type(hecmwst_saamg_bcsr),
intent(out) :: phat
38 real(kind=
kreal),
allocatable,
intent(out) :: bcoarse(:,:)
39 integer(kind=kint),
allocatable :: memcnt(:), aggptr(:), aggnodes(:), pos(:)
40 integer(kind=kint),
allocatable :: bi(:), bj(:)
41 real(kind=
kreal),
allocatable :: bv(:,:), bk(:,:), tau(:), work(:)
42 integer(kind=kint) :: nnode, ncoarse, inode, k, l, ii, c, r, node
43 integer(kind=kint) :: nk, rows, nt, maxt, lwork, info, rwork
44 real(kind=
kreal) :: wq(1)
45 #ifdef HECMW_WITH_LAPACK
46 external :: dgeqrf, dorgqr
50 allocate(bcoarse(ncoarse, m)); bcoarse = 0.0d0
53 allocate(memcnt(naggr)); memcnt = 0
55 if (aggr(inode) > 0) memcnt(aggr(inode)) = memcnt(aggr(inode)) + 1
57 allocate(aggptr(naggr+1)); aggptr(1) = 0
59 aggptr(k+1) = aggptr(k) + memcnt(k)
61 allocate(aggnodes(aggptr(naggr+1)), pos(naggr))
69 aggnodes(pos(k)) = inode
74 maxt = aggptr(naggr+1)
75 allocate(bi(maxt), bj(maxt), bv(nb*m, maxt)); nt = 0
78 nk = memcnt(k); rows = nk * nb
80 write(*,
'(a,i0,a,i0,a,i0)')
'hecmw_saamg_tentative: aggregate ', k, &
81 ' has rows=', rows,
' < m=', m
82 call hecmw_saamg_abort(
'tentative: aggregate has fewer rows than near-kernel size m')
84 allocate(bk(rows, m), tau(m))
86 node = aggnodes(aggptr(k)+l+1)
89 bk(l*nb+ii, c) = bfine((node-1)*nb+ii, c)
95 call dgeqrf(rows, m, bk, rows, tau, wq, -1, info); lwork = int(wq(1))
96 call dorgqr(rows, m, m, bk, rows, tau, wq, -1, info); rwork = int(wq(1))
97 lwork = max(lwork, rwork, 1)
100 call dgeqrf(rows, m, bk, rows, tau, work, lwork, info)
101 if (info /= 0) then;
write(*,*)
'dgeqrf info=', info
112 bcoarse((k-1)*m+r, c) = bk(r, c)
116 call dorgqr(rows, m, m, bk, rows, tau, work, lwork, info)
117 if (info /= 0) then;
write(*,*)
'dorgqr info=', info
118 call hecmw_saamg_abort(
'tentative: per-aggregate Q formation failed (dorgqr)');
end if
122 node = aggnodes(aggptr(k)+l+1)
123 nt = nt + 1; bi(nt) = node; bj(nt) = k
126 bv((c-1)*nb+ii, nt) = bk(l*nb+ii, c)
131 deallocate(bk, tau, work)
136 deallocate(memcnt, aggptr, aggnodes, pos, bi, bj, bv)
148 type(hecmwst_saamg_bcsr),
intent(in) :: a
149 type(hecmwst_saamg_blockdiag),
intent(in) :: d
150 real(kind=
kreal),
intent(in) :: omega
151 type(hecmwst_saamg_bcsr),
intent(in) :: phat
152 type(hecmwst_saamg_bcsr),
intent(out) :: p
153 type(hecmwst_saamg_bcsr) :: ap
154 integer(kind=kint),
allocatable :: bi(:), bj(:)
155 real(kind=
kreal),
allocatable :: bv(:,:)
156 integer(kind=kint) :: nb, m, bs, nrow, i, t, nt
158 nb = phat%nb; m = phat%mb; bs = nb*m
168 allocate(bi(phat%nnzb + ap%nnzb), bj(phat%nnzb + ap%nnzb), bv(bs, phat%nnzb + ap%nnzb))
171 do t = phat%browptr(i), phat%browptr(i+1)-1
172 nt = nt + 1; bi(nt) = i; bj(nt) = phat%bcol(t)
173 bv(1:bs, nt) = phat%bval((t-1)*bs+1:t*bs)
177 do t = ap%browptr(i), ap%browptr(i+1)-1
178 nt = nt + 1; bi(nt) = i; bj(nt) = ap%bcol(t)
179 bv(1:bs, nt) = -omega * ap%bval((t-1)*bs+1:t*bs)
185 deallocate(bi, bj, bv)
Smoothed Aggregation AMG preconditioner : lightweight comm table.
subroutine, public hecmw_saamg_abort(msg)
Fatal-error termination with a clear message. Under MPI this is a COLLECTIVE abort (hecmw_abort -> MP...
subroutine, public hecmw_saamg_require_lapack(site)
Abort with a uniform message when a LAPACK-only code path is reached in a build without LAPACK....
Smoothed Aggregation AMG preconditioner : internal block-CSR matrix.
subroutine, public hecmw_saamg_spgemm_blk(A, B, C)
Block SpGEMM C = A * B : block Gustavson with dense block GEMM accumulation. Requires Amb == Bnb (inn...
subroutine, public hecmw_saamg_bcsr_free(A)
Release the storage held by a hecmwST_saamg_bcsr.
subroutine, public hecmw_saamg_bcsr_from_block_triplets(nbrow, nbcol, nb, mb, bi, bj, bv, nt, A)
Assemble a block-CSR (nbrow x nbcol block grid, nb x mb blocks) from a list of block triplets (bi,...
Smoothed Aggregation AMG preconditioner : prolongation.
subroutine, public hecmw_saamg_smooth_prolongator(A, D, omega, phat, p)
Smoothed prolongator P = P-hat - omega * D^{-1} (A P-hat), via SpGEMM. Computes A*P-hat once as a spa...
subroutine, public hecmw_saamg_tentative(bfine, n, m, nb, aggr, naggr, phat, bcoarse)
Build P-hat (n x naggr*m block-CSR) and B_coarse (naggr*m x m) from B_fine.
Smoothed Aggregation AMG preconditioner : smoother building blocks.
subroutine, public hecmw_saamg_blockdiag_apply_bcsr_inplace(D, C)
Apply C <- D^{-1} C in place (each nb x mb block solved against the node's LU). Same as blockdiag_app...
Smoothed Aggregation AMG preconditioner : kind parameters.
integer(kind=4), parameter kreal