Hi,

I would like to write a c++ class which solve a linear system with petsc (code 
as following).
Petsc is used only in this class. So I call MPI_Init in main.cpp, but 
PetscInitialize and PetscFinalise are in constructor/destructor of class.
I am wondering if this way is safe?

class solvepetsc{

        solvepetsc(int argc, char** argv){
                PetscInitialize(&argc, &argv, NULL, NULL);
        };

        ~solvepetsc(){
                PetscFinalize();
        };

        // ...
}

well, you could do it this way, but the devil's in the detail: You should check the return value of PetscInitialize() and PetscFinalize() for error checking.

Now, how do you plan to deal with an error in PetscInitialize()? You can't throw an exception, because that will terminate your program immediately. Delaying the error checks is likely to be fragile.

Another question: How do you instances of solvepetsc do you expect? If you have more than one instance in use at the same time, you will run into problems due to an oversubscription of the internal global variables (logging, etc.).

Long story short: I'd encourage you not to initialize PETSc in a constructor, unless you know exactly what you are doing and can control the possible side effects.

Best regards,
Karli

Reply via email to