FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
hecmw_precond_RIF_nn.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 
7  use hecmw_util
10 
11  private
12 
16 
17  integer(4),parameter :: krealp = 8
18 
19  integer(kind=kint) :: NPFIU, NPFIL
20  integer(kind=kint) :: N
21  integer(kind=kint), pointer :: inumFI1L(:) => null()
22  integer(kind=kint), pointer :: inumFI1U(:) => null()
23  integer(kind=kint), pointer :: FI1L(:) => null()
24  integer(kind=kint), pointer :: FI1U(:) => null()
25 
26  integer(kind=kint), pointer :: indexL(:) => null()
27  integer(kind=kint), pointer :: indexU(:) => null()
28  integer(kind=kint), pointer :: itemL(:) => null()
29  integer(kind=kint), pointer :: itemU(:) => null()
30  real(kind=kreal), pointer :: d(:) => null()
31  real(kind=kreal), pointer :: al(:) => null()
32  real(kind=kreal), pointer :: au(:) => null()
33 
34  real(kind=krealp), pointer :: sainvl(:) => null()
35  real(kind=krealp), pointer :: sainvd(:) => null()
36  real(kind=krealp), pointer :: rifu(:) => null()
37  real(kind=krealp), pointer :: rifl(:) => null()
38  real(kind=krealp), pointer :: rifd(:) => null()
39 
40 contains
41 
42  !C***
43  !C*** hecmw_precond_nn_sainv_setup
44  !C***
45  subroutine hecmw_precond_rif_nn_setup(hecMAT)
46  implicit none
47  type(hecmwst_matrix) :: hecmat
48 
49  integer(kind=kint ) :: precond, ndof, ndof2
50 
51  real(kind=krealp) :: filter
52 
53  n = hecmat%N
54  ndof = hecmat%NDOF
55  ndof2 = ndof*ndof
56  precond = hecmw_mat_get_precond(hecmat)
57 
58  d => hecmat%D
59  au=> hecmat%AU
60  al=> hecmat%AL
61  indexl => hecmat%indexL
62  indexu => hecmat%indexU
63  iteml => hecmat%itemL
64  itemu => hecmat%itemU
65 
66  if (precond.eq.21) call form_ilu1_rif_nn(hecmat)
67 
68  allocate (sainvd(ndof2*hecmat%NP))
69  allocate (sainvl(ndof2*npfiu))
70  allocate (rifd(ndof2*hecmat%NP))
71  allocate (rifu(ndof2*npfiu))
72  sainvd = 0.0d0
73  sainvl = 0.0d0
74  rifd = 0.0d0
75  rifu = 0.0d0
76 
77  filter= hecmat%Rarray(5)
78 
79  write(*,"(a,F15.8)")"### RIF FILTER :",filter
80 
81  call hecmw_rif_nn(hecmat)
82 
83  allocate (rifl(ndof2*npfiu))
84  rifl = 0.0d0
85 
86  call hecmw_rif_make_u_nn(hecmat)
87 
88  end subroutine hecmw_precond_rif_nn_setup
89 
90  subroutine hecmw_precond_rif_nn_apply(ZP, NDOF)
91  implicit none
92  real(kind=kreal), intent(inout) :: zp(:)
93  integer(kind=kint) :: in, i, j, isl, iel,ndof,ndof2,idof,jdof
94  real(kind=kreal) :: sw(ndof),x(ndof)
95  ndof2=ndof*ndof
96  !C-- FORWARD
97  do i= 1, n
98  do idof = 1, ndof
99  sw(idof) = zp(ndof*(i-1)+idof)
100  end do
101  isl= inumfi1l(i-1)+1
102  iel= inumfi1l(i)
103  do j= isl, iel
104  in= fi1l(j)
105  do idof = 1, ndof
106  x(idof) = zp(ndof*(in-1)+idof)
107  end do
108  do idof = 1, ndof
109  do jdof = 1, ndof
110  sw(idof) = sw(idof) - rifl(ndof2*(j-1)+ndof*(idof-1)+jdof)*x(jdof)
111  end do
112  end do
113  enddo
114  x = sw
115  do idof = 2,ndof
116  do jdof = 1, idof-1
117  x(idof) = x(idof) - rifd(ndof2*(i-1)+ndof*(idof-1)+jdof )*x(jdof)
118  end do
119  end do
120  zp(ndof*(i-1)+1:ndof*(i-1)+ndof) = x(1:ndof)
121  enddo
122 
123  do i=1, n
124  do idof=1,ndof
125  zp(ndof*(i-1)+idof)= zp(ndof*(i-1)+idof)*rifd(ndof2*(i-1)+(idof-1)*ndof+idof)
126  end do
127  enddo
128  !C-- BACKWARD
129  do i= n, 1, -1
130  do idof = 1, ndof
131  sw(idof) = zp(ndof*(i-1)+idof)
132  end do
133  isl= inumfi1u(i-1) + 1
134  iel= inumfi1u(i)
135  do j= iel, isl, -1
136  in= fi1u(j)
137  do idof = 1, ndof
138  x(idof) = zp(ndof*(in-1)+idof)
139  end do
140  do idof = 1, ndof
141  do jdof = 1, ndof
142  sw(idof) = sw(idof) - rifu(ndof2*(j-1)+ndof*(idof-1)+jdof)*x(jdof)
143  end do
144  end do
145  enddo
146  x=sw
147  do idof = ndof, 1, -1
148  do jdof = ndof, idof+1, -1
149  x(idof) = x(idof) - rifd(ndof*ndof*(i-1)+ndof*(jdof-1)+idof)*x(jdof)
150  end do
151  end do
152  do idof = 1, ndof
153  zp(ndof*(i-1)+idof) = x(idof)
154  end do
155  enddo
156  end subroutine hecmw_precond_rif_nn_apply
157 
158 
159  !C***
160  !C*** hecmw_rif_nn
161  !C***
162  subroutine hecmw_rif_nn(hecMAT)
163  implicit none
164  type (hecmwst_matrix) :: hecmat
165  integer(kind=kint) :: i, j, k, js, je, in, itr, np, ndof, ndof2, idof, jdof, iitr
166  real(kind=krealp) :: dd, dtmp(hecmat%NDOF), x(hecmat%NDOF)
167  real(kind=krealp) :: filter
168  real(kind=krealp), allocatable :: zz(:), vv(:)
169 
170  filter= hecmat%Rarray(5)
171 
172  np = hecmat%NP
173  ndof = hecmat%NDOF
174  ndof2= ndof*ndof
175  allocate(vv(ndof*np))
176  allocate(zz(ndof*np))
177 
178  do itr=1,np
179  do iitr=1,ndof
180  zz(:) = 0.0d0
181  vv(:) = 0.0d0
182  !{v}=[A]{zi}
183  do idof = 1,ndof
184  zz(ndof*(itr-1)+idof)= sainvd(ndof2*(itr-1)+ndof*(idof-1)+iitr)
185  end do
186  zz(ndof*(itr-1)+iitr)= 1.0d0
187 
188  js= inumfi1l(itr-1) + 1
189  je= inumfi1l(itr )
190  do j= js, je
191  in = fi1l(j)
192  do idof = 1, ndof
193  zz(ndof*(in-1)+idof)=sainvl(ndof2*(j-1)+ndof*(iitr-1)+idof)
194  end do
195  enddo
196 
197  do i= 1, itr
198  do idof = 1,ndof
199  x(idof)=zz(ndof*(i-1)+idof)
200  end do
201  do idof = 1, ndof
202  do jdof = 1, ndof
203  vv(ndof*(i-1)+idof) = vv(ndof*(i-1)+idof) + d(ndof2*(i-1)+ndof*(idof-1)+jdof)*x(jdof)
204  end do
205  end do
206 
207  js= indexl(i-1) + 1
208  je= indexl(i )
209  do j=js,je
210  in = iteml(j)
211  do idof = 1, ndof
212  do jdof = 1, ndof
213  vv(ndof*(in-1)+idof) = vv(ndof*(in-1)+idof) + al(ndof2*(j-1)+ndof*(jdof-1)+idof)*x(jdof)
214  end do
215  end do
216  enddo
217  js= indexu(i-1) + 1
218  je= indexu(i )
219  do j= js, je
220  in = itemu(j)
221  do idof = 1, ndof
222  do jdof = 1, ndof
223  vv(ndof*(in-1)+idof) = vv(ndof*(in-1)+idof) + au(ndof2*(j-1)+ndof*(jdof-1)+idof)*x(jdof)
224  end do
225  end do
226  enddo
227  enddo
228 
229  !{d}={v^t}{z_j}
230  do idof = 1, ndof
231  dtmp(idof)= sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof)
232  end do
233 
234  do i= itr,np
235  do idof = 1,ndof
236  sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) = vv(ndof*(i-1)+idof)
237  do jdof = 1, idof-1
238  sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) = sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) + &
239  & sainvd(ndof2*(i-1)+ndof*(jdof-1)+idof)*vv(ndof*(i-1)+jdof)
240  end do
241  end do
242  js= inumfi1l(i-1) + 1
243  je= inumfi1l(i )
244  do j= js, je
245  in = fi1l(j)
246  do idof = 1,ndof
247  x(idof)=vv(ndof*(in-1)+idof)
248  end do
249  do idof = 1, ndof
250  do jdof = 1, ndof
251  sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) = sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) + &
252  & sainvl(ndof2*(j-1)+ndof*(idof-1)+jdof)*x(jdof)
253  end do
254  end do
255  enddo
256  enddo
257 
258  !Update D
259  dd = 1.0d0/sainvd(ndof2*(itr-1)+ndof*(iitr-1)+iitr)
260  do idof=1,iitr-1
261  sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof) = dtmp(idof)
262  end do
263  sainvd(ndof2*(itr-1)+ndof*(iitr-1)+iitr)=dd
264  do idof = iitr+1, ndof
265  sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof) = sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof)*dd
266  end do
267 
268  do i =itr+1,np
269  do idof = 1, ndof
270  sainvd(ndof2*(i-1)+ndof*(idof-1)+idof) = sainvd(ndof2*(i-1)+ndof*(idof-1)+idof)*dd
271  end do
272  enddo
273 
274  do idof = iitr, ndof
275  rifd(ndof2*(itr-1)+ndof*(idof-1)+iitr) = sainvd(ndof2*(itr-1)+ndof*(idof-1)+idof) !RIF UPDATE
276  end do
277 
278  js= inumfi1u(itr-1) + 1
279  je= inumfi1u(itr )
280  do j= js, je
281  do idof = 1, ndof
282  rifu(ndof2*(j-1)+ndof*(iitr-1)+idof) = sainvd(ndof2*(fi1u(j)-1)+ndof*(idof-1)+idof)
283  end do
284  enddo
285 
286  !Update Z
287  do k=iitr+1,ndof
288  dd = sainvd(ndof2*(itr-1)+ndof*(k-1)+k)
289  if(abs(dd) > filter)then
290  do jdof = 1, iitr
291  sainvd(ndof2*(itr-1)+ndof*(jdof-1)+k)= sainvd(ndof2*(itr-1)+ndof*(jdof-1)+k) - dd*zz(ndof*(itr-1)+jdof)
292  end do
293  js= inumfi1l(itr-1) + 1
294  je= inumfi1l(itr )
295  do j= js, je
296  in = fi1l(j)
297  do idof = 1, ndof
298  sainvl(ndof2*(j-1)+ndof*(k-1)+idof) = sainvl(ndof2*(j-1)+ndof*(k-1)+idof)-dd*zz(ndof*(in-1)+idof)
299  end do
300  enddo
301  endif
302  end do
303 
304  do i= itr +1,np
305  js= inumfi1l(i-1) + 1
306  je= inumfi1l(i )
307  do idof = 1, ndof
308  dd = sainvd(ndof2*(i-1)+ndof*(idof-1)+idof)
309  if(abs(dd) > filter)then
310  do j= js, je
311  in = fi1l(j)
312  if (in > itr) exit
313  do jdof=1,ndof
314  sainvl(ndof2*(j-1)+ndof*(idof-1)+jdof)=sainvl(ndof2*(j-1)+ndof*(idof-1)+jdof)-dd*zz(ndof*(in-1)+jdof)
315  end do
316  enddo
317  endif
318  end do
319  enddo
320  end do
321  enddo
322  deallocate(vv)
323  deallocate(zz)
324 
325  end subroutine hecmw_rif_nn
326 
327  subroutine hecmw_rif_make_u_nn(hecMAT)
328  implicit none
329  type (hecmwst_matrix) :: hecmat
330  integer(kind=kint) i,j,k,n,m,o,idof,jdof,ndof,ndof2
331  integer(kind=kint) is,ie,js,je
332  ndof=hecmat%NDOF
333  ndof2=ndof*ndof
334  n = 1
335  do i= 1, hecmat%NP
336  is=inumfi1l(i-1) + 1
337  ie=inumfi1l(i )
338  flag1:do k= is, ie
339  m = fi1l(k)
340  js=inumfi1u(m-1) + 1
341  je=inumfi1u(m )
342  do j= js,je
343  o = fi1u(j)
344  if (o == i)then
345  do idof = 1, ndof
346  do jdof = 1, ndof
347  rifl(ndof2*(n-1)+ndof*(idof-1)+jdof)=rifu(ndof2*(j-1)+ndof*(jdof-1)+idof)
348  end do
349  end do
350  n = n + 1
351  cycle flag1
352  endif
353  enddo
354  enddo flag1
355  enddo
356  end subroutine hecmw_rif_make_u_nn
357 
358  !C***
359  !C*** FORM_ILU1_nn
360  !C*** form ILU(1) matrix
361 
362  !C***
363  !C*** FORM_ILU1_nn
364  !C*** form ILU(1) matrix
365  subroutine form_ilu1_rif_nn(hecMAT)
366  implicit none
367  type(hecmwst_matrix) :: hecmat
368 
369  integer(kind=kint),allocatable :: iwsl(:), iwsu(:), iw1(:), iw2(:)
370  integer(kind=kint) :: nplf1,npuf1
371  integer(kind=kint) :: i,jj,kk,l,isk,iek,isj,iej
372  integer(kind=kint) :: icou,icou0,icouu,icouu1,icouu2,icouu3,icoul,icoul1,icoul2,icoul3
373  integer(kind=kint) :: j,k,isl,isu
374  !C
375  !C +--------------+
376  !C | find fill-in |
377  !C +--------------+
378  !C===
379 
380  !C
381  !C-- count fill-in
382  allocate (iw1(hecmat%NP) , iw2(hecmat%NP))
383  allocate (inumfi1l(0:hecmat%NP), inumfi1u(0:hecmat%NP))
384 
385  inumfi1l= 0
386  inumfi1u= 0
387 
388  nplf1= 0
389  npuf1= 0
390  do i= 2, hecmat%NP
391  icou= 0
392  iw1= 0
393  iw1(i)= 1
394  do l= indexl(i-1)+1, indexl(i)
395  iw1(iteml(l))= 1
396  enddo
397  do l= indexu(i-1)+1, indexu(i)
398  iw1(itemu(l))= 1
399  enddo
400 
401  isk= indexl(i-1) + 1
402  iek= indexl(i)
403  do k= isk, iek
404  kk= iteml(k)
405  isj= indexu(kk-1) + 1
406  iej= indexu(kk )
407  do j= isj, iej
408  jj= itemu(j)
409  if (iw1(jj).eq.0 .and. jj.lt.i) then
410  inumfi1l(i)= inumfi1l(i)+1
411  iw1(jj)= 1
412  endif
413  if (iw1(jj).eq.0 .and. jj.gt.i) then
414  inumfi1u(i)= inumfi1u(i)+1
415  iw1(jj)= 1
416  endif
417  enddo
418  enddo
419  nplf1= nplf1 + inumfi1l(i)
420  npuf1= npuf1 + inumfi1u(i)
421  enddo
422 
423  !C
424  !C-- specify fill-in
425  allocate (iwsl(0:hecmat%NP), iwsu(0:hecmat%NP))
426  allocate (fi1l(hecmat%NPL+nplf1), fi1u(hecmat%NPU+npuf1))
427 
428  npfiu = hecmat%NPU+npuf1
429  npfil = hecmat%NPL+nplf1
430 
431  fi1l= 0
432  fi1u= 0
433 
434  iwsl= 0
435  iwsu= 0
436  do i= 1, hecmat%NP
437  iwsl(i)= indexl(i)-indexl(i-1) + inumfi1l(i) + iwsl(i-1)
438  iwsu(i)= indexu(i)-indexu(i-1) + inumfi1u(i) + iwsu(i-1)
439  enddo
440 
441  do i= 2, hecmat%NP
442  icoul= 0
443  icouu= 0
444  inumfi1l(i)= inumfi1l(i-1) + inumfi1l(i)
445  inumfi1u(i)= inumfi1u(i-1) + inumfi1u(i)
446  icou= 0
447  iw1= 0
448  iw1(i)= 1
449  do l= indexl(i-1)+1, indexl(i)
450  iw1(iteml(l))= 1
451  enddo
452  do l= indexu(i-1)+1, indexu(i)
453  iw1(itemu(l))= 1
454  enddo
455 
456  isk= indexl(i-1) + 1
457  iek= indexl(i)
458  do k= isk, iek
459  kk= iteml(k)
460  isj= indexu(kk-1) + 1
461  iej= indexu(kk )
462  do j= isj, iej
463  jj= itemu(j)
464  if (iw1(jj).eq.0 .and. jj.lt.i) then
465  icoul = icoul + 1
466  fi1l(icoul+iwsl(i-1)+indexl(i)-indexl(i-1))= jj
467  iw1(jj) = 1
468  endif
469  if (iw1(jj).eq.0 .and. jj.gt.i) then
470  icouu = icouu + 1
471  fi1u(icouu+iwsu(i-1)+indexu(i)-indexu(i-1))= jj
472  iw1(jj) = 1
473  endif
474  enddo
475  enddo
476  enddo
477 
478  isl = 0
479  isu = 0
480  do i= 1, hecmat%NP
481  icoul1= indexl(i) - indexl(i-1)
482  icoul2= inumfi1l(i) - inumfi1l(i-1)
483  icoul3= icoul1 + icoul2
484  icouu1= indexu(i) - indexu(i-1)
485  icouu2= inumfi1u(i) - inumfi1u(i-1)
486  icouu3= icouu1 + icouu2
487  !C
488  !C-- LOWER part
489  icou0= 0
490  do k= indexl(i-1)+1, indexl(i)
491  icou0 = icou0 + 1
492  iw1(icou0)= iteml(k)
493  enddo
494 
495  do k= inumfi1l(i-1)+1, inumfi1l(i)
496  icou0 = icou0 + 1
497  iw1(icou0)= fi1l(icou0+iwsl(i-1))
498  enddo
499 
500  do k= 1, icoul3
501  iw2(k)= k
502  enddo
503  call rif_sort_nn (iw1, iw2, icoul3, hecmat%NP)
504 
505  do k= 1, icoul3
506  fi1l(k+isl)= iw1(k)
507  enddo
508  !C
509  !C-- UPPER part
510  icou0= 0
511  do k= indexu(i-1)+1, indexu(i)
512  icou0 = icou0 + 1
513  iw1(icou0)= itemu(k)
514  enddo
515 
516  do k= inumfi1u(i-1)+1, inumfi1u(i)
517  icou0 = icou0 + 1
518  iw1(icou0)= fi1u(icou0+iwsu(i-1))
519  enddo
520 
521  do k= 1, icouu3
522  iw2(k)= k
523  enddo
524  call rif_sort_nn (iw1, iw2, icouu3, hecmat%NP)
525 
526  do k= 1, icouu3
527  fi1u(k+isu)= iw1(k)
528  enddo
529 
530  isl= isl + icoul3
531  isu= isu + icouu3
532  enddo
533 
534  !C===
535  do i= 1, hecmat%NP
536  inumfi1l(i)= iwsl(i)
537  inumfi1u(i)= iwsu(i)
538  enddo
539 
540  deallocate (iw1, iw2)
541  deallocate (iwsl, iwsu)
542  !C===
543  end subroutine form_ilu1_rif_nn
544 
545  !C
546  !C***
547  !C*** fill_in_S33_SORT
548  !C***
549  !C
550  subroutine rif_sort_nn(STEM, INUM, N, NP)
551  use hecmw_util
552  implicit none
553  integer(kind=kint) :: n, np
554  integer(kind=kint), dimension(NP) :: stem
555  integer(kind=kint), dimension(NP) :: inum
556  integer(kind=kint), dimension(:), allocatable :: istack
557  integer(kind=kint) :: m,nstack,jstack,l,ir,ip,i,j,k,ss,ii,temp,it
558 
559  allocate (istack(-np:+np))
560 
561  m = 100
562  nstack= np
563 
564  jstack= 0
565  l = 1
566  ir = n
567 
568  ip= 0
569  1 continue
570  ip= ip + 1
571 
572  if (ir-l.lt.m) then
573  do j= l+1, ir
574  ss= stem(j)
575  ii= inum(j)
576 
577  do i= j-1,1,-1
578  if (stem(i).le.ss) goto 2
579  stem(i+1)= stem(i)
580  inum(i+1)= inum(i)
581  end do
582  i= 0
583 
584  2 continue
585  stem(i+1)= ss
586  inum(i+1)= ii
587  end do
588 
589  if (jstack.eq.0) then
590  deallocate (istack)
591  return
592  endif
593 
594  ir = istack(jstack)
595  l = istack(jstack-1)
596  jstack= jstack - 2
597  else
598 
599  k= (l+ir) / 2
600  temp = stem(k)
601  stem(k) = stem(l+1)
602  stem(l+1)= temp
603 
604  it = inum(k)
605  inum(k) = inum(l+1)
606  inum(l+1)= it
607 
608  if (stem(l+1).gt.stem(ir)) then
609  temp = stem(l+1)
610  stem(l+1)= stem(ir)
611  stem(ir )= temp
612  it = inum(l+1)
613  inum(l+1)= inum(ir)
614  inum(ir )= it
615  endif
616 
617  if (stem(l).gt.stem(ir)) then
618  temp = stem(l)
619  stem(l )= stem(ir)
620  stem(ir)= temp
621  it = inum(l)
622  inum(l )= inum(ir)
623  inum(ir)= it
624  endif
625 
626  if (stem(l+1).gt.stem(l)) then
627  temp = stem(l+1)
628  stem(l+1)= stem(l)
629  stem(l )= temp
630  it = inum(l+1)
631  inum(l+1)= inum(l)
632  inum(l )= it
633  endif
634 
635  i= l + 1
636  j= ir
637 
638  ss= stem(l)
639  ii= inum(l)
640 
641  3 continue
642  i= i + 1
643  if (stem(i).lt.ss) goto 3
644 
645  4 continue
646  j= j - 1
647  if (stem(j).gt.ss) goto 4
648 
649  if (j.lt.i) goto 5
650 
651  temp = stem(i)
652  stem(i)= stem(j)
653  stem(j)= temp
654 
655  it = inum(i)
656  inum(i)= inum(j)
657  inum(j)= it
658 
659  goto 3
660 
661  5 continue
662 
663  stem(l)= stem(j)
664  stem(j)= ss
665  inum(l)= inum(j)
666  inum(j)= ii
667 
668  jstack= jstack + 2
669 
670  if (jstack.gt.nstack) then
671  write (*,*) 'NSTACK overflow'
672  stop
673  endif
674 
675  if (ir-i+1.ge.j-1) then
676  istack(jstack )= ir
677  istack(jstack-1)= i
678  ir= j-1
679  else
680  istack(jstack )= j-1
681  istack(jstack-1)= l
682  l= i
683  endif
684 
685  endif
686 
687  goto 1
688 
689  end subroutine rif_sort_nn
690 
692  implicit none
693 
694  if (associated(sainvd)) deallocate(sainvd)
695  if (associated(sainvl)) deallocate(sainvl)
696  if (associated(rifd)) deallocate(rifd)
697  if (associated(rifu)) deallocate(rifu)
698  if (associated(rifl)) deallocate(rifl)
699  if (associated(inumfi1l)) deallocate(inumfi1l)
700  if (associated(inumfi1u)) deallocate(inumfi1u)
701  if (associated(fi1l)) deallocate(fi1l)
702  if (associated(fi1u)) deallocate(fi1u)
703  nullify(inumfi1l)
704  nullify(inumfi1u)
705  nullify(fi1l)
706  nullify(fi1u)
707  nullify(d)
708  nullify(al)
709  nullify(au)
710  nullify(indexl)
711  nullify(indexu)
712  nullify(iteml)
713  nullify(itemu)
714 
715  end subroutine hecmw_precond_rif_nn_clear
716 end module hecmw_precond_rif_nn
integer(kind=kint) function, public hecmw_mat_get_precond(hecMAT)
subroutine, public hecmw_precond_rif_nn_clear()
subroutine, public hecmw_precond_rif_nn_apply(ZP, NDOF)
subroutine, public hecmw_precond_rif_nn_setup(hecMAT)
I/O and Utility.
Definition: hecmw_util_f.F90:7
integer(kind=4), parameter kreal