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
36 REAL(KIND=8),
DIMENSION(:),
INTENT(OUT):: phi
39 INTEGER :: k, start, fin, nbghost, s,
f
41 #include "petsc/finclude/petscvec.h90"
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)
67 INTEGER,
INTENT(IN) :: kmax
68 INTEGER,
DIMENSION(:,:),
POINTER :: loc_to_glob_la
69 INTEGER,
DIMENSION(:),
POINTER :: dom_np, disp
70 INTEGER :: code, nb_procs, rank
71 INTEGER :: i, p, n, k, i_loc, proc, iglob
73 mpi_comm :: communicator
75 CALL mpi_comm_size(communicator,nb_procs,code)
76 CALL mpi_comm_rank(communicator,rank,code)
77 ALLOCATE(dom_np(nb_procs) ,disp(nb_procs+1))
78 CALL mpi_allgather(mesh%dom_np, 1, mpi_integer, dom_np, 1, &
79 mpi_integer, communicator ,code)
82 disp(n+1) = disp(n) + dom_np(n)
84 IF (
ASSOCIATED(mesh%disp))
THEN
87 IF (
ASSOCIATED(mesh%domnp))
THEN
90 ALLOCATE(mesh%disp(nb_procs+1))
91 ALLOCATE(mesh%domnp(nb_procs))
95 ALLOCATE(loc_to_glob_la(kmax,mesh%np))
100 loc_to_glob_la(k,i) = kmax*(disp(proc)-1)+(k-1)*dom_np(proc)+i
127 DO i = mesh%dom_np + 1, mesh%np
128 iglob = mesh%loc_to_glob(i)
130 IF (disp(p) > iglob)
THEN
135 i_loc = iglob - disp(proc) + 1
137 loc_to_glob_la(k,i) = kmax*(disp(proc)-1)+(k-1)*dom_np(proc)+i_loc
159 DEALLOCATE(dom_np,disp)
171 TYPE(mesh_type),
INTENT(IN) :: mesh_glob,mesh
172 INTEGER,
INTENT(IN) :: kmax
176 INTEGER :: me, nw, nmax, np, knp, ki, kj, k, njt, i1, i2
177 INTEGER :: m, ni, nj, i, j, n_a_d, iloc, jloc, jglob, nb_procs, p, proc=-1
178 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ja_work
179 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nja, a_d
180 INTEGER,
DIMENSION(SIZE(mesh_glob%jj,1)) :: jj_loc
181 INTEGER,
DIMENSION(:),
ALLOCATABLE :: per_loc
184 mpi_comm :: communicator
186 CALL
block_index(communicator,kmax,mesh,la%loc_to_glob)
187 nw =
SIZE(mesh%jj, 1)
191 nb_procs =
SIZE(mesh%domnp)
194 ALLOCATE(la%dom_np(kmax),la%np(kmax))
195 la%dom_np(:) = mesh%dom_np
199 ALLOCATE(la%ia(0:0),la%ja(0))
204 ALLOCATE (ja_work(knp,kmax*nparm), a_d(kmax*nparm), nja(knp))
205 ALLOCATE (per_loc(knp))
210 ja_work((ki-1)*np+i,1) = la%loc_to_glob(ki,i)
214 DO m = 1, mesh_glob%me
215 jj_loc = mesh_glob%jj(:,m)
216 IF (maxval(jj_loc)< mesh%loc_to_glob(1) .OR. minval(jj_loc)> mesh%loc_to_glob(1) + mesh%np -1) cycle
218 iloc = jj_loc(ni)-mesh%loc_to_glob(1)+1
219 IF (iloc<1 .OR. iloc>np) cycle
224 IF (jglob< mesh%loc_to_glob(1) .OR. jglob> mesh%loc_to_glob(2))
THEN
226 IF (mesh%disp(p) > jglob)
THEN
232 jloc = jglob - mesh%disp(proc) + 1
235 jloc = jglob - mesh%loc_to_glob(1) + 1
239 j = kmax*(mesh%disp(proc)-1)+(kj-1)*mesh%domnp(proc)+jloc
241 j = la%loc_to_glob(kj,jloc)
244 IF (minval(abs(ja_work(i,1:nja(i))-j)) /= 0)
THEN
246 ja_work(i,nja(i)) = j
254 IF (present(opt_per))
THEN
255 DO k = 1, opt_per%n_bord
256 DO i = 1,
SIZE(opt_per%list(k)%DIL)
258 i1 = opt_per%list(k)%DIL(i)
259 i2 = opt_per%perlist(k)%DIL(i)
260 njt = nja(i1)+nja(i2)
261 IF (njt > kmax*nparm)
THEN
262 CALL
error_petsc(
'BUG in st_aij_glob_block, SIZE(ja) not large enough')
264 per_loc(1:nja(i1)) = ja_work(i1,1:nja(i1))
265 per_loc(nja(i1)+1:nja(i1)+nja(i2)) = ja_work(i2,1:nja(i2))
268 ja_work(i1,1:njt) = per_loc(1:njt)
269 ja_work(i2,1:njt) = per_loc(1:njt)
274 IF (maxval(nja)>nparm)
THEN
275 WRITE(*,*)
'ST_SPARSEKIT: dimension de ja doit etre >= ',nparm
283 ALLOCATE(la%ia(0:knp),la%ja(0:nmax-1))
286 CALL
tri_jlg(ja_work(i,1:nja(i)), a_d, n_a_d)
287 IF (n_a_d /= nja(i))
THEN
288 WRITE(*,*)
' BUG : st_p1_CSR'
289 WRITE(*,*)
'n_a_d ', n_a_d,
'nja(i)', nja(i)
292 la%ia(i) = la%ia(i-1) + nja(i)
293 la%ja(la%ia(i-1):la%ia(i)-1) = a_d(1:nja(i))-1
295 DEALLOCATE (ja_work, nja, a_d )
418 INTEGER,
INTENT(IN) :: kmax
421 INTEGER :: me, nw, nmax, np, knp, ki, kj
422 INTEGER :: m, ni, nj, i, j, n_a_d, iloc
423 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ja_work
424 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nja, a_d
425 INTEGER,
DIMENSION(SIZE(mesh%jj,1)) :: j_loc
427 mpi_comm :: communicator
429 CALL
block_index(communicator,kmax,mesh,la%loc_to_glob)
430 nw =
SIZE(mesh%jj, 1)
434 ALLOCATE (ja_work(knp,kmax*nparm), a_d(kmax*nparm), nja(knp))
439 ja_work((ki-1)*np+i,1) = la%loc_to_glob(ki,i)
452 j = la%loc_to_glob(kj,j_loc(nj))
453 IF (minval(abs(ja_work(i,1:nja(i))-j)) /= 0)
THEN
455 ja_work(i,nja(i)) = j
463 IF (maxval(nja)>nparm)
THEN
464 WRITE(*,*)
'ST_SPARSEKIT: dimension de ja doit etre >= ',nparm
472 ALLOCATE(la%ia(0:knp),la%ja(0:nmax-1))
475 CALL
tri_jlg(ja_work(i,1:nja(i)), a_d, n_a_d)
476 IF (n_a_d /= nja(i))
THEN
477 WRITE(*,*)
' BUG : st_p1_CSR'
478 WRITE(*,*)
'n_a_d ', n_a_d,
'nja(i)', nja(i)
481 la%ia(i) = la%ia(i-1) + nja(i)
482 la%ja(la%ia(i-1):la%ia(i)-1) = a_d(1:nja(i))-1
484 DEALLOCATE (ja_work, nja, a_d )
495 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: jj
497 INTEGER :: me, nw, nmax, np
498 INTEGER :: m, ni, nj, i, j, n_a_d
499 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ja_work
500 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nja, a_d
505 ALLOCATE (ja_work(np,nparm), aij%ia(np+1), a_d(nparm), nja(np))
517 IF (minval(abs(ja_work(i,1:nja(i))-j)) /= 0)
THEN
519 ja_work(i,nja(i)) = j
525 IF (maxval(nja)>nparm)
THEN
526 WRITE(*,*)
'ST_SPARSEKIT: dimension de ja doit etre >= ',nparm
534 ALLOCATE(aij%ja(nmax))
537 CALL
tri_jlg(ja_work(i,1:nja(i)), a_d, n_a_d)
538 IF (n_a_d /= nja(i))
THEN
539 WRITE(*,*)
' BUG : st_p1_CSR'
540 WRITE(*,*)
'n_a_d ', n_a_d,
'nja(i)', nja(i)
543 aij%ia(i+1) = aij%ia(i) + nja(i)
544 aij%ja(aij%ia(i):aij%ia(i+1)-1) = a_d(1:nja(i))
546 DEALLOCATE ( ja_work, nja, a_d )
559 INTEGER,
INTENT(IN) :: n_b
560 INTEGER :: ki, kj, i, ib, jb, p, pb, bloc_size, np, nnz
563 nnz = in%ia(np+1) - in%ia(1)
564 ALLOCATE (out%ia(n_b*np+1), out%ja(n_b*n_b*nnz))
566 bloc_size =
SIZE(in%ia) - 1
571 DO i = 2, bloc_size + 1
572 ib = i + (ki-1)*bloc_size
573 out%ia(ib) = out%ia(ib-1) + n_b*(in%ia(i) - in%ia(i-1))
579 ib = i + (ki-1)*bloc_size
582 DO p = in%ia(i), in%ia(i+1) - 1
583 jb = in%ja(p) + (kj-1)*bloc_size
585 pb = out%ia(ib) + p - in%ia(i) + (kj-1)*(in%ia(i+1)-in%ia(i))
601 INTEGER,
DIMENSION(:),
INTENT(IN) :: ia, ja
602 INTEGER,
DIMENSION(:),
POINTER :: ia_b, ja_b
603 INTEGER,
INTENT(IN) :: n_b
604 INTEGER :: ki, kj, i, ib, jb, p, pb, bloc_size, np, nnz
607 nnz = ia(np+1) - ia(1)
608 ALLOCATE (ia_b(n_b*np+1), ja_b(n_b*n_b*nnz))
610 bloc_size =
SIZE(ia) - 1
615 DO i = 2, bloc_size + 1
616 ib = i + (ki-1)*bloc_size
617 ia_b(ib) = ia_b(ib-1) + n_b*(ia(i) - ia(i-1))
623 ib = i + (ki-1)*bloc_size
626 DO p = ia(i), ia(i+1) - 1
627 jb = ja(p) + (kj-1)*bloc_size
629 pb = ia_b(ib) + p - ia(i) + (kj-1)*(ia(i+1)-ia(i))
645 INTEGER,
DIMENSION(:,:),
INTENT(IN) :: jj
646 INTEGER,
DIMENSION(:),
POINTER :: ia, ja
648 INTEGER :: me, nw, nmax, np
649 INTEGER :: m, ni, nj, i, j, n_a_d
650 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ja_work
651 INTEGER,
DIMENSION(:),
ALLOCATABLE :: nja, a_d
657 ALLOCATE (ja_work(np,nparm), ia(np+1), a_d(nparm), nja(np))
671 IF (minval(abs(ja_work(i,1:nja(i))-j)) /= 0)
THEN
673 ja_work(i,nja(i)) = j
681 IF (maxval(nja)>nparm)
THEN
682 WRITE(*,*)
'ST_SPARSEKIT: dimension de ja doit etre >= ',nparm
694 CALL
tri_jlg(ja_work(i,1:nja(i)), a_d, n_a_d)
695 IF (n_a_d /= nja(i))
THEN
696 WRITE(*,*)
' BUG : st_p1_CSR'
697 WRITE(*,*)
'n_a_d ', n_a_d,
'nja(i)', nja(i)
700 ia(i+1) = ia(i) + nja(i)
701 ja(ia(i):ia(i+1)-1) = a_d(1:nja(i))
705 DEALLOCATE ( ja_work, nja, a_d )
786 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: a
787 INTEGER,
DIMENSION(:),
INTENT(OUT) :: a_d
788 INTEGER,
INTENT(OUT) :: n_a_d
789 INTEGER :: n, na, inc, i, j, k, ia
811 DO WHILE (a(j-inc) > ia)
825 IF (a(k) > a(k-1))
THEN
830 WRITE(*,*)
'We have a problem in the compression phase of tri_jlg', a(k), a(k-1)
837 a_d(n_a_d + 1 : na) = 0
subroutine, public st_csr_bloc(ia, ja, ia_b, ja_b, n_b)
subroutine, public create_my_ghost(mesh, LA, ifrom)
subroutine, public st_aij_csr_loc_block(communicator, kmax, mesh, LA)
subroutine block_index(communicator, kmax, mesh, loc_to_glob_LA)
section doc_intro_frame_work_num_app Numerical approximation subsection doc_intro_fram_work_num_app_Fourier_FEM Fourier Finite element representation The SFEMaNS code uses a hybrid Fourier Finite element formulation The Fourier decomposition allows to approximate the problem’s solutions for each Fourier mode modulo nonlinear terms that are made explicit The variables are then approximated on a meridian section of the domain with a finite element method The numerical approximation of a function f $f f is written in the following generic f with f(r,\theta, z)\f $the cylindrical coordinates
subroutine, public st_aij_csr(jj, aij)
subroutine, public tri_jlg(a, a_d, n_a_d)
subroutine, public st_aij_csr_glob_block(communicator, kmax, mesh_glob, mesh, LA, opt_per)
subroutine, public st_csr_block(n_b, in, out)
subroutine error_petsc(string)
subroutine, public st_csr(jj, ia, ja)
subroutine, public extract(xghost, ks, ke, LA, phi)