FrontISTR  5.7.0
Large-scale structural analysis program with finit element method
hecmw_precond_DIAG_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_DIAG_44
9 !C***
10 !C
12  use hecmw_util
13 
14  private
15 
19 
20  integer(kind=kint) :: N
21  real(kind=kreal), pointer :: alu(:) => null()
22 
23  logical, save :: INITIALIZED = .false.
24 
25 contains
26 
27  subroutine hecmw_precond_diag_44_setup(hecMAT)
29  implicit none
30  type(hecmwst_matrix), intent(inout) :: hecmat
31  integer(kind=kint ) :: np
32  real (kind=kreal) :: sigma_diag
33  real(kind=kreal), pointer:: d(:)
34 
35  real (kind=kreal):: alutmp(4,4), pw(4)
36  integer(kind=kint ):: ii, i, j, k
37 
38  if (initialized) then
39  if (hecmat%Iarray(98) == 0 .and. hecmat%Iarray(97) == 0) return
41  endif
42 
43  n = hecmat%N
44  np = hecmat%NP
45  d => hecmat%D
46  sigma_diag = hecmw_mat_get_sigma_diag(hecmat)
47 
48  allocate(alu(16*np))
49  alu = 0.d0
50 
51  do ii= 1, n
52  alu(16*ii-15) = d(16*ii-15)
53  alu(16*ii-14) = d(16*ii-14)
54  alu(16*ii-13) = d(16*ii-13)
55  alu(16*ii-12) = d(16*ii-12)
56  alu(16*ii-11) = d(16*ii-11)
57  alu(16*ii-10) = d(16*ii-10)
58  alu(16*ii-9 ) = d(16*ii-9 )
59  alu(16*ii-8 ) = d(16*ii-8 )
60  alu(16*ii-7 ) = d(16*ii-7 )
61  alu(16*ii-6 ) = d(16*ii-6 )
62  alu(16*ii-5 ) = d(16*ii-5 )
63  alu(16*ii-4 ) = d(16*ii-4 )
64  alu(16*ii-3 ) = d(16*ii-3 )
65  alu(16*ii-2 ) = d(16*ii-2 )
66  alu(16*ii-1 ) = d(16*ii-1 )
67  alu(16*ii ) = d(16*ii )
68  enddo
69 
70  !$omp parallel default(none),private(ii,ALUtmp,k,i,j,PW),shared(N,ALU,SIGMA_DIAG)
71  !$omp do
72  do ii= 1, n
73  alutmp(1,1)= alu(16*ii-15) * sigma_diag
74  alutmp(1,2)= alu(16*ii-14)
75  alutmp(1,3)= alu(16*ii-13)
76  alutmp(1,4)= alu(16*ii-12)
77 
78  alutmp(2,1)= alu(16*ii-11)
79  alutmp(2,2)= alu(16*ii-10) * sigma_diag
80  alutmp(2,3)= alu(16*ii- 9)
81  alutmp(2,4)= alu(16*ii- 8)
82 
83  alutmp(3,1)= alu(16*ii- 7)
84  alutmp(3,2)= alu(16*ii- 6)
85  alutmp(3,3)= alu(16*ii- 5) * sigma_diag
86  alutmp(3,4)= alu(16*ii- 4)
87 
88  alutmp(4,1)= alu(16*ii- 3)
89  alutmp(4,2)= alu(16*ii- 2)
90  alutmp(4,3)= alu(16*ii- 1)
91  alutmp(4,4)= alu(16*ii ) * sigma_diag
92 
93  do k= 1, 4
94  alutmp(k,k)= 1.d0/alutmp(k,k)
95  do i= k+1, 4
96  alutmp(i,k)= alutmp(i,k) * alutmp(k,k)
97  do j= k+1, 4
98  pw(j)= alutmp(i,j) - alutmp(i,k)*alutmp(k,j)
99  enddo
100  do j= k+1, 4
101  alutmp(i,j)= pw(j)
102  enddo
103  enddo
104  enddo
105 
106  alu(16*ii-15)= alutmp(1,1)
107  alu(16*ii-14)= alutmp(1,2)
108  alu(16*ii-13)= alutmp(1,3)
109  alu(16*ii-12)= alutmp(1,4)
110  alu(16*ii-11)= alutmp(2,1)
111  alu(16*ii-10)= alutmp(2,2)
112  alu(16*ii- 9)= alutmp(2,3)
113  alu(16*ii- 8)= alutmp(2,4)
114  alu(16*ii- 7)= alutmp(3,1)
115  alu(16*ii- 6)= alutmp(3,2)
116  alu(16*ii- 5)= alutmp(3,3)
117  alu(16*ii- 4)= alutmp(3,4)
118  alu(16*ii- 3)= alutmp(4,1)
119  alu(16*ii- 2)= alutmp(4,2)
120  alu(16*ii- 1)= alutmp(4,3)
121  alu(16*ii )= alutmp(4,4)
122  enddo
123  !$omp end do
124  !$omp end parallel
125 
126  initialized = .true.
127  hecmat%Iarray(98) = 0 ! symbolic setup done
128  hecmat%Iarray(97) = 0 ! numerical setup done
129  end subroutine hecmw_precond_diag_44_setup
130 
131  subroutine hecmw_precond_diag_44_apply(WW)
132  implicit none
133  real(kind=kreal), intent(inout) :: ww(:)
134  integer(kind=kint) :: i
135  real(kind=kreal) :: x1, x2, x3, x4
136 
137  !C
138  !C== Block SCALING
139  !$omp parallel default(none),private(i,X1,X2,X3,X4),shared(N,WW,ALU)
140  !$omp do
141  do i= 1, n
142  x1= ww(4*i-3)
143  x2= ww(4*i-2)
144  x3= ww(4*i-1)
145  x4= ww(4*i )
146  x2= x2 -alu(16*i-11)*x1
147  x3= x3 -alu(16*i- 7)*x1 -alu(16*i- 6)*x2
148  x4= x4 -alu(16*i- 3)*x1 -alu(16*i- 2)*x2 -alu(16*i- 1)*x3
149  x4= alu(16*i )* x4
150  x3= alu(16*i- 5)*(x3 -alu(16*i- 4)*x4)
151  x2= alu(16*i-10)*(x2 -alu(16*i- 8)*x4 -alu(16*i- 9)*x3)
152  x1= alu(16*i-15)*(x1 -alu(16*i-12)*x4 -alu(16*i-13)*x3 -alu(16*i-14)*x2)
153  ww(4*i-3)= x1
154  ww(4*i-2)= x2
155  ww(4*i-1)= x3
156  ww(4*i )= x4
157  enddo
158  !$omp end do
159  !$omp end parallel
160 
161  end subroutine hecmw_precond_diag_44_apply
162 
163  subroutine hecmw_precond_diag_44_clear()
164  implicit none
165  if (associated(alu)) deallocate(alu)
166  nullify(alu)
167  initialized = .false.
168  end subroutine hecmw_precond_diag_44_clear
169 
170 end module hecmw_precond_diag_44
hecmw_precond_diag_44::hecmw_precond_diag_44_clear
subroutine, public hecmw_precond_diag_44_clear()
Definition: hecmw_precond_DIAG_44.f90:164
hecmw_util
I/O and Utility.
Definition: hecmw_util_f.F90:7
hecmw_precond_diag_44::hecmw_precond_diag_44_setup
subroutine, public hecmw_precond_diag_44_setup(hecMAT)
Definition: hecmw_precond_DIAG_44.f90:28
hecmw_util::kreal
integer(kind=4), parameter kreal
Definition: hecmw_util_f.F90:16
hecmw_matrix_misc::hecmw_mat_get_sigma_diag
real(kind=kreal) function, public hecmw_mat_get_sigma_diag(hecMAT)
Definition: hecmw_matrix_misc.f90:694
hecmw_matrix_misc
Definition: hecmw_matrix_misc.f90:6
hecmw_precond_diag_44::hecmw_precond_diag_44_apply
subroutine, public hecmw_precond_diag_44_apply(WW)
Definition: hecmw_precond_DIAG_44.f90:132
hecmw_precond_diag_44
Definition: hecmw_precond_DIAG_44.f90:11
hecmw_util::hecmwst_matrix
Definition: hecmw_util_f.F90:444