Perhaps a custom Fortran interface that checks for FORTRAN_TYPE_INITIALIZE. That was the first thing that I looked for.
On Tue, Feb 2, 2021 at 11:31 PM Satish Balay <[email protected]> wrote: > I think the current code is to support: > > if (var not initialized): crate(var). > > And there might be some mapping of 0 to NULL or some other state (hence > the choice of -2) > > Satish > > On Tue, 2 Feb 2021, Barry Smith wrote: > > > > > I cannot remember why I selected -2 as the initial value for PETSc > objects in Fortran. Probably because it would ensure a dramatic crash if > you used > > an object without initializing it from Fortran. > > > > It could be changing > > > > config/BuildSystem/config/compilersFortran.py: > self.addDefine('FORTRAN_TYPE_INITIALIZE', ' = -2') > > > > to 0 would mean that if you called destroy on the object and never > created it everything would be fine; so you would not need to use any > special code to check. > > > > Would that be a better model? > > > > Barry > > > > > > > > > On Feb 2, 2021, at 2:34 PM, Mark Adams <[email protected]> wrote: > > > > > > Thanks Randy, that makes sense. > > > Mark > > > > > > On Tue, Feb 2, 2021 at 3:27 PM Randall Mackie <[email protected] > <mailto:[email protected]>> wrote: > > > Hi Mark, > > > > > > I don’t know what the XGC code is, but the way I do this in my Fortran > code is that I initialize all objects I later want to destroy, for example: > > > > > > mat11=PETSC_NULL_MAT > > > vec1=PETSC_NULL_VEC > > > > > > etc > > > > > > Then I check and destroy like: > > > > > > if (mat11 /= PETSC_NULL_MAT) call MatDestroy(mat11, ierr) > > > > > > etc. > > > > > > Hope this helps, > > > > > > Randy > > > > > > > > > > On Feb 2, 2021, at 12:17 PM, Mark Adams <[email protected] <mailto: > [email protected]>> wrote: > > > > > > > > Satish, a few years ago you helped us transition the XGC Fortran > code from v3.7.7 and we seemed to have regressed. > > > > > > > > As I recall we removed the initialization of Mats (for example) in > XGC. PETSc seems to initialize them with -2 in Fortran (Albert, cc'ed, > verified this today) and I recall that from our previous conversation. As I > look at the code now Fortran MatDestroy just goes straight to C, which > would explain our crashes when we MatDestroy an uninitialized (-2) Mat. > > > > > > > > What is the correct way to delete with initializing Fortran objects? > > > > > > > > Thanks, > > > > Mark > > > > > > > > > > > > > > > >
