FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_precond_BILU_44.f90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
2 ! Copyright (c) 2019 FrontISTR Commons
3 ! This software is released under the MIT License, see LICENSE.txt
4 !-------------------------------------------------------------------------------
5 
6 !C
7 !C***
8 !C*** module hecmw_precond_BILU_44
9 !C***
10 !C
12  use hecmw_util
14 
15  private
16 
20 
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()
29 
30  logical, save :: INITIALIZED = .false.
31 
32 contains
33 
34  subroutine hecmw_precond_bilu_44_setup(hecMAT)
35  implicit none
36  type(hecmwst_matrix), intent(inout) :: hecmat
37  integer(kind=kint ) :: np, npu, npl
38  integer(kind=kint ) :: precond
39  real (kind=kreal) :: sigma, sigma_diag
40 
41  real(kind=kreal), pointer :: d(:)
42  real(kind=kreal), pointer :: al(:)
43  real(kind=kreal), pointer :: au(:)
44 
45  integer(kind=kint ), pointer :: inl(:), inu(:)
46  integer(kind=kint ), pointer :: ial(:)
47  integer(kind=kint ), pointer :: iau(:)
48 
49  if (initialized) then
50  if (hecmat%Iarray(98) == 1) then ! need symbolic and numerical setup
52  else if (hecmat%Iarray(97) == 1) then ! need numerical setup only
53  call hecmw_precond_bilu_44_clear() ! TEMPORARY
54  else
55  return
56  endif
57  endif
58 
59  n = hecmat%N
60  np = hecmat%NP
61  npl = hecmat%NPL
62  npu = hecmat%NPU
63  d => hecmat%D
64  al => hecmat%AL
65  au => hecmat%AU
66  inl => hecmat%indexL
67  inu => hecmat%indexU
68  ial => hecmat%itemL
69  iau => hecmat%itemU
70  precond = hecmw_mat_get_precond(hecmat)
71  sigma = hecmw_mat_get_sigma(hecmat)
72  sigma_diag = hecmw_mat_get_sigma_diag(hecmat)
73 
74  !if (PRECOND.eq.10) call FORM_ILU0_44 &
75  call form_ilu0_44 &
76  & (n, np, npl, npu, d, al, inl, ial, au, inu, iau, &
77  & sigma, sigma_diag)
78 
79  initialized = .true.
80  hecmat%Iarray(98) = 0 ! symbolic setup done
81  hecmat%Iarray(97) = 0 ! numerical setup done
82 
83  end subroutine hecmw_precond_bilu_44_setup
84 
86  implicit none
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
90  !C
91  !C-- FORWARD
92 
93  do i= 1, n
94  sw1= ww(4*i-3)
95  sw2= ww(4*i-2)
96  sw3= ww(4*i-1)
97  sw4= ww(4*i )
98  isl= inumfi1l(i-1)+1
99  iel= inumfi1l(i)
100  do j= isl, iel
101  k= fi1l(j)
102  x1= ww(4*k-3)
103  x2= ww(4*k-2)
104  x3= ww(4*k-1)
105  x4= ww(4*k )
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
110  enddo
111 
112  x1= sw1
113  x2= sw2
114  x3= sw3
115  x4= sw4
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
119  x4= dlu0(16*i )* x4
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)
123 
124  ww(4*i-3)= x1
125  ww(4*i-2)= x2
126  ww(4*i-1)= x3
127  ww(4*i )= x4
128  enddo
129 
130  !C
131  !C-- BACKWARD
132 
133  do i= n, 1, -1
134  isu= inumfi1u(i-1) + 1
135  ieu= inumfi1u(i)
136  sw1= 0.d0
137  sw2= 0.d0
138  sw3= 0.d0
139  sw4= 0.d0
140  do j= ieu, isu, -1
141  k= fi1u(j)
142  x1= ww(4*k-3)
143  x2= ww(4*k-2)
144  x3= ww(4*k-1)
145  x4= ww(4*k )
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
150  enddo
151  x1= sw1
152  x2= sw2
153  x3= sw3
154  x4= sw4
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
158  x4= dlu0(16*i )* x4
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
166  enddo
167  end subroutine hecmw_precond_bilu_44_apply
168 
170  implicit none
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)
178  nullify(dlu0)
179  nullify(allu0)
180  nullify(aulu0)
181  nullify(inumfi1l)
182  nullify(inumfi1u)
183  nullify(fi1l)
184  nullify(fi1u)
185  initialized = .false.
186  end subroutine hecmw_precond_bilu_44_clear
187 
188  !C
189  !C***
190  !C*** FORM_ILU0_44
191  !C***
192  !C
193  !C form ILU(0) matrix
194  !C
195  subroutine form_ilu0_44 &
196  & (n, np, npl, npu, d, al, inl, ial, au, inu, iau, &
197  & sigma, sigma_diag)
198  implicit none
199  integer(kind=kint ), intent(in):: n, np, npu, npl
200  real (kind=kreal), intent(in):: sigma, sigma_diag
201 
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
205 
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
209 
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))
217 
218  do i=1,16*np
219  dlu0(i) = d(i)
220  end do
221  do i=1,16*npl
222  allu0(i) = al(i)
223  end do
224  do i=1,16*npu
225  aulu0(i) = au(i)
226  end do
227  do i=0,np
228  inumfi1l(i) = inl(i)
229  inumfi1u(i) = inu(i)
230  end do
231  do i=1,npl
232  fi1l(i) = ial(i)
233  end do
234  do i=1,npu
235  fi1u(i) = iau(i)
236  end do
237 
238  !C
239  !C +----------------------+
240  !C | ILU(0) factorization |
241  !C +----------------------+
242  !C===
243  do i=1,np
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
248  enddo
249 
250  i = 1
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)
272 
273  do i= 2, np
274  iw1= 0
275  iw2= 0
276 
277  do k= inumfi1l(i-1)+1, inumfi1l(i)
278  iw1(fi1l(k))= k
279  enddo
280 
281  do k= inumfi1u(i-1)+1, inumfi1u(i)
282  iw2(fi1u(k))= k
283  enddo
284 
285  do kk= inl(i-1)+1, inl(i)
286  k= ial(kk)
287 
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 )
304 
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 )
321 
322  do jj= inu(k-1)+1, inu(k)
323  j= iau(jj)
324  if (iw1(j).eq.0.and.iw2(j).eq.0) cycle
325 
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 )
342 
343  call ilu1b44 (rhs_aij, dkinv, aik, akj)
344 
345  if (j.eq.i) then
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)
362  endif
363 
364  if (j.lt.i) then
365  ij0= iw1(j)
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)
382  endif
383 
384  if (j.gt.i) then
385  ij0= iw2(j)
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)
402  endif
403 
404  enddo
405  enddo
406 
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)
428  enddo
429 
430  deallocate (iw1, iw2)
431  end subroutine form_ilu0_44
432 
433  !C
434  !C***
435  !C*** ILU1a44
436  !C***
437  !C
438  !C computes LU factorization of 4*4 Diagonal Block
439  !C
440  subroutine ilu1a44 (ALU, D11,D12,D13,D14,D21,D22,D23,D24,D31,D32,D33,D34,D41,D42,D43,D44)
441  use hecmw_util
442  implicit none
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
446 
447  alu(1,1)= d11
448  alu(1,2)= d12
449  alu(1,3)= d13
450  alu(1,4)= d14
451  alu(2,1)= d21
452  alu(2,2)= d22
453  alu(2,3)= d23
454  alu(2,4)= d24
455  alu(3,1)= d31
456  alu(3,2)= d32
457  alu(3,3)= d33
458  alu(3,4)= d34
459  alu(4,1)= d41
460  alu(4,2)= d42
461  alu(4,3)= d43
462  alu(4,4)= d44
463 
464  do k= 1, 4
465  alu(k,k)= 1.d0/alu(k,k)
466  do i= k+1, 4
467  alu(i,k)= alu(i,k) * alu(k,k)
468  do j= k+1, 4
469  pw(j)= alu(i,j) - alu(i,k)*alu(k,j)
470  enddo
471  do j= k+1, 4
472  alu(i,j)= pw(j)
473  enddo
474  enddo
475  enddo
476 
477  return
478  end subroutine ilu1a44
479 
480  !C
481  !C***
482  !C*** ILU1b44
483  !C***
484  !C
485  !C computes L_ik * D_k_INV * U_kj at ILU factorization
486  !C for 4*4 Block Type Matrix
487  !C
488  subroutine ilu1b44 (RHS_Aij, DkINV, Aik, Akj)
489  use hecmw_util
490  implicit none
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
493 
494  !C
495  !C-- 1st Col.
496  x1= akj(1,1)
497  x2= akj(2,1)
498  x3= akj(3,1)
499  x4= akj(4,1)
500 
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
504 
505  x4= dkinv(4,4)* x4
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)
509 
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
514 
515  !C
516  !C-- 2nd Col.
517  x1= akj(1,2)
518  x2= akj(2,2)
519  x3= akj(3,2)
520  x4= akj(4,2)
521 
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
525 
526  x4= dkinv(4,4)* x4
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)
530 
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
535 
536  !C
537  !C-- 3rd Col.
538  x1= akj(1,3)
539  x2= akj(2,3)
540  x3= akj(3,3)
541  x4= akj(4,3)
542 
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
546 
547  x4= dkinv(4,4)* x4
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)
551 
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
556 
557  !C
558  !C-- 4th Col.
559  x1= akj(1,4)
560  x2= akj(2,4)
561  x3= akj(3,4)
562  x4= akj(4,4)
563 
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
567 
568  x4= dkinv(4,4)* x4
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)
572 
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
577 
578  return
579  end subroutine ilu1b44
580 
581 end module hecmw_precond_bilu_44
582 
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)
I/O and Utility.
Definition: hecmw_util_f.F90:7
integer(kind=4), parameter kreal