MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_precision_select.f90
Go to the documentation of this file.
1!> @file m_precision_select.f90
2!! @brief Contains module m_precision_select
3
4!> @brief Working-precision kind selection (half/single/double) and corresponding MPI datatype parameters
6
7 ! use, intrinsic :: iso_c_binding
8
9#ifdef MFC_MPI
10 use mpi !< message passing interface (mpi) module
11#endif
12
13 implicit none
14
15 ! Define the available precision types
16 integer, parameter :: half_precision = 2 ! selected_real_kind(3, 4)
17 integer, parameter :: single_precision = selected_real_kind(6, 37)
18 integer, parameter :: double_precision = selected_real_kind(15, 307)
19
20 integer, parameter :: hp = half_precision
21 integer, parameter :: sp = single_precision
22 integer, parameter :: dp = double_precision
23
24 ! Set the working precision (wp) to single or double
25#ifdef MFC_SINGLE_PRECISION
26 integer, parameter :: wp = single_precision ! Change to single_precision if needed
27#else
28 integer, parameter :: wp = double_precision
29#endif
30
31 ! Set the storage precision (stp) to half if mixed precision is requested
32#ifdef MFC_MIXED_PRECISION
33 integer, parameter :: stp = half_precision
34#else
35 integer, parameter :: stp = wp
36#endif
37
38#ifdef MFC_MPI
39 ! Set mpi_p based on wp using the merge intrinsic function
40 integer, parameter :: mpi_p = merge(mpi_double_precision, mpi_real, wp == double_precision)
41 integer, parameter :: mpi_2p = merge(mpi_2double_precision, mpi_2real, wp == double_precision)
42 integer, parameter :: mpi_io_p = merge(mpi_byte, mpi_p, stp == half_precision)
43 ! MPI types per element. IE Real(kind=2) <=> 2 MPI_BYTE
44 integer, parameter :: mpi_io_type = merge(2, 1, stp == half_precision)
45#else
46 integer, parameter :: mpi_p = -100 ! Default value when MPI is not used
47 integer, parameter :: mpi_2p = -100
48 integer, parameter :: mpi_io_p = -100
49 integer, parameter :: mpi_io_type = -100
50#endif
51
52end module m_precision_select
Working-precision kind selection (half/single/double) and corresponding MPI datatype parameters.
integer, parameter sp
integer, parameter double_precision
integer, parameter half_precision
integer, parameter mpi_io_p
integer, parameter mpi_2p
integer, parameter mpi_p
integer, parameter mpi_io_type
integer, parameter wp
integer, parameter single_precision
integer, parameter hp
integer, parameter stp
integer, parameter dp