9 #include "petsc/finclude/petsc.h" 19 INTEGER,
DIMENSION(:),
POINTER :: ifrom
20 INTEGER :: kmax, nifrom, start, fin, k
21 kmax =
SIZE(la%loc_to_glob,1)
22 nifrom = mesh%np-mesh%dom_np
23 ALLOCATE(ifrom(kmax*nifrom))
26 start = (k-1)*nifrom+1
27 fin = start + nifrom - 1
28 ifrom(start:fin)= la%loc_to_glob(k,mesh%dom_np+1:)-1
33 SUBROUTINE extract(xghost,ks,ke,LA,phi)
34 #include "petsc/finclude/petscvec.h" 38 REAL(KIND=8),
DIMENSION(:),
INTENT(OUT):: phi
41 INTEGER :: k, start, fin, nbghost, s, f
43 petscerrorcode :: ierr
44 petscscalar,
POINTER :: x_loc(:)
45 CALL vecgetarrayf90(xghost, x_loc, ierr)
47 start = sum(la%dom_np(1:k-1)) + 1
48 fin = start + la%dom_np(k) - 1
49 s = sum(la%np(ks:k-1)) + 1
50 f = s + la%dom_np(k) - 1
51 phi(s:f) = x_loc(start:fin)
52 nbghost = la%np(k) - la%dom_np(k)
53 start = sum(la%dom_np) + sum(la%np(1:k-1)-la%dom_np(1:k-1)) + 1
54 fin = start + nbghost - 1
55 s = sum(la%np(ks:k-1))+la%dom_np(k)+1
57 phi(s:f) = x_loc(start:fin)
59 CALL vecrestorearrayf90(xghost, x_loc, ierr)
62 SUBROUTINE block_index(communicator,kmax,mesh,loc_to_glob_LA)
65 #include "petsc/finclude/petsc.h" 69 INTEGER,
INTENT(IN) :: kmax
70 INTEGER,
DIMENSION(:,:),
POINTER :: loc_to_glob_LA
71 INTEGER,
DIMENSION(:),
POINTER :: dom_np, disp
72 INTEGER :: code, nb_procs, rank
73 INTEGER :: i, p, n, k, i_loc, proc, iglob
74 mpi_comm :: communicator
76 CALL mpi_comm_size(communicator,nb_procs,code)
77 CALL mpi_comm_rank(communicator,rank,code)
78 ALLOCATE(dom_np(nb_procs) ,disp(nb_procs+1))
79 CALL mpi_allgather(mesh%dom_np, 1, mpi_integer, dom_np, 1, &
80 mpi_integer, communicator ,code)
83 disp(n+1) = disp(n) + dom_np(n)
85 IF (
ASSOCIATED(mesh%disp))
THEN 88 IF (
ASSOCIATED(mesh%domnp))
THEN 91 ALLOCATE(mesh%disp(nb_procs+1))
92 ALLOCATE(mesh%domnp(nb_procs))
96 ALLOCATE(loc_to_glob_la(kmax,mesh%np))
101 loc_to_glob_la(k,i) = kmax*(disp(proc)-1)+(k-1)*dom_np(proc)+i
128 DO i = mesh%dom_np + 1, mesh%np
129 iglob = mesh%loc_to_glob(i)
131 IF (disp(p) > iglob)
THEN 136 i_loc = iglob - disp(proc) + 1
138 loc_to_glob_la(k,i) = kmax*(disp(proc)-1)+(k-1)*dom_np(proc)+i_loc
160 DEALLOCATE(dom_np,disp)
172 TYPE(
mesh_type),
INTENT(IN) :: mesh_glob,mesh
173 INTEGER,
INTENT(IN) :: kmax
177 INTEGER :: me, nw, nmax, np, knp, ki, kj, k, njt, i1, i2
178 INTEGER :: m, ni, nj, i, j, n_a_d, iloc, jloc, jglob, nb_procs, p, proc=-1
179 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ja_work
180 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nja, a_d
181 INTEGER,
DIMENSION(SIZE(mesh_glob%jj,1)) :: jj_loc
182 INTEGER,
DIMENSION(:),
ALLOCATABLE :: per_loc
185 mpi_comm :: communicator
187 CALL block_index(communicator,kmax,mesh,la%loc_to_glob)
188 nw =
SIZE(mesh%jj, 1)
192 nb_procs =
SIZE(mesh%domnp)
195 ALLOCATE(la%dom_np(kmax),la%np(kmax))
196 la%dom_np(:) = mesh%dom_np
200 ALLOCATE(la%ia(0:0),la%ja(0))
205 ALLOCATE (ja_work(knp,kmax*nparm), a_d(kmax*nparm), nja(knp))
206 ALLOCATE (per_loc(knp))
211 ja_work((ki-1)*np+i,1) = la%loc_to_glob(ki,i)
215 DO m = 1, mesh_glob%me
216 jj_loc = mesh_glob%jj(:,m)
217 IF (maxval(jj_loc)< mesh%loc_to_glob(1) .OR. minval(jj_loc)> mesh%loc_to_glob(1) + mesh%np -1) cycle
219 iloc = jj_loc(ni)-mesh%loc_to_glob(1)+1
220 IF (iloc<1 .OR. iloc>np) cycle
225 IF (jglob< mesh%loc_to_glob(1) .OR. jglob> mesh%loc_to_glob(2))
THEN 227 IF (mesh%disp(p) > jglob)
THEN 233 jloc = jglob - mesh%disp(proc) + 1
236 jloc = jglob - mesh%loc_to_glob(1) + 1
240 j = kmax*(mesh%disp(proc)-1)+(kj-1)*mesh%domnp(proc)+jloc
242 j = la%loc_to_glob(kj,jloc)
245 IF (minval(abs(ja_work(i,1:nja(i))-j)) /= 0)
THEN 247 ja_work(i,nja(i)) = j
255 IF (
PRESENT(opt_per))
THEN 256 DO k = 1, opt_per%n_bord
257 DO i = 1,
SIZE(opt_per%list(k)%DIL)
259 i1 = opt_per%list(k)%DIL(i)
260 i2 = opt_per%perlist(k)%DIL(i)
261 njt = nja(i1)+nja(i2)
262 IF (njt > kmax*nparm)
THEN 263 CALL error_petsc(
'BUG in st_aij_glob_block, SIZE(ja) not large enough')
265 per_loc(1:nja(i1)) = ja_work(i1,1:nja(i1))
266 per_loc(nja(i1)+1:nja(i1)+nja(i2)) = ja_work(i2,1:nja(i2))
269 ja_work(i1,1:njt) = per_loc(1:njt)
270 ja_work(i2,1:njt) = per_loc(1:njt)
275 IF (maxval(nja)>nparm)
THEN 276 WRITE(*,*)
'ST_SPARSEKIT: dimension de ja doit etre >= ',nparm
284 ALLOCATE(la%ia(0:knp),la%ja(0:nmax-1))
287 CALL tri_jlg (ja_work(i,1:nja(i)), a_d, n_a_d)
288 IF (n_a_d /= nja(i))
THEN 289 WRITE(*,*)
' BUG : st_p1_CSR' 290 WRITE(*,*)
'n_a_d ', n_a_d,
'nja(i)', nja(i)
293 la%ia(i) = la%ia(i-1) + nja(i)
294 la%ja(la%ia(i-1):la%ia(i)-1) = a_d(1:nja(i))-1
296 DEALLOCATE (ja_work, nja, a_d )
419 INTEGER,
INTENT(IN) :: kmax
422 INTEGER :: me, nw, nmax, np, knp, ki, kj
423 INTEGER :: m, ni, nj, i, j, n_a_d, iloc
424 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ja_work
425 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nja, a_d
426 INTEGER,
DIMENSION(SIZE(mesh%jj,1)) :: j_loc
428 mpi_comm :: communicator
430 CALL block_index(communicator,kmax,mesh,la%loc_to_glob)
431 nw =
SIZE(mesh%jj, 1)
435 ALLOCATE (ja_work(knp,kmax*nparm), a_d(kmax*nparm), nja(knp))
440 ja_work((ki-1)*np+i,1) = la%loc_to_glob(ki,i)
453 j = la%loc_to_glob(kj,j_loc(nj))
454 IF (minval(abs(ja_work(i,1:nja(i))-j)) /= 0)
THEN 456 ja_work(i,nja(i)) = j
464 IF (maxval(nja)>nparm)
THEN 465 WRITE(*,*)
'ST_SPARSEKIT: dimension de ja doit etre >= ',nparm
473 ALLOCATE(la%ia(0:knp),la%ja(0:nmax-1))
476 CALL tri_jlg (ja_work(i,1:nja(i)), a_d, n_a_d)
477 IF (n_a_d /= nja(i))
THEN 478 WRITE(*,*)
' BUG : st_p1_CSR' 479 WRITE(*,*)
'n_a_d ', n_a_d,
'nja(i)', nja(i)
482 la%ia(i) = la%ia(i-1) + nja(i)
483 la%ja(la%ia(i-1):la%ia(i)-1) = a_d(1:nja(i))-1
485 DEALLOCATE (ja_work, nja, a_d )
496 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: jj
498 INTEGER :: me, nw, nmax, np
499 INTEGER :: m, ni, nj, i, j, n_a_d
500 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ja_work
501 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nja, a_d
506 ALLOCATE (ja_work(np,nparm), aij%ia(np+1), a_d(nparm), nja(np))
518 IF (minval(abs(ja_work(i,1:nja(i))-j)) /= 0)
THEN 520 ja_work(i,nja(i)) = j
526 IF (maxval(nja)>nparm)
THEN 527 WRITE(*,*)
'ST_SPARSEKIT: dimension de ja doit etre >= ',nparm
535 ALLOCATE(aij%ja(nmax))
538 CALL tri_jlg (ja_work(i,1:nja(i)), a_d, n_a_d)
539 IF (n_a_d /= nja(i))
THEN 540 WRITE(*,*)
' BUG : st_p1_CSR' 541 WRITE(*,*)
'n_a_d ', n_a_d,
'nja(i)', nja(i)
544 aij%ia(i+1) = aij%ia(i) + nja(i)
545 aij%ja(aij%ia(i):aij%ia(i+1)-1) = a_d(1:nja(i))
547 DEALLOCATE ( ja_work, nja, a_d )
560 INTEGER,
INTENT(IN) :: n_b
561 INTEGER :: ki, kj, i, ib, jb, p, pb, bloc_size, np, nnz
564 nnz = in%ia(np+1) - in%ia(1)
565 ALLOCATE (out%ia(n_b*np+1), out%ja(n_b*n_b*nnz))
567 bloc_size =
SIZE(in%ia) - 1
572 DO i = 2, bloc_size + 1
573 ib = i + (ki-1)*bloc_size
574 out%ia(ib) = out%ia(ib-1) + n_b*(in%ia(i) - in%ia(i-1))
580 ib = i + (ki-1)*bloc_size
583 DO p = in%ia(i), in%ia(i+1) - 1
584 jb = in%ja(p) + (kj-1)*bloc_size
586 pb = out%ia(ib) + p - in%ia(i) + (kj-1)*(in%ia(i+1)-in%ia(i))
602 INTEGER,
DIMENSION(:),
INTENT(IN) :: ia, ja
603 INTEGER,
DIMENSION(:),
POINTER :: ia_b, ja_b
604 INTEGER,
INTENT(IN) :: n_b
605 INTEGER :: ki, kj, i, ib, jb, p, pb, bloc_size, np, nnz
608 nnz = ia(np+1) - ia(1)
609 ALLOCATE (ia_b(n_b*np+1), ja_b(n_b*n_b*nnz))
611 bloc_size =
SIZE(ia) - 1
616 DO i = 2, bloc_size + 1
617 ib = i + (ki-1)*bloc_size
618 ia_b(ib) = ia_b(ib-1) + n_b*(ia(i) - ia(i-1))
624 ib = i + (ki-1)*bloc_size
627 DO p = ia(i), ia(i+1) - 1
628 jb = ja(p) + (kj-1)*bloc_size
630 pb = ia_b(ib) + p - ia(i) + (kj-1)*(ia(i+1)-ia(i))
640 SUBROUTINE st_csr(jj, ia, ja)
646 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: jj
647 INTEGER,
DIMENSION(:),
POINTER :: ia, ja
649 INTEGER :: me, nw, nmax, np
650 INTEGER :: m, ni, nj, i, j, n_a_d
651 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ja_work
652 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nja, a_d
658 ALLOCATE (ja_work(np,nparm), ia(np+1), a_d(nparm), nja(np))
672 IF (minval(abs(ja_work(i,1:nja(i))-j)) /= 0)
THEN 674 ja_work(i,nja(i)) = j
682 IF (maxval(nja)>nparm)
THEN 683 WRITE(*,*)
'ST_SPARSEKIT: dimension de ja doit etre >= ',nparm
695 CALL tri_jlg (ja_work(i,1:nja(i)), a_d, n_a_d)
696 IF (n_a_d /= nja(i))
THEN 697 WRITE(*,*)
' BUG : st_p1_CSR' 698 WRITE(*,*)
'n_a_d ', n_a_d,
'nja(i)', nja(i)
701 ia(i+1) = ia(i) + nja(i)
702 ja(ia(i):ia(i+1)-1) = a_d(1:nja(i))
706 DEALLOCATE ( ja_work, nja, a_d )
780 SUBROUTINE tri_jlg (a, a_d, n_a_d)
787 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: a
788 INTEGER,
DIMENSION(:),
INTENT(OUT) :: a_d
789 INTEGER,
INTENT(OUT) :: n_a_d
790 INTEGER :: n, na, inc, i, j, k, ia
812 DO WHILE (a(j-inc) > ia)
826 IF (a(k) > a(k-1))
THEN 831 WRITE(*,*)
'We have a problem in the compression phase of tri_jlg', a(k), a(k-1)
838 a_d(n_a_d + 1 : na) = 0
subroutine, public st_csr_block(n_b, in, out)
subroutine, public extract(xghost, ks, ke, LA, phi)
subroutine, public create_my_ghost(mesh, LA, ifrom)
subroutine, public st_aij_csr(jj, aij)
subroutine error_petsc(string)
subroutine, public st_aij_csr_loc_block(communicator, kmax, mesh, LA)
subroutine, public st_csr_bloc(ia, ja, ia_b, ja_b, n_b)
subroutine block_index(communicator, kmax, mesh, loc_to_glob_LA)
subroutine, public st_csr(jj, ia, ja)
subroutine, public st_aij_csr_glob_block(communicator, kmax, mesh_glob, mesh, LA, opt_per)
subroutine, public tri_jlg(a, a_d, n_a_d)