20 #ifndef SELDON_FILE_MUMPS_CXX
28 #ifndef SELDON_WITH_MPI
40 dmumps_c(&struct_mumps);
48 zmumps_c(&struct_mumps);
56 struct_mumps.comm_fortran = -987654;
59 struct_mumps.job = -1;
63 struct_mumps.info[8] = 0;
64 struct_mumps.info[9] = 0;
72 parallel_ordering =
false;
73 coef_overestimate = 1.3;
74 coef_increase_memory = 1.5;
75 coef_max_overestimate = 50.0;
76 threshold_pivot = 0.01;
105 int init_percentage = struct_mumps.icntl[13];
106 int new_percentage = init_percentage;
107 while (((struct_mumps.info[0] == -9) || (struct_mumps.info[0] == -8)
108 || (struct_mumps.info[0] == -17) || (struct_mumps.info[0] == -20))
109 && (new_percentage < coef_max_overestimate*100.0))
111 new_percentage = int(new_percentage*coef_increase_memory);
112 struct_mumps.icntl[13] = new_percentage;
113 struct_mumps.job = 2;
117 struct_mumps.icntl[13] = init_percentage;
118 info_facto = struct_mumps.info[0];
130 #ifdef SELDON_WITH_MPI
140 struct_mumps.comm_fortran = MPI_Comm_c2f(MPI_COMM_SELF);
145 struct_mumps.job = -1;
148 struct_mumps.sym = 2;
149 threshold_pivot = 0.01;
152 struct_mumps.sym = 0;
159 struct_mumps.cntl[0] = threshold_pivot;
160 struct_mumps.icntl[13] = int(100.0*(coef_overestimate-1.0));
162 if (parallel_ordering)
164 struct_mumps.icntl[6] = 0;
165 struct_mumps.icntl[27] = 2;
166 struct_mumps.icntl[28] = type_ordering;
170 struct_mumps.icntl[6] = type_ordering;
171 if (type_ordering == 1)
172 struct_mumps.perm_in = perm.GetData();
177 struct_mumps.icntl[21] = 1;
179 struct_mumps.icntl[21] = 0;
181 struct_mumps.icntl[17] = 0;
184 if (print_level >= 0)
186 struct_mumps.icntl[0] = 6;
187 struct_mumps.icntl[1] = 0;
188 struct_mumps.icntl[2] = 6;
189 struct_mumps.icntl[3] = 2;
193 struct_mumps.icntl[0] = -1;
194 struct_mumps.icntl[1] = -1;
195 struct_mumps.icntl[2] = -1;
196 struct_mumps.icntl[3] = 0;
205 type_ordering = num_ordering;
213 parallel_ordering =
true;
214 type_ordering = num_ordering;
223 perm.Reallocate(permut.GetM());
224 for (
int i = 0; i < perm.GetM(); i++)
225 perm(i) = permut(i) + 1;
232 threshold_pivot = eps;
248 if (struct_mumps.n > 0)
250 struct_mumps.job = -2;
254 num_row_glob.Clear();
255 num_col_glob.Clear();
267 struct_mumps.icntl[0] = -1;
268 struct_mumps.icntl[1] = -1;
269 struct_mumps.icntl[2] = -1;
270 struct_mumps.icntl[3] = 0;
281 struct_mumps.icntl[0] = 6;
282 struct_mumps.icntl[1] = 0;
283 struct_mumps.icntl[2] = 6;
284 struct_mumps.icntl[3] = 2;
309 coef_overestimate = coef;
317 coef_max_overestimate = coef;
325 coef_increase_memory = coef;
335 template<
class T>
template<
class T0,
class Prop,
class Storage,
class Allocator>
337 IVect& numbers,
bool keep_matrix)
344 ConvertMatrix_to_Coordinates(mat, num_row, num_col, values, 1);
346 long nnz = num_col.GetSize();
352 struct_mumps.n = n; struct_mumps.nz = nnz;
353 struct_mumps.nnz = nnz;
354 struct_mumps.irn = num_row.GetData();
355 struct_mumps.jcn = num_col.GetData();
358 struct_mumps.job = 1;
361 info_facto = struct_mumps.info[0];
363 numbers.Reallocate(n);
364 for (
int i = 0; i < n; i++)
365 numbers(i) = struct_mumps.sym_perm[i]-1;
374 template<
class T>
template<
class T0,
class Prop,
class Storage,
class Allocator>
382 ConvertMatrix_to_Coordinates(mat, num_row, num_col, values, 1);
386 FactorizeCoordinate1(n, num_row, num_col, values, sym);
398 long nnz = values.GetM();
402 struct_mumps.n = n; struct_mumps.nz = nnz;
403 struct_mumps.nnz = nnz;
404 struct_mumps.irn = num_row.GetData();
405 struct_mumps.jcn = num_col.GetData();
406 struct_mumps.a =
reinterpret_cast<pointer>(values.GetData());
409 struct_mumps.job = 4;
417 template<
class T>
template<
class Prop,
class Storage,
class Allocator>
424 long nnz = mat.GetNonZeros();
427 ConvertMatrix_to_Coordinates(mat, num_row_glob, num_col_glob, values, 1);
429 struct_mumps.n = n; struct_mumps.nz = nnz;
430 struct_mumps.nnz = nnz;
431 struct_mumps.irn = num_row_glob.GetData();
432 struct_mumps.jcn = num_col_glob.GetData();
436 struct_mumps.job = 1;
439 info_facto = struct_mumps.info[0];
450 template<
class T>
template<
class Prop,
class Allocator>
459 struct_mumps.job = 2;
473 template<
class T>
template<
class Prop,
class Allocator>
482 struct_mumps.job = 2;
496 template<
class T>
template<
class Prop,
class Storage,
class Allocator>
501 ConvertMatrix_to_Coordinates(mat, num_row_glob, num_col_glob, values, 1);
508 struct_mumps.job = 2;
519 size_t taille =
sizeof(int)*(num_row_glob.GetM()
520 + num_col_glob.GetM() + perm.GetM());
522 if (struct_mumps.n <= 0)
525 size_t nnz = struct_mumps.info[8];
526 if (struct_mumps.info[8] < 0)
527 nnz = abs(struct_mumps.info[8])*size_t(1024*1024);
529 taille +=
sizeof(T)*nnz ;
530 nnz = struct_mumps.info[9];
531 if (struct_mumps.info[9] < 0)
532 nnz = abs(struct_mumps.info[9])*size_t(1024*1024);
534 taille +=
sizeof(int)*nnz;
554 template<
class T>
template<
class Prop1,
class Storage1,
class Allocator,
555 class Prop2,
class Storage2,
class Allocator2>
563 int n_schur = num.GetM();
566 for (
int i = 0; i < n_schur; i++)
567 index_schur(i) = num(i)+1;
573 struct_mumps.icntl[18] = 1;
574 struct_mumps.size_schur = n_schur;
575 struct_mumps.listvar_schur = index_schur.GetData();
576 struct_mumps.schur =
reinterpret_cast<pointer>(vec_schur.GetData());
578 int n = mat.GetM();
long nnz = mat.GetNonZeros();
582 ConvertMatrix_to_Coordinates(mat, num_row, num_col, values, 1);
587 struct_mumps.nz = nnz; struct_mumps.nnz = nnz;
588 struct_mumps.irn = num_row.GetData();
589 struct_mumps.jcn = num_col.GetData();
593 struct_mumps.job = 4;
599 struct_mumps.icntl[18] = 0;
600 struct_mumps.size_schur = 0;
601 struct_mumps.listvar_schur = NULL;
602 struct_mumps.schur = NULL;
606 mat_schur.Reallocate(n_schur, n_schur);
608 for (
int i = 0; i < n_schur; i++)
609 for (
int j = 0; j <= i; j++)
611 mat_schur(i, j) = vec_schur(i*n_schur + j);
612 mat_schur(j, i) = vec_schur(i*n_schur + j);
615 for (
int i = 0; i < n_schur; i++)
616 for (
int j = 0; j < n_schur;j++)
617 mat_schur(i, j) = vec_schur(nb++);
619 vec_schur.Clear(); index_schur.Clear();
629 template<
class T>
template<
class Allocator2>
633 #ifdef SELDON_CHECK_DIMENSIONS
634 if (x.GetM() != struct_mumps.n)
635 throw WrongDim(
"Mumps::Solve(TransA, c)",
636 string(
"The length of x is equal to ")
638 +
" while the size of the matrix is equal to "
639 +
to_str(struct_mumps.n) +
".");
642 Solve(TransA, x.GetData(), 1);
651 struct_mumps.icntl[8] = 0;
653 struct_mumps.icntl[8] = 1;
655 struct_mumps.nrhs = nrhs;
656 struct_mumps.lrhs = struct_mumps.n;
657 struct_mumps.rhs =
reinterpret_cast<pointer>(x_ptr);
658 struct_mumps.job = 3;
664 template<
class T>
template<
class Allocator2>
667 Solve(SeldonNoTrans, x);
677 template<
class Allocator2,
class Prop>
682 #ifdef SELDON_CHECK_BOUNDS
683 if (x.GetM() != struct_mumps.n)
684 throw WrongDim(
"Mumps::Solve",
string(
"Row size of x is equal to ")
685 +
to_str(x.GetM()) +
" while size of matrix is equal to "
686 +
to_str(struct_mumps.n));
689 Solve(TransA, x.GetData(), x.GetN());
693 #ifdef SELDON_WITH_MPI
699 bool sym,
bool keep_matrix)
701 FactorizeParallel(comm_facto, Ptr, IndRow, Val, glob_number,
707 void MatrixMumps<T>::
708 FactorizeDistributedMatrix(MPI_Comm& comm_facto, Vector<int64_t>& Ptr,
709 Vector<int64_t>& IndRow, Vector<T>& Val,
710 const Vector<int>& glob_number,
711 bool sym,
bool keep_matrix)
713 cout <<
"Mumps with 64-bits integers does not work in parallel" << endl;
730 void MatrixMumps<T>::
731 FactorizeParallel(MPI_Comm& comm_facto, Vector<long>& Ptr,
732 Vector<MUMPS_INT>& IndRow, Vector<T>& Val,
733 const Vector<int>& glob_number,
734 bool sym,
bool keep_matrix)
737 struct_mumps.comm_fortran = MPI_Comm_c2f(comm_facto);
740 InitMatrix(sym,
true);
743 struct_mumps.comm_fortran = MPI_Comm_c2f(comm_facto);
746 struct_mumps.icntl[17] = 3;
750 for (
int i = 0; i < glob_number.GetM(); i++)
751 nmax = max(glob_number(i)+1, nmax);
753 MPI_Allreduce(&nmax, &N, 1, MPI_INTEGER, MPI_MAX, comm_facto);
756 long nnz = IndRow.GetSize();
759 Vector<MUMPS_INT> IndCol(nnz);
760 for (
long i = 0; i < IndRow.GetM(); i++)
763 for (
int i = 0; i < Ptr.GetM()-1; i++)
764 for (
long j = Ptr(i); j < Ptr(i+1); j++)
765 IndCol(j) = glob_number(i) + 1;
772 struct_mumps.nz_loc = nnz; struct_mumps.nnz_loc = nnz;
773 struct_mumps.irn_loc = IndRow.GetData();
774 struct_mumps.jcn_loc = IndCol.GetData();
775 struct_mumps.a_loc =
reinterpret_cast<pointer
>(Val.GetData());
778 struct_mumps.job = 1;
782 double coef = coef_overestimate;
783 struct_mumps.icntl[22] = int(coef*struct_mumps.infog[25]);
784 struct_mumps.job = 2;
788 MPI_Allreduce(&struct_mumps.info[0], &info, 1, MPI_INTEGER, MPI_MIN, comm_facto);
790 bool test_loop =
true;
791 int init_percentage = struct_mumps.icntl[13];
792 int new_percentage = init_percentage;
796 if (((info == -9)||(info==-8)||(info==-17)||(info==-19)|| (info==-20))
797 && (coef < coef_max_overestimate))
799 coef *= coef_increase_memory;
801 struct_mumps.icntl[22] = int(coef*struct_mumps.infog[25]);
802 new_percentage = int(new_percentage*coef_increase_memory);
803 struct_mumps.icntl[13] = new_percentage;
812 MPI_Allreduce(&struct_mumps.info[0],
813 &info, 1, MPI_INTEGER, MPI_MIN, comm_facto);
817 struct_mumps.icntl[13] = init_percentage;
820 int rank_proc; MPI_Comm_rank(comm_facto, &rank_proc);
821 if ((rank_proc == 0) && (print_level >= 0))
822 cout<<
"Factorization completed"<<endl;
829 ::PerformAnalysisDistributed(MPI_Comm& comm_facto, Vector<long>& Ptr,
830 Vector<int>& IndRow, Vector<T>& Val,
831 const Vector<int>& glob_number,
832 bool sym,
bool keep_matrix)
835 struct_mumps.comm_fortran = MPI_Comm_c2f(comm_facto);
838 InitMatrix(sym,
true);
841 struct_mumps.comm_fortran = MPI_Comm_c2f(comm_facto);
844 struct_mumps.icntl[17] = 3;
848 for (
int i = 0; i < glob_number.GetM(); i++)
849 nmax = max(glob_number(i)+1, nmax);
851 MPI_Allreduce(&nmax, &N, 1, MPI_INTEGER, MPI_MAX, comm_facto);
854 long nnz = IndRow.GetSize();
857 Vector<int> IndCol(nnz);
858 for (
long i = 0; i < IndRow.GetM(); i++)
861 for (
int i = 0; i < Ptr.GetM()-1; i++)
862 for (
long j = Ptr(i); j < Ptr(i+1); j++)
863 IndCol(j) = glob_number(i) + 1;
870 struct_mumps.nz_loc = nnz;
871 struct_mumps.nnz_loc = nnz;
872 struct_mumps.irn_loc = IndRow.GetData();
873 struct_mumps.jcn_loc = IndCol.GetData();
874 struct_mumps.a_loc =
reinterpret_cast<pointer
>(Val.GetData());
877 struct_mumps.job = 1;
884 ::PerformAnalysisDistributed(MPI_Comm& comm_facto, Vector<int64_t>& Ptr,
885 Vector<int64_t>& IndRow, Vector<T>& Val,
886 const Vector<int>& glob_number,
887 bool sym,
bool keep_matrix)
889 cout <<
"Mumps with 64-bits integers does not work in parallel" << endl;
895 ::PerformFactorizationDistributed(MPI_Comm& comm_facto, Vector<long>& Ptr,
896 Vector<int>& IndRow, Vector<T>& Val,
897 const Vector<int>& glob_number,
898 bool sym,
bool keep_matrix)
901 long nnz = IndRow.GetSize();
904 Vector<int> IndCol(nnz);
905 for (
long i = 0; i < IndRow.GetM(); i++)
908 for (
int i = 0; i < Ptr.GetM()-1; i++)
909 for (
long j = Ptr(i); j < Ptr(i+1); j++)
910 IndCol(j) = glob_number(i) + 1;
915 struct_mumps.nz_loc = nnz;
916 struct_mumps.nnz_loc = nnz;
917 struct_mumps.irn_loc = IndRow.GetData();
918 struct_mumps.jcn_loc = IndCol.GetData();
919 struct_mumps.a_loc =
reinterpret_cast<pointer
>(Val.GetData());
922 double coef = coef_overestimate;
923 struct_mumps.icntl[22] = int(coef*struct_mumps.infog[25]);
924 struct_mumps.job = 2;
929 MPI_Allreduce(&struct_mumps.info[0], &info, 1, MPI_INTEGER, MPI_MIN, comm_facto);
931 bool test_loop =
true;
932 int init_percentage = struct_mumps.icntl[13];
933 int new_percentage = init_percentage;
937 if (((info == -9)||(info==-8)||(info==-17)||(info==-20))
938 && (coef < coef_max_overestimate))
940 coef *= coef_increase_memory;
942 struct_mumps.icntl[22] = int(coef*struct_mumps.infog[25]);
943 new_percentage = int(new_percentage*coef_increase_memory);
944 struct_mumps.icntl[13] = new_percentage;
953 MPI_Allreduce(&struct_mumps.info[0],
954 &info, 1, MPI_INTEGER, MPI_MIN, comm_facto);
958 struct_mumps.icntl[13] = init_percentage;
961 int rank_proc; MPI_Comm_rank(comm_facto, &rank_proc);
962 if ((rank_proc == 0) && (print_level >= 0))
963 cout<<
"Factorization completed"<<endl;
969 ::PerformFactorizationDistributed(MPI_Comm& comm_facto, Vector<int64_t>& Ptr,
970 Vector<int64_t>& IndRow, Vector<T>& Val,
971 const Vector<int>& glob_number,
972 bool sym,
bool keep_matrix)
974 cout <<
"Mumps with 64-bits integers does not work in parallel" << endl;
985 template<
class T>
template<
class Allocator2>
986 void MatrixMumps<T>::SolveDistributed(MPI_Comm& comm_facto,
987 const SeldonTranspose& TransA,
988 Vector<T, VectFull, Allocator2>& x,
989 const IVect& glob_num)
991 SolveDistributed(comm_facto, TransA, x.GetData(), 1, glob_num);
1001 template<
class T>
template<
class Allocator2,
class Prop>
1002 void MatrixMumps<T>::SolveDistributed(MPI_Comm& comm_facto,
1003 const SeldonTranspose& TransA,
1004 Matrix<T, Prop, ColMajor, Allocator2>& x,
1005 const IVect& glob_num)
1007 SolveDistributed(comm_facto, TransA, x.GetData(), x.GetN(), glob_num);
1013 void MatrixMumps<T>::SolveDistributed(MPI_Comm& comm_facto,
1014 const SeldonTranspose& TransA,
1016 const IVect& glob_num)
1019 Matrix<T, General, ColMajor> rhs;
1020 int cplx =
sizeof(T)/8;
1023 int rank_proc; MPI_Comm_rank(comm_facto, &rank_proc);
1026 rhs.Reallocate(struct_mumps.n, min(nrhs, nblock));
1030 Matrix<T, General, ColMajor> xp;
1031 int nb_procs; MPI_Comm_size(comm_facto, &nb_procs);
1035 Vector<IVect> nump(nb_procs);
1040 for (
int i = 0; i < nb_procs; i++)
1045 MPI_Recv(&nb_dof, 1, MPI_INTEGER, i, 33, comm_facto, &status);
1047 nump(i).Reallocate(nb_dof);
1048 MPI_Recv(nump(i).GetData(), nb_dof, MPI_INTEGER,
1049 i, 38, comm_facto, &status);
1058 int nb = glob_num.GetM();
1059 MPI_Send(&nb, 1, MPI_INTEGER, 0, 33, comm_facto);
1060 MPI_Send(glob_num.GetData(), nb, MPI_INTEGER, 0, 38, comm_facto);
1065 int num_rhs = 0;
long ldb = glob_num.GetM();
1066 int lvl = print_level; HideMessages();
1067 while (num_rhs < nrhs)
1069 int nrhs_p = min(nrhs-num_rhs, nblock);
1076 for (
int i = 0; i < nb_procs; i++)
1083 int nb_dof = nump(i).GetM();
1084 xp.Reallocate(nb_dof, nrhs_p);
1087 MPI_Recv(xp.GetDataVoid(), cplx*nb_dof*nrhs_p,
1088 MPI_DOUBLE, i, 37, comm_facto, &status);
1092 xp.Reallocate(glob_num.GetM(), nrhs_p);
1093 for (
int k = 0; k < nrhs_p; k++)
1094 for (
int j = 0; j < glob_num.GetM(); j++)
1095 xp(j, k) = x_ptr[j + (num_rhs+k)*ldb];
1098 for (
int k = 0; k < nrhs_p; k++)
1099 for (
int j = 0; j < nump(i).GetM(); j++)
1100 rhs(nump(i)(j), k) = xp(j, k);
1105 for (
int k = 0; k < nrhs_p; k++)
1106 for (
int j = 0; j < glob_num.GetM(); j++)
1107 rhs(j, k) = x_ptr[j + (num_rhs+k)*ldb];
1110 struct_mumps.rhs =
reinterpret_cast<pointer
>(rhs.GetData());
1115 int nb_dof = glob_num.GetM();
1117 MPI_Send(&x_ptr[num_rhs*nb_dof], cplx*nb_dof*nrhs_p, MPI_DOUBLE, 0, 37, comm_facto);
1122 struct_mumps.icntl[8] = 0;
1124 struct_mumps.icntl[8] = 1;
1126 struct_mumps.nrhs = nrhs_p;
1127 struct_mumps.lrhs = struct_mumps.n;
1128 struct_mumps.job = 3;
1136 for (
int i = 0; i < nb_procs; i++)
1140 int nb_dof = nump(i).GetM();
1141 xp.Reallocate(nb_dof, nrhs_p);
1142 for (
int j = 0; j < nb_dof; j++)
1143 for (
int k = 0; k < nrhs_p; k++)
1144 xp(j, k) = rhs(nump(i)(j), k);
1146 MPI_Send(xp.GetDataVoid(), cplx*nb_dof*nrhs_p,
1147 MPI_DOUBLE, i, 40, comm_facto);
1151 for (
int k = 0; k < nrhs_p; k++)
1152 for (
int j = 0; j < glob_num.GetM(); j++)
1153 x_ptr[j + ldb*(num_rhs+k)] = rhs(glob_num(j), k);
1159 int nb_dof = glob_num.GetM();
1160 xp.Reallocate(nb_dof, nrhs_p);
1161 MPI_Recv(xp.GetDataVoid(), cplx*nb_dof*nrhs_p,
1162 MPI_DOUBLE, 0, 40, comm_facto, &status);
1164 for (
int k = 0; k < nrhs_p; k++)
1165 for (
int j = 0; j < glob_num.GetM(); j++)
1166 x_ptr[j + (num_rhs+k)*ldb] = xp(j, k);
1171 for (
int k = 0; k < nrhs_p; k++)
1172 for (
int i = 0; i < glob_num.GetM(); i++)
1173 x_ptr[i + ldb*(num_rhs+k)] = rhs(i, k);
1188 template<
class MatrixSparse,
class T>
1196 template<
class MatrixSparse,
class T>
1199 throw WrongArgument(
"GetLU(Matrix<complex<T> >& A, MatrixMumps<T>& mat_lu, bool)",
1200 "The LU matrix must be complex");
1205 template<
class MatrixSparse,
class T>
1208 throw WrongArgument(
"GetLU(Matrix<T>& A, MatrixMumps<complex<T> >& mat_lu, bool)",
1209 "The sparse matrix must be complex");
1214 template<
class T0,
class Prop,
class Storage,
class Allocator,
class T>
1224 GetLU(A, mat_lu, keep_matrix, x);
1229 template<
class T,
class Storage,
class Allocator,
class MatrixFull>
1232 MatrixFull& schur_matrix,
bool keep_matrix)
1234 mat_lu.GetSchurMatrix(A, num, schur_matrix, keep_matrix);
1239 template<
class T,
class Storage,
class Allocator,
class MatrixFull>
1242 MatrixFull& schur_matrix,
bool keep_matrix)
1244 mat_lu.GetSchurMatrix(A, num, schur_matrix, keep_matrix);
1249 template<
class T,
class Allocator>
1258 template<
class T,
class Allocator>
1262 mat_lu.
Solve(TransA, x);
1267 template<
class Allocator>
1273 for (
int i = 0; i < x.GetM(); i++)
1275 y(i, 0) = real(x(i));
1276 y(i, 1) = imag(x(i));
1281 for (
int i = 0; i < x.GetM(); i++)
1282 x(i) = complex<double>(y(i, 0), y(i, 1));
1287 template<
class Allocator>
1294 for (
int i = 0; i < x.GetM(); i++)
1296 y(i, 0) = real(x(i));
1297 y(i, 1) = imag(x(i));
1300 SolveLU(TransA, mat_lu, y);
1302 for (
int i = 0; i < x.GetM(); i++)
1303 x(i) = complex<double>(y(i, 0), y(i, 1));
1309 template<
class Allocator>
1313 throw WrongArgument(
"SolveLU(MatrixMumps<complex<double> >, Vector<double>)",
1314 "The result should be a complex vector");
1319 template<
class Allocator>
1324 throw WrongArgument(
"SolveLU(MatrixMumps<complex<double> >, Vector<double>)",
1325 "The result should be a complex vector");
1330 template<
class T,
class Prop,
class Allocator>
1334 mat_lu.
Solve(SeldonNoTrans, x);
1340 template<
class T,
class Allocator,
class Prop>
1344 mat_lu.
Solve(TransA, x);
1348 template<
class Prop,
class Allocator>
1349 void SolveLU(MatrixMumps<double>& mat_lu,
1350 Matrix<complex<double>, Prop, ColMajor, Allocator>& x)
1352 throw WrongArgument(
"SolveLU(MatrixMumps<double>, Matrix<complex<double> >)",
1353 "The result should be a real vector");
1357 template<
class Prop,
class Allocator>
1358 void SolveLU(
const SeldonTranspose& TransA,
1359 MatrixMumps<double>& mat_lu,
1360 Matrix<complex<double>, Prop, ColMajor, Allocator>& x)
1362 throw WrongArgument(
"SolveLU(MatrixMumps<double>, Matrix<complex<double> >)",
1363 "The result should be a real vector");
1367 template<
class Prop,
class Allocator>
1368 void SolveLU(MatrixMumps<complex<double> >& mat_lu,
1369 Matrix<double, Prop, ColMajor, Allocator>& x)
1371 throw WrongArgument(
"SolveLU(MatrixMumps<complex<double> >, Matrix<double>)",
1372 "The result should be a complex matrix");
1376 template<
class Prop,
class Allocator>
1377 void SolveLU(
const SeldonTranspose& TransA,
1378 MatrixMumps<complex<double> >& mat_lu,
1379 Matrix<double, Prop, ColMajor, Allocator>& x)
1381 throw WrongArgument(
"SolveLU(MatrixMumps<complex<double> >, Matrix<double>)",
1382 "The result should be a complex matrix");
1387 #define SELDON_FILE_MUMPS_CXX