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 | Polygonal region defined by a set of vertices | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/rgimpl.h> /*I "slepcrg.h" I*/ | ||
15 | #include <petscdraw.h> | ||
16 | |||
17 | #define VERTMAX 30 | ||
18 | |||
19 | typedef struct { | ||
20 | PetscInt n; /* number of vertices */ | ||
21 | PetscScalar *vr,*vi; /* array of vertices (vi not used in complex scalars) */ | ||
22 | } RG_POLYGON; | ||
23 | |||
24 | static PetscErrorCode RGComputeBoundingBox_Polygon(RG,PetscReal*,PetscReal*,PetscReal*,PetscReal*); | ||
25 | |||
26 | #if !defined(PETSC_USE_COMPLEX) | ||
27 | 12 | static PetscBool CheckSymmetry(PetscInt n,PetscScalar *vr,PetscScalar *vi) | |
28 | { | ||
29 | 12 | PetscInt i,j,k; | |
30 | /* find change of sign in imaginary part */ | ||
31 | 12 | j = vi[0]!=0.0? 0: 1; | |
32 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
12 | for (k=j+1;k<n;k++) { |
33 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
12 | if (vi[k]!=0.0) { |
34 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
12 | if (vi[k]*vi[j]<0.0) break; |
35 | ✗ | j++; | |
36 | } | ||
37 | } | ||
38 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
12 | if (k==n) return (j==1)? PETSC_TRUE: PETSC_FALSE; |
39 | /* check pairing vertices */ | ||
40 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
48 | for (i=0;i<n/2;i++) { |
41 |
2/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
|
36 | if (vr[k]!=vr[j] || vi[k]!=-vi[j]) return PETSC_FALSE; |
42 | 36 | k = (k+1)%n; | |
43 | 36 | j = (j-1+n)%n; | |
44 | } | ||
45 | return PETSC_TRUE; | ||
46 | } | ||
47 | #endif | ||
48 | |||
49 | 29 | static PetscErrorCode RGPolygonSetVertices_Polygon(RG rg,PetscInt n,PetscScalar *vr,PetscScalar *vi) | |
50 | { | ||
51 | 29 | PetscInt i; | |
52 | 29 | RG_POLYGON *ctx = (RG_POLYGON*)rg->data; | |
53 | |||
54 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
29 | PetscFunctionBegin; |
55 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
29 | PetscCheck(n>2,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"At least 3 vertices required, you provided %" PetscInt_FMT,n); |
56 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
29 | PetscCheck(n<=VERTMAX,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"Too many points, maximum allowed is %d",VERTMAX); |
57 | #if !defined(PETSC_USE_COMPLEX) | ||
58 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
12 | PetscCheck(CheckSymmetry(n,vr,vi),PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_WRONG,"In real scalars the region must be symmetric wrt real axis"); |
59 | #endif | ||
60 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
29 | if (ctx->n) { |
61 | ✗ | PetscCall(PetscFree(ctx->vr)); | |
62 | #if !defined(PETSC_USE_COMPLEX) | ||
63 | ✗ | PetscCall(PetscFree(ctx->vi)); | |
64 | #endif | ||
65 | } | ||
66 | 29 | ctx->n = n; | |
67 |
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.
|
29 | PetscCall(PetscMalloc1(n,&ctx->vr)); |
68 | #if !defined(PETSC_USE_COMPLEX) | ||
69 |
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.
|
12 | PetscCall(PetscMalloc1(n,&ctx->vi)); |
70 | #endif | ||
71 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
223 | for (i=0;i<n;i++) { |
72 | 194 | ctx->vr[i] = vr[i]; | |
73 | #if !defined(PETSC_USE_COMPLEX) | ||
74 | 84 | ctx->vi[i] = vi[i]; | |
75 | #endif | ||
76 | } | ||
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.
|
5 | PetscFunctionReturn(PETSC_SUCCESS); |
78 | } | ||
79 | |||
80 | /*@ | ||
81 | RGPolygonSetVertices - Sets the vertices that define the polygon region. | ||
82 | |||
83 | Logically Collective | ||
84 | |||
85 | Input Parameters: | ||
86 | + rg - the region context | ||
87 | . n - number of vertices | ||
88 | . vr - array of vertices | ||
89 | - vi - array of vertices (imaginary part) | ||
90 | |||
91 | Options Database Keys: | ||
92 | + -rg_polygon_vertices - Sets the vertices | ||
93 | - -rg_polygon_verticesi - Sets the vertices (imaginary part) | ||
94 | |||
95 | Notes: | ||
96 | In the case of complex scalars, only argument vr is used, containing | ||
97 | the complex vertices; the list of vertices can be provided in the | ||
98 | command line with a comma-separated list of complex values | ||
99 | [+/-][realnumber][+/-]realnumberi with no spaces. | ||
100 | |||
101 | When PETSc is built with real scalars, the real and imaginary parts of | ||
102 | the vertices must be provided in two separate arrays (or two lists in | ||
103 | the command line). In this case, the region must be symmetric with | ||
104 | respect to the real axis. | ||
105 | |||
106 | Level: advanced | ||
107 | |||
108 | .seealso: RGPolygonGetVertices() | ||
109 | @*/ | ||
110 | 29 | PetscErrorCode RGPolygonSetVertices(RG rg,PetscInt n,PetscScalar vr[],PetscScalar vi[]) | |
111 | { | ||
112 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
29 | PetscFunctionBegin; |
113 |
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.
|
29 | PetscValidHeaderSpecific(rg,RG_CLASSID,1); |
114 |
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.
|
29 | PetscValidLogicalCollectiveInt(rg,n,2); |
115 |
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.
|
29 | PetscAssertPointer(vr,3); |
116 | #if !defined(PETSC_USE_COMPLEX) | ||
117 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
12 | PetscAssertPointer(vi,4); |
118 | #endif | ||
119 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 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.
|
29 | PetscTryMethod(rg,"RGPolygonSetVertices_C",(RG,PetscInt,PetscScalar*,PetscScalar*),(rg,n,vr,vi)); |
120 |
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.
|
29 | PetscFunctionReturn(PETSC_SUCCESS); |
121 | } | ||
122 | |||
123 | 20 | static PetscErrorCode RGPolygonGetVertices_Polygon(RG rg,PetscInt *n,PetscScalar *vr[],PetscScalar *vi[]) | |
124 | { | ||
125 | 20 | RG_POLYGON *ctx = (RG_POLYGON*)rg->data; | |
126 | 20 | PetscInt i; | |
127 | |||
128 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
129 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
20 | if (n) *n = ctx->n; |
130 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
20 | if (vr) { |
131 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
20 | if (!ctx->n) *vr = NULL; |
132 | else { | ||
133 |
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.
|
20 | PetscCall(PetscMalloc1(ctx->n,vr)); |
134 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
160 | for (i=0;i<ctx->n;i++) (*vr)[i] = ctx->vr[i]; |
135 | } | ||
136 | } | ||
137 | #if !defined(PETSC_USE_COMPLEX) | ||
138 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
10 | if (vi) { |
139 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
10 | if (!ctx->n) *vi = NULL; |
140 | else { | ||
141 |
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.
|
10 | PetscCall(PetscMalloc1(ctx->n,vi)); |
142 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
80 | for (i=0;i<ctx->n;i++) (*vi)[i] = ctx->vi[i]; |
143 | } | ||
144 | } | ||
145 | #endif | ||
146 |
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.
|
4 | PetscFunctionReturn(PETSC_SUCCESS); |
147 | } | ||
148 | |||
149 | /*@C | ||
150 | RGPolygonGetVertices - Gets the vertices that define the polygon region. | ||
151 | |||
152 | Not Collective | ||
153 | |||
154 | Input Parameter: | ||
155 | . rg - the region context | ||
156 | |||
157 | Output Parameters: | ||
158 | + n - number of vertices | ||
159 | . vr - array of vertices | ||
160 | - vi - array of vertices (imaginary part) | ||
161 | |||
162 | Notes: | ||
163 | The values passed by user with RGPolygonSetVertices() are returned (or null | ||
164 | pointers otherwise). | ||
165 | The returned arrays should be freed by the user when no longer needed. | ||
166 | |||
167 | Level: advanced | ||
168 | |||
169 | .seealso: RGPolygonSetVertices() | ||
170 | @*/ | ||
171 | 20 | PetscErrorCode RGPolygonGetVertices(RG rg,PetscInt *n,PetscScalar *vr[],PetscScalar *vi[]) PeNS | |
172 | { | ||
173 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
174 |
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.
|
20 | PetscValidHeaderSpecific(rg,RG_CLASSID,1); |
175 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ 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.
|
20 | PetscUseMethod(rg,"RGPolygonGetVertices_C",(RG,PetscInt*,PetscScalar**,PetscScalar**),(rg,n,vr,vi)); |
176 |
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.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
177 | } | ||
178 | |||
179 | 36 | static PetscErrorCode RGView_Polygon(RG rg,PetscViewer viewer) | |
180 | { | ||
181 | 36 | RG_POLYGON *ctx = (RG_POLYGON*)rg->data; | |
182 | 36 | PetscBool isdraw,isascii; | |
183 | 36 | int winw,winh; | |
184 | 36 | PetscDraw draw; | |
185 | 36 | PetscDrawAxis axis; | |
186 | 36 | PetscReal a,b,c,d,ab,cd,lx,ly,w,x0,y0,x1,y1,scale=1.2; | |
187 | 36 | PetscInt i; | |
188 | 36 | char str[50]; | |
189 | |||
190 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
36 | PetscFunctionBegin; |
191 |
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.
|
36 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw)); |
192 |
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.
|
36 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
193 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
36 | if (isascii) { |
194 |
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.
|
26 | PetscCall(PetscViewerASCIIPrintf(viewer," vertices: ")); |
195 |
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.
|
26 | PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE)); |
196 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
208 | for (i=0;i<ctx->n;i++) { |
197 | #if defined(PETSC_USE_COMPLEX) | ||
198 |
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.
|
98 | PetscCall(SlepcSNPrintfScalar(str,sizeof(str),ctx->vr[i],PETSC_FALSE)); |
199 | #else | ||
200 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ 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.
|
84 | if (ctx->vi[i]!=0.0) PetscCall(PetscSNPrintf(str,sizeof(str),"%g%+gi",(double)ctx->vr[i],(double)ctx->vi[i])); |
201 |
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.
|
12 | else PetscCall(PetscSNPrintf(str,sizeof(str),"%g",(double)ctx->vr[i])); |
202 | #endif | ||
203 |
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.
|
208 | PetscCall(PetscViewerASCIIPrintf(viewer,"%s%s",str,(i<ctx->n-1)?", ":"")); |
204 | } | ||
205 |
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.
|
26 | PetscCall(PetscViewerASCIIPrintf(viewer,"\n")); |
206 |
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.
|
26 | PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE)); |
207 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | } else if (isdraw) { |
208 |
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(PetscViewerDrawGetDraw(viewer,0,&draw)); |
209 |
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(PetscDrawCheckResizedWindow(draw)); |
210 |
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(PetscDrawGetWindowSize(draw,&winw,&winh)); |
211 | 10 | winw = PetscMax(winw,1); winh = PetscMax(winh,1); | |
212 |
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(PetscDrawClear(draw)); |
213 |
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(PetscDrawSetTitle(draw,"Polygonal region")); |
214 |
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(PetscDrawAxisCreate(draw,&axis)); |
215 |
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(RGComputeBoundingBox_Polygon(rg,&a,&b,&c,&d)); |
216 | 10 | a *= rg->sfactor; | |
217 | 10 | b *= rg->sfactor; | |
218 | 10 | c *= rg->sfactor; | |
219 | 10 | d *= rg->sfactor; | |
220 | 10 | lx = b-a; | |
221 | 10 | ly = d-c; | |
222 | 10 | ab = (a+b)/2; | |
223 | 10 | cd = (c+d)/2; | |
224 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | w = scale*PetscMax(lx/winw,ly/winh)/2; |
225 |
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(PetscDrawAxisSetLimits(axis,ab-w*winw,ab+w*winw,cd-w*winh,cd+w*winh)); |
226 |
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(PetscDrawAxisDraw(axis)); |
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.
|
10 | PetscCall(PetscDrawAxisDestroy(&axis)); |
228 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
80 | for (i=0;i<ctx->n;i++) { |
229 | #if defined(PETSC_USE_COMPLEX) | ||
230 | 35 | x0 = PetscRealPart(ctx->vr[i]); y0 = PetscImaginaryPart(ctx->vr[i]); | |
231 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
35 | if (i<ctx->n-1) { |
232 | 30 | x1 = PetscRealPart(ctx->vr[i+1]); y1 = PetscImaginaryPart(ctx->vr[i+1]); | |
233 | } else { | ||
234 | 5 | x1 = PetscRealPart(ctx->vr[0]); y1 = PetscImaginaryPart(ctx->vr[0]); | |
235 | } | ||
236 | #else | ||
237 | 35 | x0 = ctx->vr[i]; y0 = ctx->vi[i]; | |
238 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
35 | if (i<ctx->n-1) { |
239 | 30 | x1 = ctx->vr[i+1]; y1 = ctx->vi[i+1]; | |
240 | } else { | ||
241 | 5 | x1 = ctx->vr[0]; y1 = ctx->vi[0]; | |
242 | } | ||
243 | #endif | ||
244 |
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.
|
70 | PetscCall(PetscDrawLine(draw,x0*rg->sfactor,y0*rg->sfactor,x1*rg->sfactor,y1*rg->sfactor,PETSC_DRAW_MAGENTA)); |
245 | } | ||
246 |
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(PetscDrawFlush(draw)); |
247 |
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(PetscDrawSave(draw)); |
248 |
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(PetscDrawPause(draw)); |
249 | } | ||
250 |
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); |
251 | } | ||
252 | |||
253 | 58 | static PetscErrorCode RGIsTrivial_Polygon(RG rg,PetscBool *trivial) | |
254 | { | ||
255 | 58 | RG_POLYGON *ctx = (RG_POLYGON*)rg->data; | |
256 | |||
257 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
58 | PetscFunctionBegin; |
258 | 58 | *trivial = PetscNot(ctx->n); | |
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.
|
58 | PetscFunctionReturn(PETSC_SUCCESS); |
260 | } | ||
261 | |||
262 | 23 | static PetscErrorCode RGComputeContour_Polygon(RG rg,PetscInt n,PetscScalar *ucr,PetscScalar *uci) | |
263 | { | ||
264 | 23 | RG_POLYGON *ctx = (RG_POLYGON*)rg->data; | |
265 | 23 | PetscReal length,h,d,rem=0.0; | |
266 | 23 | PetscInt k=1,idx=ctx->n-1,i; | |
267 | 23 | PetscBool ini=PETSC_FALSE; | |
268 | 23 | PetscScalar incr,*cr=ucr,*ci=uci; | |
269 | #if !defined(PETSC_USE_COMPLEX) | ||
270 | 10 | PetscScalar inci; | |
271 | #endif | ||
272 | |||
273 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
23 | PetscFunctionBegin; |
274 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
23 | PetscCheck(ctx->n,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_WRONGSTATE,"No vertices have been set yet"); |
275 | 23 | length = SlepcAbsEigenvalue(ctx->vr[0]-ctx->vr[ctx->n-1],ctx->vi[0]-ctx->vi[ctx->n-1]); | |
276 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
162 | for (i=0;i<ctx->n-1;i++) length += SlepcAbsEigenvalue(ctx->vr[i]-ctx->vr[i+1],ctx->vi[i]-ctx->vi[i+1]); |
277 | 23 | h = length/n; | |
278 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
23 | if (!ucr) PetscCall(PetscMalloc1(n,&cr)); |
279 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
23 | if (!uci) PetscCall(PetscMalloc1(n,&ci)); |
280 | 23 | cr[0] = ctx->vr[0]; | |
281 | #if !defined(PETSC_USE_COMPLEX) | ||
282 | 10 | ci[0] = ctx->vi[0]; | |
283 | #endif | ||
284 | 23 | incr = ctx->vr[ctx->n-1]-ctx->vr[0]; | |
285 | #if !defined(PETSC_USE_COMPLEX) | ||
286 | 10 | inci = ctx->vi[ctx->n-1]-ctx->vi[0]; | |
287 | #endif | ||
288 | 23 | d = SlepcAbsEigenvalue(incr,inci); | |
289 | 23 | incr /= d; | |
290 | #if !defined(PETSC_USE_COMPLEX) | ||
291 | 10 | inci /= d; | |
292 | #endif | ||
293 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
629 | while (k<n) { |
294 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
606 | if (ini) { |
295 | 129 | incr = ctx->vr[idx]-ctx->vr[idx+1]; | |
296 | #if !defined(PETSC_USE_COMPLEX) | ||
297 | 60 | inci = ctx->vi[idx]-ctx->vi[idx+1]; | |
298 | #endif | ||
299 | 129 | d = SlepcAbsEigenvalue(incr,inci); | |
300 | 129 | incr /= d; | |
301 | #if !defined(PETSC_USE_COMPLEX) | ||
302 | 60 | inci /= d; | |
303 | #endif | ||
304 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
129 | if (rem+d>h) { |
305 | 129 | cr[k] = ctx->vr[idx+1]+incr*(h-rem); | |
306 | #if !defined(PETSC_USE_COMPLEX) | ||
307 | 60 | ci[k] = ctx->vi[idx+1]+inci*(h-rem); | |
308 | #endif | ||
309 | 129 | k++; | |
310 | 129 | ini = PETSC_FALSE; | |
311 | ✗ | } else {rem += d; idx--;} | |
312 | } else { | ||
313 | #if !defined(PETSC_USE_COMPLEX) | ||
314 | 90 | rem = SlepcAbsEigenvalue(ctx->vr[idx]-cr[k-1],ctx->vi[idx]-ci[k-1]); | |
315 | #else | ||
316 | 387 | rem = PetscAbsScalar(ctx->vr[idx]-cr[k-1]); | |
317 | #endif | ||
318 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
477 | if (rem>h) { |
319 | 348 | cr[k] = cr[k-1]+incr*h; | |
320 | #if !defined(PETSC_USE_COMPLEX) | ||
321 | 30 | ci[k] = ci[k-1]+inci*h; | |
322 | #endif | ||
323 | 348 | k++; | |
324 | 129 | } else {ini = PETSC_TRUE; idx--;} | |
325 | } | ||
326 | } | ||
327 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
23 | if (!ucr) PetscCall(PetscFree(cr)); |
328 |
1/10✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
23 | if (!uci) PetscCall(PetscFree(ci)); |
329 |
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.
|
5 | PetscFunctionReturn(PETSC_SUCCESS); |
330 | } | ||
331 | |||
332 | 30 | static PetscErrorCode RGComputeBoundingBox_Polygon(RG rg,PetscReal *a,PetscReal *b,PetscReal *c,PetscReal *d) | |
333 | { | ||
334 | 30 | RG_POLYGON *ctx = (RG_POLYGON*)rg->data; | |
335 | 30 | PetscInt i; | |
336 | |||
337 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
30 | PetscFunctionBegin; |
338 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
30 | if (a) *a = PETSC_MAX_REAL; |
339 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
30 | if (b) *b = -PETSC_MAX_REAL; |
340 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
30 | if (c) *c = PETSC_MAX_REAL; |
341 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
30 | if (d) *d = -PETSC_MAX_REAL; |
342 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
240 | for (i=0;i<ctx->n;i++) { |
343 | #if defined(PETSC_USE_COMPLEX) | ||
344 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
120 | if (a) *a = PetscMin(*a,PetscRealPart(ctx->vr[i])); |
345 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
120 | if (b) *b = PetscMax(*b,PetscRealPart(ctx->vr[i])); |
346 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
150 | if (c) *c = PetscMin(*c,PetscImaginaryPart(ctx->vr[i])); |
347 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
165 | if (d) *d = PetscMax(*d,PetscImaginaryPart(ctx->vr[i])); |
348 | #else | ||
349 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
135 | if (a) *a = PetscMin(*a,ctx->vr[i]); |
350 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
150 | if (b) *b = PetscMax(*b,ctx->vr[i]); |
351 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
150 | if (c) *c = PetscMin(*c,ctx->vi[i]); |
352 |
3/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
195 | if (d) *d = PetscMax(*d,ctx->vi[i]); |
353 | #endif | ||
354 | } | ||
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.
|
30 | PetscFunctionReturn(PETSC_SUCCESS); |
356 | } | ||
357 | |||
358 | 17858 | static PetscErrorCode RGCheckInside_Polygon(RG rg,PetscReal px,PetscReal py,PetscInt *inout) | |
359 | { | ||
360 | 17858 | RG_POLYGON *ctx = (RG_POLYGON*)rg->data; | |
361 | 17858 | PetscReal val,x[VERTMAX],y[VERTMAX]; | |
362 | 17858 | PetscBool mx,my,nx,ny; | |
363 | 17858 | PetscInt i,j; | |
364 | |||
365 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
17858 | PetscFunctionBegin; |
366 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
89368 | for (i=0;i<ctx->n;i++) { |
367 | #if defined(PETSC_USE_COMPLEX) | ||
368 | 71426 | x[i] = PetscRealPart(ctx->vr[i])-px; | |
369 | 71426 | y[i] = PetscImaginaryPart(ctx->vr[i])-py; | |
370 | #else | ||
371 | 84 | x[i] = ctx->vr[i]-px; | |
372 | 84 | y[i] = ctx->vi[i]-py; | |
373 | #endif | ||
374 | } | ||
375 | 17858 | *inout = -1; | |
376 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
89368 | for (i=0;i<ctx->n;i++) { |
377 | 71510 | j = (i+1)%ctx->n; | |
378 | 71510 | mx = PetscNot(x[i]<0.0); | |
379 | 71510 | nx = PetscNot(x[j]<0.0); | |
380 | 71510 | my = PetscNot(y[i]<0.0); | |
381 | 71510 | ny = PetscNot(y[j]<0.0); | |
382 |
6/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 5 times.
|
71510 | if (!((my||ny) && (mx||nx)) || (mx&&nx)) continue; |
383 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
6817 | if (((my && ny && (mx||nx)) && (!(mx&&nx)))) { |
384 | 5879 | *inout = -*inout; | |
385 | 5879 | continue; | |
386 | } | ||
387 | 938 | val = (y[i]*x[j]-x[i]*y[j])/(x[j]-x[i]); | |
388 |
3/4✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
|
938 | if (PetscAbs(val)<10*PETSC_MACHINE_EPSILON) { |
389 | ✗ | *inout = 0; | |
390 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
391 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
|
938 | } else if (val>0.0) *inout = -*inout; |
392 | } | ||
393 |
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.
|
5948 | PetscFunctionReturn(PETSC_SUCCESS); |
394 | } | ||
395 | |||
396 | 29 | static PetscErrorCode RGSetFromOptions_Polygon(RG rg,PetscOptionItems PetscOptionsObject) | |
397 | { | ||
398 | 29 | PetscScalar array[VERTMAX]; | |
399 | 29 | PetscInt i,k; | |
400 | 29 | PetscBool flg,flgi=PETSC_FALSE; | |
401 | #if !defined(PETSC_USE_COMPLEX) | ||
402 | 12 | PetscScalar arrayi[VERTMAX]; | |
403 | 12 | PetscInt ki; | |
404 | #else | ||
405 | 17 | PetscScalar *arrayi=NULL; | |
406 | #endif | ||
407 | |||
408 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
29 | PetscFunctionBegin; |
409 |
1/12✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
29 | PetscOptionsHeadBegin(PetscOptionsObject,"RG Polygon Options"); |
410 | |||
411 | 29 | k = VERTMAX; | |
412 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
899 | for (i=0;i<k;i++) array[i] = 0; |
413 |
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.
|
29 | PetscCall(PetscOptionsScalarArray("-rg_polygon_vertices","Vertices of polygon","RGPolygonSetVertices",array,&k,&flg)); |
414 | #if !defined(PETSC_USE_COMPLEX) | ||
415 | 12 | ki = VERTMAX; | |
416 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
372 | for (i=0;i<ki;i++) arrayi[i] = 0; |
417 |
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.
|
12 | PetscCall(PetscOptionsScalarArray("-rg_polygon_verticesi","Vertices of polygon (imaginary part)","RGPolygonSetVertices",arrayi,&ki,&flgi)); |
418 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
12 | PetscCheck(ki==k,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_SIZ,"The number of real %" PetscInt_FMT " and imaginary %" PetscInt_FMT " parts do not match",k,ki); |
419 | #endif | ||
420 |
6/10✓ Branch 0 taken 8 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
29 | if (flg || flgi) PetscCall(RGPolygonSetVertices(rg,k,array,arrayi)); |
421 | |||
422 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
29 | PetscOptionsHeadEnd(); |
423 |
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.
|
5 | PetscFunctionReturn(PETSC_SUCCESS); |
424 | } | ||
425 | |||
426 | 29 | static PetscErrorCode RGDestroy_Polygon(RG rg) | |
427 | { | ||
428 | 29 | RG_POLYGON *ctx = (RG_POLYGON*)rg->data; | |
429 | |||
430 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
29 | PetscFunctionBegin; |
431 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
29 | if (ctx->n) { |
432 |
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.
|
29 | PetscCall(PetscFree(ctx->vr)); |
433 | #if !defined(PETSC_USE_COMPLEX) | ||
434 |
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.
|
12 | PetscCall(PetscFree(ctx->vi)); |
435 | #endif | ||
436 | } | ||
437 |
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.
|
29 | PetscCall(PetscFree(rg->data)); |
438 |
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.
|
29 | PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGPolygonSetVertices_C",NULL)); |
439 |
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.
|
29 | PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGPolygonGetVertices_C",NULL)); |
440 |
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.
|
5 | PetscFunctionReturn(PETSC_SUCCESS); |
441 | } | ||
442 | |||
443 | 29 | SLEPC_EXTERN PetscErrorCode RGCreate_Polygon(RG rg) | |
444 | { | ||
445 | 29 | RG_POLYGON *polygon; | |
446 | |||
447 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
29 | PetscFunctionBegin; |
448 |
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.
|
29 | PetscCall(PetscNew(&polygon)); |
449 | 29 | rg->data = (void*)polygon; | |
450 | |||
451 | 29 | rg->ops->istrivial = RGIsTrivial_Polygon; | |
452 | 29 | rg->ops->computecontour = RGComputeContour_Polygon; | |
453 | 29 | rg->ops->computebbox = RGComputeBoundingBox_Polygon; | |
454 | 29 | rg->ops->checkinside = RGCheckInside_Polygon; | |
455 | 29 | rg->ops->setfromoptions = RGSetFromOptions_Polygon; | |
456 | 29 | rg->ops->view = RGView_Polygon; | |
457 | 29 | rg->ops->destroy = RGDestroy_Polygon; | |
458 |
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.
|
29 | PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGPolygonSetVertices_C",RGPolygonSetVertices_Polygon)); |
459 |
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.
|
29 | PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGPolygonGetVertices_C",RGPolygonGetVertices_Polygon)); |
460 |
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.
|
5 | PetscFunctionReturn(PETSC_SUCCESS); |
461 | } | ||
462 |