15 & NELT, FRT_PTR, FRT_ELT,
16 & N, INODE, IW, LIW, A, LA,
18 & OPASSW, OPELIW, STEP, PTRIST, PTRAST, ITLOC,
20 & FILS, PTRARW, PTRAIW, INTARR, DBLARR,
21 & ICNTL, KEEP, KEEP8, MYID, LRGROUPS)
26 INTEGER KEEP(500), ICNTL(60)
29 INTEGER NBROWS, NBCOLS
30 INTEGER(8) :: PTRAST(KEEP(28))
31 INTEGER IW(LIW), ITLOC(N+KEEP(253)), STEP(N),
32 & ptrist(keep(28)), fils(n)
33 INTEGER(8),
INTENT(IN) :: PTRARW(NELT+1), PTRAIW(NELT+1)
34 COMPLEX :: RHS_MUMPS(KEEP(255))
35 INTEGER INTARR(KEEP8(27))
36 INTEGER FRT_PTR(N+1), FRT_ELT(NELT)
38 COMPLEX :: DBLARR(KEEP8(26))
39 DOUBLE PRECISION OPASSW, OPELIW
40 INTEGER,
INTENT(IN) :: LRGROUPS(N)
42 COMPLEX,
DIMENSION(:),
POINTER :: A_PTR
44 INTEGER IOLDPS, NBCOLF, NBROWF, NSLAVES, HF,
47 parameter( zero = (0.0e0,0.0e0) )
48 include
'mumps_headers.h'
49 ioldps = ptrist(step(inode))
51 & ptrast(step(inode)), iw(ioldps+xxd), iw(ioldps+xxr),
52 & a_ptr, poselt, la_ptr )
53 nbcolf = iw(ioldps+keep(ixsz))
54 nbrowf = iw(ioldps+2+keep(ixsz))
55 nass = iw(ioldps+1+keep(ixsz))
56 nslaves = iw(ioldps+5+keep(ixsz))
57 hf = 6 + nslaves + keep(ixsz)
60 iw(ioldps+1+keep(ixsz)) = nass
62 & ioldps, a_ptr(poselt), la_ptr, 1_8, keep, keep8, itloc, fils,
64 & intarr, dblarr, keep8(27), keep8(26), frt_ptr, frt_elt,
65 & rhs_mumps, lrgroups)
68 k1 = ioldps + hf + nbrowf
80 &IOLDPS, A, LA, POSELT, KEEP, KEEP8, ITLOC, FILS, PTRAIW, PTRARW,
81 &INTARR, DBLARR, LINTARR, LDBLARR, FRT_PTR, FRT_ELT, RHS_MUMPS,
88 INTEGER,
intent(in) :: N, NELT, LIW, IOLDPS, INODE
89 INTEGER(8),
intent(in) :: LA, POSELT, LINTARR, LDBLARR
90 INTEGER,
intent(in) :: IW(LIW)
91 INTEGER,
intent(in) :: KEEP(500)
92 INTEGER(8),
intent(in) :: KEEP8(150)
93 INTEGER,
intent(inout) :: ITLOC(N+KEEP(253))
94 COMPLEX,
intent(inout) :: A(LA)
95 COMPLEX,
intent(in) :: RHS_MUMPS(KEEP(255))
96 INTEGER,
intent(in) :: INTARR(LINTARR)
97 COMPLEX,
intent(in) :: DBLARR(LDBLARR)
98 INTEGER,
intent(in) :: FRT_PTR(N+1), FRT_ELT(NELT)
99 INTEGER,
intent(in) :: FILS(N)
100 INTEGER(8),
intent(in) :: PTRAIW(NELT+1), PTRARW(NELT+1)
101 INTEGER,
INTENT(IN) :: LRGROUPS(N)
105 include 'mumps_headers.h
'
106 INTEGER :: HF, NBROWF, NBCOLF, NASS, NSLAVES
107 INTEGER :: ILOC, IELL, ELTI, ELBEG, NUMELT
108 INTEGER(8) :: SIZE_ELTI8
109 INTEGER :: I, J, K, K1, K2
110 INTEGER :: IPOS, IPOS1, IPOS2, JPOS, IJROW
112 INTEGER(8) :: II8, JJ8, J18, J28
113 INTEGER(8) :: AINPUT8
115 INTEGER(8) :: APOS, APOS2, ICT12
116 INTEGER, POINTER, DIMENSION(:) :: BEGS_BLR_LS
117 INTEGER :: NB_BLR_LS, NPARTSCB, NPARTSASS, MAXI_CLUSTER,
118 & IBCKSZ2, MINSIZE, TOPDIAG
120 INTEGER :: K1RHS, K2RHS, JFirstRHS
122 PARAMETER( ZERO = (0.0E0,0.0E0) )
123 NBCOLF = IW(IOLDPS+KEEP(IXSZ))
124 NBROWF = IW(IOLDPS+2+KEEP(IXSZ))
125 NASS = IW(IOLDPS+1+KEEP(IXSZ))
126 NSLAVES= IW(IOLDPS+5 + KEEP(IXSZ))
127 HF = 6 + NSLAVES + KEEP(IXSZ)
128!$ NOMP = OMP_GET_MAX_THREADS()
129.EQ..OR..LT.
IF (KEEP(50) 0 NBROWF KEEP(63)) THEN
130!$ CHUNK8 = int(KEEP(361),8)
131!$OMP PARALLEL DO PRIVATE(JJ8) SCHEDULE(STATIC, CHUNK8)
132!$OMP& IF (int(NBROWF,8)*int(NBCOLF,8) > int(KEEP(361),8)
133.AND..GT.
!$OMP& NOMP 1)
134 DO JJ8=POSELT, POSELT+int(NBROWF,8)*int(NBCOLF,8)-1_8
140.GE.
IF (IW(IOLDPS+XXLR)1) THEN
141 CALL GET_CUT(IW(IOLDPS+HF:IOLDPS+HF+NBROWF-1), 0,
142 & NBROWF, LRGROUPS, NPARTSCB,
143 & NPARTSASS, BEGS_BLR_LS)
145 call MAX_CLUSTER(BEGS_BLR_LS,NB_BLR_LS+1,MAXI_CLUSTER)
146 DEALLOCATE(BEGS_BLR_LS)
147 CALL COMPUTE_BLR_VCS(KEEP(472), IBCKSZ2, KEEP(488), NASS)
148 MINSIZE = int(IBCKSZ2 / 2)
149 TOPDIAG = max(2*MINSIZE + MAXI_CLUSTER-1, TOPDIAG)
151!$ CHUNK = max( KEEP(360)/2,
152!$ & ((NBROWF+NOMP-1)/NOMP +2) / 3 )
153!$OMP PARALLEL DO PRIVATE(APOS,JJ3,JJ8) SCHEDULE(STATIC,CHUNK)
154.GT..AND..GT.
!$OMP& IF (NBROWF KEEP(360) NOMP 1)
155 DO JJ8 = 0_8, int(NBROWF-1,8)
156 APOS = POSELT+ JJ8*int(NBCOLF,8)
157 JJ3 = min( int(NBCOLF,8) - 1_8,
158 & JJ8 + int(NBCOLF-NBROWF,8) + TOPDIAG )
159 A(APOS: APOS+JJ3) = ZERO
163 K1 = IOLDPS + HF + NBROWF
174.GT..AND..NE.
IF ((KEEP(253)0)(KEEP(50)0)) THEN
179 ITLOC(J) = -ITLOC(J)*NBCOLF + JPOS
180.EQ..AND..GT.
IF ((K1RHS0)(JN)) THEN
186.GT.
IF (K1RHS0) K2RHS=K2
187.GE.
IF ( K2RHSK1RHS ) THEN
195 APOS = POSELT+int(ILOC-1,8)*int(NBCOLF,8) +
197 A(APOS) = A(APOS) + RHS_MUMPS(
198 & (JFirstRHS+(K-K1RHS)-1)*KEEP(254)+ IN)
206 ITLOC(J) = -ITLOC(J)*NBCOLF + JPOS
210 ELBEG = FRT_PTR(INODE)
211 NUMELT = FRT_PTR(INODE+1) - ELBEG
212 DO IELL=ELBEG,ELBEG+NUMELT-1
215 J28= PTRAIW(ELTI+1)-1_8
217 SIZE_ELTI8 = J28 - J18 + 1_8
219 I = ITLOC(INTARR(II8))
220.EQ.
IF (KEEP(50)0) THEN
222 AINPUT8 = AII8 + II8 - J18
224 ICT12 = POSELT + int(IPOS-1,8) * int(NBCOLF,8)
226 JPOS = ITLOC(INTARR(JJ8))
232 APOS2 = ICT12 + int(JPOS - 1,8)
233 A(APOS2) = A(APOS2) + DBLARR(AINPUT8)
234 AINPUT8 = AINPUT8 + SIZE_ELTI8
238 AII8 = AII8 + J28 - II8 + 1_8
246 IPOS2 = mod(I,NBCOLF)
248 ICT12 = POSELT + int(IPOS2-1,8)*int(NBCOLF,8)
251 J = ITLOC(INTARR(JJ8))
253.EQ..AND..LE.
IF ( IPOS20 J0) CYCLE
259.GE..AND..GT.
IF ( (IPOS1JPOS) (IPOS20) ) THEN
260 APOS2 = ICT12 + int(JPOS - 1,8)
261 A(APOS2) = A(APOS2) + DBLARR(AII8-1_8)
263.LT..AND..GT.
IF ( (IPOS1JPOS) (J0) ) THEN
266 APOS2 = POSELT + int(IPOS-1,8)*int(NBCOLF,8)
268 A(APOS2) = A(APOS2) + DBLARR(AII8-1_8)
274 K1 = IOLDPS + HF + NBROWF
subroutine cmumps_elt_asm_s_2_s_init(nelt, frt_ptr, frt_elt, n, inode, iw, liw, a, la, nbrows, nbcols, opassw, opeliw, step, ptrist, ptrast, itloc, rhs_mumps, fils, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, myid, lrgroups)
subroutine cmumps_asm_slave_elements(inode, n, nelt, iw, liw, ioldps, a, la, poselt, keep, keep8, itloc, fils, ptraiw, ptrarw, intarr, dblarr, lintarr, ldblarr, frt_ptr, frt_elt, rhs_mumps, lrgroups)