10 #include <petsc/finclude/petsc.h>
16 integer,
dimension(:),
allocatable :: arr
21 integer,
dimension(:, :, :),
allocatable :: arr
26 integer,
dimension(:, :, :, :),
allocatable :: arr
57 mat,
dimension(:),
allocatable :: a
58 ksp,
dimension(:),
allocatable :: ksplevels
59 vec,
dimension(:),
allocatable :: res, rhs, sol, sol2
62 mat,
pointer :: finemat
75 subroutine setupamg(inputMat, nCell, blockSize, levels, nSmooth)
82 integer(kind=intType),
intent(in) :: nCell, blockSize, levels, nSmooth
83 mat,
target :: inputmat
86 vec :: recvvec, indexvec
89 integer(kind=intTYpe) :: nnx, nny, nnz, l, nn, i, j, k, ii, jj, kk, lvl, n, m
90 integer(kind=intType) :: idim, count, cursize, ierr, coarseIndex
91 integer(kind=intType) :: level, nVar, sps, nextLvl, ncoarse
92 integer(kind=intType),
dimension(:, :, :),
allocatable :: sizes
93 integer(kind=intType),
dimension(:),
allocatable :: offsets, procStarts, nnzOn, nnzOff
94 real(kind=realtype),
dimension(:),
pointer :: indptr
95 integer(kind=intType),
dimension(:),
allocatable :: indicesToGet
143 cursize = sizes(idim, nn, lvl - 1)
144 if (cursize == 1)
then
145 sizes(idim, nn, lvl) = cursize
146 else if (mod(cursize, 2) == 0)
then
148 sizes(idim, nn, lvl) = cursize / 2
149 else if (mod(cursize, 2) == 1)
then
151 sizes(idim, nn, lvl) = (cursize - 1) / 2 + 1
160 i = i + sizes(1, nn, lvl) * sizes(2, nn, lvl) * sizes(3, nn, lvl)
163 call mpi_allgather(i, 1, mpi_integer, offsets(1:
nproc), 1, mpi_integer, &
165 call echk(ierr, __file__, __line__)
170 offsets(i) = offsets(i - 1) + offsets(i)
174 procstarts(lvl) = offsets(
myid)
184 petsc_determine, indexvec, ierr)
185 call echk(ierr, __file__, __line__)
201 n = n + sizes(1, nn, lvl) * sizes(2, nn, lvl) * sizes(3, nn, lvl)
212 nnx = sizes(1, nn, lvl + 1)
213 nny = sizes(2, nn, lvl + 1)
214 nnz = sizes(3, nn, lvl + 1)
217 do k = 1, sizes(3, nn, lvl)
218 do j = 1, sizes(2, nn, lvl)
219 do i = 1, sizes(1, nn, lvl)
226 coarseindex = (kk - 1) * nnx * nny + (jj - 1) * nnx + ii + count
230 interps(lvl)%arr(n) = coarseindex
235 count = count + nnx * nny * nnz
246 call vecgetarrayf90(indexvec, indptr, ierr)
247 call echk(ierr, __file__, __line__)
251 ii = ii + (
kb + 1) * (
jb + 1) * (
ib + 1)
261 coarseindex =
interps(1)%arr(n)
267 coarseindex =
interps(nextlvl)%arr(coarseindex)
274 coarseindex = coarseindex + procstarts(lvl + 1) - 1
278 indptr(n) = transfer(int(coarseindex, 8),
one)
284 call vecrestorearrayf90(indexvec, indptr, ierr)
285 call echk(ierr, __file__, __line__)
287 allocate (indicestoget(8 * ii))
295 if (
iblank(i, j, k) == -1)
then
297 if (flowdoms(nn, 1, 1)%gInd(m, i, j, k) >= 0)
then
299 indicestoget(ii) = flowdoms(nn, 1, 1)%gInd(m, i, j, k)
311 call iscreategeneral(
adflow_comm_world, ii, indicestoget(1:ii), petsc_copy_values, &
313 call echk(ierr, __file__, __line__)
314 deallocate (indicestoget)
318 call echk(ierr, __file__, __line__)
321 call vecscattercreate(indexvec, is1, recvvec, petsc_null_is, scat, ierr)
322 call echk(ierr, __file__, __line__)
325 call vecscatterbegin(scat, indexvec, recvvec, insert_values, scatter_forward, ierr)
326 call echk(ierr, __file__, __line__)
327 call vecscatterend(scat, indexvec, recvvec, insert_values, scatter_forward, ierr)
328 call echk(ierr, __file__, __line__)
330 call vecgetarrayf90(recvvec, indptr, ierr)
331 call echk(ierr, __file__, __line__)
341 if (
iblank(i, j, k) == -1)
then
343 if (flowdoms(nn, 1, 1)%gInd(m, i, j, k) >= 0)
then
346 int(transfer(indptr(ii), 1_8), inttype)
355 call vecrestorearrayf90(recvvec, indptr, ierr)
356 call echk(ierr, __file__, __line__)
358 call vecscatterdestroy(scat, ierr)
359 call echk(ierr, __file__, __line__)
361 call vecdestroy(recvvec, ierr)
362 call echk(ierr, __file__, __line__)
364 call isdestroy(is1, ierr)
365 call echk(ierr, __file__, __line__)
375 flowdoms(nn, level, sps)%intCommVars(1)%var =>
coarseindices(nn, lvl)%arr(:, :, :)
382 call vecdestroy(indexvec, ierr)
383 call echk(ierr, __file__, __line__)
390 call echk(ierr, __file__, __line__)
394 ncoarse = maxval(
interps(lvl - 1)%arr)
396 allocate (nnzon(1:ncoarse), nnzoff(1:ncoarse))
400 petsc_determine, petsc_determine, 0, nnzon, 0, nnzoff, &
402 call echk(ierr, __file__, __line__)
403 deallocate (nnzon, nnzoff)
405 call matsetoption(a(lvl), mat_row_oriented, petsc_false, ierr)
406 call echk(ierr, __file__, __line__)
408 call matsetoption(a(lvl), mat_new_nonzero_allocation_err, petsc_false, ierr)
409 call echk(ierr, __file__, __line__)
411 call matcreatevecs(a(lvl), res(lvl), sol(lvl), ierr)
412 call echk(ierr, __file__, __line__)
416 call echk(ierr, __file__, __line__)
418 call vecduplicate(res(lvl), sol(lvl), ierr)
419 call echk(ierr, __file__, __line__)
422 call vecduplicate(res(lvl), rhs(lvl), ierr)
423 call echk(ierr, __file__, __line__)
425 call vecduplicate(res(lvl), sol2(lvl), ierr)
426 call echk(ierr, __file__, __line__)
435 integer(kind=intType) :: lvl, ierr, i, j
440 call matdestroy(a(lvl), ierr)
441 call echk(ierr, __file__, __line__)
444 call vecdestroy(res(lvl), ierr)
445 call echk(ierr, __file__, __line__)
447 call vecdestroy(sol(lvl), ierr)
448 call echk(ierr, __file__, __line__)
450 call vecdestroy(sol2(lvl), ierr)
451 call echk(ierr, __file__, __line__)
453 call vecdestroy(rhs(lvl), ierr)
454 call echk(ierr, __file__, __line__)
456 call kspdestroy(ksplevels(lvl), ierr)
457 call echk(ierr, __file__, __line__)
460 deallocate (a, res, rhs, sol, sol2, ksplevels)
472 integer(kind=intType) ierr
475 integer(kind=intType) :: i
480 call veccopy(x, rhs(1), ierr)
481 call echk(ierr, __file__, __line__)
484 call vecset(y,
zero, ierr)
485 call echk(ierr, __file__, __line__)
496 call vecaypx(y,
one, sol(1), ierr)
497 call echk(ierr, __file__, __line__)
501 call matmult(finemat, y, rhs(1), ierr)
502 call echk(ierr, __file__, __line__)
504 call vecaypx(rhs(1), -
one, x, ierr)
505 call echk(ierr, __file__, __line__)
513 call kspsolve(ksplevels(1), x, y, ierr)
514 call echk(ierr, __file__, __line__)
526 integer(kind=intTYpe) :: ierr
531 integer(kind=intType) :: lvl
532 integer(kind=intType) :: nlocal, first
536 call kspsetoperators(ksplevels(lvl), finemat, finemat, ierr)
537 call echk(ierr, __file__, __line__)
543 call kspsetoperators(ksplevels(lvl), a(lvl), a(lvl), ierr)
544 call echk(ierr, __file__, __line__)
551 call kspsetnormtype(ksplevels(lvl), ksp_norm_none, ierr)
552 call echk(ierr, __file__, __line__)
554 call kspsettype(ksplevels(lvl),
'richardson', ierr)
555 call echk(ierr, __file__, __line__)
557 call kspsettolerances(ksplevels(lvl), petsc_default_real, &
558 petsc_default_real, petsc_default_real, &
560 call echk(ierr, __file__, __line__)
562 call kspgetpc(ksplevels(lvl), globalpc, ierr)
563 call echk(ierr, __file__, __line__)
565 call pcsettype(globalpc,
'asm', ierr)
566 call echk(ierr, __file__, __line__)
569 call echk(ierr, __file__, __line__)
572 call kspsetup(ksplevels(lvl), ierr)
573 call echk(ierr, __file__, __line__)
576 call pcasmgetsubksp(globalpc, nlocal, first, subksp, ierr)
577 call echk(ierr, __file__, __line__)
583 call kspsettype(subksp,
'richardson', ierr)
584 call echk(ierr, __file__, __line__)
587 call kspsettolerances(subksp, petsc_default_real, petsc_default_real, petsc_default_real, &
589 call echk(ierr, __file__, __line__)
592 call kspsetnormtype(subksp, ksp_norm_none, ierr)
593 call echk(ierr, __file__, __line__)
596 call kspsettype(subksp,
'preonly', ierr)
597 call echk(ierr, __file__, __line__)
601 call kspgetpc(subksp, subpc, ierr)
602 call echk(ierr, __file__, __line__)
605 call pcsettype(subpc,
'ilu', ierr)
606 call echk(ierr, __file__, __line__)
610 call echk(ierr, __file__, __line__)
614 call echk(ierr, __file__, __line__)
623 integer(kind=intType) :: ierr
626 integer(kind=intType) :: lvl
634 integer(kind=intType),
dimension(:),
intent(in) :: interp
637 real(kind=realtype),
pointer :: yptr(:), xptr(:)
638 real(kind=realtype),
pointer :: xptrblk(:, :), yptrblk(:, :)
639 integer(kind=intType) :: ierr, n, i, j
642 call vecgetarrayf90(x, xptr, ierr)
643 call echk(ierr, __file__, __line__)
645 call vecgetarrayf90(y, yptr, ierr)
646 call echk(ierr, __file__, __line__)
652 xptrblk(1:
bs, 1:
size(xptr) /
bs) => xptr
653 yptrblk(1:
bs, 1:
size(yptr) /
bs) => yptr
661 yptrblk(:, j) = yptrblk(:, j) + xptrblk(:, i)
664 call vecrestorearrayf90(x, xptr, ierr)
665 call echk(ierr, __file__, __line__)
667 call vecrestorearrayf90(y, yptr, ierr)
668 call echk(ierr, __file__, __line__)
676 integer(kind=intType),
dimension(:),
intent(in) :: interp
679 real(kind=realtype),
pointer :: yptr(:), xptr(:)
680 real(kind=realtype),
pointer :: xptrblk(:, :), yptrblk(:, :)
681 integer(kind=intType) :: ierr, n, i, j
685 call vecgetarrayf90(x, xptr, ierr)
686 call echk(ierr, __file__, __line__)
688 call vecgetarrayf90(y, yptr, ierr)
689 call echk(ierr, __file__, __line__)
695 yptrblk(1:
bs, 1:
size(yptr) /
bs) => yptr
696 xptrblk(1:
bs, 1:
size(xptr) /
bs) => xptr
701 yptrblk(:, i) = xptrblk(:, j)
704 call vecrestorearrayf90(x, xptr, ierr)
705 call echk(ierr, __file__, __line__)
707 call vecrestorearrayf90(y, yptr, ierr)
708 call echk(ierr, __file__, __line__)
719 integer(kind=intType),
intent(in) :: k
722 integer(kind=intType) :: ierr, i
731 call kspsolve(ksplevels(k + 1), rhs(k + 1), sol(k + 1), ierr)
732 call echk(ierr, __file__, __line__)
735 call mgprecon(rhs(k + 1), sol(k + 1), k + 1)
743 call matmult(finemat, y, res(k), ierr)
745 call matmult(a(k), y, res(k), ierr)
747 call echk(ierr, __file__, __line__)
749 call vecaypx(res(k), -
one, r, ierr)
750 call echk(ierr, __file__, __line__)
753 call kspsolve(ksplevels(k), res(k), sol2(k), ierr)
754 call echk(ierr, __file__, __line__)
756 call vecaxpy(y,
one, sol2(k), ierr)
757 call echk(ierr, __file__, __line__)
integer(kind=inttype), dimension(maxlevels) ncellslocal
type(arr3int4), dimension(:, :), allocatable, target coarseindices
integer(kind=inttype) amgouterits
integer(kind=inttype) amglevels
type(arr4int4), dimension(:, :), allocatable, target coarseoversetindices
subroutine setupshellpc(pc, ierr)
integer(kind=inttype) amgnsmooth
integer(kind=inttype) amgfilllevelfine
integer(kind=inttype) amglocalpreconitsfine
subroutine prolongvec(x, y, interp)
integer(kind=inttype) amgfilllevel
subroutine setupamg(inputMat, nCell, blockSize, levels, nSmooth)
integer(kind=inttype) amglocalpreconitscoarse
subroutine applyshellpc(pc, x, y, ierr)
subroutine restrictvec(x, y, interp)
type(arr1int4), dimension(:), allocatable interps
integer(kind=inttype) amgasmoverlapcoarse
character(len=maxstringlen) amgmatrixordering
integer(kind=inttype) amgasmoverlap
integer(kind=inttype) amgasmoverlapfine
recursive subroutine mgprecon(r, y, k)
integer(kind=inttype) amgfilllevelcoarse
subroutine destroyshellpc(pc, ierr)
integer(kind=inttype) amglocalpreconits
integer(kind=inttype), dimension(:, :, :), pointer iblank
type(internalcommtype), dimension(:), allocatable internalcell_2nd
type(commtype), dimension(:), allocatable commpatterncell_2nd
integer adflow_comm_world
real(kind=realtype), parameter zero
real(kind=realtype), parameter one
subroutine whalo1to1intgeneric(nVar, level, sps, commPattern, internal)
subroutine echk(errorcode, file, line)
subroutine setpointers(nn, mm, ll)