14 SUBROUTINE dmumps_f77( JOB, SYM, PAR, COMM_F77, N, NBLK, ICNTL,
15 & CNTL, KEEP, DKEEP, KEEP8, NZ, NNZ, IRN, IRNhere, JCN,
16 & JCNhere, A, Ahere, NZ_loc, NNZ_loc, IRN_loc, IRN_lochere,
17 & JCN_loc, JCN_lochere, A_loc, A_lochere, NELT, ELTPTR,
18 & ELTPTRhere, ELTVAR, ELTVARhere, A_ELT, A_ELThere,
19 & BLKPTR, BLKPTRhere, BLKVAR, BLKVARhere,
20 & PERM_IN, PERM_INhere, RHS, RHShere, REDRHS, REDRHShere,
21 & INFO, RINFO, INFOG, RINFOG, DEFICIENCY, LWK_USER,
22 & SIZE_SCHUR, LISTVAR_SCHUR, LISTVAR_SCHURhere, SCHUR,
23 & SCHURhere, WK_USER, WK_USERhere, COLSCA, COLSCAhere,
24 & ROWSCA, ROWSCAhere, INSTANCE_NUMBER, NRHS, LRHS, LREDRHS,
25 & RHS_SPARSE, RHS_SPARSEhere, SOL_loc, SOL_lochere,
26 & RHS_loc, RHS_lochere,
27 & IRHS_SPARSE, IRHS_SPARSEhere, IRHS_PTR, IRHS_PTRhere,
28 & ISOL_loc, ISOL_lochere, IRHS_loc, IRHS_lochere, NZ_RHS,
29 & LSOL_loc, LRHS_loc, Nloc_RHS,
30 & SCHUR_MLOC, SCHUR_NLOC, SCHUR_LLD,
31 & MBLOCK, NBLOCK, NPROW, NPCOL,
32 & OOC_TMPDIR, OOC_PREFIX, WRITE_PROBLEM,
33 & SAVE_DIR, SAVE_PREFIX,
34 & TMPDIRLEN, PREFIXLEN, WRITE_PROBLEMLEN,
35 & SAVE_DIRLEN, SAVE_PREFIXLEN,
40 INTEGER OOC_PREFIX_MAX_LENGTH, OOC_TMPDIR_MAX_LENGTH
42 PARAMETER(OOC_PREFIX_MAX_LENGTH=63, ooc_tmpdir_max_length=255)
43 parameter(pb_max_length=255)
44 INTEGER,
PARAMETER :: SAVE_DIR_MAX_LENGTH = 255
45 integer,
PARAMETER :: save_prefix_max_length = 255
46 INTEGER JOB, , PAR, COMM_F77, N, NBLK, NZ, NZ_loc, NELT,
47 & DEFICIENCY, LWK_USER, SIZE_SCHUR, INSTANCE_NUMBER,
49 & NZ_RHS, LSOL_loc,Nloc_RHS, LRHS_loc, LREDRHS
51 INTEGER ICNTL(60), INFO(80), INFOG(80), KEEP(500)
52 INTEGER SCHUR_MLOC, SCHUR_NLOC, SCHUR_LLD
53 INTEGER MBLOCK, NBLOCK, NPROW, NPCOL
54 INTEGER TMPDIRLEN, PREFIXLEN, WRITE_PROBLEMLEN
55 DOUBLE PRECISION CNTL(15), RINFO(40), RINFOG(40), DKEEP(230)
57 INTEGER,
TARGET :: IRN(*), JCN(*), ELTPTR(*), ELTVAR(*)
58 INTEGER,
TARGET :: PERM_IN(*), IRN_loc(*), JCN_loc(*)
59 INTEGER,
TARGET :: LISTVAR_SCHUR(*)
60 INTEGER,
TARGET :: IRHS_PTR(*), IRHS_SPARSE(*)
61 INTEGER,
TARGET :: ISOL_loc(*), IRHS_loc(*)
62 INTEGER,
TARGET :: BLKPTR(*), BLKVAR(*)
63 DOUBLE PRECISION,
TARGET :: A(*), A_ELT(*), A_loc(*), RHS(*)
64 DOUBLE PRECISION,
TARGET :: WK_USER(*)
65 DOUBLE PRECISION,
TARGET :: REDRHS(*)
66 DOUBLE PRECISION,
TARGET :: ROWSCA(*), COLSCA(*)
67 DOUBLE PRECISION,
TARGET :: (*)
68 DOUBLE PRECISION,
TARGET :: RHS_SPARSE(*), SOL_loc(*), RHS_loc(*)
69 INTEGER,
INTENT(inout) :: OOC_TMPDIR(OOC_TMPDIR_MAX_LENGTH)
70 INTEGER,
INTENT(inout) :: OOC_PREFIX(OOC_PREFIX_MAX_LENGTH)
71 INTEGER,
INTENT(in) :: WRITE_PROBLEM(PB_MAX_LENGTH)
72 INTEGER SAVE_DIRLEN, SAVE_PREFIXLEN
73 INTEGER,
INTENT(in) :: SAVE_DIR(SAVE_DIR_MAX_LENGTH)
74 INTEGER,
INTENT(in) :: SAVE_PREFIX(SAVE_PREFIX_MAX_LENGTH)
75 INTEGER METIS_OPTIONS(40)
79 & rhshere, redrhshere, irn_lochere,
80 & jcn_lochere, a_lochere, listvar_schurhere,
81 & schurhere, colscahere, rowscahere, rhs_sparsehere,
82 & sol_lochere, rhs_lochere, irhs_ptrhere, irhs_sparsehere,
83 & isol_lochere, irhs_lochere
86 TYPE (DMUMPS_STRUC),
POINTER :: PTR
87 END TYPE dmumps_struc_ptr
88 TYPE (DMUMPS_STRUC),
POINTER :: mumps_par
89 TYPE (DMUMPS_STRUC_PTR),
DIMENSION (:),
POINTER,
SAVE ::
91 TYPE (DMUMPS_STRUC_PTR),
DIMENSION (:),
POINTER ::
93 INTEGER,
SAVE :: DMUMPS_STRUC_ARRAY_SIZE = 0
94 INTEGER,
SAVE :: N_INSTANCES = 0
96 INTEGER(8) :: A_ELT_SIZE, NNZ_i
97 INTEGER DMUMPS_STRUC_ARRAY_SIZE_INIT
98 parameter(dmumps_struc_array_size_init=10)
99 EXTERNAL mumps_assign_mapping,
100 & mumps_assign_pivnul_list,
101 & mumps_assign_sym_perm,
102 & mumps_assign_uns_perm
103 EXTERNAL dmumps_assign_colsca,
104 & dmumps_assign_rowsca
106 DO i = 1, dmumps_struc_array_size
107 IF ( .NOT.
associated(mumps_par_array(i)%PTR) )
GOTO 10
109 ALLOCATE( mumps_par_array_bis(dmumps_struc_array_size +
110 & dmumps_struc_array_size_init), stat=ierr)
112 WRITE(*,*)
' ** Allocation Error 1 in DMUMPS_F77.'
115 DO i = 1, dmumps_struc_array_size
116 mumps_par_array_bis(i)%PTR=>mumps_par_array(i)%PTR
118 IF (
associated(mumps_par_array))
DEALLOCATE(mumps_par_array)
119 mumps_par_array=>mumps_par_array_bis
120 NULLIFY(mumps_par_array_bis)
121 DO i = dmumps_struc_array_size+1, dmumps_struc_array_size +
122 & dmumps_struc_array_size_init
123 NULLIFY(mumps_par_array(i)%PTR)
125 i = dmumps_struc_array_size+1
126 dmumps_struc_array_size = dmumps_struc_array_size +
127 & dmumps_struc_array_size_init
130 n_instances = n_instances+1
131 ALLOCATE( mumps_par_array(instance_number)%PTR,stat=ierr )
133 WRITE(*,*)
'** Allocation Error 2 in DMUMPS_F77.'
141 metis_options(1:40) = 0
142 mumps_par_array(instance_number)%PTR%INSTANCE_NUMBER =
145 IF ( instance_number .LE. 0 .OR. instance_number .GT.
146 & dmumps_struc_array_size )
THEN
147 WRITE(*,*)
' ** Instance Error 1 in DMUMPS_F77',
151 IF ( .NOT.
associated ( mumps_par_array(instance_number)%PTR ) )
153 WRITE(*,*)
' Instance Error 2 in DMUMPS_F77',
157 mumps_par => mumps_par_array(instance_number)%PTR
162 mumps_par%NBLK = nblk
165 mumps_par%NZ_loc = nz_loc
166 mumps_par%NNZ_loc = nnz_loc
167 mumps_par%LWK_USER = lwk_user
168 mumps_par%SIZE_SCHUR = size_schur
170 mumps_par%ICNTL(1:60)=icntl(1:60)
171 mumps_par%CNTL(1:15)=cntl(1:15)
172 mumps_par%KEEP(1:500)=keep(1:500)
173 mumps_par%DKEEP(1:230)=dkeep(1:230)
174 mumps_par%KEEP8(1:150)=keep8(1:150)
175 mumps_par%METIS_OPTIONS(1:40)=metis_options(1:40)
176 mumps_par%NRHS = nrhs
177 mumps_par%LRHS = lrhs
178 mumps_par%LREDRHS = lredrhs
179 mumps_par%NZ_RHS = nz_rhs
180 mumps_par%LSOL_loc = lsol_loc
181 mumps_par%Nloc_RHS = nloc_rhs
182 mumps_par%LRHS_loc = lrhs_loc
183 mumps_par%SCHUR_MLOC = schur_mloc
184 mumps_par%SCHUR_NLOC = schur_nloc
185 mumps_par%SCHUR_LLD = schur_lld
186 mumps_par%MBLOCK = mblock
187 mumps_par%NBLOCK = nblock
188 mumps_par%NPROW = nprow
189 mumps_par%NPCOL = npcol
190 IF ( comm_f77 .NE. -987654 )
THEN
191 mumps_par%COMM = comm_f77
193 mumps_par%COMM = mpi_comm_world
195 CALL mpi_bcast(nrhs,1,mpi_integer,0,mumps_par%COMM,ierr)
197 IF ( irnhere /= 0 ) mumps_par%IRN => irn(1:nnz_i)
198 IF ( jcnhere /= 0 ) mumps_par%JCN => jcn(1:nnz_i)
199 IF ( ahere /= 0 ) mumps_par%A => a(1:nnz_i)
201 IF ( irn_lochere /= 0 ) mumps_par%IRN_loc => irn_loc(1:nnz_i)
202 IF ( jcn_lochere /= 0 ) mumps_par%JCN_loc => jcn_loc(1:nnz_i)
203 IF ( a_lochere /= 0 ) mumps_par%A_loc => a_loc(1:nnz_i
204 IF ( eltptrhere /= 0 ) mumps_par%ELTPTR => eltptr(1:nelt+1)
205 IF ( eltvarhere /= 0 ) mumps_par%ELTVAR =>
206 & eltvar(1:eltptr(nelt+1)-1)
207 IF ( a_elthere /= 0 )
THEN
210 np = eltptr(i+1) -eltptr(i)
212 a_elt_size = a_elt_size + np * np
214 a_elt_size = a_elt_size + np * ( np + 1 ) /
217 mumps_par%A_ELT => a_elt(1_8:a_elt_size)
219 IF ( blkptrhere /= 0 ) mumps_par%BLKPTR => blkptr(1:nblk+1)
220 IF ( blkvarhere /= 0 ) mumps_par%BLKVAR => blkvar(1:n)
221 IF ( perm_inhere /= 0) mumps_par%PERM_IN => perm_in(1:n)
222 IF ( listvar_schurhere /= 0)
223 & mumps_par%LISTVAR_SCHUR =>listvar_schur(1:size_schur)
224 IF ( schurhere /= 0 )
THEN
225 mumps_par%SCHUR_CINTERFACE=>schur(1:1)
227 IF (nrhs .NE. 1)
THEN
228 IF ( rhshere /= 0 ) mumps_par%RHS =>
229 & rhs(1_8:int(nrhs,8)*int(lrhs
230 IF (redrhshere /= 0)mumps_par%REDRHS=>
231 & redrhs(1_8:int(nrhs,8)*int(lredrhs,8))
233 IF ( rhshere /= 0 ) mumps_par%RHS => rhs(1:n)
234 IF (redrhshere /= 0)mumps_par%REDRHS=>redrhs(1:size_schur)
236 IF ( wk_userhere /=0 )
THEN
237 IF (lwk_user > 0 )
THEN
238 mumps_par%WK_USER => wk_user(1:lwk_user)
240 mumps_par%WK_USER => wk_user(1_8:-int(lwk_user,8)*1000000_8)
243 IF ( colscahere /= 0) mumps_par%COLSCA => colsca(1:n)
244 IF ( rowscahere /= 0) mumps_par%ROWSCA => rowsca(1:n)
245 IF ( rhs_sparsehere /=0 ) mumps_par%RHS_SPARSE=>
246 & rhs_sparse(1:nz_rhs)
247 IF ( irhs_sparsehere /=0 ) mumps_par%IRHS_SPARSE=>
248 & irhs_sparse(1:nz_rhs)
249 IF ( sol_lochere /=0 ) mumps_par%SOL_loc=>
250 & sol_loc(1_8:int(lsol_loc,8)*int(nrhs,8))
251 IF ( rhs_lochere /=0 ) mumps_par%RHS_loc=>
252 & rhs_loc(1_8:int(lrhs_loc,8)*int(nrhs,8))
253 IF ( isol_lochere /=0 ) mumps_par%ISOL_loc=>
254 & isol_loc(1:lsol_loc)
255 IF ( irhs_lochere /=0 ) mumps_par%IRHS_loc=>
256 & irhs_loc(1:lrhs_loc)
257 IF ( irhs_ptrhere /=0 ) mumps_par%IRHS_PTR=>
260 mumps_par%OOC_TMPDIR(i:i)=char(ooc_tmpdir(i))
262 DO i=tmpdirlen+1,ooc_tmpdir_max_length
263 mumps_par%OOC_TMPDIR(i:i)=
' '
266 mumps_par%OOC_PREFIX(i:i)=char(ooc_prefix(i))
268 DO i=prefixlen+1,ooc_prefix_max_length
269 mumps_par%OOC_PREFIX(i:i)=
' '
271 DO i=1,write_problemlen
272 mumps_par%WRITE_PROBLEM(i:i)=char(write_problem(i))
274 DO i=write_problemlen+1,pb_max_length
275 mumps_par%WRITE_PROBLEM(i:i)=
' '
278 mumps_par%SAVE_DIR(i:i)=char(save_dir(i))
280 DO i=save_dirlen+1,save_dir_max_length
281 mumps_par%SAVE_DIR(i:i)=
' '
283 DO i=1,save_prefixlen
284 mumps_par%SAVE_PREFIX(i:i)=char(save_prefix(i))
286 DO i=save_prefixlen+1,save_prefix_max_length
287 mumps_par%SAVE_PREFIX(i:i)=
' '
289 CALL dmumps( mumps_par )
290 info(1:80)=mumps_par%INFO(1:80)
291 infog(1:80)=mumps_par%INFOG(1:80)
292 rinfo(1:40)=mumps_par%RINFO(1:40)
293 rinfog(1:40)=mumps_par%RINFOG(1:40)
294 icntl(1:60) = mumps_par%ICNTL(1:60)
295 cntl(1:15) = mumps_par%CNTL(1:15)
296 keep(1:500) = mumps_par%KEEP(1:500)
297 dkeep(1:230) = mumps_par%DKEEP(1:230)
298 keep8(1:150) = mumps_par%KEEP8(1:150)
299 metis_options(1:40) = mumps_par%METIS_OPTIONS(1:40)
304 nblk = mumps_par%NBLK
307 nrhs = mumps_par%NRHS
308 lrhs = mumps_par%LRHS
309 lredrhs = mumps_par%LREDRHS
310 nz_loc = mumps_par%NZ_loc
311 nnz_loc = mumps_par%NNZ_loc
312 nz_rhs = mumps_par%NZ_RHS
313 lsol_loc = mumps_par%LSOL_loc
314 nloc_rhs = mumps_par%Nloc_RHS
315 lrhs_loc = mumps_par%LRHS_loc
316 size_schur = mumps_par%SIZE_SCHUR
317 lwk_user = mumps_par%LWK_USER
318 nelt = mumps_par%NELT
319 deficiency = mumps_par%Deficiency
320 schur_mloc = mumps_par%SCHUR_MLOC
321 schur_nloc = mumps_par%SCHUR_NLOC
322 schur_lld = mumps_par%SCHUR_LLD
323 mblock = mumps_par%MBLOCK
324 nblock = mumps_par%NBLOCK
325 nprow = mumps_par%NPROW
326 npcol = mumps_par%NPCOL
327 IF (
associated (mumps_par%MAPPING) )
THEN
328 CALL mumps_assign_mapping(mumps_par%MAPPING(1))
330 CALL mumps_nullify_c_mapping()
332 IF (
associated (mumps_par%PIVNUL_LIST) )
THEN
333 CALL mumps_assign_pivnul_list(mumps_par%PIVNUL_LIST
335 CALL mumps_nullify_c_pivnul_list()
337 IF (
associated (mumps_par%SYM_PERM) )
THEN
338 CALL mumps_assign_sym_perm(mumps_par%SYM_PERM(1))
340 CALL mumps_nullify_c_sym_perm()
342 IF (
associated (mumps_par%UNS_PERM) )
THEN
343 CALL mumps_assign_uns_perm(mumps_par%UNS_PERM(1))
345 CALL mumps_nullify_c_uns_perm()
347 IF (
associated( mumps_par%COLSCA))
THEN
348 CALL dmumps_assign_colsca(mumps_par%COLSCA(1))
350 CALL dmumps_nullify_c_colsca()
352 IF (
associated( mumps_par%ROWSCA))
THEN
353 CALL dmumps_assign_rowsca(mumps_par%ROWSCA(1))
355 CALL dmumps_nullify_c_rowsca()
357 tmpdirlen=len_trim(mumps_par%OOC_TMPDIR)
358 DO i=1,ooc_tmpdir_max_length
359 ooc_tmpdir(i)=ichar(mumps_par%OOC_TMPDIR(i:i))
361 prefixlen=len_trim(mumps_par%OOC_PREFIX)
362 DO i=1,ooc_prefix_max_length
363 ooc_prefix(i)=ichar(mumps_par%OOC_PREFIX(i:i))
365 IF ( job == -2 )
THEN
366 IF (
associated(mumps_par_array(instance_number)%PTR))
THEN
367 DEALLOCATE(mumps_par_array(instance_number)%PTR)
368 NULLIFY (mumps_par_array(instance_number)%PTR)
369 n_instances = n_instances - 1
370 IF ( n_instances == 0 )
THEN
371 DEALLOCATE(mumps_par_array)
372 dmumps_struc_array_size = 0
375 WRITE(*,*)
"** Warning: instance already freed"
376 WRITE(*,*)
" this should normally not happen."
subroutine dmumps_f77(job, sym, par, comm_f77, n, nblk, icntl, cntl, keep, dkeep, keep8, nz, nnz, irn, irnhere, jcn, jcnhere, a, ahere, nz_loc, nnz_loc, irn_loc, irn_lochere, jcn_loc, jcn_lochere, a_loc, a_lochere, nelt, eltptr, eltptrhere, eltvar, eltvarhere, a_elt, a_elthere, blkptr, blkptrhere, blkvar, blkvarhere, perm_in, perm_inhere, rhs, rhshere, redrhs, redrhshere, info, rinfo, infog, rinfog, deficiency, lwk_user, size_schur, listvar_schur, listvar_schurhere, schur, schurhere, wk_user, wk_userhere, colsca, colscahere, rowsca, rowscahere, instance_number, nrhs, lrhs, lredrhs, rhs_sparse, rhs_sparsehere, sol_loc, sol_lochere, rhs_loc, rhs_lochere, irhs_sparse, irhs_sparsehere, irhs_ptr, irhs_ptrhere, isol_loc, isol_lochere, irhs_loc, irhs_lochere, nz_rhs, lsol_loc, lrhs_loc, nloc_rhs, schur_mloc, schur_nloc, schur_lld, mblock, nblock, nprow, npcol, ooc_tmpdir, ooc_prefix, write_problem, save_dir, save_prefix, tmpdirlen, prefixlen, write_problemlen, save_dirlen, save_prefixlen, metis_options)