LAPACK Archives

[Lapack] LAPACK and C++


oh yes and I forgot.

For LAPACK and C++, a good way to go right now might be to give a try 
with lpp:
        http://sourceforge.net/projects/lpp/

I think lpp provides on top of LAPACK a .h file for C++ and some wrappers 
for automatic workspace allocation when needed. They also have some 
examples, might be of some help for you.

Julien


On Fri, 10 Mar 2006, Julien Langou wrote:


There is no restriction on using LAPACK or CLAPACK from C++. Both are just 
regular libraries. Below an example code in C++ that works with LAPACK 
without any problem. (Ok, so there is nothing C++ except the extern "C" and 
the fact that I am using g++, your job is to do what you want with the C++ 
part.)

The main problem is that people forgot to declare the prototype and that's 
true that we are not providing any .h so far to do it for you.

Works the same with CLAPACK.

compile it with something like:
g++ -Wall -O3 mycode.cc \
      -L/usr/local/lib/ -llapack -lf77blas -lcblas -latlas\
      -lg2c -lm
should work.

Here I am using ATLAS BLAS.

Julien.

----------------------------------------------------------------------------
#include <stddef.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern "C" double dnrm2_(int *n,double *x, int* incx);
extern "C" void   dgesv_(int *n, int *nrhs, double *a, int *lda, int *ipiv, 
double *b, int *ldb, int *info );
extern "C" void   dcopy_(int *n, double *x, int *incx, double *y, int *incy);
extern "C" void   dgemm_(char *transa, char *transb,
                       int *m, int *n, int *k, double *alpha, double *a, int 
*lda, double *b, int *ldb,
                       double *beta, double *c, int *ldc );

int main( ){

       int n=100, k=1;
       double A[n*n], b[n*k], Acopy[n*n], bcopy[n*k];
       int ipiv[n], info;
       int i;
       double normr, normb;

       int ione=1, int01;
       char charN = 'N';
       double dpone = 1.e0, dmone = -1.e0;

       for(i=0;i<n*n;i++)
               A[i] = ((double) rand()) / ((double) RAND_MAX) - 0.5;
       for(i=0;i<n*k;i++)
               b[i] = ((double) rand()) / ((double) RAND_MAX) - 0.5;


       int01 = n*k; dcopy_(&int01,b,&ione,bcopy,&ione);
       int01 = n*n; dcopy_(&int01,A,&ione,Acopy,&ione);

       dgesv_(&n, &k, A, &n, ipiv, b, &n, &info);

       normb = dnrm2_(&n,bcopy,&ione);
       dgemm_ (&charN, &charN, &n, &k, &n, &dpone, Acopy, &n, b, &n, &dmone, 
bcopy, &n);
       normr = dnrm2_(&n,bcopy,&ione);
       printf("\tDGESV [n=%d,k=%d] \t\t(check:%e)\n",
               n,k,normr/normb);

       return 0;

}
----------------------------------------------------------------------------


On Fri, 10 Mar 2006, Yao-ban Chan wrote:

     Hello,

     I am having problems using LAPACK for my C++ program. I tried using 
CLAPACK at first, and I was able to compile and run a test program in C, 
using the compiler gcc. However, either switching the compiler to g++ or 
renaming the file extension to .cpp resulted in errors. The IT staff at my 
university think that this is because CLAPACK cannot be used in C++. I 
understand there is a version of LAPACK for C++ (LAPACK++) but it doesn't 
seem to have the routine that I need (dsyevr). I understand that there may 
be a way to build and link the Fortran files directly to the C++ - is this 
possible? I can't seem to find any instructions on how to do it. If is it 
possible, could you please tell me how to go about doing it?

Thanks a lot,
Yao-ban Chan
_______________________________________________
Lapack mailing list
Lapack@Domain.Removed
http://lists.cs.utk.edu/listinfo/lapack



<Prev in Thread] Current Thread [Next in Thread>


For additional information you may use the LAPACK/ScaLAPACK Forum.
Or one of the mailing lists, or