Hello Erik,
Regarding segfaults in Fortran: why don't unallocated variables lead to an error in Fortran? Do you refer to Fortran allocation or Cactus allocations here?
Cactus allocations. Variables for which no STORAGE statement is active (either global or in the schedule item).
The reason is that (see configs/*/bindings/include/cctk_Arguments.h) you cannot legally pass a NULL pointer as a FORTRAN array subroutine argument, there apparently *has* to be some storage (I guess FORTRAN does no allow zero-sized arrays). So for non-debug runs Cactus passes in the address of a dummy array. This is sufficient to prevent segfaults (even for rather larger grids). Caught me recently when adding the Multipatch hacks to support non-multipatch runs. I was counting on segfaults if I had forgotten any pointers (and for rather large grids, so it is not just a small grid issue that goes away in production runs). I ended up unitialized memory which was mostly 0 so it did not show up in the test (since the variable without storage was kxx in Minkowski spacetime). :-(
Yours, Roland
--8<-- configs/*/bindings/include/cctk_Arguments.h --8<-- /* * References to non-existing or non-allocated variables should be passed * as NULL pointers in order to catch any invalid access immediately * However, this runtime debugging feature may cause problems * with some fortran compilers which require all fortran routine arguments * to refer to a valid memory location (eg. to enable the code optimizer * to generate conditional load/store instructions if applicable). * For this reason, we pass NULL pointers only for debugging configurations, * and a pointer to a user-accessable memory location (a local dummy variable) * otherwise. */ --8<--