35 IMPLICIT NONE
36 include 'mpif.h'
37 TYPE (CMUMPS_ROOT_STRUC) :: root
38 INTEGER IROOT
39 INTEGER ICNTL( 60 ), KEEP( 500 )
40 INTEGER(8) KEEP8(150)
41 REAL DKEEP(230)
42 INTEGER COMM_LOAD, ASS_IRECV
43 INTEGER LBUFR, LBUFR_BYTES
44 INTEGER BUFR( LBUFR )
45 INTEGER(8) :: POSFAC,IPTRLU, LRLU, LRLUS
46 INTEGER IWPOS, IWPOSCB
47 INTEGER(8) :: LA
48 INTEGER N, LIW
49 INTEGER IW( LIW )
50 COMPLEX A( LA )
51 INTEGER, intent(in) :: LRGROUPS(N)
52 INTEGER(8) :: PTRAST(KEEP(28))
53 INTEGER(8) :: PTRFAC(KEEP(28))
54 INTEGER(8) :: PAMASTER(KEEP(28))
55 INTEGER PTRIST(KEEP(28)), PTLUST_S(KEEP(28))
56 INTEGER STEP(N), PIMASTER(KEEP(28))
57 INTEGER COMP
58 INTEGER NSTK_S( KEEP(28) ), PROCNODE_STEPS( KEEP(28) )
59 INTEGER PERM(N)
60 INTEGER IFLAG, IERROR, COMM
61 INTEGER LPTRAR, NELT
62 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
63 INTEGER LPOOL, LEAF
64 INTEGER IPOOL( LPOOL )
65 INTEGER MYID, SLAVEF, NBFIN
66 INTEGER ISTEP_TO_INIV2(KEEP(71)),
67 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
68 DOUBLE PRECISION OPASSW, OPELIW
69 INTEGER ITLOC( N+KEEP(253) ), FILS( N ), DAD( KEEP(28) )
70 COMPLEX :: RHS_MUMPS(KEEP(255))
71 INTEGER(8), INTENT(IN) :: PTRARW( LPTRAR ), PTRAIW( LPTRAR )
72 INTEGER ND(KEEP(28)), FRERE(KEEP(28))
73 COMPLEX DBLARR( KEEP8(26) )
74 INTEGER INTARR( KEEP8(27) )
75 INTEGER I, NELIM, NB_CONTRI_GLOBAL, NUMORG,
76 & NFRONT, IROW, JCOL, PDEST, HF, IOLDPS,
77 & IN, DEB_ROW, ILOC_ROW, IFSON, ILOC_COL,
78 & IPOS_SON, NELIM_SON, NSLAVES_SON, HS,
79 & IROW_SON, ICOL_SON, ISLAVE, IERR,
80 & NELIM_SENT, IPOS_STATREC, TYPE_SON
81 INTEGER MUMPS_PROCNODE
83 include 'mumps_headers.h'
84 include 'mumps_tags.h'
85 nb_contri_global = keep(41)
86 numorg = root%ROOT_SIZE
87 nelim = keep(42)
88 nfront = numorg + keep(42)
89 DO irow = 0, root%NPROW - 1
90 DO jcol = 0, root%NPCOL - 1
91 pdest = irow * root%NPCOL + jcol
92 IF ( pdest .NE. myid ) THEN
94 & nb_contri_global, pdest, comm, keep, ierr)
95 if (ierr.lt.0) then
96 write(6,*) ' error detected by ',
98 CALL MUMPS_ABORT()
99 endif
100 ENDIF
101 END DO
102 END DO
103 CALL CMUMPS_PROCESS_ROOT2SLAVE( NFRONT,
104 & NB_CONTRI_GLOBAL, root,
105 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
106 & IWPOS, IWPOSCB, IPTRLU,
107 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
108 & PTLUST_S, PTRFAC,
109 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
110 & IFLAG, IERROR, COMM, COMM_LOAD,
111 & IPOOL, LPOOL, LEAF,
112 & NBFIN, MYID, SLAVEF,
113 &
114 & OPASSW, OPELIW, ITLOC, RHS_MUMPS, FILS, DAD,
115 & LPTRAR, NELT, FRTPTR, FRTELT,
116 & PTRARW, PTRAIW,
117 & INTARR,DBLARR,ICNTL,KEEP,KEEP8,DKEEP,ND )
118 IF (IFLAG < 0 ) RETURN
119 HF = 6 + KEEP(IXSZ)
120 IOLDPS = PTLUST_S(STEP(IROOT))
121 IN = IROOT
122 DEB_ROW = IOLDPS + HF
123 ILOC_ROW = DEB_ROW
124.GT. DO WHILE (IN0)
125 IW(ILOC_ROW) = IN
126 IW(ILOC_ROW+NFRONT) = IN
127 ILOC_ROW = ILOC_ROW + 1
128 IN = FILS(IN)
129 END DO
130 IFSON = -IN
131 ILOC_ROW = IOLDPS + HF + NUMORG
132 ILOC_COL = ILOC_ROW + NFRONT
133.GT. IF ( NELIM0 ) THEN
134 IN = IFSON
135.GT. DO WHILE (IN0)
136 IPOS_SON = PIMASTER(STEP(IN))
137.EQ. IF (IPOS_SON 0) GOTO 100
138 NELIM_SON = IW(IPOS_SON+1+KEEP(IXSZ))
139.eq. if (NELIM_SON0) then
140 write(6,*) ' error 1 in process_last_rtnelind'
141 CALL MUMPS_ABORT()
142 endif
143 NSLAVES_SON = IW(IPOS_SON+5+KEEP(IXSZ))
144 HS = 6 + NSLAVES_SON + KEEP(IXSZ)
145 IROW_SON = IPOS_SON + HS
146 ICOL_SON = IROW_SON + NELIM_SON
147 DO I = 1, NELIM_SON
148 IW( ILOC_ROW+I-1 ) = IW( IROW_SON+I-1 )
149 ENDDO
150 DO I = 1, NELIM_SON
151 IW( ILOC_COL+I-1 ) = IW( ICOL_SON+I-1 )
152 ENDDO
153 NELIM_SENT = ILOC_ROW - IOLDPS - HF + 1
154 DO ISLAVE = 0,NSLAVES_SON
155.EQ. IF (ISLAVE0) THEN
156 PDEST= MUMPS_PROCNODE(PROCNODE_STEPS(STEP(IN)),KEEP(199))
157 ELSE
158 PDEST = IW(IPOS_SON + 5 + ISLAVE+KEEP(IXSZ))
159 ENDIF
160.NE. IF (PDESTMYID) THEN
161 CALL CMUMPS_BUF_SEND_ROOT2SON(IN, NELIM_SENT,
162 & PDEST, COMM, KEEP, IERR )
163.lt. if (IERR0) then
164 write(6,*) ' error detected by ',
166 CALL MUMPS_ABORT()
167 endif
168 ELSE
169 CALL CMUMPS_PROCESS_ROOT2SON( COMM_LOAD, ASS_IRECV,
170 & IN, NELIM_SENT, root,
171 &
172 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
173 & IWPOS, IWPOSCB, IPTRLU,
174 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
175 & PTLUST_S, PTRFAC,
176 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
177 & IFLAG, IERROR, COMM,
178 & PERM,
179 & IPOOL, LPOOL, LEAF,
180 & NBFIN, MYID, SLAVEF,
181 &
182 & OPASSW, OPELIW, ITLOC, RHS_MUMPS,
183 & FILS, DAD, PTRARW, PTRAIW,
184 & INTARR, DBLARR, ICNTL, KEEP, KEEP8, DKEEP, ND, FRERE,
185 & LPTRAR, NELT, FRTPTR, FRTELT,
186 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
187 & , LRGROUPS
188 & )
189.NE. IF ( ISLAVE 0 ) THEN
190.EQ. IF (KEEP(50) 0) THEN
191 IPOS_STATREC = PTRIST(STEP(IN))+6+KEEP(IXSZ)
192 ELSE
193 IPOS_STATREC = PTRIST(STEP(IN))+8+KEEP(IXSZ)
194 ENDIF
195.EQ. IF (IW(IPOS_STATREC) S_REC_CONTSTATIC) THEN
196 IW(IPOS_STATREC) = S_ROOT2SON_CALLED
197 ELSE
198.EQ. IF (NSLAVES_SON 0) THEN
199 TYPE_SON = 1
200 ELSE
201 TYPE_SON = 2
202 ENDIF
203 CALL CMUMPS_FREE_BAND( N, IN, PTRIST, PTRAST,
204 & IW, LIW, A, LA, LRLU, LRLUS, IWPOSCB,
205 & IPTRLU, STEP, MYID, KEEP, KEEP8, TYPE_SON
206 & )
207 ENDIF
208 ENDIF
209 IPOS_SON = PIMASTER(STEP(IN))
210 ENDIF
211 END DO
212 CALL CMUMPS_FREE_BLOCK_CB_STATIC(
213 & .FALSE., MYID, N, IPOS_SON,
214 & IW, LIW,
215 & LRLU, LRLUS, IPTRLU,
216 & IWPOSCB, LA, KEEP,KEEP8, .FALSE.
217 & )
218 ILOC_ROW = ILOC_ROW + NELIM_SON
219 ILOC_COL = ILOC_COL + NELIM_SON
220 100 CONTINUE
221 IN = FRERE(STEP(IN))
222 ENDDO
223 ENDIF
224 RETURN
subroutine, public cmumps_buf_send_root2slave(tot_root_size, tot_cont2recv, dest, comm, keep, ierr)