ADflow  v1.0
ADflow is a finite volume RANS solver tailored for gradient-based aerodynamic design optimization.
precision.F90
Go to the documentation of this file.
1 module precision
2  !
3  ! Definition of the kinds used for the integer and real types.
4  ! Due to MPI, it is a bit messy to use the compiler options -r8
5  ! and -r4 and therefore the kind construction is used here,
6  ! where the precision is set using compiler flags of -d type.
7  ! This is the only file of the code that should be changed when
8  ! a user wants single precision instead of double precision. All
9  ! other routines use the definitions in this file whenever
10  ! possible. If other definitions are used, there is a good
11  ! reason to do so, e.g. when calling the cgns or MPI functions.
12  ! The actual types used are determined by compiler flags like
13  ! -DUSE_LONG_INT and -DUSE_SINGLE_PRECISION. If these are
14  ! omitted the default integer and double precision are used.
15  !
16  !
17  use mpi
18  implicit none
19 
20  save
21 
22  !
23  ! Definition of the integer type used in the entire code. There
24  ! might be a more elegant solution to do this, but be sure that
25  ! compatability with MPI must be guaranteed. Note that dummyInt
26  ! is a private variable, only used for the definition of the
27  ! integer type. Note furthermore that the parameters defining
28  ! the MPI types are integers. This is because of the definition
29  ! in MPI.
30  !
31 
32 #ifdef USE_LONG_INT
33 
34  ! Long, i.e. 8 byte, integers are used as default integers
35 
36  integer(kind=8), private :: dummyInt
37  integer, parameter :: adflow_integer = mpi_integer8
38  integer, parameter :: sizeOfInteger = 8
39 #else
40 
41  ! Standard 4 byte integer types are used as default integers.
42 
43  integer(kind=4), private :: dummyInt
44  integer, parameter :: adflow_integer = mpi_integer4
45  integer, parameter :: sizeofinteger = 4
46 #endif
47 
48  !
49  ! Definition of the float type used in the entire code. The
50  ! remarks mentioned before the integer type definition also
51  ! apply here.
52  !
53 
54 #ifdef USE_SINGLE_PRECISION
55 
56  ! Single precision reals are used as default real types.
57 
58  real(kind=4), private :: dummyreal
59  integer, parameter :: adflow_real = mpi_real4
60  integer, parameter :: sizeofreal = 4
61  real(kind=4), private :: dummycgnsreal
62 
63 #elif USE_QUADRUPLE_PRECISION
64 
65  ! Quadrupole precision reals are used as default real types.
66  ! This may not be supported on all platforms.
67  ! As cgns does not support quadrupole precision, double
68  ! precision is used instead.
69 
70  real(kind=16), private :: dummyreal
71  integer, parameter :: adflow_real = mpi_real16
72  integer, parameter :: sizeofreal = 16
73  real(kind=8), private :: dummycgnsreal
74 
75 #else
76 
77  ! Double precision reals are used as default real types.
78 
79  real(kind=8), private :: dummyreal
80  integer, parameter :: adflow_real = mpi_real8
81  integer, parameter :: sizeofreal = 8
82  real(kind=8), private :: dummycgnsreal
83 
84 #endif
85 
86  ! Dummy single and double types
87  real(kind=4) :: dummysingle
88  real(kind=8) :: dummydouble
89 
90  !
91  ! Definition of the porosity type. As this is only a flag to
92  ! indicate whether or not fluxes must be computed, an integer1
93  ! is perfectly okay.
94  !
95  integer(kind=1), private :: dummypor
96 
97  ! Definition of the integer type for the element types. As only
98  ! a limited number element types are present, a 1 byte integer
99  ! is enough.
100  !
101  integer(kind=1), private :: adtdummyelementint
102 
103  ! Definition of the cgns periodic type.
104  !
105  real(kind=4), private :: dummycgnsper
106  !
107  ! Definition of the kind parameters for the integer and real
108  ! types.
109  !
110  integer, parameter :: inttype = kind(dummyint)
111  integer, parameter :: portype = kind(dummypor)
112  integer, parameter :: realtype = kind(dummyreal)
113  integer, parameter :: adtelementtype = kind(adtdummyelementint)
114  integer, parameter :: cgnsrealtype = kind(dummycgnsreal)
115  integer, parameter :: cgnspertype = kind(dummycgnsper)
116  integer, parameter :: alwaysrealtype = kind(dummyreal)
117  integer, parameter :: singletype = kind(dummysingle)
118  integer, parameter :: doubletype = kind(dummydouble)
119  !
120  ! Set the parameter debug, depending on the compiler option.
121  !
122 #ifdef DEBUG_MODE
123  logical, parameter :: debug = .true.
124 #else
125  logical, parameter :: debug = .false.
126 #endif
127 
128 end module precision
integer, parameter singletype
Definition: precision.F90:117
integer, parameter portype
Definition: precision.F90:111
logical, parameter debug
Definition: precision.F90:125
integer, parameter adtelementtype
Definition: precision.F90:113
integer, parameter adflow_real
Definition: precision.F90:80
integer, parameter inttype
Definition: precision.F90:110
real(kind=8) dummydouble
Definition: precision.F90:88
integer, parameter doubletype
Definition: precision.F90:118
integer, parameter cgnsrealtype
Definition: precision.F90:114
integer, parameter realtype
Definition: precision.F90:112
integer, parameter alwaysrealtype
Definition: precision.F90:116
real(kind=4) dummysingle
Definition: precision.F90:87
integer, parameter sizeofreal
Definition: precision.F90:81
integer, parameter cgnspertype
Definition: precision.F90:115