176 MYFREE( (*dmumps_par)->irn );
177 MYFREE( (*dmumps_par)->jcn );
178 MYFREE( (*dmumps_par)->a );
179 MYFREE( (*dmumps_par)->irn_loc );
180 MYFREE( (*dmumps_par)->jcn_loc );
181 MYFREE( (*dmumps_par)->a_loc );
182 MYFREE( (*dmumps_par)->eltptr );
183 MYFREE( (*dmumps_par)->eltvar );
184 MYFREE( (*dmumps_par)->a_elt );
185 MYFREE( (*dmumps_par)->perm_in );
189 MYFREE( (*dmumps_par)->colsca );
190 MYFREE( (*dmumps_par)->rowsca );
191 MYFREE( (*dmumps_par)->pivnul_list );
192 MYFREE( (*dmumps_par)->listvar_schur );
193 MYFREE( (*dmumps_par)->sym_perm );
194 MYFREE( (*dmumps_par)->uns_perm );
195 MYFREE( (*dmumps_par)->irhs_ptr);
196 MYFREE( (*dmumps_par)->irhs_sparse);
197 MYFREE( (*dmumps_par)->rhs_sparse);
198 MYFREE( (*dmumps_par)->rhs);
199 MYFREE( (*dmumps_par)->redrhs);
207 (*dmumps_par)->irn = NULL;
208 (*dmumps_par)->jcn = NULL;
209 (*dmumps_par)->a = NULL;
210 (*dmumps_par)->irn_loc = NULL;
211 (*dmumps_par)->jcn_loc = NULL;
212 (*dmumps_par)->a_loc = NULL;
213 (*dmumps_par)->eltptr = NULL;
214 (*dmumps_par)->eltvar = NULL;
215 (*dmumps_par)->a_elt = NULL;
216 (*dmumps_par)->perm_in = NULL;
217 (*dmumps_par)->colsca = NULL;
218 (*dmumps_par)->rowsca = NULL;
219 (*dmumps_par)->rhs = NULL;
220 (*dmumps_par)->redrhs = NULL;
221 (*dmumps_par)->rhs_sparse = NULL;
222 (*dmumps_par)->irhs_sparse = NULL;
223 (*dmumps_par)->irhs_ptr = NULL;
224 (*dmumps_par)->pivnul_list = NULL;
225 (*dmumps_par)->listvar_schur = NULL;
226 (*dmumps_par)->schur = NULL;
227 (*dmumps_par)->sym_perm = NULL;
228 (*dmumps_par)->uns_perm = NULL;
232 int nrhs,
const mxArray *prhs[ ]) {
237#if MUMPS_ARITH == MUMPS_ARITH_z
244 mwSize
n,m,ne, netrue ;
246 mwIndex *irn_in,*jcn_in;
250 mwSize nbrhs,ldrhs, nz_rhs;
251 mwIndex *irhs_ptr, *irhs_sparse;
253#if MUMPS_ARITH == MUMPS_ARITH_z
254 double *im_rhs_sparse;
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);
273 dmumps_par->
job = -1;
280 ptr_int = (
int *) inst_address;
285 dmumps_par->
job = -2;
297 if (!mxIsSparse(
A_IN) ||
n != m )
298 mexErrMsgTxt(
"Input matrix must be a sparse square matrix");
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");
307 if(dmumps_par->
sym != 0)
318 MYMALLOC((dmumps_par->
a),(
int)netrue,double2);
321 mexErrMsgTxt(
"Input is too big; will not work...barfing out\n");
325 if(dmumps_par->
sym == 0){
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;
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];
347 ptr_matlab = mxGetPi(
A_IN);
349 for(i=0;i<dmumps_par->
nz;i++){
350 ((dmumps_par->
a)[i]).i = ptr_matlab[i];
353 for(i=0;i<dmumps_par->
nz;i++){
354 ((dmumps_par->
a)[i]).i = 0.0;
358 ptr_matlab = mxGetPr(
A_IN);
359 for(i=0;i<dmumps_par->
nz;i++){
360 (dmumps_par->
a)[i] = ptr_matlab[i];
366 ptr_matlab = mxGetPr(
A_IN);
367#if MUMPS_ARITH == MUMPS_ARITH_z
368 ptri_matlab = mxGetPi(
A_IN);
370 for(i=0;i<dmumps_par->
n;i++){
371 for(j=jcn_in[i];j<jcn_in[i+1];j++){
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];
380 ((dmumps_par->
a)[pos]).i = ptri_matlab[j];
382 ((dmumps_par->
a)[pos]).i = 0.0;
385 (dmumps_par->
a)[pos] = ptr_matlab[j];
391 dmumps_par->
nz = pos;
416 ptr_matlab = mxGetPr (
RHS_IN);
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;
439 else if ( dmumps_par->
icntl[25-1] > 0 && dmumps_par->
icntl[25-1] <= dmumps_par->
infog[28-1] ) {
441 donullspace = dosolve;
447 nbrhs=dmumps_par->
nrhs; ldrhs=
n;
448 dmumps_par->
lrhs=(int)
n;
451 else if((!dosolve) || ptr_matlab[0] == -9999 ) {
456 EXTRACT_CMPLX_FROM_MATLAB_TOPTR(
RHS_IN,(dmumps_par->
rhs),
double,1);
460 dmumps_par->
nrhs = (int)nbrhs;
461 dmumps_par->
lrhs = (int)ldrhs;
463 mexErrMsgTxt (
"Incompatible number of rows in RHS");
466 dmumps_par->
icntl[20-1] = 0;
467 EXTRACT_CMPLX_FROM_MATLAB_TOPTR(
RHS_IN,(dmumps_par->
rhs),
double,(
int)( dmumps_par->
nrhs*ldrhs));
470 if (dmumps_par->
icntl[30-1] == 0) {
473 dmumps_par->
icntl[20-1] = 1;
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);
481 nz_rhs = irhs_ptr[nbrhs];
482 dmumps_par->
nz_rhs = (int)nz_rhs;
490 for(i=0;i< dmumps_par->
nrhs;i++){
491 for(j=irhs_ptr[i];j<irhs_ptr[i+1];j++){
494 (dmumps_par->
irhs_ptr)[i] = irhs_ptr[i]+1;
497#if MUMPS_ARITH == MUMPS_ARITH_z
499 for(i=0;i<dmumps_par->
nz_rhs;i++){
501 ((dmumps_par->
rhs_sparse)[i]).i = im_rhs_sparse[i];
504 for(i=0;i<dmumps_par->
nz_rhs;i++){
510 for(i=0;i<dmumps_par->
nz_rhs;i++){
521 dmumps_par->
icntl[18] = 1;
523 dmumps_par->
icntl[18] = 0;
526 if ( dmumps_par->
size_schur > 0 && dosolve ) {
527 if ( dmumps_par->
icntl[26-1] == 2 ) {
531 if (tmp_m != dmumps_par->
size_schur || tmp_n != dmumps_par->
nrhs) {
532 mexErrMsgTxt (
"bad dimensions for REDRHS in mumpsmex.c");
534 EXTRACT_CMPLX_FROM_MATLAB_TOPTR(
REDRHS_IN,(dmumps_par->
redrhs),
double,((
int)tmp_m*tmp_n));
537 if ( dmumps_par->
icntl[26-1] == 1 ) {
540 if(!(dmumps_par->
redrhs=(double2 *)malloc((dmumps_par->
size_schur*dmumps_par->
nrhs)*
sizeof(double2)))){
541 mexErrMsgTxt(
"malloc redrhs failed in intmumpsc.c");
552 if ( dmumps_par->
icntl[30-1] != 0 && dosolve ) {
553 RHS_OUT = mxCreateSparse(dmumps_par->
n, dmumps_par->
n,dmumps_par->
nz_rhs,mxREAL2);
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);
561#if MUMPS_ARITH == MUMPS_ARITH_z
562 ptri_matlab = mxGetPi(
RHS_OUT);
564 for(i=0;i<dmumps_par->
nz_rhs;i++){
565#if MUMPS_ARITH == MUMPS_ARITH_z
568 ptri_matlab[i] = (dmumps_par->
rhs_sparse)[i].i;
573 irhs_sparse[i] = (mwIndex)((dmumps_par->
irhs_sparse)[i]-1);
577 else if(dmumps_par->
rhs && dosolve){
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;
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];
600 EXTRACT_CMPLX_FROM_C_TO_MATLAB(
RHS_OUT,(dmumps_par->
rhs),1);
603 ptr_int = (
int *)dmumps_par;
604 inst_address = (size_t) ptr_int;
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;
632 ptr_matlab[j+pos] = (dmumps_par->
schur)[j+pos];
637 SCHUR_OUT = mxCreateDoubleMatrix(1,1,mxREAL2);
639 ptr_matlab[0] = -9999;
640#if MUMPS_ARITH == MUMPS_ARITH_z
642 ptr_matlab[0] = -9999;
646 if ( dmumps_par->
icntl[26-1]==1 && dmumps_par->
size_schur > 0 && dosolve ) {
649#if MUMPS_ARITH == MUMPS_ARITH_z
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;
657 ptr_matlab[i] = ((dmumps_par->
redrhs)[i]);
661 REDRHS_OUT = mxCreateDoubleMatrix(1,1,mxREAL2);
663 ptr_matlab[0] = -9999;
664#if MUMPS_ARITH == MUMPS_ARITH_z
666 ptr_matlab[0] = -9999;