[petsc-users] petsc init in class constructor

Feng Xing snakexf at gmail.com
Thu Oct 6 04:03:44 CDT 2016


Hello Stefano and Karl,

Thanks a lot for your detailed replies. I understand now it is not a good idea to put petscinit in constructor. :-)

Best reagards,
Feng


> On 06 Oct 2016, at 10:44, Stefano Zampini <stefano.zampini at gmail.com> wrote:
> 
> Sorry,
> I realized I replied to Feng and not to the list. Below is my previous email.
> 
> Feng,
> 
> Your class is fine as long as the constructor of your solver is called AFTER MPI_Init, and the destructor BEFORE MPI_Finalize.
> This means that you cannot have something like
> 
> int main (int argc, char**argv)
> {
> MPI_Init();
> solverpetsc S(argc,argv);
> MPI_Finalize();
> return 0;
> } 
> 
> as the destructor for S will be called after MPI_Finalize().
> 
> If you call PetscInitialize before MPI_Init, PETSc will call it for you. But then, it will also call MPI_Finalize during PetscFinalize().
> 
> so, the following code will abort at any_MPI_call()
> 
> int main (int argc, char**argv)
> {
> solverpetsc *S;
> 
> S = new solverpetsc(argc,argv);
> ….
> <here you can use MPI>
> ….
> delete S;
> any_MPI_call();
> return 0;
> }
> On Oct 6, 2016, at 11:42 AM, Stefano Zampini <stefano.zampini at gmail.com> wrote:
> 
>>> 
>>> 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.
>>> 
>> 
>> completely agree on that.
>> 
> 



More information about the petsc-users mailing list