5 #include "petsc/finclude/petsc.h"
10 phi_mesh_glob, phi_mesh, interface_glob, interface_h_mu_glob, &
11 la_h, la_pmag, la_phi, la_mhd, opt_per)
16 TYPE(mesh_type),
INTENT(IN) :: h_mesh_glob, pmag_mesh_glob, phi_mesh_glob
17 TYPE(mesh_type),
INTENT(IN) :: h_mesh, pmag_mesh, phi_mesh
18 TYPE(interface_type),
INTENT(IN) :: interface_glob, interface_h_mu_glob
20 TYPE(petsc_csr_la),
INTENT(OUT):: la_h, la_pmag, la_phi, la_mhd
21 INTEGER,
PARAMETER :: param=200
22 INTEGER,
DIMENSION(param) :: a_d
23 INTEGER,
DIMENSION(SIZE(H_mesh_glob%jj,1)) :: jj_loc, jj_loc1, jj_loc2
24 INTEGER,
DIMENSION(:,:),
POINTER :: ja_work
25 INTEGER,
DIMENSION(:),
POINTER :: nja_glob
26 INTEGER :: np_glob, np_h, np_pmag, np_phi, np_m, code, rank, dp, n_a_d, &
27 iglob, jglob, iloc, jloc, ni, nj, ci, m, mi, mj, m1, m2, i ,j, k, ki, kj, &
28 jmin, jmax, p, nnz, p_i, p_f, ms, nb_procs, proc
30 INTEGER,
DIMENSION(:),
ALLOCATABLE :: per_loc
31 INTEGER :: njt, i1, i2
32 mpi_comm :: communicator
34 CALL mpi_comm_rank(communicator,rank,code)
35 CALL mpi_comm_size(communicator,nb_procs,code)
42 np_h = 3*h_mesh%dom_np
43 np_pmag = pmag_mesh%dom_np
44 np_phi = phi_mesh%dom_np
45 np_glob = np_h + np_pmag + np_phi
50 dp = 3*(h_mesh%disp(rank+1)-1)+(pmag_mesh%disp(rank+1)-1)+(phi_mesh%disp(rank+1)-1)
71 CALL
search_index_block(h_mesh, la_h%loc_to_glob(k,i),rank, 3, nb_procs, iloc, proc, out)
72 la_h%loc_to_glob(k,i) = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1)+ iloc
76 DO i = 1, pmag_mesh%np
77 CALL
search_index_block(pmag_mesh, la_pmag%loc_to_glob(1,i),rank, 1, nb_procs, iloc, proc, out)
78 la_pmag%loc_to_glob(1,i) =3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) &
79 + 3*h_mesh%domnp(proc) + iloc
82 CALL
search_index_block(phi_mesh, la_phi%loc_to_glob(1,i), rank, 1, nb_procs, iloc, proc, out)
83 la_phi%loc_to_glob(1,i) =3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) &
84 + 3*h_mesh%domnp(proc) +pmag_mesh%domnp(proc) + iloc
89 ALLOCATE(ja_work(np_glob,param),nja_glob(np_glob))
90 ALLOCATE(per_loc(2*param))
94 IF (h_mesh%me /=0)
THEN
95 DO m = 1, h_mesh_glob%me
96 DO ni = 1,
SIZE(h_mesh%jj,1)
97 iglob = h_mesh_glob%jj(ni,m)
98 IF (iglob<h_mesh%loc_to_glob(1) .OR. iglob>h_mesh%loc_to_glob(1) + h_mesh%dom_np -1) cycle
99 DO nj = 1,
SIZE(h_mesh%jj,1)
100 jglob = h_mesh_glob%jj(nj,m)
104 j = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) + (kj-1)*h_mesh%domnp(proc) &
107 j = la_h%loc_to_glob(kj,jloc)
110 i = iglob - h_mesh%loc_to_glob(1)+1 + (ki-1)*np_m
111 IF (minval(abs(ja_work(i,1:nja_glob(i))-j)) /= 0)
THEN
112 nja_glob(i) = nja_glob(i) + 1
113 ja_work(i,nja_glob(i)) = j
127 nnz = la_pmag%ia(i) - la_pmag%ia(i-1)
128 p_i = la_pmag%ia(i-1)
129 p_f = la_pmag%ia(i)-1
131 jglob = la_pmag%ja(p)+1
134 j = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) + 3*h_mesh%domnp(proc) + jloc
136 j = la_pmag%loc_to_glob(1,jloc)
138 ja_work(iglob,p-p_i+1) = j
140 nja_glob(iglob) = nnz
146 iglob = i + np_h + np_pmag
147 nnz = la_phi%ia(i) - la_phi%ia(i-1)
151 jglob = la_phi%ja(p)+1
154 j = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) &
155 + 3*h_mesh%domnp(proc) + pmag_mesh%domnp(proc) + jloc
157 j = la_phi%loc_to_glob(1,jloc)
159 ja_work(iglob,p-p_i+1) = j
161 nja_glob(iglob) = nnz
166 nullify(la_h%ia,la_h%ja,la_pmag%ia,la_pmag%ja,la_phi%ia,la_phi%ja)
170 IF (h_mesh%me /=0)
THEN
171 DO m = 1, h_mesh_glob%me
172 jj_loc = h_mesh_glob%jj(:,m)
173 IF (maxval(jj_loc)<h_mesh%loc_to_glob(1) .OR. minval(jj_loc)>h_mesh%loc_to_glob(1) + h_mesh%dom_np -1) cycle
174 DO ni = 1,
SIZE(h_mesh%jj,1)
177 DO nj = 1,
SIZE(pmag_mesh%jj,1)
178 jglob = pmag_mesh_glob%jj(nj,m)
179 CALL
search_index(pmag_mesh,jglob,nb_procs,jloc,proc,out)
181 j = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) + 3*h_mesh%domnp(proc) + jloc
183 j = la_pmag%loc_to_glob(1,jloc)
186 IF (iglob.GE.h_mesh%loc_to_glob(1) .AND. iglob.LE.h_mesh%loc_to_glob(1) + h_mesh%dom_np -1)
THEN
187 i = iglob - h_mesh%loc_to_glob(1)+1
188 IF (minval(abs(ja_work(i,1:nja_glob(i))-j)) /= 0)
THEN
189 nja_glob(i) = nja_glob(i) + 1
190 nja_glob(i+np_m) = nja_glob(i+np_m) + 1
191 nja_glob(i+2*np_m) = nja_glob(i+2*np_m) + 1
192 ja_work(i,nja_glob(i)) = j
193 ja_work(i+np_m,nja_glob(i+np_m)) = j
194 ja_work(i+2*np_m,nja_glob(i+2*np_m)) = j
203 j = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) &
204 + (k-1)*h_mesh%domnp(proc) + iloc
206 j = la_h%loc_to_glob(k,iloc)
208 IF (minval(abs(ja_work(i,1:nja_glob(i))-j)) /= 0)
THEN
209 nja_glob(i) = nja_glob(i) + 1
210 ja_work(i,nja_glob(i)) = j
222 IF (h_mesh%me /=0)
THEN
223 DO ms = 1, interface_h_mu_glob%mes
224 m1 = h_mesh_glob%neighs(interface_h_mu_glob%mesh1(ms))
225 m2 = h_mesh_glob%neighs(interface_h_mu_glob%mesh2(ms))
227 jj_loc1 = h_mesh_glob%jj(:,m1)
228 jj_loc2 = h_mesh_glob%jj(:,m2)
229 jmin = min(minval(jj_loc1),minval(jj_loc2))
230 jmax = max(maxval(jj_loc1),maxval(jj_loc2))
232 IF (jmax<h_mesh%loc_to_glob(1) .OR. jmin>h_mesh%loc_to_glob(1) + h_mesh%dom_np -1) cycle
243 DO ni = 1,
SIZE(h_mesh%jj,1)
244 iglob = h_mesh_glob%jj(ni,mi)
245 IF (iglob < h_mesh%loc_to_glob(1) .OR. iglob > h_mesh%loc_to_glob(1) + h_mesh%dom_np -1) cycle
247 DO nj = 1,
SIZE(h_mesh%jj,1)
248 jglob = h_mesh_glob%jj(nj,mj)
252 j = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) &
253 + (kj-1)*h_mesh%domnp(proc) + jloc
255 j = la_h%loc_to_glob(kj,jloc)
258 i = iglob - h_mesh%loc_to_glob(1) + 1 + (ki-1)*np_m
259 IF (minval(abs(ja_work(i,1:nja_glob(i))-j)) == 0) cycle
260 nja_glob(i) = nja_glob(i) + 1
261 ja_work(i,nja_glob(i)) = j
272 IF (h_mesh%me*phi_mesh%me /=0)
THEN
273 DO ms = 1, interface_glob%mes
274 m1 = h_mesh_glob%neighs(interface_glob%mesh1(ms))
275 m2 = phi_mesh_glob%neighs(interface_glob%mesh2(ms))
277 DO ni = 1,
SIZE(h_mesh%jj,1)
278 iglob = h_mesh_glob%jj(ni,m1)
279 IF (iglob < h_mesh%loc_to_glob(1) .OR. iglob > h_mesh%loc_to_glob(1) + h_mesh%dom_np -1) cycle
281 DO nj = 1,
SIZE(phi_mesh%jj,1)
282 jglob = phi_mesh_glob%jj(nj,m2)
283 CALL
search_index(phi_mesh,jglob,nb_procs,jloc,proc,out)
285 j = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) &
286 + 3*h_mesh%domnp(proc) + pmag_mesh%domnp(proc) + jloc
288 j = la_phi%loc_to_glob(1,jloc)
291 i = iglob - h_mesh%loc_to_glob(1) + 1 + (ki-1)*np_m
292 IF (minval(abs(ja_work(i,1:nja_glob(i))-j)) == 0) cycle
293 nja_glob(i) = nja_glob(i) + 1
294 ja_work(i,nja_glob(i)) = j
299 DO ni = 1,
SIZE(phi_mesh%jj,1)
300 iglob = phi_mesh_glob%jj(ni,m2)
301 IF (iglob < phi_mesh%loc_to_glob(1) .OR. iglob > phi_mesh%loc_to_glob(1) + phi_mesh%dom_np -1) cycle
302 i = iglob - phi_mesh%loc_to_glob(1) + 1 + np_h + np_pmag
303 DO nj = 1,
SIZE(h_mesh%jj,1)
304 jglob = h_mesh_glob%jj(nj,m1)
308 j = 3*(h_mesh%disp(proc)-1)+(pmag_mesh%disp(proc)-1)+(phi_mesh%disp(proc)-1) &
309 + (kj-1)*h_mesh%domnp(proc) + jloc
311 j = la_h%loc_to_glob(kj,jloc)
313 IF (minval(abs(ja_work(i,1:nja_glob(i))-j)) == 0) cycle
314 nja_glob(i) = nja_glob(i) + 1
315 ja_work(i,nja_glob(i)) = j
323 IF (present(opt_per))
THEN
324 DO k = 1, opt_per%n_bord
325 DO i = 1,
SIZE(opt_per%list(k)%DIL)
327 i1 = opt_per%list(k)%DIL(i)
328 i2 = opt_per%perlist(k)%DIL(i)
329 njt = nja_glob(i1)+nja_glob(i2)
330 IF (njt > param)
THEN
331 CALL
error_petsc(
'BUG in st_aij_glob_block, SIZE(ja) not large enough')
333 per_loc(1:nja_glob(i1)) = ja_work(i1,1:nja_glob(i1))
334 per_loc(nja_glob(i1)+1:njt) = ja_work(i2,1:nja_glob(i2))
337 ja_work(i1,1:njt) = per_loc(1:njt)
338 ja_work(i2,1:njt) = per_loc(1:njt)
345 IF (maxval(nja_glob)>param)
THEN
346 CALL
error_petsc(
'ST_SPARSEKIT: dimension of ja must be >= nparm')
351 ALLOCATE(la_mhd%ia(0:np_glob),la_mhd%ja(0:nnz-1))
354 CALL
tri_jlg(ja_work(i,1:nja_glob(i)), a_d, n_a_d)
355 IF (n_a_d /= nja_glob(i))
THEN
356 CALL
error_petsc(
' BUG in st_scr_maxwell_mu_H_p_phi')
358 la_mhd%ia(i) = la_mhd%ia(i-1) + nja_glob(i)
359 la_mhd%ja(la_mhd%ia(i-1):la_mhd%ia(i)-1) = a_d(1:nja_glob(i))-1
362 ALLOCATE(la_mhd%dom_np(5),la_mhd%np(5))
364 la_mhd%dom_np(1:3) = h_mesh%dom_np
365 la_mhd%np(1:3) = h_mesh%np
366 la_mhd%dom_np(4) = pmag_mesh%dom_np
367 la_mhd%np(4) = pmag_mesh%np
368 la_mhd%dom_np(5) = phi_mesh%dom_np
369 la_mhd%np(5) = phi_mesh%np
371 IF (
ASSOCIATED(la_mhd%loc_to_glob))
DEALLOCATE(la_mhd%loc_to_glob)
372 ALLOCATE(la_mhd%loc_to_glob(1,np_glob))
373 np_h = 3*h_mesh%dom_np
374 np_pmag = pmag_mesh%dom_np
375 np_phi = phi_mesh%dom_np
379 la_mhd%loc_to_glob(1,(j-1)*np_m+i) = la_h%loc_to_glob(j,i)
383 la_mhd%loc_to_glob(1,np_h+i) = la_pmag%loc_to_glob(1,i)
386 la_mhd%loc_to_glob(1,np_h+np_pmag+i) = la_phi%loc_to_glob(1,i)
389 DEALLOCATE (ja_work, nja_glob)
422 INTEGER ,
INTENT(IN) :: jglob, nb_procs
423 INTEGER ,
INTENT(OUT):: jloc, proc
424 LOGICAL,
INTENT(OUT):: out
427 IF (mesh%dom_np == 0)
THEN
429 IF (mesh%disp(p) > jglob)
THEN
435 jloc = jglob - mesh%disp(proc) + 1
436 ELSE IF (jglob< mesh%loc_to_glob(1) .OR. jglob> mesh%loc_to_glob(mesh%dom_np))
THEN
438 IF (mesh%disp(p) > jglob)
THEN
444 jloc = jglob - mesh%disp(proc) + 1
447 jloc = jglob - mesh%loc_to_glob(1) + 1
455 INTEGER,
INTENT(IN) :: jglob,rank, kmax, nb_procs
456 INTEGER,
INTENT(OUT) :: jloc, proc
457 LOGICAL,
INTENT(OUT) :: out
463 IF (kmax*(mesh%disp(p)-1) .GE. jglob)
THEN
469 IF (out) proc = nb_procs
471 jloc = jglob - kmax*(mesh%disp(proc)-1)
472 out = (proc /= rank+1)
subroutine search_index_block(mesh, jglob, rank, kmax, nb_procs, jloc, proc, out)
subroutine, public st_scr_maxwell_mu_h_p_phi(communicator, H_mesh_glob, H_mesh, pmag_mesh_glob, pmag_mesh, phi_mesh_glob, phi_mesh, interface_glob, interface_H_mu_glob, LA_H, LA_pmag, LA_phi, LA_mhd, opt_per)
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 search_index(mesh, jglob, nb_procs, jloc, proc, out)
subroutine error_petsc(string)