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 integer, parameter :: hp = half_precision
20 integer, parameter :: sp = single_precision
21 integer, parameter :: dp = double_precision
22
23 ! Set the working precision (wp) to single or double
24#ifdef MFC_SINGLE_PRECISION
25 integer, parameter :: wp = single_precision !< Change to single_precision if needed
26#else
27 integer, parameter :: wp = double_precision
28#endif
29
30 ! Set the storage precision (stp) to half if mixed precision is requested
31#ifdef MFC_MIXED_PRECISION
32 integer, parameter :: stp = half_precision
33#else
34 integer, parameter :: stp = wp
35#endif
36
37#ifdef MFC_MPI
38 ! Set mpi_p based on wp using the merge intrinsic function
39 integer, parameter :: mpi_p = merge(mpi_double_precision, mpi_real, wp == double_precision)
40 integer, parameter :: mpi_2p = merge(mpi_2double_precision, mpi_2real, wp == double_precision)
41 integer, parameter :: mpi_io_p = merge(mpi_byte, mpi_p, stp == half_precision)
42 ! MPI types per element. IE Real(kind=2) <=> 2 MPI_BYTE
43 integer, parameter :: mpi_io_type = merge(2, 1, stp == half_precision)
44#else
45 integer, parameter :: mpi_p = -100 !< Default value when MPI is not used
46 integer, parameter :: mpi_2p = -100
47 integer, parameter :: mpi_io_p = -100
48 integer, parameter :: mpi_io_type = -100
49#endif
50end 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
selected_real_kind(3, 4)
integer, parameter mpi_io_p
integer, parameter mpi_2p
integer, parameter mpi_p
Default value when MPI is not used.
integer, parameter mpi_io_type
integer, parameter wp
Change to single_precision if needed.
integer, parameter single_precision
integer, parameter hp
integer, parameter stp
integer, parameter dp