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()
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)
129 IF (keep(50) .EQ. 0 .OR. nbrowf .LT. keep(63))
THEN
134 DO jj8=poselt, poselt+int(nbrowf,8)*int(nbcolf,8)-1_8
140 IF (iw(ioldps+xxlr).GE.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)
152!$ & ((nbrowf+nomp-1)/nomp +2) / 3 )
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 IF ((keep(253).GT.0).AND.(keep(50).NE.0))
THEN
179 itloc(j) = -itloc(j)*nbcolf + jpos
180 IF ((k1rhs.EQ.0).AND.(j.GT.n))
THEN
186 IF (k1rhs.GT.0) k2rhs=k2
187 IF ( k2rhs.GE.k1rhs )
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 IF (keep(50).EQ.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))
252 IF ( j .EQ. 0 ) cycle
253 IF ( ipos2.EQ.0 .AND. j.LE.0) cycle
259 IF ( (ipos1.GE.jpos) .AND. (ipos2.GT.0) )
THEN
260 apos2 = ict12 + int(jpos - 1,8)
261 a(apos2) = a(apos2) + dblarr(aii8-1_8)
263 IF ( (ipos1.LT.jpos) .AND. (j.GT.0) )
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)