[petsc-dev] ugliness due to missing lapack routines
Barry Smith
bsmith at mcs.anl.gov
Sat Feb 9 13:08:51 CST 2013
On Feb 9, 2013, at 11:57 AM, Karl Rupp <rupp at mcs.anl.gov> wrote:
> Hi Jed,
>
>> If we we did negative defines
>>
>> #define PETSC_HAVE_SOMETHING 0
>>
>> then we could have normal code
>>
>> if (PETSC_HAVE_SOMETHING) {
>> some_func(ibuprofen);
>> } else { ... }
>>
>> The problem with this is that (a) we always need to define everything so
>> petscconf.h becomes larger and configure becomes more tightly coupled in
>> some ways, and (b) any use of #if defined(PETSC_HAVE_SOMETHING) will
>> evaluate true even for a negative define. This last instance is such a
>> confusing source of bugs that almost every project avoids it.
>
> (a) might lead to a larger petscconf.h, but at the same time it always contains a full list of packages that can be used within PETSc. I wouldn't consider this to be a drawback.
>
> Fortunately, b) can be checked easily with 'style checkers', keeping the lifetime of such a bug below 1 day.
>
>
>> To convert this to usual C semantics, we could use (yet another) macro trick
>
> Replacing CPP with CPP to get rid of CPP? That does not sound like a good approach :-D
>
>
>> With this sort of thing, we could write
>>
>> if (PETSC_HAVE_(SOMETHING)) {
>> some_func(no_headache);
>> } else { ... }
>>
>> which can be reasoned about using normal C semantics. The condition
>> evaluates at compile time so the code produced (with any optimization)
>> is identical. If different functions are called in the two cases, the
>> linker may request both of them. (This can be good or bad.)
>
> Since #if defined(...) is often used to conditionally enable calls to external libraries, this would require us to either disallow all direct calls to external libraries in all of PETSc core (and use some sublibrary-type generic interface instead), or to always link against all libraries. The latter is a nightmare with respect to support-requests to petsc-maint.
Most of the time (except for when Matt starts typing) each external library is associated with a few files that only get seen if the external library is present (for example, ML, hypre, superLU, etc etc) thus all those external libraries do not lead to the #if defined() nightmare.
Barry
>
> Best regards,
> Karli
>
More information about the petsc-dev
mailing list