Floating Point Precision

Currently, libCEED supports two options for CeedScalar : double and single. The default is to use double precision. Users wishing to set CeedScalar to single precision should edit include/ceed/types.h and change

#include "ceed-f64.h"  // IWYU pragma: export

to include ceed-f32.h instead, then recompile the library. Tests can be run using make test FC= because the Fortran tests do not support single precision at this time.

Language-specific notes

  • C: CEED_SCALAR_TYPE will be defined to match one of the values of the CeedScalarType enum, and can be used for compile-time checking of CeedScalar’s type; see, e.g., tests/t314-basis.c.

  • Fortran: There is no definition of CeedScalar available in the Fortran header. The user is responsible for ensuring that data used in Fortran code is of the correct type (real*8 or real*4) for libCEED’s current configuration.

  • Julia: After compiling the single precision version of libCEED, instruct LibCEED.jl to use this library with the set_libceed_path! function and restart the Julia session. LibCEED.jl will configure itself to use the appropriate type for CeedScalar.

  • Python: Make sure to replace the ceed-f64.h inclusion rather than commenting it out, to guarantee that the Python bindings will pick the correct precision. The scalar_type() function has been added to the Ceed class for convenience. It returns a string corresponding to a numpy datatype matching that of CeedScalar.

  • Rust: The Scalar type corresponds to CeedScalar.

This is work in progress! The ability to use single precision is an initial step in ongoing development of mixed-precision support in libCEED. A current GitHub issue contains discussions related to this development.