232 {
233
234 int i,j,pos;
235 int *ptr_int;
236 double *ptr_matlab;
237#if MUMPS_ARITH == MUMPS_ARITH_z
238 double *ptri_matlab;
239#endif
240 mwSize tmp_m,tmp_n;
241
242
243 size_t inst_address;
244 mwSize
n,m,ne, netrue ;
245 int job;
246 mwIndex *irn_in,*jcn_in;
247
248
249 int posrhs;
250 mwSize nbrhs,ldrhs, nz_rhs;
251 mwIndex *irhs_ptr, *irhs_sparse;
252 double *rhs_sparse;
253#if MUMPS_ARITH == MUMPS_ARITH_z
254 double *im_rhs_sparse;
255#endif
256
258 int dosolve = 0;
259 int donullspace = 0;
260 int doanalysis = 0;
261 int dofactorize = 0;
262
263
265
266 doanalysis = (job == 1 || job == 4 || job == 6);
267 dofactorize = (job == 2 || job == 4 || job == 5 || job == 6);
268 dosolve = (job == 3 || job == 5 || job == 6);
269
270 if(job == -1){
273 dmumps_par->
job = -1;
278 }else{
280 ptr_int = (int *) inst_address;
281
283
284 if(job == -2){
285 dmumps_par->
job = -2;
287
288
289
291 }else{
292
293
296
297 if (!mxIsSparse(
A_IN) ||
n != m )
298 mexErrMsgTxt("Input matrix must be a sparse square matrix");
299
300 jcn_in = mxGetJc(
A_IN);
302 irn_in = mxGetIr(
A_IN);
303 dmumps_par->
n = (int)
n;
304 if(dmumps_par->
n !=
n)
305 mexErrMsgTxt("Input is too big; will not work...barfing out\n");
306
307 if(dmumps_par->
sym != 0)
309 else
310 netrue = ne;
311
318 MYMALLOC((dmumps_par->
a),(
int)netrue,double2);
321 mexErrMsgTxt("Input is too big; will not work...barfing out\n");
322 }
323
324
325 if(dmumps_par->
sym == 0){
326
327
328
329
330 if(doanalysis){
331
332 for(i=0;i<dmumps_par->
n;i++){
333 for(j=jcn_in[i];j<jcn_in[i+1];j++){
334 (dmumps_par->
jcn)[j] = i+1;
335 (dmumps_par->
irn)[j] = ((
int)irn_in[j])+1;
336 }
337 }
338 }
339 dmumps_par->
nz = (int)ne;
340 if( dmumps_par->
nz != ne)
341 mexErrMsgTxt("Input is too big; will not work...barfing out\n");
342#if MUMPS_ARITH == MUMPS_ARITH_z
343 ptr_matlab = mxGetPr(
A_IN);
344 for(i=0;i<dmumps_par->
nz;i++){
345 ((dmumps_par->
a)[i]).
r = ptr_matlab[i];
346 }
347 ptr_matlab = mxGetPi(
A_IN);
348 if(ptr_matlab){
349 for(i=0;i<dmumps_par->
nz;i++){
350 ((dmumps_par->
a)[i]).i = ptr_matlab[i];
351 }
352 }else{
353 for(i=0;i<dmumps_par->
nz;i++){
354 ((dmumps_par->
a)[i]).i = 0.0;
355 }
356 }
357#else
358 ptr_matlab = mxGetPr(
A_IN);
359 for(i=0;i<dmumps_par->
nz;i++){
360 (dmumps_par->
a)[i] = ptr_matlab[i];
361 }
362#endif
363 }else{
364
365 pos = 0;
366 ptr_matlab = mxGetPr(
A_IN);
367#if MUMPS_ARITH == MUMPS_ARITH_z
368 ptri_matlab = mxGetPi(
A_IN);
369#endif
370 for(i=0;i<dmumps_par->
n;i++){
371 for(j=jcn_in[i];j<jcn_in[i+1];j++){
372 if(irn_in[j] >= i){
373 if(pos >= netrue)
374 mexErrMsgTxt("Input matrix must be symmetric");
375 (dmumps_par->
jcn)[pos] = i+1;
376 (dmumps_par->
irn)[pos] = (
int)irn_in[j]+1;
377#if MUMPS_ARITH == MUMPS_ARITH_z
378 ((dmumps_par->
a)[pos]).
r = ptr_matlab[j];
379 if(ptri_matlab){
380 ((dmumps_par->
a)[pos]).i = ptri_matlab[j];
381 }else{
382 ((dmumps_par->
a)[pos]).i = 0.0;
383 }
384#else
385 (dmumps_par->
a)[pos] = ptr_matlab[j];
386#endif
387 pos++;
388 }
389 }
390 }
391 dmumps_par->
nz = pos;
392 }
393
394
399
400
401
402
403
404
405
408
411
415
416 ptr_matlab = mxGetPr (
RHS_IN);
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435 if ( dmumps_par->
icntl[25-1] == -1 && dmumps_par->
infog[28-1] > 0 ) {
436 dmumps_par->
nrhs=dmumps_par->
infog[28-1];
437 donullspace = dosolve;
438 }
439 else if ( dmumps_par->
icntl[25-1] > 0 && dmumps_par->
icntl[25-1] <= dmumps_par->
infog[28-1] ) {
441 donullspace = dosolve;
442 }
443 else {
444 donullspace=0;
445 }
446 if (donullspace) {
447 nbrhs=dmumps_par->
nrhs; ldrhs=
n;
448 dmumps_par->
lrhs=(int)
n;
450 }
451 else if((!dosolve) || ptr_matlab[0] == -9999 ) {
452
453
454
455
456 EXTRACT_CMPLX_FROM_MATLAB_TOPTR(
RHS_IN,(dmumps_par->
rhs),
double,1);
457 }else{
460 dmumps_par->
nrhs = (int)nbrhs;
461 dmumps_par->
lrhs = (int)ldrhs;
463 mexErrMsgTxt ("Incompatible number of rows in RHS");
464 }
466 dmumps_par->
icntl[20-1] = 0;
467 EXTRACT_CMPLX_FROM_MATLAB_TOPTR(
RHS_IN,(dmumps_par->
rhs),
double,(
int)( dmumps_par->
nrhs*ldrhs));
468 }else{
469
470 if (dmumps_par->
icntl[30-1] == 0) {
471
472
473 dmumps_par->
icntl[20-1] = 1;
474 }
475 irhs_ptr = mxGetJc(
RHS_IN);
476 irhs_sparse = mxGetIr(
RHS_IN);
477 rhs_sparse = mxGetPr(
RHS_IN);
478#if MUMPS_ARITH == MUMPS_ARITH_z
479 im_rhs_sparse = mxGetPi(
RHS_IN);
480#endif
481 nz_rhs = irhs_ptr[nbrhs];
482 dmumps_par->
nz_rhs = (int)nz_rhs;
483
487
489
490 for(i=0;i< dmumps_par->
nrhs;i++){
491 for(j=irhs_ptr[i];j<irhs_ptr[i+1];j++){
493 }
494 (dmumps_par->
irhs_ptr)[i] = irhs_ptr[i]+1;
495 }
497#if MUMPS_ARITH == MUMPS_ARITH_z
498 if(im_rhs_sparse){
499 for(i=0;i<dmumps_par->
nz_rhs;i++){
501 ((dmumps_par->
rhs_sparse)[i]).i = im_rhs_sparse[i];
502 }
503 }else{
504 for(i=0;i<dmumps_par->
nz_rhs;i++){
507 }
508 }
509#else
510 for(i=0;i<dmumps_par->
nz_rhs;i++){
512 }
513#endif
514 }
515 }
516
518 if (dofactorize) {
520 }
521 dmumps_par->
icntl[18] = 1;
522 }else{
523 dmumps_par->
icntl[18] = 0;
524 }
525
526 if ( dmumps_par->
size_schur > 0 && dosolve ) {
527 if ( dmumps_par->
icntl[26-1] == 2 ) {
528
531 if (tmp_m != dmumps_par->
size_schur || tmp_n != dmumps_par->
nrhs) {
532 mexErrMsgTxt ("bad dimensions for REDRHS in mumpsmex.c");
533 }
534 EXTRACT_CMPLX_FROM_MATLAB_TOPTR(
REDRHS_IN,(dmumps_par->
redrhs),
double,((
int)tmp_m*tmp_n));
536 }
537 if ( dmumps_par->
icntl[26-1] == 1 ) {
538
540 if(!(dmumps_par->
redrhs=(double2 *)malloc((dmumps_par->
size_schur*dmumps_par->
nrhs)*
sizeof(double2)))){
541 mexErrMsgTxt("malloc redrhs failed in intmumpsc.c");
542 }
543 }
544 }
546 }
547 }
548 if(nlhs > 0){
551
552 if ( dmumps_par->
icntl[30-1] != 0 && dosolve ) {
553 RHS_OUT = mxCreateSparse(dmumps_par->
n, dmumps_par->
n,dmumps_par->
nz_rhs,mxREAL2);
554
556 irhs_sparse = mxGetIr(
RHS_OUT);
557 for(j=0;j<dmumps_par->
nrhs+1;j++){
558 irhs_ptr[j] = (mwIndex) ((dmumps_par->
irhs_ptr)[j]-1);
559 }
561#if MUMPS_ARITH == MUMPS_ARITH_z
562 ptri_matlab = mxGetPi(
RHS_OUT);
563#endif
564 for(i=0;i<dmumps_par->
nz_rhs;i++){
565#if MUMPS_ARITH == MUMPS_ARITH_z
566
568 ptri_matlab[i] = (dmumps_par->
rhs_sparse)[i].i;
569#else
570
572#endif
573 irhs_sparse[i] = (mwIndex)((dmumps_par->
irhs_sparse)[i]-1);
574 }
575
576 }
577 else if(dmumps_par->
rhs && dosolve){
578
579 nbrhs=dmumps_par->
nrhs;
580 RHS_OUT = mxCreateDoubleMatrix (dmumps_par->
n,dmumps_par->
nrhs,mxREAL2);
581 ptr_matlab = mxGetPr (
RHS_OUT);
582#if MUMPS_ARITH == MUMPS_ARITH_z
583 ptri_matlab = mxGetPi (
RHS_OUT);
584 for(j=0;j<dmumps_par->
nrhs;j++){
586 for(i=0;i<dmumps_par->
n;i++){
587 ptr_matlab[posrhs+i]= (dmumps_par->
rhs)[posrhs+i].
r;
588 ptri_matlab[posrhs+i]= (dmumps_par->
rhs)[posrhs+i].i;
589 }
590 }
591#else
592 for(j=0;j<dmumps_par->
nrhs;j++){
593 posrhs = j*dmumps_par->
n;
594 for(i=0;i<dmumps_par->
n;i++){
595 ptr_matlab[posrhs+i]= (dmumps_par->
rhs)[posrhs+i];
596 }
597 }
598#endif
599 }else{
600 EXTRACT_CMPLX_FROM_C_TO_MATLAB(
RHS_OUT,(dmumps_par->
rhs),1);
601 }
602
603 ptr_int = (int *)dmumps_par;
604 inst_address = (size_t) ptr_int;
615
616 if(dmumps_par->
size_schur > 0 && dofactorize){
619#if MUMPS_ARITH == MUMPS_ARITH_z
624 ptr_matlab[j+pos] = ((dmumps_par->
schur)[j+pos]).
r;
625 ptri_matlab[j+pos] = ((dmumps_par->
schur)[j+pos]).i;
626 }
627 }
628#else
632 ptr_matlab[j+pos] = (dmumps_par->
schur)[j+pos];
633 }
634 }
635#endif
636 }else{
637 SCHUR_OUT = mxCreateDoubleMatrix(1,1,mxREAL2);
639 ptr_matlab[0] = -9999;
640#if MUMPS_ARITH == MUMPS_ARITH_z
642 ptr_matlab[0] = -9999;
643#endif
644 }
645
646 if ( dmumps_par->
icntl[26-1]==1 && dmumps_par->
size_schur > 0 && dosolve ) {
649#if MUMPS_ARITH == MUMPS_ARITH_z
651#endif
653#if MUMPS_ARITH == MUMPS_ARITH_z
654 ptr_matlab[i] = ((dmumps_par->
redrhs)[i]).
r;
655 ptri_matlab[i] = ((dmumps_par->
redrhs)[i]).i;
656#else
657 ptr_matlab[i] = ((dmumps_par->
redrhs)[i]);
658#endif
659 }
660 }else{
661 REDRHS_OUT = mxCreateDoubleMatrix(1,1,mxREAL2);
663 ptr_matlab[0] = -9999;
664#if MUMPS_ARITH == MUMPS_ARITH_z
666 ptr_matlab[0] = -9999;
667#endif
668 }
669
676 }
677}
void MUMPS_CALL dmumps_c(DMUMPS_STRUC_C *dmumps_par)
#define EXTRACT_SCALING_FROM_MATLAB_TOPTR(mxcomponent, mumpspointer, is_a_pointer_from_mumps, length)
#define EXTRACT_FROM_MATLAB_TOVAL(mxcomponent, mumpsvalue)
void DMUMPS_free(DMUMPS_STRUC_C **dmumps_par)
#define EXTRACT_FROM_C_TO_MATLAB(mxcomponent, mumpspointer, length)
void DMUMPS_alloc(DMUMPS_STRUC_C **dmumps_par)
#define EXTRACT_FROM_MATLAB_TOARR(mxcomponent, mumpsarray, type, length)
#define EXTRACT_FROM_MATLAB_TOPTR(mxcomponent, mumpspointer, type, length)
DMUMPS_COMPLEX * rhs_sparse
MUMPS_INT colsca_from_mumps
MUMPS_INT rowsca_from_mumps
MUMPS_INT * listvar_schur