185 int njob, mjob, ljob, mint, nint, lint, nsym, msym, lsym, nA, mA, nRHS, nREDRHS, mRHS,lRHS, liRHS;
186 int mREDRHS,lREDRHS,liREDRHS;
187 int nicntl, micntl, licntl, ncntl, mcntl, lcntl, nperm, mperm, lperm;
188 int ncols, mcols, lcols, licols, nrows, mrows, lrows, lirows, ns_schu , ms_schu, ls_schu;
189 int nv_schu, mv_schu, lv_schu, nschu, mschu, lschu;
190 int type_rhs, mtype_rhs, ntype_rhs, ltype_rhs;
193 int linfog, lrinfog, lrhsout,lrhsouti, linstout, lschurout, lschurouti, ldef;
194 int lpivnul_list, lmapp, lsymperm, lunsperm;
195 int one=1, temp1=80, temp2=40, temp3, temp4;
196 int it, itRHS, itREDRHS;
198 int i,j,k1,k2, nb_in_row,netrue;
202#if MUMPS_ARITH == MUMPS_ARITH_z
203 double * ptri_scilab;
217 int posrhs, posschur, nz_RHS,col_ind,k;
221#if MUMPS_ARITH == MUMPS_ARITH_z
222 double *im_rhs_sparse;
223 char * function_name=
"zmumpsc";
225 char * function_name=
"dmumpsc";
229 SciSparse RHS_SPARSE;
239 GetRhsVar(2,
"i",&mjob,&njob,&ljob);
240 dosolve = (*istk(ljob) == 3 || *istk(ljob) == 5 ||*istk(ljob) == 6);
241 doanal = (*istk(ljob) == 1 || *istk(ljob) == 4 || *istk(ljob) == 6);
242 if(*istk(ljob) == -1){
245 GetRhsVar(1,
"i",&msym,&nsym,&lsym);
246 dmumps_par->
sym=*istk(lsym);
247 dmumps_par->
job = -1;
255 GetRhsVar(10,
"i",&mint,&nint,&lint);
256 inst_address=*istk(lint);
257 ptr_int = (
int *) inst_address;
260 if(*istk(ljob) == -2){
261 dmumps_par->
job = -2;
266 GetRhsVar(12,
"s",&mA,&nA,&A);
268 if (nA != mA || mA<1 ){
269 Scierror(999,
"%s: Bad dimensions for mat\n",function_name);
276 if(dmumps_par->
sym != 0){
287 dmumps_par->
jcn = (
int*)malloc(netrue*
sizeof(
int));
288 dmumps_par->
irn = (
int*)malloc(netrue*
sizeof(
int));
289 dmumps_par->
a = (double2 *) malloc(netrue*
sizeof(double2));
294 if ((dmumps_par->
sym)==0){
303 (dmumps_par->
jcn)[i]=(A.icol)[i];}
305 for (k2=1;k2<mA+1;k2++){
307 while(nb_in_row<(A.mnel)[k2-1]){
308 dmumps_par->
irn[k1]=k2;
310 nb_in_row=nb_in_row+1;
315#if MUMPS_ARITH == MUMPS_ARITH_z
317 ((dmumps_par->
a)[i]).
r = (A.R)[i];}
320 ((dmumps_par->
a)[i]).i = (A.I)[i];}
323 ((dmumps_par->
a)[i]).i = 0.0;}
327 ((dmumps_par->
a)[i]) = (A.R)[i];}
335 for (k2=1;k2<mA+1;k2++){
337 while(nb_in_row<(A.mnel)[k2-1]){
338 if( k2 >= (A.icol)[i]){
340 Scierror(999,
"%s: The matrix must be symmetric\n",function_name);
343 (dmumps_par->
jcn)[k1]=(A.icol)[i];
344 (dmumps_par->
irn)[k1]=k2;
345#if MUMPS_ARITH == MUMPS_ARITH_z
346 (dmumps_par->
a)[k1].
r=(A.R)[i];
348 ((dmumps_par->
a)[k1]).i = (A.I)[i];}
350 ((dmumps_par->
a)[k1]).i = 0.0;}
352 ((dmumps_par->
a)[k1]) = (A.R)[i];
356 nb_in_row=nb_in_row+1;
363 GetRhsVar(2,
"i",&mjob,&njob,&ljob);
364 dmumps_par->
job=*istk(ljob);
366 GetRhsVar(3,
"i",&micntl,&nicntl,&licntl);
369 GetRhsVar(4,
"d",&mcntl,&ncntl,&lcntl);
372 GetRhsVar(5,
"i",&mperm, &nperm, &lperm);
375 GetRhsCVar(6,
"d",&it,&mcols,&ncols,&lcols,&licols);
378 GetRhsCVar(7,
"d",&it,&mrows,&nrows,&lrows,&lirows);
397 if ( dmumps_par->
icntl[25-1] == -1 && dmumps_par->
infog[28-1] > 0) {
398 dmumps_par->
nrhs=dmumps_par->
infog[28-1];
399 donullspace = dosolve;
401 else if ( dmumps_par->
icntl[25-1] > 0 && dmumps_par->
icntl[25-1] <= dmumps_par->
infog[28-1] ) {
403 donullspace = dosolve;
409 nRHS=dmumps_par->
nrhs;
410 dmumps_par->
lrhs=dmumps_par->
n;
411 dmumps_par->
rhs=(double2 *)malloc((dmumps_par->
n)*(dmumps_par->
nrhs)*
sizeof(double2));
412 dmumps_par->
icntl[19]=0;
415 else if(GetType(8)!=5){
417 GetRhsCVar(8,
"d",&itRHS,&mRHS,&nRHS,&lRHS,&liRHS);
419 if((!dosolve) || (stk(lRHS)[0]) == -9999){
421 EXTRACT_CMPLX_FROM_SCILAB_TOPTR(itRHS,stk(lRHS),stk(liRHS),(dmumps_par->
rhs),double2,one);
424 dmumps_par->
nrhs = nRHS;
425 dmumps_par->
lrhs = mRHS;
427 Scierror(999,
"%s: Incompatible number of rows in RHS\n",function_name);
429 dmumps_par->
icntl[19]=0;
430 EXTRACT_CMPLX_FROM_SCILAB_TOPTR(itRHS,stk(lRHS),stk(liRHS),(dmumps_par->
rhs),double2,(nRHS*mRHS));
434 GetRhsVar(8,
"s",&mRHS,&nRHS,&RHS_SPARSE);
435 dmumps_par->
icntl[19]=1;
436 dmumps_par->
nrhs = nRHS;
437 dmumps_par->
lrhs = mRHS;
438 nz_RHS=RHS_SPARSE.nel;
439 dmumps_par->
nz_rhs=nz_RHS;
441 irhs_ptr=(
int*)malloc((nRHS+1)*
sizeof(
int));
443 dmumps_par->
irhs_ptr=(
int*)malloc((nRHS+1)*
sizeof(
int));
444 dmumps_par->
irhs_sparse=(
int*)malloc(nz_RHS*
sizeof(
int));
445 dmumps_par->
rhs_sparse=(double2*)malloc(nz_RHS*
sizeof(double2));
446 dmumps_par->
rhs=(double2*)malloc((nRHS*mRHS)*
sizeof(double2));
450 for(i=0;i<nRHS+1;i++){
453 for(i=1;i<mRHS+1;i++){
454 for(j=0;j<(RHS_SPARSE.mnel)[i-1];j++){
455 col_ind=(RHS_SPARSE.icol)[k];
457 ((dmumps_par->
irhs_ptr)[col_ind])++;
461 irhs_ptr[0]=(dmumps_par->
irhs_ptr)[0];
462 for(i=1;i<nRHS+1;i++){
464 irhs_ptr[i]= (dmumps_par->
irhs_ptr)[i];
467 for(i=mRHS;i>=1;i--){
469 for(j=0;j<(RHS_SPARSE.mnel)[i-1];j++){
470 col_ind=(RHS_SPARSE.icol)[k];
472#if MUMPS_ARITH == MUMPS_ARITH_z
473 if(RHS_SPARSE.it==1){
474 ((dmumps_par->
rhs_sparse)[irhs_ptr[col_ind]-2]).
r=RHS_SPARSE.R[k];
475 ((dmumps_par->
rhs_sparse)[irhs_ptr[col_ind]-2]).i=RHS_SPARSE.I[k];
477 ((dmumps_par->
rhs_sparse)[irhs_ptr[col_ind]-2]).
r=RHS_SPARSE.R[k];
478 ((dmumps_par->
rhs_sparse)[irhs_ptr[col_ind]-2]).i=0.0;
481 (dmumps_par->
rhs_sparse)[irhs_ptr[col_ind]-2]=RHS_SPARSE.R[k];
484 irhs_ptr[col_ind]=irhs_ptr[col_ind]-1;
490 GetRhsVar(9,
"i",&nv_schu,&mv_schu,&lv_schu);
491 dmumps_par-> size_schur=mv_schu;
498 Scierror(999,
"%s: malloc Schur failed in intmumpsc.c\n",function_name);
500 dmumps_par->
icntl[18]=1;
502 dmumps_par->
icntl[18]=0;
506 if ( dmumps_par->
size_schur > 0 && dosolve ) {
508 if ( dmumps_par->
icntl[26-1] == 2 ) {
510 GetRhsCVar(11,
"d",&itREDRHS,&mREDRHS,&nREDRHS,&lREDRHS,&liREDRHS);
511 if (mREDRHS != dmumps_par->
size_schur || nREDRHS != dmumps_par->
nrhs ) {
512 Scierror(999,
"%s: bad dimensions for REDRHS\n");
515 EXTRACT_CMPLX_FROM_SCILAB_TOPTR(itREDRHS,stk(lREDRHS),stk(liREDRHS),(dmumps_par->
redrhs),double2,(nREDRHS*mREDRHS));
516 dmumps_par->
lrhs=mREDRHS;
519 if ( dmumps_par->
icntl[26-1] == 1 ) {
522 if(!(dmumps_par->
redrhs=(double2 *)malloc((dmumps_par->
size_schur*dmumps_par->
nrhs)*
sizeof(double2)))){
523 Scierror(999,
"%s: malloc redrhs failed in intmumpsc.c\n",function_name);
544 if(dmumps_par->
rhs && dosolve){
546 EXTRACT_CMPLX_FROM_C_TO_SCILAB(3,it,lrhsout,lrhsouti,(dmumps_par->
rhs),nA,nRHS,one);
550 EXTRACT_CMPLX_FROM_C_TO_SCILAB(3,it,lrhsout,lrhsouti,(dmumps_par->
rhs),one,one,one);
553 ptr_int = (
int *)dmumps_par;
554 inst_address = (int) ptr_int;
561 EXTRACT_CMPLX_FROM_C_TO_SCILAB(5,it,lschurout,lschurouti,(dmumps_par->
schur),temp4,temp4,one);
564 EXTRACT_CMPLX_FROM_C_TO_SCILAB(5,it,lschurout,lschurouti,(dmumps_par->
schur),one,one,one);
569 if ( dmumps_par->
icntl[26-1]==1 && dmumps_par->
size_schur > 0 && dosolve ) {
571 len2=dmumps_par->
nrhs;
578 EXTRACT_CMPLX_FROM_C_TO_SCILAB(6,it,stkptr,stkptri,(dmumps_par->
redrhs),len1,len2,one)
589 temp3=dmumps_par->
infog[27];