new build system

Richard Tran Mills rmills at ornl.gov
Thu Jun 14 14:36:44 CDT 2007


Folks,

I agree with Leif and Stephan that the API changes between sub-sub-versions of 
PETSc can be a headache.  That said, I almost always LIKE the API changes 
because they usually are more intuitive, consistent, etc.

I work on a Fortran code for groundwater simulation that is built on PETSc. 
To allow the code to build with some different versions of PETSc, we have 
introduced some wrappers.  Our source code tracks PETSc-dev, but to make it 
compatible with "release" versions (the example below is for 2.3.2) we do the 
following.  We have an include file (included by all of our source files) that 
contains

-----
#if (PETSC_VERSION_RELEASE == 1 && PETSC_VERSION_SUBMINOR < 3)

! Name differences between petsc-dev and petsc-release.
#define SNESMonitorSet SNESSetMonitor
#define MatCreateMFFD MatCreateSNESMF
#define MatMFFDSetType MatSNESMFSetType
#define MATMFFD_WP MATSNESMF_WP
#define MatMFFDGetH MatSNESMFGetH
#define MatMFFDSetHHistory MatSNESMFSetHHistory
#define IS_COLORING_GLOBAL IS_COLORING_LOCAL

! Wrappers to handle prototype differences between petsc-dev and petsc-release.
#define VecScatterBegin VecScatterBegin_wrap
#define VecScatterEnd VecScatterEnd_wrap

#endif
-----

And then to handle the prototype differences we have a module that looks like

-----
module PetscRelWrappers
   private

   public :: VecScatterBegin_wrap, VecScatterEnd_wrap

#include "include/finclude/petsc.h"
#include "include/finclude/petscvec.h"
#include "include/finclude/petscvec.h90"

#if (PETSC_VERSION_RELEASE == 1 && PETSC_VERSION_SUBMINOR < 3)

contains

subroutine VecScatterBegin_wrap(inctx,x,y,addv,mode,ierr)
   implicit none

   VecScatter, intent(in) :: inctx
   Vec, intent(in) :: x
   Vec, intent(out) :: y
   InsertMode, intent(in) :: addv
   ScatterMode, intent(in) :: mode
   PetscErrorCode, intent(out) :: ierr

   call VecScatterBegin(x,y,addv,mode,inctx,ierr)
end subroutine VecScatterBegin_wrap


subroutine VecScatterEnd_wrap(inctx,x,y,addv,mode,ierr)
   implicit none

   VecScatter, intent(in) :: inctx
   Vec, intent(in) :: x
   Vec, intent(out) :: y
   InsertMode, intent(in) :: addv
   ScatterMode, intent(in) :: mode
   PetscErrorCode, intent(out) :: ierr

   call VecScatterEnd(x,y,addv,mode,inctx,ierr)
end subroutine VecScatterEnd_wrap

#endif

end module PetscRelWrappers
-----

This allows our code to compile fine with PETSc 2.3.2 even though internally 
our code uses the 2.3.3 (petsc-dev, actually) interfaces.  It would also be 
easy to do the same sort of thing to allow code that uses the 2.3.2 interfaces 
to compile with 2.3.3.

It might be a good idea to have some officially maintained wrappers like this 
(wrapping "older" PETSc interfaces to the new ones), although that might get a 
little messy (maybe more than a little).

I always insist on upgrading code to use the latest PETSc, but I know that 
there are people who either don't care to do this or who simple cannot due to 
circumstances beyond their control.  Folks installed PETSc from a package are 
probably not going to want to have to do this.

Best regards,
Richard Mills

Leif Strand wrote:
> Stephan Kramer wrote:
>> In that respect a related question: is it really necessary to have
>> incompatible changes between sub-sub-versions of PETSc? Most software
>> only makes backwards-incompatible changes when bumping their mayor
>> version number. I must say that I was not really amused when I found out
>> our software would not build with PETSc 2.3.3, because of various small
>> namechanges, such as KSPSetMonitor -> KSPMonitorSet.
> 
> 
> I second all of this. This is a much bigger issue than build system, 
> directory layout, etc. As a library maintainer, one needs religion about 
> this sort of thing. I would expect any library not to make gratuitous 
> changes to the API from one update to the next, and to have a sane 
> version numbering scheme.
> 
> So the number of changes between PETSc 2.3.2 and 2.3.3 was a bit 
> surprising. Given that it adds new features (Sieve), one could argue 
> that it should have been called PETSc 2.4. Given the number of 
> incompatibility-inducing changes (order-of-args for 
> VecScatter{Begin,End}, KSPDefaultSMonitor -> KSPMonitorDefault, etc.) I 
> would argue it should have been called PETSc 3.0. If you're really 
> ambitious, you could implement a separate API layer, and applications 
> can choose which API version they want to use (using a #define, for 
> example). Otherwise, branch management is a must.

-- 
Richard Tran Mills, Ph.D.
Computational Scientist                     E-mail: rmills at ornl.gov
Computational Earth Sciences Group          Phone:  (865) 241-3198
Oak Ridge National Laboratory               Fax:    (865) 574-0405




More information about the petsc-dev mailing list