OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
cfac_mem_stack_aux.F
Go to the documentation of this file.
1C
2C This file is part of MUMPS 5.5.1, released
3C on Tue Jul 12 13:17:24 UTC 2022
4C
5C
6C Copyright 1991-2022 CERFACS, CNRS, ENS Lyon, INP Toulouse, Inria,
7C Mumps Technologies, University of Bordeaux.
8C
9C This version of MUMPS is provided to you free of charge. It is
10C released under the CeCILL-C license
11C (see doc/CeCILL-C_V1-en.txt, doc/CeCILL-C_V1-fr.txt, and
12C https://cecill.info/licences/Licence_CeCILL-C_V1-en.html)
13C
14 SUBROUTINE cmumps_compact_factors(A, LDA, NPIV, NBROW, KEEP,
15 & SIZEA, IW )
16 IMPLICIT NONE
17 INTEGER, INTENT(IN) :: LDA, NPIV, NBROW
18 INTEGER(8), INTENT(IN) :: SIZEA
19 INTEGER, INTENT(IN) :: IW( NPIV )
20 INTEGER :: KEEP(500)
21 COMPLEX :: A(SIZEA)
22 INTEGER(8) :: IOLD, INEW, J8
23 INTEGER I , ILAST
24 INTEGER NBROW_L_RECTANGLE_TO_MOVE
25 INTEGER :: ICOL_BEG, ICOL_END, NBPANELS, NB_TARGET
26 INTEGER :: NBCOLS_PANEL, NBROWS_PANEL
27 IF ( npiv .EQ. 0 ) GOTO 500
28 nb_target = npiv
29 IF ( keep(459) .GT. 1 .AND. keep(50) .NE. 0 ) THEN
30 CALL mumps_ldltpanel_nbtarget( npiv, nb_target, keep )
31 ENDIF
32 IF ( keep(50) .EQ.0 .OR. nb_target .EQ. npiv ) THEN
33 IF (lda.EQ.npiv) GOTO 500
34 IF ( keep(50) .NE. 0 ) THEN
35 iold = int(lda + 1,8)
36 inew = int(npiv + 1,8)
37 IF (iold .EQ. inew ) THEN
38 WRITE(*,*) " Internal error in CMUMPS_COMPACT_FACTORS",
39 & iold, inew, npiv
40 CALL mumps_abort()
41 ENDIF
42 DO i = 1, npiv - 1
43 IF ( i .LE. npiv-2 ) THEN
44 ilast = i+1
45 ELSE
46 ilast = i
47 ENDIF
48 DO j8 = 0_8, int(ilast,8)
49 a( inew + j8 ) = a( iold + j8 )
50 END DO
51 inew = inew + int(npiv,8)
52 iold = iold + int(lda,8)
53 END DO
54 nbrow_l_rectangle_to_move = nbrow
55 ELSE
56 inew = 1_8 + int(npiv,8) * int(lda + 1,8)
57 iold = 1_8 + int(lda,8) * int(npiv +1,8)
58 nbrow_l_rectangle_to_move = nbrow - 1
59 ENDIF
60 ELSE
61 icol_beg = 1
62 nbpanels = 0
63 inew = 1_8
64 nbrows_panel = npiv
65 DO WHILE ( icol_beg .LE. npiv )
66 nbpanels=nbpanels + 1
67 icol_end = min(nb_target * nbpanels, npiv)
68 IF ( iw( icol_end ) < 0 ) THEN
69 icol_end = icol_end + 1
70 ENDIF
71 nbcols_panel = icol_end - icol_beg + 1
72 iold = int(icol_beg-1,8) * int(lda,8) + int(icol_beg,8)
73 DO i =1, nbrows_panel
74 IF (iold .NE. inew) THEN
75 DO j8=0, min(i+1, nbcols_panel)-1
76 a(inew+j8) = a(iold+j8)
77 ENDDO
78 ENDIF
79 inew = inew + int(nbcols_panel,8)
80 iold = iold + int(lda,8)
81 ENDDO
82 nbrows_panel = nbrows_panel - nbcols_panel
83 icol_beg = icol_end + 1
84 ENDDO
85 iold = 1_8 + int(lda,8)*int(npiv,8)
86 nbrow_l_rectangle_to_move = nbrow
87 ENDIF
88 DO i = 1, nbrow_l_rectangle_to_move
89 DO j8 = 0_8, int(npiv - 1,8)
90 a( inew + j8 ) = a( iold + j8 )
91 END DO
92 inew = inew + int(npiv,8)
93 iold = iold + int(lda,8)
94 ENDDO
95 500 RETURN
96 END SUBROUTINE cmumps_compact_factors
97 SUBROUTINE cmumps_compact_factors_unsym(A, LDA, NPIV, NCONTIG,
98 & SIZEA )
99 IMPLICIT NONE
100 INTEGER, INTENT(IN) :: NCONTIG, NPIV, LDA
101 INTEGER(8), INTENT(IN) :: SIZEA
102 COMPLEX, INTENT(INOUT) :: A(SIZEA)
103 INTEGER I, J
104 INTEGER(8) :: INEW, IOLD
105 inew = int(npiv+1,8)
106 iold = int(lda+1,8)
107 DO i = 2, ncontig
108 DO j = 1, npiv
109 a(inew)=a(iold)
110 inew = inew + 1_8
111 iold = iold + 1_8
112 ENDDO
113 iold = iold + int(lda - npiv,8)
114 ENDDO
115 RETURN
116 END SUBROUTINE cmumps_compact_factors_unsym
117 SUBROUTINE cmumps_copy_cb_right_to_left( A, LA, LDA, POSELT,
118 & IPTRLU, NPIV,
119 & NBCOL_STACK, NBROW_STACK,
120 & NBROW_SEND, SIZECB, KEEP, PACKED_CB,
121 & LAST_ALLOWED, NBROW_ALREADY_STACKED )
122 IMPLICIT NONE
123 INTEGER(8), intent (in) :: POSELT, IPTRLU, LA, SIZECB
124 LOGICAL, intent (in) :: PACKED_CB
125 COMPLEX A(LA)
126 INTEGER, intent(in):: LDA, NPIV, NBCOL_STACK, NBROW_STACK,
127 & NBROW_SEND
128 INTEGER, intent(inout) :: NBROW_ALREADY_STACKED
129 INTEGER(8), intent(in) :: LAST_ALLOWED
130 INTEGER(8) :: APOS, NPOS
131 INTEGER NBROW
132 INTEGER(8) :: J
133 INTEGER I, KEEP(500)
134#if defined(ZERO_TRIANGLE)
135 COMPLEX ZERO
136 parameter( zero = (0.0e0,0.0e0) )
137#endif
138 nbrow = nbrow_stack + nbrow_send
139 IF (nbrow_stack .NE. 0 ) THEN
140 npos = iptrlu + sizecb
141 apos = poselt + int(npiv+nbrow,8)
142 & * int(lda,8) - 1_8
143 IF ( keep(50) .EQ. 0 .OR. .NOT. packed_cb ) THEN
144 apos = apos - int(lda,8) * int(nbrow_already_stacked,8)
145 npos = npos
146 & - int(nbcol_stack,8) * int(nbrow_already_stacked,8)
147 ELSE
148 apos = apos - int(lda - 1,8) * int(nbrow_already_stacked,8)
149 npos = npos - ( int(nbrow_already_stacked,8) *
150 & int(nbrow_already_stacked+1,8) ) / 2_8
151 ENDIF
152 DO i = nbrow - nbrow_already_stacked, nbrow_send+1, -1
153 IF (keep(50).EQ.0) THEN
154 IF ( npos - int(nbcol_stack,8) + 1_8 .LT.
155 & last_allowed ) THEN
156 EXIT
157 ENDIF
158 DO j= 1_8,int(nbcol_stack,8)
159 a(npos-j+1_8) = a(apos-j+1_8)
160 ENDDO
161 npos = npos - int(nbcol_stack,8)
162 ELSE
163 IF (.NOT. packed_cb) THEN
164 IF ( npos - int(nbcol_stack,8) + 1_8 .LT.
165 & last_allowed ) THEN
166 EXIT
167 ENDIF
168#if defined(ZERO_TRIANGLE)
169 DO j = 1_8, int(nbcol_stack - i,8)
170 a(npos - j + 1_8) = zero
171 END DO
172#endif
173 npos = npos + int(- nbcol_stack + i,8)
174 ENDIF
175 IF ( npos - int(i,8) + 1_8 .LT. last_allowed ) THEN
176 EXIT
177 ENDIF
178 DO j =1_8, int(i,8)
179 a(npos-j+1_8) = a(apos-j+1_8)
180 ENDDO
181 npos = npos - int(i,8)
182 ENDIF
183 IF (keep(50).EQ.0) THEN
184 apos = apos - int(lda,8)
185 ELSE
186 apos = apos - int(lda + 1,8)
187 ENDIF
188 nbrow_already_stacked = nbrow_already_stacked + 1
189 ENDDO
190 END IF
191 RETURN
192 END SUBROUTINE cmumps_copy_cb_right_to_left
193 SUBROUTINE cmumps_copy_cb_left_to_right( A, LA, LDA, POSELT,
194 & IPTRLU, NPIV,
195 & NBCOL_STACK, NBROW_STACK,
196 & NBROW_SEND, SIZECB, KEEP, PACKED_CB)
197 IMPLICIT NONE
198 INTEGER(8), intent (in) :: POSELT, IPTRLU, LA, SIZECB
199 LOGICAL, intent (in) :: PACKED_CB
200 COMPLEX A(LA)
201 INTEGER, intent(in):: LDA, NPIV, NBCOL_STACK, NBROW_STACK,
202 & nbrow_send
203 INTEGER(8) :: APOS, NPOS, APOS_ini, NPOS_ini
204 INTEGER I, KEEP(500)
205 INTEGER(8) :: J, LDA8
206#if defined(ZERO_TRIANGLE)
207 COMPLEX ZERO
208 parameter( zero = (0.0e0,0.0e0) )
209#endif
210 lda8 = int(lda,8)
211 npos_ini = iptrlu + 1_8
212 apos_ini = poselt + int(npiv+nbrow_send,8)* lda8 + int(npiv,8)
213!$OMP PARALLEL DO PRIVATE(J, NPOS, APOS) IF (NBROW_STACK > KEEP(360))
214 DO i = 1, nbrow_stack
215 IF (packed_cb) THEN
216 npos = npos_ini + int(i-1,8) * int(i,8)/2_8 +
217 & int(i-1,8) * int(nbrow_send,8)
218 ELSE
219 npos = npos_ini + int(i-1,8) * int(nbcol_stack,8)
220 ENDIF
221 apos = apos_ini + int(i-1,8) * lda8
222 IF (keep(50).EQ.0) THEN
223 DO j = 1_8, int(nbcol_stack,8)
224 a(npos+j-1_8) = a(apos+j-1_8)
225 ENDDO
226 ELSE
227 DO j = 1_8, int(i + nbrow_send,8)
228 a(npos+j-1_8)=a(apos+j-1_8)
229 ENDDO
230#if defined(ZERO_TRIANGLE)
231 IF (.NOT. packed_cb) THEN
232 a(npos+int(i+nbrow_send,8):
233 & npos+int(nbcol_stack-1,8))=zero
234 ENDIF
235#endif
236 ENDIF
237 ENDDO
238!$OMP END PARALLEL DO
239 RETURN
240 END SUBROUTINE cmumps_copy_cb_left_to_right
#define mumps_abort
Definition VE_Metis.h:25
subroutine cmumps_copy_cb_right_to_left(a, la, lda, poselt, iptrlu, npiv, nbcol_stack, nbrow_stack, nbrow_send, sizecb, keep, packed_cb, last_allowed, nbrow_already_stacked)
subroutine cmumps_copy_cb_left_to_right(a, la, lda, poselt, iptrlu, npiv, nbcol_stack, nbrow_stack, nbrow_send, sizecb, keep, packed_cb)
subroutine cmumps_compact_factors(a, lda, npiv, nbrow, keep, sizea, iw)
subroutine cmumps_compact_factors_unsym(a, lda, npiv, ncontig, sizea)
#define min(a, b)
Definition macros.h:20
subroutine mumps_ldltpanel_nbtarget(npiv, nb_target, keep)