Line data Source code
1 : /* 2 : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3 : SLEPc - Scalable Library for Eigenvalue Problem Computations 4 : Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain 5 : 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 : */ 14 : 15 : #pragma once 16 : 17 : /* SUBMANSEC = sys */ 18 : 19 : /* 20 : Default tolerance for the different solvers, depending on the precision 21 : */ 22 : #if defined(PETSC_USE_REAL_SINGLE) 23 : # define SLEPC_DEFAULT_TOL 1e-5 24 : #elif defined(PETSC_USE_REAL_DOUBLE) 25 : # define SLEPC_DEFAULT_TOL 1e-8 26 : #elif defined(PETSC_USE_REAL___FLOAT128) 27 : # define SLEPC_DEFAULT_TOL 1e-16 28 : #elif defined(PETSC_USE_REAL___FP16) 29 : # define SLEPC_DEFAULT_TOL 1e-2 30 : #endif 31 : 32 2325 : static inline PetscReal SlepcDefaultTol(PetscReal tol) 33 : { 34 2325 : return tol == (PetscReal)PETSC_DEFAULT ? SLEPC_DEFAULT_TOL : tol; 35 : } 36 : 37 : /*@C 38 : SlepcAbs - Returns sqrt(x**2+y**2), taking care not to cause unnecessary 39 : overflow. It is based on LAPACK's DLAPY2. 40 : 41 : Not Collective 42 : 43 : Input parameters: 44 : . x,y - the real numbers 45 : 46 : Output parameter: 47 : . return - the result 48 : 49 : Note: 50 : This function is not available from Fortran. 51 : 52 : Level: developer 53 : @*/ 54 4392371 : static inline PetscReal SlepcAbs(PetscReal x,PetscReal y) 55 : { 56 4392371 : PetscReal w,z,t,xabs=PetscAbs(x),yabs=PetscAbs(y); 57 : 58 4392371 : w = PetscMax(xabs,yabs); 59 4392371 : z = PetscMin(xabs,yabs); 60 4392371 : if (PetscUnlikely(z == (PetscReal)0.0)) return w; 61 373006 : t = z/w; 62 373006 : return w*PetscSqrtReal((PetscReal)1.0+t*t); 63 : } 64 : 65 : /*MC 66 : SlepcAbsEigenvalue - Returns the absolute value of a complex number given 67 : its real and imaginary parts. 68 : 69 : Synopsis: 70 : PetscReal SlepcAbsEigenvalue(PetscScalar x,PetscScalar y) 71 : 72 : Not Collective 73 : 74 : Input parameters: 75 : + x - the real part of the complex number 76 : - y - the imaginary part of the complex number 77 : 78 : Notes: 79 : This function computes sqrt(x**2+y**2), taking care not to cause unnecessary 80 : overflow. It is based on LAPACK's DLAPY2. 81 : 82 : In complex scalars, only the first argument is used. 83 : 84 : This function is not available from Fortran. 85 : 86 : Level: developer 87 : M*/ 88 : #if !defined(PETSC_USE_COMPLEX) 89 : #define SlepcAbsEigenvalue(x,y) SlepcAbs(x,y) 90 : #else 91 : #define SlepcAbsEigenvalue(x,y) PetscAbsScalar(x) 92 : #endif 93 : 94 : /* 95 : SlepcSetFlushToZero - Set the FTZ flag in floating-point arithmetic. 96 : */ 97 72 : static inline PetscErrorCode SlepcSetFlushToZero(unsigned int *state) 98 : { 99 72 : PetscFunctionBegin; 100 : #if defined(PETSC_HAVE_XMMINTRIN_H) && defined(_MM_FLUSH_ZERO_ON) && defined(__SSE__) 101 : *state = _MM_GET_FLUSH_ZERO_MODE(); 102 : _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); 103 : #else 104 72 : *state = 0; 105 : #endif 106 72 : PetscFunctionReturn(PETSC_SUCCESS); 107 : } 108 : 109 : /* 110 : SlepcResetFlushToZero - Reset the FTZ flag in floating-point arithmetic. 111 : */ 112 72 : static inline PetscErrorCode SlepcResetFlushToZero(unsigned int *state) 113 : { 114 72 : PetscFunctionBegin; 115 : #if defined(PETSC_HAVE_XMMINTRIN_H) && defined(_MM_FLUSH_ZERO_MASK) && defined(__SSE__) 116 : _MM_SET_FLUSH_ZERO_MODE(*state & _MM_FLUSH_ZERO_MASK); 117 : #else 118 72 : *state = 0; 119 : #endif 120 72 : PetscFunctionReturn(PETSC_SUCCESS); 121 : }