21 integer(kind=kint) :: N
22 real(kind=
kreal),
pointer :: dlu0(:) => null()
23 real(kind=
kreal),
pointer :: allu0(:) => null()
24 real(kind=
kreal),
pointer :: aulu0(:) => null()
25 integer(kind=kint),
pointer :: inumFI1L(:) => null()
26 integer(kind=kint),
pointer :: inumFI1U(:) => null()
27 integer(kind=kint),
pointer :: FI1L(:) => null()
28 integer(kind=kint),
pointer :: FI1U(:) => null()
30 logical,
save :: INITIALIZED = .false.
37 integer(kind=kint ) :: np, npu, npl
38 integer(kind=kint ) :: precond
39 real (kind=
kreal) :: sigma, sigma_diag
41 real(kind=
kreal),
pointer :: d(:)
42 real(kind=
kreal),
pointer :: al(:)
43 real(kind=
kreal),
pointer :: au(:)
45 integer(kind=kint ),
pointer :: inl(:), inu(:)
46 integer(kind=kint ),
pointer :: ial(:)
47 integer(kind=kint ),
pointer :: iau(:)
50 if (hecmat%Iarray(98) == 1)
then
52 else if (hecmat%Iarray(97) == 1)
then
76 & (n, np, npl, npu, d, al, inl, ial, au, inu, iau, &
87 real(kind=
kreal),
intent(inout) :: ww(:)
88 integer(kind=kint) :: i, j, isl, iel, isu, ieu, k
89 real(kind=
kreal) :: sw1, sw2, sw3, sw4, x1, x2, x3, x4
106 sw1= sw1 - allu0(16*j-15)*x1-allu0(16*j-14)*x2-allu0(16*j-13)*x3-allu0(16*j-12)*x4
107 sw2= sw2 - allu0(16*j-11)*x1-allu0(16*j-10)*x2-allu0(16*j- 9)*x3-allu0(16*j- 8)*x4
108 sw3= sw3 - allu0(16*j- 7)*x1-allu0(16*j- 6)*x2-allu0(16*j- 5)*x3-allu0(16*j- 4)*x4
109 sw4= sw4 - allu0(16*j- 3)*x1-allu0(16*j- 2)*x2-allu0(16*j- 1)*x3-allu0(16*j )*x4
116 x2= x2 - dlu0(16*i-11)*x1
117 x3= x3 - dlu0(16*i- 7)*x1 - dlu0(16*i-6)*x2
118 x4= x4 - dlu0(16*i- 3)*x1 - dlu0(16*i-2)*x2 - dlu0(16*i-1)*x3
120 x3= dlu0(16*i- 5)*(x3 - dlu0(16*i- 4)*x4)
121 x2= dlu0(16*i-10)*(x2 - dlu0(16*i- 8)*x4 - dlu0(16*i- 9)*x3 )
122 x1= dlu0(16*i-15)*(x1 - dlu0(16*i-12)*x4 - dlu0(16*i-13)*x3 - dlu0(16*i-14)*x2)
134 isu= inumfi1u(i-1) + 1
146 sw1= sw1 + aulu0(16*j-15)*x1+aulu0(16*j-14)*x2+aulu0(16*j-13)*x3+aulu0(16*j-12)*x4
147 sw2= sw2 + aulu0(16*j-11)*x1+aulu0(16*j-10)*x2+aulu0(16*j- 9)*x3+aulu0(16*j- 8)*x4
148 sw3= sw3 + aulu0(16*j- 7)*x1+aulu0(16*j- 6)*x2+aulu0(16*j- 5)*x3+aulu0(16*j- 4)*x4
149 sw4= sw4 + aulu0(16*j- 3)*x1+aulu0(16*j- 2)*x2+aulu0(16*j- 1)*x3+aulu0(16*j )*x4
155 x2= x2 - dlu0(16*i-11)*x1
156 x3= x3 - dlu0(16*i- 7)*x1 - dlu0(16*i-6)*x2
157 x4= x4 - dlu0(16*i- 3)*x1 - dlu0(16*i-2)*x2 - dlu0(16*i-1)*x3
159 x3= dlu0(16*i- 5)*( x3 - dlu0(16*i- 4)*x4 )
160 x2= dlu0(16*i-10)*( x2 - dlu0(16*i- 8)*x4 - dlu0(16*i- 9)*x3 )
161 x1= dlu0(16*i-15)*( x1 - dlu0(16*i-12)*x4 - dlu0(16*i-13)*x3 - dlu0(16*i-14)*x2)
162 ww(4*i-3)= ww(4*i-3) - x1
163 ww(4*i-2)= ww(4*i-2) - x2
164 ww(4*i-1)= ww(4*i-1) - x3
165 ww(4*i )= ww(4*i ) - x4
171 if (
associated(dlu0))
deallocate(dlu0)
172 if (
associated(allu0))
deallocate(allu0)
173 if (
associated(aulu0))
deallocate(aulu0)
174 if (
associated(inumfi1l))
deallocate(inumfi1l)
175 if (
associated(inumfi1u))
deallocate(inumfi1u)
176 if (
associated(fi1l))
deallocate(fi1l)
177 if (
associated(fi1u))
deallocate(fi1u)
185 initialized = .false.
195 subroutine form_ilu0_44 &
196 & (n, np, npl, npu, d, al, inl, ial, au, inu, iau, &
199 integer(kind=kint ),
intent(in):: n, np, npu, npl
200 real (kind=
kreal),
intent(in):: sigma, sigma_diag
202 real(kind=
kreal),
dimension(16*NPL),
intent(in):: al
203 real(kind=
kreal),
dimension(16*NPU),
intent(in):: au
204 real(kind=
kreal),
dimension(16*NP ),
intent(in):: d
206 integer(kind=kint ),
dimension(0:NP) ,
intent(in) :: inu, inl
207 integer(kind=kint ),
dimension( NPL),
intent(in) :: ial
208 integer(kind=kint ),
dimension( NPU),
intent(in) :: iau
210 integer(kind=kint),
dimension(:),
allocatable :: iw1, iw2
211 real (kind=
kreal),
dimension(4,4) :: rhs_aij, dkinv, aik, akj
212 integer(kind=kint) :: i,jj,jj1,ij0,kk,kk1
213 integer(kind=kint) :: j,k
214 allocate (iw1(np) , iw2(np))
215 allocate(dlu0(9*np), allu0(9*npl), aulu0(9*npu))
216 allocate(inumfi1l(0:np), inumfi1u(0:np), fi1l(npl), fi1u(npu))
244 dlu0(16*i-15)=dlu0(16*i-15)*sigma_diag
245 dlu0(16*i-10)=dlu0(16*i-10)*sigma_diag
246 dlu0(16*i- 5)=dlu0(16*i- 5)*sigma_diag
247 dlu0(16*i )=dlu0(16*i )*sigma_diag
251 call ilu1a44 (dkinv, &
252 dlu0(16*i-15), dlu0(16*i-14), dlu0(16*i-13), dlu0(16*i-12), &
253 dlu0(16*i-11), dlu0(16*i-10), dlu0(16*i- 9), dlu0(16*i- 8), &
254 dlu0(16*i- 7), dlu0(16*i- 6), dlu0(16*i- 5), dlu0(16*i- 4), &
255 dlu0(16*i- 3), dlu0(16*i- 2), dlu0(16*i- 1), dlu0(16*i ) )
256 dlu0(16*i-15)= dkinv(1,1)
257 dlu0(16*i-14)= dkinv(1,2)
258 dlu0(16*i-13)= dkinv(1,3)
259 dlu0(16*i-12)= dkinv(1,4)
260 dlu0(16*i-11)= dkinv(2,1)
261 dlu0(16*i-10)= dkinv(2,2)
262 dlu0(16*i- 9)= dkinv(2,3)
263 dlu0(16*i- 8)= dkinv(2,4)
264 dlu0(16*i- 7)= dkinv(3,1)
265 dlu0(16*i- 6)= dkinv(3,2)
266 dlu0(16*i- 5)= dkinv(3,3)
267 dlu0(16*i- 4)= dkinv(3,4)
268 dlu0(16*i- 3)= dkinv(4,1)
269 dlu0(16*i- 2)= dkinv(4,2)
270 dlu0(16*i- 1)= dkinv(4,3)
271 dlu0(16*i )= dkinv(4,4)
277 do k= inumfi1l(i-1)+1, inumfi1l(i)
281 do k= inumfi1u(i-1)+1, inumfi1u(i)
285 do kk= inl(i-1)+1, inl(i)
288 dkinv(1,1)= dlu0(16*k-15)
289 dkinv(1,2)= dlu0(16*k-14)
290 dkinv(1,3)= dlu0(16*k-13)
291 dkinv(1,4)= dlu0(16*k-12)
292 dkinv(2,1)= dlu0(16*k-11)
293 dkinv(2,2)= dlu0(16*k-10)
294 dkinv(2,3)= dlu0(16*k- 9)
295 dkinv(2,4)= dlu0(16*k- 8)
296 dkinv(3,1)= dlu0(16*k- 7)
297 dkinv(3,2)= dlu0(16*k- 6)
298 dkinv(3,3)= dlu0(16*k- 5)
299 dkinv(3,4)= dlu0(16*k- 4)
300 dkinv(4,1)= dlu0(16*k- 3)
301 dkinv(4,2)= dlu0(16*k- 2)
302 dkinv(4,3)= dlu0(16*k- 1)
303 dkinv(4,4)= dlu0(16*k )
305 aik(1,1)= allu0(16*kk-15)
306 aik(1,2)= allu0(16*kk-14)
307 aik(1,3)= allu0(16*kk-13)
308 aik(1,4)= allu0(16*kk-12)
309 aik(2,1)= allu0(16*kk-11)
310 aik(2,2)= allu0(16*kk-10)
311 aik(2,3)= allu0(16*kk- 9)
312 aik(2,4)= allu0(16*kk- 8)
313 aik(3,1)= allu0(16*kk- 7)
314 aik(3,2)= allu0(16*kk- 6)
315 aik(3,3)= allu0(16*kk- 5)
316 aik(3,4)= allu0(16*kk- 4)
317 aik(4,1)= allu0(16*kk- 3)
318 aik(4,2)= allu0(16*kk- 2)
319 aik(4,3)= allu0(16*kk- 1)
320 aik(4,4)= allu0(16*kk )
322 do jj= inu(k-1)+1, inu(k)
324 if (iw1(j).eq.0.and.iw2(j).eq.0) cycle
326 akj(1,1)= aulu0(16*jj-15)
327 akj(1,2)= aulu0(16*jj-14)
328 akj(1,3)= aulu0(16*jj-13)
329 akj(1,4)= aulu0(16*jj-12)
330 akj(2,1)= aulu0(16*jj-11)
331 akj(2,2)= aulu0(16*jj-10)
332 akj(2,3)= aulu0(16*jj- 9)
333 akj(2,4)= aulu0(16*jj- 8)
334 akj(3,1)= aulu0(16*jj- 7)
335 akj(3,2)= aulu0(16*jj- 6)
336 akj(3,3)= aulu0(16*jj- 5)
337 akj(3,4)= aulu0(16*jj- 4)
338 akj(4,1)= aulu0(16*jj- 3)
339 akj(4,2)= aulu0(16*jj- 2)
340 akj(4,3)= aulu0(16*jj- 1)
341 akj(4,4)= aulu0(16*jj )
343 call ilu1b44 (rhs_aij, dkinv, aik, akj)
346 dlu0(16*i-15)= dlu0(16*i-15) - rhs_aij(1,1)
347 dlu0(16*i-14)= dlu0(16*i-14) - rhs_aij(1,2)
348 dlu0(16*i-13)= dlu0(16*i-13) - rhs_aij(1,3)
349 dlu0(16*i-12)= dlu0(16*i-12) - rhs_aij(1,4)
350 dlu0(16*i-11)= dlu0(16*i-11) - rhs_aij(2,1)
351 dlu0(16*i-10)= dlu0(16*i-10) - rhs_aij(2,2)
352 dlu0(16*i- 9)= dlu0(16*i- 9) - rhs_aij(2,3)
353 dlu0(16*i- 8)= dlu0(16*i- 8) - rhs_aij(2,4)
354 dlu0(16*i- 7)= dlu0(16*i- 7) - rhs_aij(3,1)
355 dlu0(16*i- 6)= dlu0(16*i- 6) - rhs_aij(3,2)
356 dlu0(16*i- 5)= dlu0(16*i- 5) - rhs_aij(3,3)
357 dlu0(16*i- 4)= dlu0(16*i- 4) - rhs_aij(3,4)
358 dlu0(16*i- 3)= dlu0(16*i- 3) - rhs_aij(4,1)
359 dlu0(16*i- 2)= dlu0(16*i- 2) - rhs_aij(4,2)
360 dlu0(16*i- 1)= dlu0(16*i- 1) - rhs_aij(4,3)
361 dlu0(16*i )= dlu0(16*i ) - rhs_aij(4,4)
366 allu0(16*ij0-15)= allu0(16*ij0-15) - rhs_aij(1,1)
367 allu0(16*ij0-14)= allu0(16*ij0-14) - rhs_aij(1,2)
368 allu0(16*ij0-13)= allu0(16*ij0-13) - rhs_aij(1,3)
369 allu0(16*ij0-12)= allu0(16*ij0-12) - rhs_aij(1,4)
370 allu0(16*ij0-11)= allu0(16*ij0-11) - rhs_aij(2,1)
371 allu0(16*ij0-10)= allu0(16*ij0-10) - rhs_aij(2,2)
372 allu0(16*ij0- 9)= allu0(16*ij0- 9) - rhs_aij(2,3)
373 allu0(16*ij0- 8)= allu0(16*ij0- 8) - rhs_aij(2,4)
374 allu0(16*ij0- 7)= allu0(16*ij0- 7) - rhs_aij(3,1)
375 allu0(16*ij0- 6)= allu0(16*ij0- 6) - rhs_aij(3,2)
376 allu0(16*ij0- 5)= allu0(16*ij0- 5) - rhs_aij(3,3)
377 allu0(16*ij0- 4)= allu0(16*ij0- 4) - rhs_aij(3,4)
378 allu0(16*ij0- 3)= allu0(16*ij0- 3) - rhs_aij(4,1)
379 allu0(16*ij0- 2)= allu0(16*ij0- 2) - rhs_aij(4,2)
380 allu0(16*ij0- 1)= allu0(16*ij0- 1) - rhs_aij(4,3)
381 allu0(16*ij0 )= allu0(16*ij0 ) - rhs_aij(4,4)
386 aulu0(16*ij0-15)= aulu0(16*ij0-15) - rhs_aij(1,1)
387 aulu0(16*ij0-14)= aulu0(16*ij0-14) - rhs_aij(1,2)
388 aulu0(16*ij0-13)= aulu0(16*ij0-13) - rhs_aij(1,3)
389 aulu0(16*ij0-12)= aulu0(16*ij0-12) - rhs_aij(1,4)
390 aulu0(16*ij0-11)= aulu0(16*ij0-11) - rhs_aij(2,1)
391 aulu0(16*ij0-10)= aulu0(16*ij0-10) - rhs_aij(2,2)
392 aulu0(16*ij0- 9)= aulu0(16*ij0- 9) - rhs_aij(2,3)
393 aulu0(16*ij0- 8)= aulu0(16*ij0- 8) - rhs_aij(2,4)
394 aulu0(16*ij0- 7)= aulu0(16*ij0- 7) - rhs_aij(3,1)
395 aulu0(16*ij0- 6)= aulu0(16*ij0- 6) - rhs_aij(3,2)
396 aulu0(16*ij0- 5)= aulu0(16*ij0- 5) - rhs_aij(3,3)
397 aulu0(16*ij0- 4)= aulu0(16*ij0- 4) - rhs_aij(3,4)
398 aulu0(16*ij0- 3)= aulu0(16*ij0- 3) - rhs_aij(4,1)
399 aulu0(16*ij0- 2)= aulu0(16*ij0- 2) - rhs_aij(4,2)
400 aulu0(16*ij0- 1)= aulu0(16*ij0- 1) - rhs_aij(4,3)
401 aulu0(16*ij0 )= aulu0(16*ij0 ) - rhs_aij(4,4)
407 call ilu1a44 (dkinv, &
408 dlu0(16*i-15), dlu0(16*i-14), dlu0(16*i-13), dlu0(16*i-12), &
409 dlu0(16*i-11), dlu0(16*i-10), dlu0(16*i- 9), dlu0(16*i- 8), &
410 dlu0(16*i- 7), dlu0(16*i- 6), dlu0(16*i- 5), dlu0(16*i- 4), &
411 dlu0(16*i- 3), dlu0(16*i- 2), dlu0(16*i- 1), dlu0(16*i ) )
412 dlu0(16*i-15)= dkinv(1,1)
413 dlu0(16*i-14)= dkinv(1,2)
414 dlu0(16*i-13)= dkinv(1,3)
415 dlu0(16*i-12)= dkinv(1,4)
416 dlu0(16*i-11)= dkinv(2,1)
417 dlu0(16*i-10)= dkinv(2,2)
418 dlu0(16*i- 9)= dkinv(2,3)
419 dlu0(16*i- 8)= dkinv(2,4)
420 dlu0(16*i- 7)= dkinv(3,1)
421 dlu0(16*i- 6)= dkinv(3,2)
422 dlu0(16*i- 5)= dkinv(3,3)
423 dlu0(16*i- 4)= dkinv(3,4)
424 dlu0(16*i- 3)= dkinv(4,1)
425 dlu0(16*i- 2)= dkinv(4,2)
426 dlu0(16*i- 1)= dkinv(4,3)
427 dlu0(16*i )= dkinv(4,4)
430 deallocate (iw1, iw2)
431 end subroutine form_ilu0_44
440 subroutine ilu1a44 (ALU, D11,D12,D13,D14,D21,D22,D23,D24,D31,D32,D33,D34,D41,D42,D43,D44)
443 real(kind=
kreal) :: alu(4,4), pw(4)
444 real(kind=
kreal) :: d11,d12,d13,d14,d21,d22,d23,d24,d31,d32,d33,d34,d41,d42,d43,d44
445 integer(kind=kint) :: i,j,k
465 alu(k,k)= 1.d0/alu(k,k)
467 alu(i,k)= alu(i,k) * alu(k,k)
469 pw(j)= alu(i,j) - alu(i,k)*alu(k,j)
478 end subroutine ilu1a44
491 real(kind=
kreal) :: rhs_aij(4,4), dkinv(4,4), aik(4,4), akj(4,4)
492 real(kind=
kreal) :: x1,x2,x3,x4
501 x2= x2 - dkinv(2,1)*x1
502 x3= x3 - dkinv(3,1)*x1 - dkinv(3,2)*x2
503 x4= x4 - dkinv(4,1)*x1 - dkinv(4,2)*x2 - dkinv(4,3)*x3
506 x3= dkinv(3,3)*( x3 - dkinv(3,4)*x4 )
507 x2= dkinv(2,2)*( x2 - dkinv(2,4)*x4 - dkinv(2,3)*x3 )
508 x1= dkinv(1,1)*( x1 - dkinv(1,4)*x4 - dkinv(1,3)*x3 - dkinv(1,2)*x2)
510 rhs_aij(1,1)= aik(1,1)*x1 + aik(1,2)*x2 + aik(1,3)*x3 + aik(1,4)*x4
511 rhs_aij(2,1)= aik(2,1)*x1 + aik(2,2)*x2 + aik(2,3)*x3 + aik(2,4)*x4
512 rhs_aij(3,1)= aik(3,1)*x1 + aik(3,2)*x2 + aik(3,3)*x3 + aik(3,4)*x4
513 rhs_aij(4,1)= aik(4,1)*x1 + aik(4,2)*x2 + aik(4,3)*x3 + aik(4,4)*x4
522 x2= x2 - dkinv(2,1)*x1
523 x3= x3 - dkinv(3,1)*x1 - dkinv(3,2)*x2
524 x4= x4 - dkinv(4,1)*x1 - dkinv(4,2)*x2 - dkinv(4,3)*x3
527 x3= dkinv(3,3)*( x3 - dkinv(3,4)*x4 )
528 x2= dkinv(2,2)*( x2 - dkinv(2,4)*x4 - dkinv(2,3)*x3 )
529 x1= dkinv(1,1)*( x1 - dkinv(1,4)*x4 - dkinv(1,3)*x3 - dkinv(1,2)*x2)
531 rhs_aij(1,2)= aik(1,1)*x1 + aik(1,2)*x2 + aik(1,3)*x3 + aik(1,4)*x4
532 rhs_aij(2,2)= aik(2,1)*x1 + aik(2,2)*x2 + aik(2,3)*x3 + aik(2,4)*x4
533 rhs_aij(3,2)= aik(3,1)*x1 + aik(3,2)*x2 + aik(3,3)*x3 + aik(3,4)*x4
534 rhs_aij(4,2)= aik(4,1)*x1 + aik(4,2)*x2 + aik(4,3)*x3 + aik(4,4)*x4
543 x2= x2 - dkinv(2,1)*x1
544 x3= x3 - dkinv(3,1)*x1 - dkinv(3,2)*x2
545 x4= x4 - dkinv(4,1)*x1 - dkinv(4,2)*x2 - dkinv(4,3)*x3
548 x3= dkinv(3,3)*( x3 - dkinv(3,4)*x4 )
549 x2= dkinv(2,2)*( x2 - dkinv(2,4)*x4 - dkinv(2,3)*x3 )
550 x1= dkinv(1,1)*( x1 - dkinv(1,4)*x4 - dkinv(1,3)*x3 - dkinv(1,2)*x2)
552 rhs_aij(1,3)= aik(1,1)*x1 + aik(1,2)*x2 + aik(1,3)*x3 + aik(1,4)*x4
553 rhs_aij(2,3)= aik(2,1)*x1 + aik(2,2)*x2 + aik(2,3)*x3 + aik(2,4)*x4
554 rhs_aij(3,3)= aik(3,1)*x1 + aik(3,2)*x2 + aik(3,3)*x3 + aik(3,4)*x4
555 rhs_aij(4,3)= aik(4,1)*x1 + aik(4,2)*x2 + aik(4,3)*x3 + aik(4,4)*x4
564 x2= x2 - dkinv(2,1)*x1
565 x3= x3 - dkinv(3,1)*x1 - dkinv(3,2)*x2
566 x4= x4 - dkinv(4,1)*x1 - dkinv(4,2)*x2 - dkinv(4,3)*x3
569 x3= dkinv(3,3)*( x3 - dkinv(3,4)*x4 )
570 x2= dkinv(2,2)*( x2 - dkinv(2,4)*x4 - dkinv(2,3)*x3 )
571 x1= dkinv(1,1)*( x1 - dkinv(1,4)*x4 - dkinv(1,3)*x3 - dkinv(1,2)*x2)
573 rhs_aij(1,4)= aik(1,1)*x1 + aik(1,2)*x2 + aik(1,3)*x3 + aik(1,4)*x4
574 rhs_aij(2,4)= aik(2,1)*x1 + aik(2,2)*x2 + aik(2,3)*x3 + aik(2,4)*x4
575 rhs_aij(3,4)= aik(3,1)*x1 + aik(3,2)*x2 + aik(3,3)*x3 + aik(3,4)*x4
576 rhs_aij(4,4)= aik(4,1)*x1 + aik(4,2)*x2 + aik(4,3)*x3 + aik(4,4)*x4
real(kind=kreal) function, public hecmw_mat_get_sigma_diag(hecMAT)
integer(kind=kint) function, public hecmw_mat_get_precond(hecMAT)
real(kind=kreal) function, public hecmw_mat_get_sigma(hecMAT)
subroutine, public hecmw_precond_bilu_44_apply(WW)
subroutine, public hecmw_precond_bilu_44_clear()
subroutine, public hecmw_precond_bilu_44_setup(hecMAT)
subroutine ilu1b44(RHS_Aij, DkINV, Aik, Akj)
integer(kind=4), parameter kreal