The following message is a courtesy copy of an article that has been posted as well. In case anyone else is interested in doing rudimentary "design by contract" in Fortran, here is a simple subroutine that works for me using Solaris Fortran 2.0 using the fortran preprocessor fpp. I'd be interested in hearing about improvements and portability. For those who aren't familiar with C-style assertions, they are enormously useful macro statements that test the truth of a logical condition. If the condition isn't met, then the program halts and prints the line number. If the program is compiled with -DNDEBUG, then the assertions are no-ops that are optimized away. Here's an example of a precondtion test: --------testit.F90 #include "assert.h" program test_assert implicit none real a,b,c b=4. a=5. c=8. REQUIRE(a .lt. b) end program test_assert when compiled (without -DNDEBUG) and run, the resulting output is: <peacock /nfs/peacock/local1/datatmp/phil/testf90.dir> testit Precondition (a .lt. b) failed in file testit.F90 line 0009 Two files are needed to get this to work on Solaris: ----------assert.h #ifdef NDEBUG #define assert(EX) #define REQUIRE(EX) #define ENSURE(EX) #else #define assert(EX) if(.not. ( EX )) call FortranAssert('Assertion',#EX, __FILE__, __LINE__) #define REQUIRE(EX) if(.not. ( EX )) call FortranAssert('Precondition',#EX, __FILE__, __LINE__) #define ENSURE(EX) if(.not. ( EX )) call FortranAssert('Postcondition',#EX, __FILE__, __LINE__) #endif and: _________ FortranAssert.f90 subroutine FortranAssert(prepost,expression,filename,linenum) character(*), intent(in) :: prepost,expression, filename integer, intent(in) :: linenum write(6,'(a,a,a,a,a,a,i4.4)') prepost," (", expression, ") failed in file ", filename," line ",linenum stop end subroutine FortranAssert -- ------------------------------------------------------------ Phil Austin ([log in to unmask]) Department of Geography, Tel: (604) 822-2663 University of British Columbia, B.C. Fax: (604) 822-6150 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%