Actual source code: slepcfn.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: User interface for the mathematical function object in SLEPc
12: */
14: #pragma once
16: #include <slepcsys.h>
18: /* SUBMANSEC = FN */
20: #define FN_MAX_SOLVE 16
22: SLEPC_EXTERN PetscErrorCode FNInitializePackage(void);
23: SLEPC_EXTERN PetscErrorCode FNFinalizePackage(void);
25: /*S
26: FN - Abstraction of a mathematical function.
28: Level: beginner
30: .seealso: [](sec:fn), `FNCreate()`
31: S*/
32: typedef struct _p_FN* FN;
34: /*J
35: FNType - String with the name of the mathematical function.
37: Level: beginner
39: .seealso: [](sec:fn), `FNSetType()`, `FN`
40: J*/
41: typedef const char *FNType;
42: #define FNRATIONAL "rational"
43: #define FNEXP "exp"
44: #define FNLOG "log"
45: #define FNPHI "phi"
46: #define FNSQRT "sqrt"
47: #define FNINVSQRT "invsqrt"
48: #define FNCOMBINE "combine"
50: /* Logging support */
51: SLEPC_EXTERN PetscClassId FN_CLASSID;
53: /*E
54: FNCombineType - Determines how two functions are combined.
56: Values:
57: + `FN_COMBINE_ADD` - add the functions
58: . `FN_COMBINE_MULTIPLY` - multiply the functions
59: . `FN_COMBINE_DIVIDE` - divide the functions
60: - `FN_COMBINE_COMPOSE` - use function composition
62: Level: intermediate
64: .seealso: [](sec:fn), `FNCombineSetChildren()`
65: E*/
66: typedef enum { FN_COMBINE_ADD,
67: FN_COMBINE_MULTIPLY,
68: FN_COMBINE_DIVIDE,
69: FN_COMBINE_COMPOSE } FNCombineType;
71: /*MC
72: FN_COMBINE_ADD - In functions of type `FNCOMBINE`, add the two child functions
73: together.
75: Level: intermediate
77: .seealso: [](sec:fn), `FNCombineType`, `FNCombineSetChildren()`, `FN_COMBINE_MULTIPLY`, `FN_COMBINE_DIVIDE`, `FN_COMBINE_COMPOSE`
78: M*/
80: /*MC
81: FN_COMBINE_MULTIPLY - In functions of type `FNCOMBINE`, multiply the two child functions
82: together.
84: Level: intermediate
86: .seealso: [](sec:fn), `FNCombineType`, `FNCombineSetChildren()`, `FN_COMBINE_ADD`, `FN_COMBINE_DIVIDE`, `FN_COMBINE_COMPOSE`
87: M*/
89: /*MC
90: FN_COMBINE_DIVIDE - In functions of type `FNCOMBINE`, compute the ratio of the
91: two child functions (the first one in the numerator).
93: Level: intermediate
95: .seealso: [](sec:fn), `FNCombineType`, `FNCombineSetChildren()`, `FN_COMBINE_ADD`, `FN_COMBINE_MULTIPLY`, `FN_COMBINE_COMPOSE`
96: M*/
98: /*MC
99: FN_COMBINE_COMPOSE - In functions of type `FNCOMBINE`, compose the two child functions,
100: i.e., evaluate the second function on the result of evaluating the first function.
102: Level: intermediate
104: .seealso: [](sec:fn), `FNCombineType`, `FNCombineSetChildren()`, `FN_COMBINE_ADD`, `FN_COMBINE_MULTIPLY`, `FN_COMBINE_DIVIDE`
105: M*/
107: /*E
108: FNParallelType - Indicates the parallel mode that will be used for matrix
109: function evaluation.
111: Values:
112: + `FN_PARALLEL_REDUNDANT` - all processes compute redundantly
113: - `FN_PARALLEL_SYNCHRONIZED` - only the first MPI process performs the computation
115: Level: advanced
117: .seealso: [](sec:fn), `FNSetParallel()`
118: E*/
119: typedef enum { FN_PARALLEL_REDUNDANT,
120: FN_PARALLEL_SYNCHRONIZED } FNParallelType;
121: SLEPC_EXTERN const char *FNParallelTypes[];
123: /*MC
124: FN_PARALLEL_REDUNDANT - In matrix function evaluation, all processes compute
125: redundantly.
127: Note:
128: When this parallel mode is selected, all processes will make the computation
129: redundantly, starting from the same data, and producing the same result.
130: This result may be slightly different in the different processes if using a
131: multithreaded BLAS library, which may cause issues in ill-conditioned problems.
133: Level: advanced
135: .seealso: [](sec:fn), `FNParallelType`, `FNSetParallel()`, `FN_PARALLEL_SYNCHRONIZED`
136: M*/
138: /*MC
139: FN_PARALLEL_SYNCHRONIZED - In matrix function evaluation, only the first MPI
140: process performs the computation.
142: Note:
143: When this parallel mode is selected, only the first MPI process performs the
144: computation and then the computed matrix is broadcast to the other
145: processes in the communicator. This communication is done automatically at
146: the end of `FNEvaluateFunctionMat()` or `FNEvaluateFunctionMatVec()`.
148: Level: advanced
150: .seealso: [](sec:fn), `FNParallelType`, `FNSetParallel()`, `FN_PARALLEL_REDUNDANT`
151: M*/
153: SLEPC_EXTERN PetscErrorCode FNCreate(MPI_Comm,FN*);
154: SLEPC_EXTERN PetscErrorCode FNSetType(FN,FNType);
155: SLEPC_EXTERN PetscErrorCode FNGetType(FN,FNType*);
156: SLEPC_EXTERN PetscErrorCode FNSetOptionsPrefix(FN,const char[]);
157: SLEPC_EXTERN PetscErrorCode FNAppendOptionsPrefix(FN,const char[]);
158: SLEPC_EXTERN PetscErrorCode FNGetOptionsPrefix(FN,const char*[]);
159: SLEPC_EXTERN PetscErrorCode FNSetFromOptions(FN);
160: SLEPC_EXTERN PetscErrorCode FNView(FN,PetscViewer);
161: SLEPC_EXTERN PetscErrorCode FNViewFromOptions(FN,PetscObject,const char[]);
162: SLEPC_EXTERN PetscErrorCode FNDestroy(FN*);
163: SLEPC_EXTERN PetscErrorCode FNDuplicate(FN,MPI_Comm,FN*);
165: SLEPC_EXTERN PetscErrorCode FNSetScale(FN,PetscScalar,PetscScalar);
166: SLEPC_EXTERN PetscErrorCode FNGetScale(FN,PetscScalar*,PetscScalar*);
167: SLEPC_EXTERN PetscErrorCode FNSetMethod(FN,PetscInt);
168: SLEPC_EXTERN PetscErrorCode FNGetMethod(FN,PetscInt*);
169: SLEPC_EXTERN PetscErrorCode FNSetParallel(FN,FNParallelType);
170: SLEPC_EXTERN PetscErrorCode FNGetParallel(FN,FNParallelType*);
172: SLEPC_EXTERN PetscErrorCode FNEvaluateFunction(FN,PetscScalar,PetscScalar*);
173: SLEPC_EXTERN PetscErrorCode FNEvaluateDerivative(FN,PetscScalar,PetscScalar*);
174: SLEPC_EXTERN PetscErrorCode FNEvaluateFunctionMat(FN,Mat,Mat);
175: SLEPC_EXTERN PetscErrorCode FNEvaluateFunctionMatVec(FN,Mat,Vec);
177: SLEPC_EXTERN PetscFunctionList FNList;
178: SLEPC_EXTERN PetscErrorCode FNRegister(const char[],PetscErrorCode(*)(FN));
180: /* --------- options specific to particular functions -------- */
182: SLEPC_EXTERN PetscErrorCode FNRationalSetNumerator(FN,PetscInt,PetscScalar[]);
183: SLEPC_EXTERN PetscErrorCode FNRationalGetNumerator(FN,PetscInt*,PetscScalar*[]);
184: SLEPC_EXTERN PetscErrorCode FNRationalSetDenominator(FN,PetscInt,PetscScalar[]);
185: SLEPC_EXTERN PetscErrorCode FNRationalGetDenominator(FN,PetscInt*,PetscScalar*[]);
187: SLEPC_EXTERN PetscErrorCode FNCombineSetChildren(FN,FNCombineType,FN,FN);
188: SLEPC_EXTERN PetscErrorCode FNCombineGetChildren(FN,FNCombineType*,FN*,FN*);
190: SLEPC_EXTERN PetscErrorCode FNPhiSetIndex(FN,PetscInt);
191: SLEPC_EXTERN PetscErrorCode FNPhiGetIndex(FN,PetscInt*);