On Tue, 9 Sep 2014, Florian Lindner wrote: > Am Montag, 8. September 2014, 10:53:27 schrieb Barry Smith: > > > > On Sep 8, 2014, at 2:19 AM, Florian Lindner <[email protected]> wrote: > > > > > > > > I want to offer an interface that uses some Petsc types (like Vec and > > > Mat) but I do not want to import all petsc symbols into the global > > > namespace for anyone using the interface. That does not seam possible > > > though... > > > > > > Thanks, > > > > > > Florian > > > > Which symbols do you want to have available and which ones not? Do you > > not want to use the other symbols but not let the user use them, for > > example, you want to use KSP but don’t want the user to have access to > > them? Or something else. Note that you can configure PETSc into several > > libraries and then use only the ones you want with -with-single-library=no > > it creates a separate TS, SNES, KSP, DM, Mat,and Vec library. > > > > Let us know what you want in more detail and we may have suggestions on > > how to achieve it. > > Thanks for your help! > > If a user of my class library does an #include "mypetsc.h" he should not get > all the petsc symbols in his global namespace, e.g. > > #include "mypetsc.h" > > Vector v; // is an object of my class lib > Vec pv; // should not work, since I do not want petsc symbols in my global > namespace > petsc::Vec pv; // fine, since petsc symbols are contained in namespace petsc. > But this does not seem to be possible. > > petsc::Vec = v.vector // vector of type petsc::Vec is a public member of > Vector. That's why "mypetsc.h" needs to #include "petscvec.h". Because of > that an #include "mypetsc" imports all the symbols of "petscvec" into anyone > wanting to use Vector. > > Since "mypetsc.h" only contains declarations and no code I tried it with > forward declarations of Vec, but no success. > Hm - it should work. PETSc uses opaque objects (pointers) in C. You should be able to do the same from C++
http://en.wikipedia.org/wiki/Opaque_pointer >>>>>>>> from include/petscmat.h typedef struct _p_Mat* Mat; from include/petsc-private/matimpl.h struct _p_Mat { PETSCHEADER(struct _MatOps); <snip> }; <<<<<<< You should be able to use similar mode. Attaching a [non-working] example - that compiles without errors. Note: if you are exposing more than PETSc objects [like enums, or other things - you might need to duplicate them in your interface.. [i.e I don't think you can wrap petsc headers with 'namespace' and have all PETSc public stuff available automatically] Satish -------------- $ make mpicxx -o ex1.o -c -Wall -Wwrite-strings -Wno-strict-aliasing -Wno-unknown-pragmas -g -O0 -fPIC -I/home/balay/petsc/include -I/home/balay/petsc/arch-maint/include -I/usr/include/mpich-x86_64 `pwd`/ex1.cpp mpicxx -o mypetsc.o -c -Wall -Wwrite-strings -Wno-strict-aliasing -Wno-unknown-pragmas -g -O0 -fPIC -I/home/balay/petsc/include -I/home/balay/petsc/arch-maint/include -I/usr/include/mpich-x86_64 `pwd`/mypetsc.cpp mpicc -fPIC -Wall -Wwrite-strings -Wno-strict-aliasing -Wno-unknown-pragmas -g3 -O0 -o ex1 ex1.o mypetsc.o -Wl,-rpath,/home/balay/petsc/arch-maint/lib -L/home/balay/petsc/arch-maint/lib -lpetsc -llapack -lblas -lX11 -lpthread -lm -Wl,-rpath,/usr/lib64/mpich/lib -L/usr/lib64/mpich/lib -Wl,-rpath,/usr/lib/gcc/x86_64-redhat-linux/4.9.1 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.1 -lmpichf90 -lgfortran -lm -lgfortran -lm -lquadmath -lm -lmpichcxx -lstdc++ -Wl,-rpath,/usr/lib64/mpich/lib -L/usr/lib64/mpich/lib -Wl,-rpath,/usr/lib/gcc/x86_64-redhat-linux/4.9.1 -L/usr/lib/gcc/x86_64-redhat-linux/4.9.1 -ldl -Wl,-rpath,/usr/lib64/mpich/lib -lmpich -lopa -lmpl -lrt -lpthread -lgcc_s -ldl /usr/bin/rm -f ex1.o mypetsc.o balay@asterix /home/balay/tmp/test $ cat mypetsc.h namespace petsc { typedef struct _p_Vec* Vec; typedef struct _p_Mat* Mat; } class Vector { public: int Scale(); private: petsc::Vec vector; }; balay@asterix /home/balay/tmp/test $ cat mypetsc.cpp #include "petsc.h" #include "petsc-private/vecimpl.h" #include "petsc-private/matimpl.h" #include "mypetsc.h" int Vector::Scale() { PetscScalar a=1.0; VecScale(Vector::vector,a); return 0; } balay@asterix /home/balay/tmp/test $ cat ex1.cpp #include "mypetsc.h" int main () { Vector v; v.Scale(); return 0; } balay@asterix /home/balay/tmp/test $ ------------------------------------ > At the end an #include "mypetsc.h" should import only my own symbols like > Vector and Matrix. It would be ok, if it also imports Vec and Mat (which are > types of public members / return types of public functions). It would also be > ok, if it imports all other petsc symbols (like VecGetOwnershipRange) in a > seperate namespace. > > I hope I was able to convey what I want... > > Thx, > Florian >
test.tar.gz
Description: application/gzip
