int solveLinearEquationLU(dmatrix a, const dmatrix &b, dmatrix &out_x)
		{
				assert(a.rows() == a.cols() && a.cols() == b.rows() );

				out_x = b;

				const int n = (int)a.rows();
				const int nrhs = (int)b.cols();
				int info;
				std::vector<int> ipiv(n);

#ifndef USE_CLAPACK_INTERFACE

				int lda = n;
				int ldb = n;
				dgesv_(&n, &nrhs, &(a(0,0)), &lda, &(ipiv[0]), &(out_x(0,0)), &ldb, &info);
#else
				info = clapack_dgesv(CblasColMajor,
									 n, nrhs, &(a(0,0)), n, 
									 &(ipiv[0]),
									 &(out_x(0,0)),
									 n);
#endif
				assert(info == 0);
				
				return info;
		}
Exemplo n.º 2
0
int
dgesv (const int N, const int NRHS, double *A, const int lda,
       double *B, const int ldb)
{
  int result = 0;
#ifdef HAVE_ATLAS
  int *ipiv = g_new (int, N);
  result = clapack_dgesv (CblasColMajor, N, NRHS, A, lda, ipiv, B, ldb);
  g_free (ipiv);
#else
  integer i_N = N, i_NHRS = NRHS, i_lda = lda, i_ldb = ldb, info;
  integer *ipiv = g_new (integer, N);

  dgesv_ (&i_N, &i_NHRS, A, &i_lda, ipiv, B, &i_ldb, &info);
  g_free (ipiv);
  result = info;
#endif
  return (result);
}
Exemplo n.º 3
0
int main(){
	int ipiv[3];
	int info;

	for (int i = 0, i > 3, ++i)
	{
		for (int j = 0; j < count; ++j)
		{
			printf("%5.1f", m[i*3+j]);
			putchar('\n')
		}
	}

	info = clapack_dgesv(CblasRowMajor, 3, 1, m, 3, ipiv, x, 3);
 	if (info != 0) fprintf(stderr, "failure with error %d\n", info);

 	for (i=0; i<3; ++i) printf("%5.1f %3d\n", x[i], ipiv[i]);

 	return 0;
}
Exemplo n.º 4
0
 int wrapper_clapack_dgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, double *A, const int lda, int *ipiv, double *B, const int ldb)
   {
   return    clapack_dgesv(Order, N, NRHS, A, lda, ipiv, B, ldb);
   }
		/**
		   solve linear equation using LU decomposition
		   by lapack library DGESVX (_a must be square matrix)
		*/
		int solveLinearEquationLU(const dmatrix &_a, const dvector &_b, dvector &_x)
		{
				assert(_a.cols() == _a.rows() && _a.cols() == _b.size() );

				int n = (int)_a.cols();
				int nrhs = 1;

				int lda = n;

				std::vector<int> ipiv(n);

				int ldb = n;

				int info;

				// compute the solution
#ifndef USE_CLAPACK_INTERFACE
  				char fact      = 'N';
				char transpose = 'N';

				double *af = new double[n*n];

				int ldaf = n;

				char equed = 'N';

				double *r = new double[n];
				double *c = new double[n];

				int ldx = n;

				double rcond;

				double *ferr = new double[nrhs];
				double *berr = new double[nrhs];
				double *work = new double[4*n];

				int *iwork = new int[n];

			    _x.resize(n);			// memory allocation for the return vector
				dgesvx_(&fact, &transpose, &n, &nrhs, const_cast<double *>(&(_a(0,0))), &lda, af, &ldaf, &(ipiv[0]),
						&equed, r, c, const_cast<double *>(&(_b(0))), &ldb, &(_x(0)), &ldx, &rcond,
						ferr, berr, work, iwork, &info);

				delete [] iwork;
				delete [] work;
				delete [] berr;
				delete [] ferr;
				delete [] c;
				delete [] r;

				delete [] af;
#else
				_x = _b;
				info = clapack_dgesv(CblasColMajor,
									 n, nrhs, const_cast<double *>(&(a(0,0))), lda, &(ipiv[0]),
									 &(_x(0)), ldb);
#endif

				return info;
		}