1: /*
2: SLEPc mathematics include file. Defines basic operations and functions.
3: This file is included by slepcsys.h and should not be used directly.
5: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
6: SLEPc - Scalable Library for Eigenvalue Problem Computations
7: Copyright (c) 2002-2015, Universitat Politecnica de Valencia, Spain
9: This file is part of SLEPc.
11: SLEPc is free software: you can redistribute it and/or modify it under the
12: terms of version 3 of the GNU Lesser General Public License as published by
13: the Free Software Foundation.
15: SLEPc is distributed in the hope that it will be useful, but WITHOUT ANY
16: WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17: FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
18: more details.
20: You should have received a copy of the GNU Lesser General Public License
21: along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
22: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
23: */
28: /*
29: Default tolerance for the different solvers, depending on the precision
30: */
31: #if defined(PETSC_USE_REAL_SINGLE)
32: # define SLEPC_DEFAULT_TOL 1e-6
33: #elif defined(PETSC_USE_REAL_DOUBLE)
34: # define SLEPC_DEFAULT_TOL 1e-8
35: #elif defined(PETSC_USE_REAL___FLOAT128)
36: # define SLEPC_DEFAULT_TOL 1e-16
37: #else
38: # define SLEPC_DEFAULT_TOL 1e-7
39: #endif
41: /*@C
42: SlepcAbs - Returns sqrt(x**2+y**2), taking care not to cause unnecessary
43: overflow. It is based on LAPACK's DLAPY2.
45: Not Collective
47: Input parameters:
48: . x,y - the real numbers
50: Output parameter:
51: . return - the result
53: Note:
54: This function is not available from Fortran.
56: Level: developer
57: @*/
58: PETSC_STATIC_INLINE PetscReal SlepcAbs(PetscReal x,PetscReal y) 59: {
60: PetscReal w,z,t,xabs=PetscAbs(x),yabs=PetscAbs(y);
62: w = PetscMax(xabs,yabs);
63: z = PetscMin(xabs,yabs);
64: if (z == 0.0) return w;
65: t = z/w;
66: return w*PetscSqrtReal(1.0+t*t);
67: }
69: /*MC
70: SlepcAbsEigenvalue - Returns the absolute value of a complex number given
71: its real and imaginary parts.
73: Synopsis:
74: PetscReal SlepcAbsEigenvalue(PetscScalar x,PetscScalar y)
76: Not Collective
78: Input parameters:
79: + x - the real part of the complex number
80: - y - the imaginary part of the complex number
82: Notes:
83: This function computes sqrt(x**2+y**2), taking care not to cause unnecessary
84: overflow. It is based on LAPACK's DLAPY2.
86: This function is not available from Fortran.
88: Level: developer
89: M*/
90: #if !defined(PETSC_USE_COMPLEX)
91: #define SlepcAbsEigenvalue(x,y) SlepcAbs(x,y) 92: #else
93: #define SlepcAbsEigenvalue(x,y) PetscAbsScalar(x) 94: #endif
96: #endif