00001
00005 inline long dgbmatrix::dgbsv(dgematrix& mat)
00006 {
00007 #ifdef CPPL_VERBOSE
00008 std::cerr << "# [MARK] dgbmatrix::dgbsv(dgematrix&)"
00009 << std::endl;
00010 #endif//CPPL_VERBOSE
00011
00012 #ifdef CPPL_DEBUG
00013 if(M!=N || N!=mat.M){
00014 std::cerr << "[ERROR] dgbmatrix::dgbsv(dgematrix&) " << std::endl
00015 << "These matrix and vector cannot be solved." << std::endl
00016 << "Your input was (" << M << "x" << N << ") and ("
00017 << mat.M << "x" << mat.N << ")." << std::endl;
00018 exit(1);
00019 }
00020 #endif//CPPL_DEBUG
00021
00022 dgbmatrix newmat(M,N,KL,KU+KL);
00023 for(long i=0; i<M; i++){ for(long j=max(0,i-KL); j<min(N,i+KU+1); j++){
00024 newmat(i,j) =operator()(i,j);
00025 }}
00026
00027 long NRHS(mat.N), LDAB(2*KL+KU+1),
00028 *IPIV(new long[N]), LDB(mat.M), INFO(1);
00029 dgbsv_(N, KL, KU, NRHS, newmat.Array, LDAB, IPIV, mat.Array, LDB, INFO);
00030 delete [] IPIV;
00031
00032 swap(*this,newmat);
00033
00034 if(INFO!=0){
00035 std::cerr << "[WARNING] dgbmatrix::dgbsv(dgematrix&) "
00036 << "Serious trouble happend. INFO = "<< INFO << "." << std::endl;
00037 }
00038 return INFO;
00039 }
00040
00041
00045 inline long dgbmatrix::dgbsv(dcovector& vec)
00046 {
00047 #ifdef CPPL_VERBOSE
00048 std::cerr << "# [MARK] dgbmatrix::dgbsv(dcovector&)"
00049 << std::endl;
00050 #endif//CPPL_VERBOSE
00051
00052 #ifdef CPPL_DEBUG
00053 if(M!=N || N!=vec.L){
00054 std::cerr << "[ERROR] dgbmatrix::dgbsv(dcovector&) " << std::endl
00055 << "These matrix and vector cannot be solved." << std::endl
00056 << "Your input was (" << M << "x" << N << ") and ("
00057 << vec.L << ")." << std::endl;
00058 exit(1);
00059 }
00060 #endif//CPPL_DEBUG
00061
00062 dgbmatrix newmat(M,N,KL,KU+KL);
00063 for(long i=0; i<M; i++){ for(long j=max(0,i-KL); j<min(N,i+KU+1); j++){
00064 newmat(i,j) =operator()(i,j);
00065 }}
00066
00067 long NRHS(1), LDAB(2*KL+KU+1),
00068 *IPIV(new long[N]), LDB(vec.L), INFO(1);
00069 dgbsv_(N, KL, KU, NRHS, newmat.Array, LDAB, IPIV, vec.Array, LDB, INFO);
00070 delete [] IPIV;
00071
00072 swap(*this,newmat);
00073
00074 if(INFO!=0){
00075 std::cerr << "[WARNING] dgbmatrix::dgbsv(dgematrix&) "
00076 << "Serious trouble happend. INFO = "<< INFO << "." << std::endl;
00077 }
00078 return INFO;
00079 }