[ET Trac] [Einstein Toolkit] #1534: Bug in complex numbers

Einstein Toolkit trac-noreply at einsteintoolkit.org
Thu Feb 6 17:56:16 CST 2014


#1534: Bug in complex numbers
-----------------------+----------------------------------------------------
  Reporter:  eschnett  |       Owner:                     
      Type:  defect    |      Status:  new                
  Priority:  critical  |   Milestone:                     
 Component:  Cactus    |     Version:  development version
Resolution:            |    Keywords:                     
-----------------------+----------------------------------------------------

Comment (by rhaas):

 Reading the bug report this seems to be only an issue for return values.
 The bug report states that even std::complex<double> is fine *in memory*
 ie std::complex<double> must look the same as _Complex double in memory.
 The only functions we have that returns a CCTK_COMPLEX are the
 CCTK_CmplxAdd etc functions. Since we now require C99 all of our supported
 languages (C, C++, F77, F90) support a complex type natively to do algebra
 with. So it seems feasible that we can make things standards conforming by
 removing the  CCTK_CmplxAdd etc. functions which are no longer required
 since the users can just use the language provided functionality instead.
 For backwards compatibility we can provide macro versions of the routines
 in cctk_Math.h or similar (or inline functions returning CCTK_COMPLEX for
 C/C++). I actually do run the Cactus test suites on a 32bit (virtual)
 machine. The failing tests (current trunk) are (using gcc/gfortran):
 {{{
     waveinterp-2p (from CarpetInterp)
     test_o9 (from CarpetProlongateTest)
     Schwarzschild_EF (from Exact)
     test_tov_carpet_refined_nosync (from GRHydro)
     tov_slowsector (from GRHydro)
     test_axibrill_nostagger (from IDAxiBrillBH)
     test_simpson (from Multipole)
     regression_test (from SphericalHarmonicRecon)
 }}}
 SphericalHarmonicRecon in PITTNull uses complex numbers. PITTNull itself
 is in Fortran so probably fine, MoL does the update and is in C so
 *should* be fine as well. There seems to be no C++ code using complex
 numbers in the tests. Slab uses complex numbers but the test does not use
 Slab. Both SphericalHarmonicReconGen and SphericalSlice do use them and
 are in C++, neither one is in the ET yet.

 There are two reasons I can see for the SphericalHarmonicRecon test
 failing:
 1. complex return values are handled differently in C and Fortran after
 all (different from what is stated in the link above)
 2. 32bit machines by default compile for the i387 coprocessor which always
 uses 80bit long double precision in its registers (well almost always)
 while 64bit machines use sse2 which uses only 64bit double precision it
 its registers. One can test this by recompiling the code (assuming gcc)
 using -mfpmath=sse

 I am testing patch for the flesh that replaces the complex algebra
 routines by inline function calls which should remove the problem of
 possibly differing return value representations and will report back on
 the results using the patch alone and using -mfpmath=sse.

-- 
Ticket URL: <https://trac.einsteintoolkit.org/ticket/1534#comment:4>
Einstein Toolkit <http://einsteintoolkit.org>
The Einstein Toolkit


More information about the Trac mailing list