Actual source code: slepcmath.h
1: /*
2: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3: SLEPc - Scalable Library for Eigenvalue Problem Computations
4: Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
6: This file is part of SLEPc.
7: SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9: */
10: /*
11: SLEPc mathematics include file. Defines basic operations and functions.
12: This file is included by slepcsys.h and should not be used directly.
13: */
15: #pragma once
17: /* SUBMANSEC = Sys */
19: /*
20: Default tolerance for the different solvers, depending on the precision
21: */
22: #if PetscDefined(USE_REAL_SINGLE)
23: # define SLEPC_DEFAULT_TOL 1e-5
24: #elif PetscDefined(USE_REAL_DOUBLE)
25: # define SLEPC_DEFAULT_TOL 1e-8
26: #elif PetscDefined(USE_REAL___FLOAT128)
27: # define SLEPC_DEFAULT_TOL 1e-16
28: #elif PetscDefined(USE_REAL___FP16)
29: # define SLEPC_DEFAULT_TOL 1e-2
30: #endif
32: static inline PetscReal SlepcDefaultTol(PetscReal tol)
33: {
34: return tol == (PetscReal)PETSC_DETERMINE ? SLEPC_DEFAULT_TOL : tol;
35: }
37: /*@
38: SlepcAbs - Returns $\sqrt{x^2+y^2}$, taking care not to cause unnecessary
39: overflow. It is based on LAPACK's `DLAPY2`.
41: Not Collective
43: Input parameters:
44: + x - the first real number
45: - y - the second real number
47: Output parameter:
48: . return - the result
50: Fortran Note:
51: This function is not available from Fortran.
53: Level: developer
54: @*/
55: static inline PetscReal SlepcAbs(PetscReal x,PetscReal y)
56: {
57: PetscReal w,z,t,xabs=PetscAbs(x),yabs=PetscAbs(y);
59: w = PetscMax(xabs,yabs);
60: z = PetscMin(xabs,yabs);
61: if (PetscUnlikely(z == PetscRealConstant(0.0))) return w;
62: t = z/w;
63: return w*PetscSqrtReal(PetscRealConstant(1.0)+t*t);
64: }
66: /*MC
67: SlepcAbsEigenvalue - Returns the absolute value of a complex number given
68: its real and imaginary parts.
70: Synopsis:
71: #include <slepcmath.h>
72: PetscReal SlepcAbsEigenvalue(PetscScalar x, PetscScalar y)
74: Not Collective
76: Input parameters:
77: + x - the real part of the complex number
78: - y - the imaginary part of the complex number
80: Notes:
81: This function computes $\sqrt{x^2+y^2}$, taking care not to cause unnecessary
82: overflow. It is based on LAPACK's `DLAPY2`.
84: In complex scalars, only the first argument is used, i.e., the result is $|x|$.
86: Fortran Note:
87: This function is not available from Fortran.
89: Level: developer
91: .seealso: `PetscAbsScalar()`
92: M*/
93: #if !PetscDefined(USE_COMPLEX)
94: #define SlepcAbsEigenvalue(x,y) SlepcAbs((x),(y))
95: #else
96: #define SlepcAbsEigenvalue(x,y) PetscAbsScalar(x)
97: #endif
99: /*@
100: SlepcSetFlushToZero - Set the FTZ flag in floating-point arithmetic.
102: Logically Collective
104: Output Parameter:
105: . state - the value before setting the flag
107: Level: developer
109: .seealso: `SlepcResetFlushToZero()`
110: @*/
111: static inline PetscErrorCode SlepcSetFlushToZero(unsigned int *state)
112: {
113: PetscFunctionBegin;
114: #if PetscDefined(HAVE_XMMINTRIN_H) && defined(_MM_FLUSH_ZERO_ON) && defined(__SSE__)
115: *state = _MM_GET_FLUSH_ZERO_MODE();
116: _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
117: #else
118: *state = 0;
119: #endif
120: PetscFunctionReturn(PETSC_SUCCESS);
121: }
123: /*@
124: SlepcResetFlushToZero - Reset the FTZ flag in floating-point arithmetic.
126: Logically Collective
128: Input Parameter:
129: . state - the value to be restored
131: Level: developer
133: .seealso: `SlepcResetFlushToZero()`
134: @*/
135: static inline PetscErrorCode SlepcResetFlushToZero(unsigned int *state)
136: {
137: PetscFunctionBegin;
138: #if PetscDefined(HAVE_XMMINTRIN_H) && defined(_MM_FLUSH_ZERO_MASK) && defined(__SSE__)
139: _MM_SET_FLUSH_ZERO_MODE(*state & _MM_FLUSH_ZERO_MASK);
140: #else
141: *state = 0;
142: #endif
143: PetscFunctionReturn(PETSC_SUCCESS);
144: }