56 IMPLICIT NONE
57 TYPE(SMUMPS_STRUC) :: id
58 INTEGER, TARGET :: WORK1(:), WORK2(:)
59 INTEGER :: NFSIZ(:), FILS(:), FRERE(:)
60 TYPE(ORD_TYPE) :: ord
61 INTEGER, POINTER :: IPE(:), NV(:),
62 & NE(:), NA(:), NODE(:),
63 & ND(:), SUBORD(:), NAMALG(:),
64 & IPS(:), CUMUL(:),
65 & SAVEIRN(:), SAVEJCN(:)
66 INTEGER :: MYID, NPROCS, IERR, NEMIN, LDIAG
67 LOGICAL :: SPLITROOT
68 INTEGER(8), PARAMETER :: K79REF=12000000_8
69 INTEGER, PARAMETER :: LIDUMMY = 1
70 INTEGER :: IDUMMY(1)
71 DOUBLE PRECISION :: TIMEB
72 nullify(ipe, nv, ne, na, node, nd, subord, namalg, ips,
73 & cumul, saveirn, savejcn)
79 prok = (mp.GT.0)
80 prokg = (mpg.GT.0) .AND. (myid .EQ. 0)
81 lpok = (lp.GT.0) .AND. (
id%ICNTL(4).GE.1)
83 ord%PERMTAB => work1(1 :
id%N)
84 ord%PERITAB => work1(
id%N+1 : 2*
id%N)
85 ord%TREETAB => work1(2*
id%N+1 : 3*
id%N)
86 IF(
id%KEEP(54) .NE. 3)
THEN
87 IF(myid.EQ.0) THEN
92 id%KEEP8(29) =
id%KEEP8(28)
93 ELSE
95 END IF
96 END IF
97 maxmem=0
98 IF(memcnt .GT. maxmem) maxmem=memcnt
99 CALL smumps_set_par_ord(
id, ord)
100 id%INFOG(7) =
id%KEEP(245)
103 IF (
id%INFO(1) .LT. 0 )
RETURN
105 CALL smumps_do_par_ord(
id, ord, work2)
106 IF (prokg) THEN
108 WRITE(mpg,
109 & '(" ELAPSED time in parallel ordering =",F12.4)')
110 & timeb
111 ENDIF
114 IF (
id%INFO(1) .LT. 0 )
RETURN
115 IF(
id%MYID .EQ. 0)
THEN
116 CALL mumps_realloc(ipe,
id%N,
id%INFO, lp, force=.false.,
117 & copy=.false., string='',
118 & memcnt=memcnt, errcode=-7)
119 CALL mumps_realloc(nv,
id%N,
id%INFO, lp,
120 & memcnt=memcnt, errcode=-7)
121 IF(memcnt .GT. maxmem) maxmem=memcnt
122 END IF
123 ord%SUBSTRAT = 0
124 ord%TOPSTRAT = 0
125 CALL smumps_parsymfact(
id, ord, ipe, nv, work2)
126 IF(
id%KEEP(54) .NE. 3)
THEN
127 IF(myid.EQ.0) THEN
128 id%IRN_loc => saveirn
129 id%JCN_loc => savejcn
130 END IF
131 END IF
134 IF (
id%INFO(1) .LT. 0 )
RETURN
135 NULLIFY(ord%PERMTAB)
136 NULLIFY(ord%PERITAB)
137 NULLIFY(ord%TREETAB)
138 CALL mumps_idealloc(ord%FIRST, ord%LAST, memcnt=memcnt)
139 IF (myid .EQ. 0) THEN
141 ne => work1(
id%N+1 : 2*
id%N)
142 na => work1(2*
id%N+1 : 3*
id%N)
143 node => work2(1 :
id%N )
144 nd => work2(
id%N+1 : 2*
id%N)
145 subord => work2(2*
id%N+1 : 3*
id%N)
146 namalg => work2(3*
id%N+1 : 4*
id%N)
147 CALL mumps_realloc(cumul,
id%N,
id%INFO, lp,
148 & string='CUMUL', memcnt=memcnt, errcode=-7)
149 IF(memcnt .GT. maxmem) maxmem=memcnt
152 & na(1), nfsiz(1), node(1),
id%INFOG(6), fils(1), frere(1),
153 & nd(1), nemin, subord(1),
id%KEEP(60),
id%KEEP(20),
154 &
id%KEEP(38), namalg(1),
id%KEEP(104), cumul(1),
155 &
id%KEEP(50),
id%ICNTL(13),
id%KEEP(37),
id%KEEP(197),
156 &
id%NSLAVES,
id%KEEP(250).EQ.1, .false., idummy, lidummy)
157 CALL mumps_dealloc(cumul, nv, ipe, memcnt=memcnt)
159 &
id%KEEP(2),
id%KEEP(50),
id%KEEP8(101),
id%KEEP(108),
160 &
id%KEEP(5),
id%KEEP(6),
id%KEEP(226),
id%KEEP(253))
161 IF (
id%KEEP(53) .NE. 0 )
THEN
164 END IF
165 IF ( (
id%KEEP(48) == 4 .AND.
id%KEEP8(21).GT.0_8)
166 & .OR.
167 & (
id%KEEP (48)==5 .AND.
id%KEEP8(21) .GT. 0_8 )
168 & .OR.
169 & (
id%KEEP(24).NE.0.AND.
id%KEEP8(21).GT.0_8) )
THEN
171 &
id%KEEP(48),
id%KEEP(50),
id%NSLAVES)
172 END IF
173 IF ((
id%KEEP(210).LT.0) .OR. (
id%KEEP(210).GT.2))
175 IF ((
id%KEEP(210).EQ.0) .AND. (
id%KEEP(201).GT.0))
177 IF ((
id%KEEP(210).EQ.0) .AND. (
id%KEEP(201).EQ.0))
179 IF (
id%KEEP(210).EQ.2)
id%KEEP8(79)=huge(
id%KEEP8(79))
180 IF ((
id%KEEP(210).EQ.1) .AND. (
id%KEEP8(79).LE.0_8))
THEN
181 id%KEEP8(79)=k79ref * int(
id%NSLAVES,8)
182 ENDIF
183 IF ( (
id%KEEP(79).EQ.0).OR.(
id%KEEP(79).EQ.2).OR.
184 & (
id%KEEP(79).EQ.3).OR.(
id%KEEP(79).EQ.5).OR.
186 & ) THEN
187 IF (
id%KEEP(210).EQ.1)
THEN
188 splitroot = .false.
189 IF (
id%KEEP(62).GE.1)
THEN
190 idummy(1) = -1
192 & nfsiz(1), idummy, lidummy,
id%INFOG(6),
193 &
id%NSLAVES,
id%KEEP(1),
id%KEEP8(1), splitroot,
194 & mp, ldiag,
id%INFOG(1),
id%INFOG(2))
195 IF (
id%INFOG(1).LT.0)
RETURN
196 ENDIF
197 ENDIF
198 ENDIF
199 splitroot = (((
id%ICNTL(13).GT.0) .AND.
200 & (
id%NSLAVES.GT.
id%ICNTL(13))) .OR.
201 & (
id%ICNTL(13).EQ.-1)) .AND. (
id%KEEP(60).EQ.0)
202 IF (splitroot) THEN
203 idummy(1) = -1
205 & idummy, lidummy,
id%INFOG(6),
206 &
id%NSLAVES,
id%KEEP(1),
id%KEEP8(1),
207 & splitroot, mp, ldiag,
id%INFOG(1),
id%INFOG(2))
208 IF (
id%INFOG(1).LT.0)
RETURN
209 ENDIF
210 END IF
211 RETURN
subroutine mumps_propinfo(icntl, info, comm, id)
subroutine mpi_comm_size(comm, size, ierr)
subroutine mpi_comm_rank(comm, rank, ierr)
subroutine smumps_ana_m(ne, nd, nsteps, maxfr, maxelim, k50, sizefac_tot, maxnpiv, k5, k6, panel_size, k253)
subroutine smumps_set_k821_surface(keep821, keep2, keep48, keep50, nslaves)
subroutine smumps_ana_lnew(n, ipe, nv, ips, ne, na, nfsiz, node, nsteps, fils, frere, nd, nemin, subord, keep60, keep20, keep38, namalg, namalgmax, cumul, keep50, icntl13, keep37, keep197, nslaves, allow_amalg_tiny_nodes, blkon, sizeofblocks, lsizeofblocks)
subroutine smumps_cutnodes(n, frere, fils, nfsiz, sizeofblocks, lsizeofblocks, nsteps, nslaves, keep, keep8, splitroot, mp, ldiag, info1, info2)