Line | Branch | Exec | Source |
---|---|---|---|
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 | Basic FN routines | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/fnimpl.h> /*I "slepcfn.h" I*/ | ||
15 | #include <slepcblaslapack.h> | ||
16 | |||
17 | PetscFunctionList FNList = NULL; | ||
18 | PetscBool FNRegisterAllCalled = PETSC_FALSE; | ||
19 | PetscClassId FN_CLASSID = 0; | ||
20 | PetscLogEvent FN_Evaluate = 0; | ||
21 | static PetscBool FNPackageInitialized = PETSC_FALSE; | ||
22 | |||
23 | const char *FNParallelTypes[] = {"REDUNDANT","SYNCHRONIZED","FNParallelType","FN_PARALLEL_",NULL}; | ||
24 | |||
25 | /*@C | ||
26 | FNFinalizePackage - This function destroys everything in the Slepc interface | ||
27 | to the FN package. It is called from SlepcFinalize(). | ||
28 | |||
29 | Level: developer | ||
30 | |||
31 | .seealso: SlepcFinalize() | ||
32 | @*/ | ||
33 | 1804 | PetscErrorCode FNFinalizePackage(void) | |
34 | { | ||
35 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1804 | PetscFunctionBegin; |
36 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1804 | PetscCall(PetscFunctionListDestroy(&FNList)); |
37 | 1804 | FNPackageInitialized = PETSC_FALSE; | |
38 | 1804 | FNRegisterAllCalled = PETSC_FALSE; | |
39 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1804 | PetscFunctionReturn(PETSC_SUCCESS); |
40 | } | ||
41 | |||
42 | /*@C | ||
43 | FNInitializePackage - This function initializes everything in the FN package. | ||
44 | It is called from PetscDLLibraryRegister() when using dynamic libraries, and | ||
45 | on the first call to FNCreate() when using static libraries. | ||
46 | |||
47 | Level: developer | ||
48 | |||
49 | .seealso: SlepcInitialize() | ||
50 | @*/ | ||
51 | 16990 | PetscErrorCode FNInitializePackage(void) | |
52 | { | ||
53 | 16990 | char logList[256]; | |
54 | 16990 | PetscBool opt,pkg; | |
55 | 16990 | PetscClassId classids[1]; | |
56 | |||
57 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
16990 | PetscFunctionBegin; |
58 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
16990 | if (FNPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); |
59 | 1804 | FNPackageInitialized = PETSC_TRUE; | |
60 | /* Register Classes */ | ||
61 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1804 | PetscCall(PetscClassIdRegister("Math Function",&FN_CLASSID)); |
62 | /* Register Constructors */ | ||
63 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1804 | PetscCall(FNRegisterAll()); |
64 | /* Register Events */ | ||
65 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1804 | PetscCall(PetscLogEventRegister("FNEvaluate",FN_CLASSID,&FN_Evaluate)); |
66 | /* Process Info */ | ||
67 | 1804 | classids[0] = FN_CLASSID; | |
68 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1804 | PetscCall(PetscInfoProcessClass("fn",1,&classids[0])); |
69 | /* Process summary exclusions */ | ||
70 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1804 | PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); |
71 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1804 | if (opt) { |
72 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(PetscStrInList("fn",logList,',',&pkg)); |
73 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
64 | if (pkg) PetscCall(PetscLogEventDeactivateClass(FN_CLASSID)); |
74 | } | ||
75 | /* Register package finalizer */ | ||
76 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1804 | PetscCall(PetscRegisterFinalize(FNFinalizePackage)); |
77 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
329 | PetscFunctionReturn(PETSC_SUCCESS); |
78 | } | ||
79 | |||
80 | /*@ | ||
81 | FNCreate - Creates an FN context. | ||
82 | |||
83 | Collective | ||
84 | |||
85 | Input Parameter: | ||
86 | . comm - MPI communicator | ||
87 | |||
88 | Output Parameter: | ||
89 | . newfn - location to put the FN context | ||
90 | |||
91 | Level: beginner | ||
92 | |||
93 | .seealso: FNDestroy(), FN | ||
94 | @*/ | ||
95 | 4317 | PetscErrorCode FNCreate(MPI_Comm comm,FN *newfn) | |
96 | { | ||
97 | 4317 | FN fn; | |
98 | |||
99 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4317 | PetscFunctionBegin; |
100 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
4317 | PetscAssertPointer(newfn,2); |
101 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4317 | PetscCall(FNInitializePackage()); |
102 |
7/12✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
4317 | PetscCall(SlepcHeaderCreate(fn,FN_CLASSID,"FN","Math Function","FN",comm,FNDestroy,FNView)); |
103 | |||
104 | 4317 | fn->alpha = 1.0; | |
105 | 4317 | fn->beta = 1.0; | |
106 | 4317 | fn->method = 0; | |
107 | |||
108 | 4317 | fn->nw = 0; | |
109 | 4317 | fn->cw = 0; | |
110 | 4317 | fn->data = NULL; | |
111 | |||
112 | 4317 | *newfn = fn; | |
113 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
4317 | PetscFunctionReturn(PETSC_SUCCESS); |
114 | } | ||
115 | |||
116 | /*@ | ||
117 | FNSetOptionsPrefix - Sets the prefix used for searching for all | ||
118 | FN options in the database. | ||
119 | |||
120 | Logically Collective | ||
121 | |||
122 | Input Parameters: | ||
123 | + fn - the math function context | ||
124 | - prefix - the prefix string to prepend to all FN option requests | ||
125 | |||
126 | Notes: | ||
127 | A hyphen (-) must NOT be given at the beginning of the prefix name. | ||
128 | The first character of all runtime options is AUTOMATICALLY the | ||
129 | hyphen. | ||
130 | |||
131 | Level: advanced | ||
132 | |||
133 | .seealso: FNAppendOptionsPrefix() | ||
134 | @*/ | ||
135 | 50 | PetscErrorCode FNSetOptionsPrefix(FN fn,const char *prefix) | |
136 | { | ||
137 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBegin; |
138 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
50 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
139 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
50 | PetscCall(PetscObjectSetOptionsPrefix((PetscObject)fn,prefix)); |
140 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
141 | } | ||
142 | |||
143 | /*@ | ||
144 | FNAppendOptionsPrefix - Appends to the prefix used for searching for all | ||
145 | FN options in the database. | ||
146 | |||
147 | Logically Collective | ||
148 | |||
149 | Input Parameters: | ||
150 | + fn - the math function context | ||
151 | - prefix - the prefix string to prepend to all FN option requests | ||
152 | |||
153 | Notes: | ||
154 | A hyphen (-) must NOT be given at the beginning of the prefix name. | ||
155 | The first character of all runtime options is AUTOMATICALLY the hyphen. | ||
156 | |||
157 | Level: advanced | ||
158 | |||
159 | .seealso: FNSetOptionsPrefix() | ||
160 | @*/ | ||
161 | 10 | PetscErrorCode FNAppendOptionsPrefix(FN fn,const char *prefix) | |
162 | { | ||
163 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
164 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
10 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
165 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)fn,prefix)); |
166 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
167 | } | ||
168 | |||
169 | /*@ | ||
170 | FNGetOptionsPrefix - Gets the prefix used for searching for all | ||
171 | FN options in the database. | ||
172 | |||
173 | Not Collective | ||
174 | |||
175 | Input Parameters: | ||
176 | . fn - the math function context | ||
177 | |||
178 | Output Parameters: | ||
179 | . prefix - pointer to the prefix string used is returned | ||
180 | |||
181 | Note: | ||
182 | On the Fortran side, the user should pass in a string 'prefix' of | ||
183 | sufficient length to hold the prefix. | ||
184 | |||
185 | Level: advanced | ||
186 | |||
187 | .seealso: FNSetOptionsPrefix(), FNAppendOptionsPrefix() | ||
188 | @*/ | ||
189 | ✗ | PetscErrorCode FNGetOptionsPrefix(FN fn,const char *prefix[]) | |
190 | { | ||
191 | ✗ | PetscFunctionBegin; | |
192 | ✗ | PetscValidHeaderSpecific(fn,FN_CLASSID,1); | |
193 | ✗ | PetscAssertPointer(prefix,2); | |
194 | ✗ | PetscCall(PetscObjectGetOptionsPrefix((PetscObject)fn,prefix)); | |
195 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
196 | } | ||
197 | |||
198 | /*@ | ||
199 | FNSetType - Selects the type for the FN object. | ||
200 | |||
201 | Logically Collective | ||
202 | |||
203 | Input Parameters: | ||
204 | + fn - the math function context | ||
205 | - type - a known type | ||
206 | |||
207 | Notes: | ||
208 | The default is FNRATIONAL, which includes polynomials as a particular | ||
209 | case as well as simple functions such as f(x)=x and f(x)=constant. | ||
210 | |||
211 | Level: intermediate | ||
212 | |||
213 | .seealso: FNGetType() | ||
214 | @*/ | ||
215 | 4425 | PetscErrorCode FNSetType(FN fn,FNType type) | |
216 | { | ||
217 | 4425 | PetscErrorCode (*r)(FN); | |
218 | 4425 | PetscBool match; | |
219 | |||
220 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4425 | PetscFunctionBegin; |
221 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
4425 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
222 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
4425 | PetscAssertPointer(type,2); |
223 | |||
224 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4425 | PetscCall(PetscObjectTypeCompare((PetscObject)fn,type,&match)); |
225 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
4425 | if (match) PetscFunctionReturn(PETSC_SUCCESS); |
226 | |||
227 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4347 | PetscCall(PetscFunctionListFind(FNList,type,&r)); |
228 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
4347 | PetscCheck(r,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested FN type %s",type); |
229 | |||
230 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
4347 | PetscTryTypeMethod(fn,destroy); |
231 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4347 | PetscCall(PetscMemzero(fn->ops,sizeof(struct _FNOps))); |
232 | |||
233 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4347 | PetscCall(PetscObjectChangeTypeName((PetscObject)fn,type)); |
234 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4347 | PetscCall((*r)(fn)); |
235 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
819 | PetscFunctionReturn(PETSC_SUCCESS); |
236 | } | ||
237 | |||
238 | /*@ | ||
239 | FNGetType - Gets the FN type name (as a string) from the FN context. | ||
240 | |||
241 | Not Collective | ||
242 | |||
243 | Input Parameter: | ||
244 | . fn - the math function context | ||
245 | |||
246 | Output Parameter: | ||
247 | . type - name of the math function | ||
248 | |||
249 | Level: intermediate | ||
250 | |||
251 | .seealso: FNSetType() | ||
252 | @*/ | ||
253 | 464 | PetscErrorCode FNGetType(FN fn,FNType *type) | |
254 | { | ||
255 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
464 | PetscFunctionBegin; |
256 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
464 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
257 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
464 | PetscAssertPointer(type,2); |
258 | 464 | *type = ((PetscObject)fn)->type_name; | |
259 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
464 | PetscFunctionReturn(PETSC_SUCCESS); |
260 | } | ||
261 | |||
262 | /*@ | ||
263 | FNSetScale - Sets the scaling parameters that define the matematical function. | ||
264 | |||
265 | Logically Collective | ||
266 | |||
267 | Input Parameters: | ||
268 | + fn - the math function context | ||
269 | . alpha - inner scaling (argument) | ||
270 | - beta - outer scaling (result) | ||
271 | |||
272 | Notes: | ||
273 | Given a function f(x) specified by the FN type, the scaling parameters can | ||
274 | be used to realize the function beta*f(alpha*x). So when these values are given, | ||
275 | the procedure for function evaluation will first multiply the argument by alpha, | ||
276 | then evaluate the function itself, and finally scale the result by beta. | ||
277 | Likewise, these values are also considered when evaluating the derivative. | ||
278 | |||
279 | If you want to provide only one of the two scaling factors, set the other | ||
280 | one to 1.0. | ||
281 | |||
282 | Level: intermediate | ||
283 | |||
284 | .seealso: FNGetScale(), FNEvaluateFunction() | ||
285 | @*/ | ||
286 | 1774 | PetscErrorCode FNSetScale(FN fn,PetscScalar alpha,PetscScalar beta) | |
287 | { | ||
288 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1774 | PetscFunctionBegin; |
289 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
1774 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
290 |
30/68✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 2 times.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
|
1774 | PetscValidLogicalCollectiveScalar(fn,alpha,2); |
291 |
30/68✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 2 times.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
✗ Branch 66 not taken.
✗ Branch 67 not taken.
|
1774 | PetscValidLogicalCollectiveScalar(fn,beta,3); |
292 |
2/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1774 | PetscCheck(PetscAbsScalar(alpha)!=0.0 && PetscAbsScalar(beta)!=0.0,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_WRONG,"Scaling factors must be nonzero"); |
293 | 1774 | fn->alpha = alpha; | |
294 | 1774 | fn->beta = beta; | |
295 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1774 | PetscFunctionReturn(PETSC_SUCCESS); |
296 | } | ||
297 | |||
298 | /*@ | ||
299 | FNGetScale - Gets the scaling parameters that define the matematical function. | ||
300 | |||
301 | Not Collective | ||
302 | |||
303 | Input Parameter: | ||
304 | . fn - the math function context | ||
305 | |||
306 | Output Parameters: | ||
307 | + alpha - inner scaling (argument) | ||
308 | - beta - outer scaling (result) | ||
309 | |||
310 | Level: intermediate | ||
311 | |||
312 | .seealso: FNSetScale() | ||
313 | @*/ | ||
314 | 7229 | PetscErrorCode FNGetScale(FN fn,PetscScalar *alpha,PetscScalar *beta) | |
315 | { | ||
316 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
7229 | PetscFunctionBegin; |
317 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
7229 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
318 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
7229 | if (alpha) *alpha = fn->alpha; |
319 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
7229 | if (beta) *beta = fn->beta; |
320 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
7229 | PetscFunctionReturn(PETSC_SUCCESS); |
321 | } | ||
322 | |||
323 | /*@ | ||
324 | FNSetMethod - Selects the method to be used to evaluate functions of matrices. | ||
325 | |||
326 | Logically Collective | ||
327 | |||
328 | Input Parameters: | ||
329 | + fn - the math function context | ||
330 | - meth - an index identifying the method | ||
331 | |||
332 | Options Database Key: | ||
333 | . -fn_method <meth> - Sets the method | ||
334 | |||
335 | Notes: | ||
336 | In some FN types there are more than one algorithms available for computing | ||
337 | matrix functions. In that case, this function allows choosing the wanted method. | ||
338 | |||
339 | If meth is currently set to 0 (the default) and the input argument A of | ||
340 | FNEvaluateFunctionMat() is a symmetric/Hermitian matrix, then the computation | ||
341 | is done via the eigendecomposition of A, rather than with the general algorithm. | ||
342 | |||
343 | Level: intermediate | ||
344 | |||
345 | .seealso: FNGetMethod(), FNEvaluateFunctionMat() | ||
346 | @*/ | ||
347 | 888 | PetscErrorCode FNSetMethod(FN fn,PetscInt meth) | |
348 | { | ||
349 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
888 | PetscFunctionBegin; |
350 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
888 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
351 |
27/62✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
888 | PetscValidLogicalCollectiveInt(fn,meth,2); |
352 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
888 | PetscCheck(meth>=0,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_OUTOFRANGE,"The method must be a non-negative integer"); |
353 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
888 | PetscCheck(meth<=FN_MAX_SOLVE,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_OUTOFRANGE,"Too large value for the method"); |
354 | 888 | fn->method = meth; | |
355 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
888 | PetscFunctionReturn(PETSC_SUCCESS); |
356 | } | ||
357 | |||
358 | /*@ | ||
359 | FNGetMethod - Gets the method currently used in the FN. | ||
360 | |||
361 | Not Collective | ||
362 | |||
363 | Input Parameter: | ||
364 | . fn - the math function context | ||
365 | |||
366 | Output Parameter: | ||
367 | . meth - identifier of the method | ||
368 | |||
369 | Level: intermediate | ||
370 | |||
371 | .seealso: FNSetMethod() | ||
372 | @*/ | ||
373 | 464 | PetscErrorCode FNGetMethod(FN fn,PetscInt *meth) | |
374 | { | ||
375 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
464 | PetscFunctionBegin; |
376 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
464 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
377 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
464 | PetscAssertPointer(meth,2); |
378 | 464 | *meth = fn->method; | |
379 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
464 | PetscFunctionReturn(PETSC_SUCCESS); |
380 | } | ||
381 | |||
382 | /*@ | ||
383 | FNSetParallel - Selects the mode of operation in parallel runs. | ||
384 | |||
385 | Logically Collective | ||
386 | |||
387 | Input Parameters: | ||
388 | + fn - the math function context | ||
389 | - pmode - the parallel mode | ||
390 | |||
391 | Options Database Key: | ||
392 | . -fn_parallel <mode> - Sets the parallel mode, either 'redundant' or 'synchronized' | ||
393 | |||
394 | Notes: | ||
395 | This is relevant only when the function is evaluated on a matrix, with | ||
396 | either FNEvaluateFunctionMat() or FNEvaluateFunctionMatVec(). | ||
397 | |||
398 | In the 'redundant' parallel mode, all processes will make the computation | ||
399 | redundantly, starting from the same data, and producing the same result. | ||
400 | This result may be slightly different in the different processes if using a | ||
401 | multithreaded BLAS library, which may cause issues in ill-conditioned problems. | ||
402 | |||
403 | In the 'synchronized' parallel mode, only the first MPI process performs the | ||
404 | computation and then the computed matrix is broadcast to the other | ||
405 | processes in the communicator. This communication is done automatically at | ||
406 | the end of FNEvaluateFunctionMat() or FNEvaluateFunctionMatVec(). | ||
407 | |||
408 | Level: advanced | ||
409 | |||
410 | .seealso: FNEvaluateFunctionMat() or FNEvaluateFunctionMatVec(), FNGetParallel() | ||
411 | @*/ | ||
412 | 524 | PetscErrorCode FNSetParallel(FN fn,FNParallelType pmode) | |
413 | { | ||
414 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
524 | PetscFunctionBegin; |
415 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
524 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
416 |
27/62✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
524 | PetscValidLogicalCollectiveEnum(fn,pmode,2); |
417 | 524 | fn->pmode = pmode; | |
418 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
524 | PetscFunctionReturn(PETSC_SUCCESS); |
419 | } | ||
420 | |||
421 | /*@ | ||
422 | FNGetParallel - Gets the mode of operation in parallel runs. | ||
423 | |||
424 | Not Collective | ||
425 | |||
426 | Input Parameter: | ||
427 | . fn - the math function context | ||
428 | |||
429 | Output Parameter: | ||
430 | . pmode - the parallel mode | ||
431 | |||
432 | Level: advanced | ||
433 | |||
434 | .seealso: FNSetParallel() | ||
435 | @*/ | ||
436 | 464 | PetscErrorCode FNGetParallel(FN fn,FNParallelType *pmode) | |
437 | { | ||
438 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
464 | PetscFunctionBegin; |
439 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
464 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
440 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
464 | PetscAssertPointer(pmode,2); |
441 | 464 | *pmode = fn->pmode; | |
442 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
464 | PetscFunctionReturn(PETSC_SUCCESS); |
443 | } | ||
444 | |||
445 | /*@ | ||
446 | FNEvaluateFunction - Computes the value of the function f(x) for a given x. | ||
447 | |||
448 | Not Collective | ||
449 | |||
450 | Input Parameters: | ||
451 | + fn - the math function context | ||
452 | - x - the value where the function must be evaluated | ||
453 | |||
454 | Output Parameter: | ||
455 | . y - the result of f(x) | ||
456 | |||
457 | Note: | ||
458 | Scaling factors are taken into account, so the actual function evaluation | ||
459 | will return beta*f(alpha*x). | ||
460 | |||
461 | Level: intermediate | ||
462 | |||
463 | .seealso: FNEvaluateDerivative(), FNEvaluateFunctionMat(), FNSetScale() | ||
464 | @*/ | ||
465 | 122782 | PetscErrorCode FNEvaluateFunction(FN fn,PetscScalar x,PetscScalar *y) | |
466 | { | ||
467 | 122782 | PetscScalar xf,yf; | |
468 | |||
469 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
122782 | PetscFunctionBegin; |
470 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
122782 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
471 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
122782 | PetscValidType(fn,1); |
472 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
122782 | PetscAssertPointer(y,3); |
473 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
122782 | PetscCall(PetscLogEventBegin(FN_Evaluate,fn,0,0,0)); |
474 | 122782 | xf = fn->alpha*x; | |
475 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
122782 | PetscUseTypeMethod(fn,evaluatefunction,xf,&yf); |
476 | 122782 | *y = fn->beta*yf; | |
477 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
122782 | PetscCall(PetscLogEventEnd(FN_Evaluate,fn,0,0,0)); |
478 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
24521 | PetscFunctionReturn(PETSC_SUCCESS); |
479 | } | ||
480 | |||
481 | /*@ | ||
482 | FNEvaluateDerivative - Computes the value of the derivative f'(x) for a given x. | ||
483 | |||
484 | Not Collective | ||
485 | |||
486 | Input Parameters: | ||
487 | + fn - the math function context | ||
488 | - x - the value where the derivative must be evaluated | ||
489 | |||
490 | Output Parameter: | ||
491 | . y - the result of f'(x) | ||
492 | |||
493 | Note: | ||
494 | Scaling factors are taken into account, so the actual derivative evaluation will | ||
495 | return alpha*beta*f'(alpha*x). | ||
496 | |||
497 | Level: intermediate | ||
498 | |||
499 | .seealso: FNEvaluateFunction() | ||
500 | @*/ | ||
501 | 43705 | PetscErrorCode FNEvaluateDerivative(FN fn,PetscScalar x,PetscScalar *y) | |
502 | { | ||
503 | 43705 | PetscScalar xf,yf; | |
504 | |||
505 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
43705 | PetscFunctionBegin; |
506 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
43705 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
507 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
43705 | PetscValidType(fn,1); |
508 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
43705 | PetscAssertPointer(y,3); |
509 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
43705 | PetscCall(PetscLogEventBegin(FN_Evaluate,fn,0,0,0)); |
510 | 43705 | xf = fn->alpha*x; | |
511 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
43705 | PetscUseTypeMethod(fn,evaluatederivative,xf,&yf); |
512 | 43705 | *y = fn->alpha*fn->beta*yf; | |
513 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
43705 | PetscCall(PetscLogEventEnd(FN_Evaluate,fn,0,0,0)); |
514 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
8538 | PetscFunctionReturn(PETSC_SUCCESS); |
515 | } | ||
516 | |||
517 | 434 | static PetscErrorCode FNEvaluateFunctionMat_Sym_Private(FN fn,const PetscScalar *As,PetscScalar *Bs,PetscInt m,PetscBool firstonly) | |
518 | { | ||
519 | 434 | PetscInt i,j; | |
520 | 434 | PetscBLASInt n,k,ld,lwork,info; | |
521 | 434 | PetscScalar *Q,*W,*work,adummy,a,x,y,one=1.0,zero=0.0; | |
522 | 434 | PetscReal *eig,dummy; | |
523 | #if defined(PETSC_USE_COMPLEX) | ||
524 | 217 | PetscReal *rwork,rdummy; | |
525 | #endif | ||
526 | |||
527 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
434 | PetscFunctionBegin; |
528 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
434 | PetscCall(PetscBLASIntCast(m,&n)); |
529 | 434 | ld = n; | |
530 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
434 | k = firstonly? 1: n; |
531 | |||
532 | /* workspace query and memory allocation */ | ||
533 | 434 | lwork = -1; | |
534 | #if defined(PETSC_USE_COMPLEX) | ||
535 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
217 | PetscCallBLAS("LAPACKsyev",LAPACKsyev_("V","L",&n,&adummy,&ld,&dummy,&a,&lwork,&rdummy,&info)); |
536 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
217 | PetscCall(PetscBLASIntCast((PetscInt)PetscRealPart(a),&lwork)); |
537 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
217 | PetscCall(PetscMalloc5(m,&eig,m*m,&Q,m*k,&W,lwork,&work,PetscMax(1,3*m-2),&rwork)); |
538 | #else | ||
539 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
217 | PetscCallBLAS("LAPACKsyev",LAPACKsyev_("V","L",&n,&adummy,&ld,&dummy,&a,&lwork,&info)); |
540 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
217 | PetscCall(PetscBLASIntCast((PetscInt)a,&lwork)); |
541 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
217 | PetscCall(PetscMalloc4(m,&eig,m*m,&Q,m*k,&W,lwork,&work)); |
542 | #endif | ||
543 | |||
544 | /* compute eigendecomposition */ | ||
545 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
589514 | for (j=0;j<n;j++) for (i=j;i<n;i++) Q[i+j*ld] = As[i+j*ld]; |
546 | #if defined(PETSC_USE_COMPLEX) | ||
547 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
217 | PetscCallBLAS("LAPACKsyev",LAPACKsyev_("V","L",&n,Q,&ld,eig,work,&lwork,rwork,&info)); |
548 | #else | ||
549 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
217 | PetscCallBLAS("LAPACKsyev",LAPACKsyev_("V","L",&n,Q,&ld,eig,work,&lwork,&info)); |
550 | #endif | ||
551 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
434 | SlepcCheckLapackInfo("syev",info); |
552 | |||
553 | /* W = f(Lambda)*Q' */ | ||
554 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
14456 | for (i=0;i<n;i++) { |
555 | 14022 | x = fn->alpha*eig[i]; | |
556 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
14022 | PetscUseTypeMethod(fn,evaluatefunction,x,&y); /* y = f(x) */ |
557 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
581496 | for (j=0;j<k;j++) W[i+j*ld] = PetscConj(Q[j+i*ld])*fn->beta*y; |
558 | } | ||
559 | /* Bs = Q*W */ | ||
560 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
434 | PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&n,&k,&n,&one,Q,&ld,W,&ld,&zero,Bs,&ld)); |
561 | #if defined(PETSC_USE_COMPLEX) | ||
562 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
217 | PetscCall(PetscFree5(eig,Q,W,work,rwork)); |
563 | #else | ||
564 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
217 | PetscCall(PetscFree4(eig,Q,W,work)); |
565 | #endif | ||
566 |
3/6✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
434 | PetscCall(PetscLogFlops(9.0*n*n*n+2.0*n*n*n)); |
567 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
434 | PetscFunctionReturn(PETSC_SUCCESS); |
568 | } | ||
569 | |||
570 | /* | ||
571 | FNEvaluateFunctionMat_Sym_Default - given a symmetric matrix A, | ||
572 | compute the matrix function as f(A)=Q*f(D)*Q' where the spectral | ||
573 | decomposition of A is A=Q*D*Q' | ||
574 | */ | ||
575 | 196 | static PetscErrorCode FNEvaluateFunctionMat_Sym_Default(FN fn,Mat A,Mat B) | |
576 | { | ||
577 | 196 | PetscInt m; | |
578 | 196 | const PetscScalar *As; | |
579 | 196 | PetscScalar *Bs; | |
580 | |||
581 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
196 | PetscFunctionBegin; |
582 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(MatDenseGetArrayRead(A,&As)); |
583 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(MatDenseGetArray(B,&Bs)); |
584 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(MatGetSize(A,&m,NULL)); |
585 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(FNEvaluateFunctionMat_Sym_Private(fn,As,Bs,m,PETSC_FALSE)); |
586 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(MatDenseRestoreArrayRead(A,&As)); |
587 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(MatDenseRestoreArray(B,&Bs)); |
588 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
38 | PetscFunctionReturn(PETSC_SUCCESS); |
589 | } | ||
590 | |||
591 | 18991 | static PetscErrorCode FNEvaluateFunctionMat_Basic(FN fn,Mat A,Mat F) | |
592 | { | ||
593 | 18991 | PetscBool iscuda; | |
594 | |||
595 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
18991 | PetscFunctionBegin; |
596 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18991 | PetscCall(PetscObjectTypeCompare((PetscObject)A,MATSEQDENSECUDA,&iscuda)); |
597 |
3/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
18991 | if (iscuda && !fn->ops->evaluatefunctionmatcuda[fn->method]) PetscCall(PetscInfo(fn,"The method %" PetscInt_FMT " is not implemented for CUDA, falling back to CPU version\n",fn->method)); |
598 |
4/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
18991 | if (iscuda && fn->ops->evaluatefunctionmatcuda[fn->method]) PetscUseTypeMethod(fn,evaluatefunctionmatcuda[fn->method],A,F); |
599 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
18655 | else if (fn->ops->evaluatefunctionmat[fn->method]) PetscUseTypeMethod(fn,evaluatefunctionmat[fn->method],A,F); |
600 | else { | ||
601 | ✗ | PetscCheck(fn->method,PetscObjectComm((PetscObject)fn),PETSC_ERR_SUP,"Matrix functions not implemented in this FN type"); | |
602 | ✗ | PetscCheck(!fn->method,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_OUTOFRANGE,"The specified method number does not exist for this FN type"); | |
603 | } | ||
604 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
3700 | PetscFunctionReturn(PETSC_SUCCESS); |
605 | } | ||
606 | |||
607 | 16471 | PetscErrorCode FNEvaluateFunctionMat_Private(FN fn,Mat A,Mat B,PetscBool sync) | |
608 | { | ||
609 | 16471 | PetscBool set,flg,symm=PETSC_FALSE,iscuda,hasspecificmeth; | |
610 | 16471 | PetscInt m,n; | |
611 | 16471 | PetscMPIInt size,rank,n2; | |
612 | 16471 | PetscScalar *pF; | |
613 | 16471 | Mat M,F; | |
614 | |||
615 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
16471 | PetscFunctionBegin; |
616 | /* destination matrix */ | ||
617 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16471 | F = B?B:A; |
618 | |||
619 | /* check symmetry of A */ | ||
620 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16471 | PetscCall(MatIsHermitianKnown(A,&set,&flg)); |
621 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
|
16471 | symm = set? flg: PETSC_FALSE; |
622 | |||
623 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
16471 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)fn),&size)); |
624 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
16471 | PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)fn),&rank)); |
625 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
|
16471 | if (size==1 || fn->pmode==FN_PARALLEL_REDUNDANT || (fn->pmode==FN_PARALLEL_SYNCHRONIZED && !rank)) { |
626 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16351 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
627 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16351 | PetscCall(PetscObjectTypeCompare((PetscObject)A,MATSEQDENSECUDA,&iscuda)); |
628 |
7/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
|
16351 | hasspecificmeth = ((iscuda && fn->ops->evaluatefunctionmatcuda[fn->method]) || (!iscuda && fn->method && fn->ops->evaluatefunctionmat[fn->method]))? PETSC_TRUE: PETSC_FALSE; |
629 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
16351 | if (!hasspecificmeth && symm && !fn->method) { /* prefer diagonalization */ |
630 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(PetscInfo(fn,"Computing matrix function via diagonalization\n")); |
631 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(FNEvaluateFunctionMat_Sym_Default(fn,A,F)); |
632 | } else { | ||
633 | /* scale argument */ | ||
634 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16155 | if (fn->alpha!=(PetscScalar)1.0) { |
635 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2910 | PetscCall(FN_AllocateWorkMat(fn,A,&M)); |
636 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2910 | PetscCall(MatScale(M,fn->alpha)); |
637 | 13245 | } else M = A; | |
638 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16155 | PetscCall(FNEvaluateFunctionMat_Basic(fn,M,F)); |
639 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
16155 | if (fn->alpha!=(PetscScalar)1.0) PetscCall(FN_FreeWorkMat(fn,&M)); |
640 | /* scale result */ | ||
641 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16155 | PetscCall(MatScale(F,fn->beta)); |
642 | } | ||
643 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
16351 | PetscCall(PetscFPTrapPop()); |
644 | } | ||
645 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
16471 | if (size>1 && fn->pmode==FN_PARALLEL_SYNCHRONIZED && sync) { /* synchronize */ |
646 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(MatGetSize(A,&m,&n)); |
647 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(MatDenseGetArray(F,&pF)); |
648 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscMPIIntCast(n*n,&n2)); |
649 |
15/30✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
360 | PetscCallMPI(MPI_Bcast(pF,n2,MPIU_SCALAR,0,PetscObjectComm((PetscObject)fn))); |
650 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(MatDenseRestoreArray(F,&pF)); |
651 | } | ||
652 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
3224 | PetscFunctionReturn(PETSC_SUCCESS); |
653 | } | ||
654 | |||
655 | /*@ | ||
656 | FNEvaluateFunctionMat - Computes the value of the function f(A) for a given | ||
657 | matrix A, where the result is also a matrix. | ||
658 | |||
659 | Logically Collective | ||
660 | |||
661 | Input Parameters: | ||
662 | + fn - the math function context | ||
663 | - A - matrix on which the function must be evaluated | ||
664 | |||
665 | Output Parameter: | ||
666 | . B - (optional) matrix resulting from evaluating f(A) | ||
667 | |||
668 | Notes: | ||
669 | Matrix A must be a square sequential dense Mat, with all entries equal on | ||
670 | all processes (otherwise each process will compute different results). | ||
671 | If matrix B is provided, it must also be a square sequential dense Mat, and | ||
672 | both matrices must have the same dimensions. If B is NULL (or B=A) then the | ||
673 | function will perform an in-place computation, overwriting A with f(A). | ||
674 | |||
675 | If A is known to be real symmetric or complex Hermitian then it is | ||
676 | recommended to set the appropriate flag with MatSetOption(), because | ||
677 | symmetry can sometimes be exploited by the algorithm. | ||
678 | |||
679 | Scaling factors are taken into account, so the actual function evaluation | ||
680 | will return beta*f(alpha*A). | ||
681 | |||
682 | Level: advanced | ||
683 | |||
684 | .seealso: FNEvaluateFunction(), FNEvaluateFunctionMatVec(), FNSetMethod() | ||
685 | @*/ | ||
686 | 15937 | PetscErrorCode FNEvaluateFunctionMat(FN fn,Mat A,Mat B) | |
687 | { | ||
688 | 15937 | PetscBool inplace=PETSC_FALSE; | |
689 | 15937 | PetscInt m,n,n1; | |
690 | 15937 | MatType type; | |
691 | |||
692 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
15937 | PetscFunctionBegin; |
693 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
15937 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
694 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
15937 | PetscValidHeaderSpecific(A,MAT_CLASSID,2); |
695 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15937 | PetscValidType(fn,1); |
696 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15937 | PetscValidType(A,2); |
697 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15937 | if (B) { |
698 |
2/12✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
3035 | PetscValidHeaderSpecific(B,MAT_CLASSID,3); |
699 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3035 | PetscValidType(B,3); |
700 | 460 | } else inplace = PETSC_TRUE; | |
701 |
4/10✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
15937 | PetscCheckTypeNames(A,MATSEQDENSE,MATSEQDENSECUDA); //SlepcMatCheckSeq(A); |
702 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15937 | PetscCall(MatGetSize(A,&m,&n)); |
703 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15937 | PetscCheck(m==n,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_SIZ,"Mat A is not square (has %" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",m,n); |
704 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15937 | if (!inplace) { |
705 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15378 | PetscCall(MatGetType(A,&type)); |
706 |
4/10✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
15378 | PetscCheckTypeName(B,type); |
707 | 15378 | n1 = n; | |
708 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15378 | PetscCall(MatGetSize(B,&m,&n)); |
709 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15378 | PetscCheck(m==n,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_SIZ,"Mat B is not square (has %" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",m,n); |
710 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15378 | PetscCheck(n1==n,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_SIZ,"Matrices A and B must have the same dimension"); |
711 | } | ||
712 | |||
713 | /* evaluate matrix function */ | ||
714 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15937 | PetscCall(PetscLogEventBegin(FN_Evaluate,fn,0,0,0)); |
715 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15937 | PetscCall(FNEvaluateFunctionMat_Private(fn,A,B,PETSC_TRUE)); |
716 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
15937 | PetscCall(PetscLogEventEnd(FN_Evaluate,fn,0,0,0)); |
717 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
3134 | PetscFunctionReturn(PETSC_SUCCESS); |
718 | } | ||
719 | |||
720 | /* | ||
721 | FNEvaluateFunctionMatVec_Default - computes the full matrix f(A) | ||
722 | and then copies the first column. | ||
723 | */ | ||
724 | 2836 | static PetscErrorCode FNEvaluateFunctionMatVec_Default(FN fn,Mat A,Vec v) | |
725 | { | ||
726 | 2836 | Mat F; | |
727 | |||
728 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2836 | PetscFunctionBegin; |
729 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2836 | PetscCall(FN_AllocateWorkMat(fn,A,&F)); |
730 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2836 | PetscCall(FNEvaluateFunctionMat_Basic(fn,A,F)); |
731 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2836 | PetscCall(MatGetColumnVector(F,v,0)); |
732 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2836 | PetscCall(FN_FreeWorkMat(fn,&F)); |
733 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
538 | PetscFunctionReturn(PETSC_SUCCESS); |
734 | } | ||
735 | |||
736 | /* | ||
737 | FNEvaluateFunctionMatVec_Sym_Default - given a symmetric matrix A, | ||
738 | compute the matrix function as f(A)=Q*f(D)*Q' where the spectral | ||
739 | decomposition of A is A=Q*D*Q'. Only the first column is computed. | ||
740 | */ | ||
741 | 238 | static PetscErrorCode FNEvaluateFunctionMatVec_Sym_Default(FN fn,Mat A,Vec v) | |
742 | { | ||
743 | 238 | PetscInt m; | |
744 | 238 | const PetscScalar *As; | |
745 | 238 | PetscScalar *vs; | |
746 | |||
747 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
238 | PetscFunctionBegin; |
748 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
238 | PetscCall(MatDenseGetArrayRead(A,&As)); |
749 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
238 | PetscCall(VecGetArray(v,&vs)); |
750 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
238 | PetscCall(MatGetSize(A,&m,NULL)); |
751 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
238 | PetscCall(FNEvaluateFunctionMat_Sym_Private(fn,As,vs,m,PETSC_TRUE)); |
752 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
238 | PetscCall(MatDenseRestoreArrayRead(A,&As)); |
753 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
238 | PetscCall(VecRestoreArray(v,&vs)); |
754 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
47 | PetscFunctionReturn(PETSC_SUCCESS); |
755 | } | ||
756 | |||
757 | 4431 | PetscErrorCode FNEvaluateFunctionMatVec_Private(FN fn,Mat A,Vec v,PetscBool sync) | |
758 | { | ||
759 | 4431 | PetscBool set,flg,symm=PETSC_FALSE,iscuda,hasspecificmeth; | |
760 | 4431 | PetscInt m,n; | |
761 | 4431 | Mat M; | |
762 | 4431 | PetscMPIInt size,rank,n_; | |
763 | 4431 | PetscScalar *pv; | |
764 | |||
765 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4431 | PetscFunctionBegin; |
766 | /* check symmetry of A */ | ||
767 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4431 | PetscCall(MatIsHermitianKnown(A,&set,&flg)); |
768 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
|
4431 | symm = set? flg: PETSC_FALSE; |
769 | |||
770 | /* evaluate matrix function */ | ||
771 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
4431 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)fn),&size)); |
772 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
4431 | PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)fn),&rank)); |
773 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
|
4431 | if (size==1 || fn->pmode==FN_PARALLEL_REDUNDANT || (fn->pmode==FN_PARALLEL_SYNCHRONIZED && !rank)) { |
774 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4311 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
775 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4311 | PetscCall(PetscObjectTypeCompare((PetscObject)A,MATSEQDENSECUDA,&iscuda)); |
776 |
7/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
|
4311 | hasspecificmeth = ((iscuda && fn->ops->evaluatefunctionmatcuda[fn->method]) || (!iscuda && fn->method && fn->ops->evaluatefunctionmat[fn->method]))? PETSC_TRUE: PETSC_FALSE; |
777 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
4311 | if (!hasspecificmeth && symm && !fn->method) { /* prefer diagonalization */ |
778 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
238 | PetscCall(PetscInfo(fn,"Computing matrix function via diagonalization\n")); |
779 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
238 | PetscCall(FNEvaluateFunctionMatVec_Sym_Default(fn,A,v)); |
780 | } else { | ||
781 | /* scale argument */ | ||
782 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4073 | if (fn->alpha!=(PetscScalar)1.0) { |
783 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2963 | PetscCall(FN_AllocateWorkMat(fn,A,&M)); |
784 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2963 | PetscCall(MatScale(M,fn->alpha)); |
785 | 1110 | } else M = A; | |
786 |
5/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
4073 | if (iscuda && fn->ops->evaluatefunctionmatveccuda[fn->method]) PetscUseTypeMethod(fn,evaluatefunctionmatveccuda[fn->method],M,v); |
787 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
4025 | else if (fn->ops->evaluatefunctionmatvec[fn->method]) PetscUseTypeMethod(fn,evaluatefunctionmatvec[fn->method],M,v); |
788 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2836 | else PetscCall(FNEvaluateFunctionMatVec_Default(fn,M,v)); |
789 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
4073 | if (fn->alpha!=(PetscScalar)1.0) PetscCall(FN_FreeWorkMat(fn,&M)); |
790 | /* scale result */ | ||
791 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4073 | PetscCall(VecScale(v,fn->beta)); |
792 | } | ||
793 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4311 | PetscCall(PetscFPTrapPop()); |
794 | } | ||
795 | |||
796 | /* synchronize */ | ||
797 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
4431 | if (size>1 && fn->pmode==FN_PARALLEL_SYNCHRONIZED && sync) { |
798 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(MatGetSize(A,&m,&n)); |
799 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecGetArray(v,&pv)); |
800 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(PetscMPIIntCast(n,&n_)); |
801 |
15/30✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
360 | PetscCallMPI(MPI_Bcast(pv,n_,MPIU_SCALAR,0,PetscObjectComm((PetscObject)fn))); |
802 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
180 | PetscCall(VecRestoreArray(v,&pv)); |
803 | } | ||
804 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
842 | PetscFunctionReturn(PETSC_SUCCESS); |
805 | } | ||
806 | |||
807 | /*@ | ||
808 | FNEvaluateFunctionMatVec - Computes the first column of the matrix f(A) | ||
809 | for a given matrix A. | ||
810 | |||
811 | Logically Collective | ||
812 | |||
813 | Input Parameters: | ||
814 | + fn - the math function context | ||
815 | - A - matrix on which the function must be evaluated | ||
816 | |||
817 | Output Parameter: | ||
818 | . v - vector to hold the first column of f(A) | ||
819 | |||
820 | Notes: | ||
821 | This operation is similar to FNEvaluateFunctionMat() but returns only | ||
822 | the first column of f(A), hence saving computations in most cases. | ||
823 | |||
824 | Level: advanced | ||
825 | |||
826 | .seealso: FNEvaluateFunction(), FNEvaluateFunctionMat(), FNSetMethod() | ||
827 | @*/ | ||
828 | 3691 | PetscErrorCode FNEvaluateFunctionMatVec(FN fn,Mat A,Vec v) | |
829 | { | ||
830 | 3691 | PetscInt m,n; | |
831 | 3691 | PetscBool iscuda; | |
832 | |||
833 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3691 | PetscFunctionBegin; |
834 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3691 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
835 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3691 | PetscValidHeaderSpecific(A,MAT_CLASSID,2); |
836 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3691 | PetscValidHeaderSpecific(v,VEC_CLASSID,3); |
837 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3691 | PetscValidType(fn,1); |
838 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3691 | PetscValidType(A,2); |
839 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3691 | PetscValidType(v,3); |
840 |
4/10✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
3691 | PetscCheckTypeNames(A,MATSEQDENSE,MATSEQDENSECUDA); //SlepcMatCheckSeq(A); |
841 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3691 | PetscCall(MatGetSize(A,&m,&n)); |
842 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3691 | PetscCheck(m==n,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_SIZ,"Mat A is not square (has %" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",m,n); |
843 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3691 | PetscCall(PetscObjectTypeCompare((PetscObject)A,MATSEQDENSECUDA,&iscuda)); |
844 |
5/14✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
4393 | PetscCheckTypeName(v,iscuda?VECSEQCUDA:VECSEQ); |
845 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3691 | PetscCall(VecGetSize(v,&m)); |
846 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3691 | PetscCheck(m==n,PetscObjectComm((PetscObject)fn),PETSC_ERR_ARG_SIZ,"Matrix A and vector v must have the same size"); |
847 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3691 | PetscCall(PetscLogEventBegin(FN_Evaluate,fn,0,0,0)); |
848 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3691 | PetscCall(FNEvaluateFunctionMatVec_Private(fn,A,v,PETSC_TRUE)); |
849 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3691 | PetscCall(PetscLogEventEnd(FN_Evaluate,fn,0,0,0)); |
850 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
702 | PetscFunctionReturn(PETSC_SUCCESS); |
851 | } | ||
852 | |||
853 | /*@ | ||
854 | FNSetFromOptions - Sets FN options from the options database. | ||
855 | |||
856 | Collective | ||
857 | |||
858 | Input Parameters: | ||
859 | . fn - the math function context | ||
860 | |||
861 | Notes: | ||
862 | To see all options, run your program with the -help option. | ||
863 | |||
864 | Level: beginner | ||
865 | |||
866 | .seealso: FNSetOptionsPrefix() | ||
867 | @*/ | ||
868 | 3626 | PetscErrorCode FNSetFromOptions(FN fn) | |
869 | { | ||
870 | 3626 | char type[256]; | |
871 | 3626 | PetscScalar array[2]; | |
872 | 3626 | PetscInt k,meth; | |
873 | 3626 | PetscBool flg; | |
874 | 3626 | FNParallelType pmode; | |
875 | |||
876 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3626 | PetscFunctionBegin; |
877 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3626 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
878 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3626 | PetscCall(FNRegisterAll()); |
879 |
8/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
|
10878 | PetscObjectOptionsBegin((PetscObject)fn); |
880 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
7208 | PetscCall(PetscOptionsFList("-fn_type","Math function type","FNSetType",FNList,(char*)(((PetscObject)fn)->type_name?((PetscObject)fn)->type_name:FNRATIONAL),type,sizeof(type),&flg)); |
881 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
3626 | if (flg) PetscCall(FNSetType(fn,type)); |
882 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
3576 | else if (!((PetscObject)fn)->type_name) PetscCall(FNSetType(fn,FNRATIONAL)); |
883 | |||
884 | 3626 | k = 2; | |
885 | 3626 | array[0] = 0.0; array[1] = 0.0; | |
886 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3626 | PetscCall(PetscOptionsScalarArray("-fn_scale","Scale factors (one or two scalar values separated with a comma without spaces)","FNSetScale",array,&k,&flg)); |
887 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3626 | if (flg) { |
888 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
423 | if (k<2) array[1] = 1.0; |
889 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
423 | PetscCall(FNSetScale(fn,array[0],array[1])); |
890 | } | ||
891 | |||
892 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3626 | PetscCall(PetscOptionsInt("-fn_method","Method to be used for computing matrix functions","FNSetMethod",fn->method,&meth,&flg)); |
893 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
3626 | if (flg) PetscCall(FNSetMethod(fn,meth)); |
894 | |||
895 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3626 | PetscCall(PetscOptionsEnum("-fn_parallel","Operation mode in parallel runs","FNSetParallel",FNParallelTypes,(PetscEnum)fn->pmode,(PetscEnum*)&pmode,&flg)); |
896 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
3626 | if (flg) PetscCall(FNSetParallel(fn,pmode)); |
897 | |||
898 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
3626 | PetscTryTypeMethod(fn,setfromoptions,PetscOptionsObject); |
899 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3626 | PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)fn,PetscOptionsObject)); |
900 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3626 | PetscOptionsEnd(); |
901 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
3626 | PetscFunctionReturn(PETSC_SUCCESS); |
902 | } | ||
903 | |||
904 | /*@ | ||
905 | FNView - Prints the FN data structure. | ||
906 | |||
907 | Collective | ||
908 | |||
909 | Input Parameters: | ||
910 | + fn - the math function context | ||
911 | - viewer - optional visualization context | ||
912 | |||
913 | Note: | ||
914 | The available visualization contexts include | ||
915 | + PETSC_VIEWER_STDOUT_SELF - standard output (default) | ||
916 | - PETSC_VIEWER_STDOUT_WORLD - synchronized standard | ||
917 | output where only the first processor opens | ||
918 | the file. All other processors send their | ||
919 | data to the first processor to print. | ||
920 | |||
921 | The user can open an alternative visualization context with | ||
922 | PetscViewerASCIIOpen() - output to a specified file. | ||
923 | |||
924 | Level: beginner | ||
925 | |||
926 | .seealso: FNCreate() | ||
927 | @*/ | ||
928 | 992 | PetscErrorCode FNView(FN fn,PetscViewer viewer) | |
929 | { | ||
930 | 992 | PetscBool isascii; | |
931 | 992 | PetscMPIInt size; | |
932 | |||
933 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
992 | PetscFunctionBegin; |
934 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
992 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
935 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
992 | if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)fn),&viewer)); |
936 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
992 | PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); |
937 |
13/32✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
992 | PetscCheckSameComm(fn,1,viewer,2); |
938 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
992 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
939 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
992 | if (isascii) { |
940 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
992 | PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)fn,viewer)); |
941 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
992 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)fn),&size)); |
942 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
992 | if (size>1) PetscCall(PetscViewerASCIIPrintf(viewer," parallel operation mode: %s\n",FNParallelTypes[fn->pmode])); |
943 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
992 | PetscCall(PetscViewerASCIIPushTab(viewer)); |
944 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
992 | PetscTryTypeMethod(fn,view,viewer); |
945 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
992 | PetscCall(PetscViewerASCIIPopTab(viewer)); |
946 | } | ||
947 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
171 | PetscFunctionReturn(PETSC_SUCCESS); |
948 | } | ||
949 | |||
950 | /*@ | ||
951 | FNViewFromOptions - View from options | ||
952 | |||
953 | Collective | ||
954 | |||
955 | Input Parameters: | ||
956 | + fn - the math function context | ||
957 | . obj - optional object | ||
958 | - name - command line option | ||
959 | |||
960 | Level: intermediate | ||
961 | |||
962 | .seealso: FNView(), FNCreate() | ||
963 | @*/ | ||
964 | 2984 | PetscErrorCode FNViewFromOptions(FN fn,PetscObject obj,const char name[]) | |
965 | { | ||
966 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2984 | PetscFunctionBegin; |
967 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
2984 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
968 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2984 | PetscCall(PetscObjectViewFromOptions((PetscObject)fn,obj,name)); |
969 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
579 | PetscFunctionReturn(PETSC_SUCCESS); |
970 | } | ||
971 | |||
972 | /*@ | ||
973 | FNDuplicate - Duplicates a math function, copying all parameters, possibly with a | ||
974 | different communicator. | ||
975 | |||
976 | Collective | ||
977 | |||
978 | Input Parameters: | ||
979 | + fn - the math function context | ||
980 | - comm - MPI communicator | ||
981 | |||
982 | Output Parameter: | ||
983 | . newfn - location to put the new FN context | ||
984 | |||
985 | Note: | ||
986 | In order to use the same MPI communicator as in the original object, | ||
987 | use PetscObjectComm((PetscObject)fn). | ||
988 | |||
989 | Level: developer | ||
990 | |||
991 | .seealso: FNCreate() | ||
992 | @*/ | ||
993 | 464 | PetscErrorCode FNDuplicate(FN fn,MPI_Comm comm,FN *newfn) | |
994 | { | ||
995 | 464 | FNType type; | |
996 | 464 | PetscScalar alpha,beta; | |
997 | 464 | PetscInt meth; | |
998 | 464 | FNParallelType ptype; | |
999 | |||
1000 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
464 | PetscFunctionBegin; |
1001 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
464 | PetscValidHeaderSpecific(fn,FN_CLASSID,1); |
1002 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
464 | PetscValidType(fn,1); |
1003 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
464 | PetscAssertPointer(newfn,3); |
1004 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNCreate(comm,newfn)); |
1005 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNGetType(fn,&type)); |
1006 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNSetType(*newfn,type)); |
1007 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNGetScale(fn,&alpha,&beta)); |
1008 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNSetScale(*newfn,alpha,beta)); |
1009 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNGetMethod(fn,&meth)); |
1010 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNSetMethod(*newfn,meth)); |
1011 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNGetParallel(fn,&ptype)); |
1012 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
464 | PetscCall(FNSetParallel(*newfn,ptype)); |
1013 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
464 | PetscTryTypeMethod(fn,duplicate,comm,newfn); |
1014 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
88 | PetscFunctionReturn(PETSC_SUCCESS); |
1015 | } | ||
1016 | |||
1017 | /*@ | ||
1018 | FNDestroy - Destroys FN context that was created with FNCreate(). | ||
1019 | |||
1020 | Collective | ||
1021 | |||
1022 | Input Parameter: | ||
1023 | . fn - the math function context | ||
1024 | |||
1025 | Level: beginner | ||
1026 | |||
1027 | .seealso: FNCreate() | ||
1028 | @*/ | ||
1029 | 8908 | PetscErrorCode FNDestroy(FN *fn) | |
1030 | { | ||
1031 | 8908 | PetscInt i; | |
1032 | |||
1033 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8908 | PetscFunctionBegin; |
1034 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
8908 | if (!*fn) PetscFunctionReturn(PETSC_SUCCESS); |
1035 |
2/12✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
8511 | PetscValidHeaderSpecific(*fn,FN_CLASSID,1); |
1036 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
8511 | if (--((PetscObject)*fn)->refct > 0) { *fn = NULL; PetscFunctionReturn(PETSC_SUCCESS); } |
1037 |
5/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
4317 | PetscTryTypeMethod(*fn,destroy); |
1038 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
5760 | for (i=0;i<(*fn)->nw;i++) PetscCall(MatDestroy(&(*fn)->W[i])); |
1039 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4317 | PetscCall(PetscHeaderDestroy(fn)); |
1040 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
813 | PetscFunctionReturn(PETSC_SUCCESS); |
1041 | } | ||
1042 | |||
1043 | /*@C | ||
1044 | FNRegister - Adds a mathematical function to the FN package. | ||
1045 | |||
1046 | Not Collective | ||
1047 | |||
1048 | Input Parameters: | ||
1049 | + name - name of a new user-defined FN | ||
1050 | - function - routine to create context | ||
1051 | |||
1052 | Notes: | ||
1053 | FNRegister() may be called multiple times to add several user-defined functions. | ||
1054 | |||
1055 | Level: advanced | ||
1056 | |||
1057 | .seealso: FNRegisterAll() | ||
1058 | @*/ | ||
1059 | 12628 | PetscErrorCode FNRegister(const char *name,PetscErrorCode (*function)(FN)) | |
1060 | { | ||
1061 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
12628 | PetscFunctionBegin; |
1062 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12628 | PetscCall(FNInitializePackage()); |
1063 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12628 | PetscCall(PetscFunctionListAdd(&FNList,name,function)); |
1064 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
2303 | PetscFunctionReturn(PETSC_SUCCESS); |
1065 | } | ||
1066 |