GCC Code Coverage Report


Directory: ./
File: src/sys/classes/rg/impls/polygon/rgpolygon.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 246 252 97.6%
Functions: 13 13 100.0%
Branches: 408 788 51.8%

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 10 static PetscBool CheckSymmetry(PetscInt n,PetscScalar *vr,PetscScalar *vi)
28 {
29 10 PetscInt i,j,k;
30 /* find change of sign in imaginary part */
31 10 j = vi[0]!=0.0? 0: 1;
32
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
10 for (k=j+1;k<n;k++) {
33
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
10 if (vi[k]!=0.0) {
34
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
10 if (vi[k]*vi[j]<0.0) break;
35 j++;
36 }
37 }
38
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
10 if (k==n) return (j==1)? PETSC_TRUE: PETSC_FALSE;
39 /* check pairing vertices */
40
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
40 for (i=0;i<n/2;i++) {
41
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
30 if (vr[k]!=vr[j] || vi[k]!=-vi[j]) return PETSC_FALSE;
42 30 k = (k+1)%n;
43 30 j = (j-1+n)%n;
44 }
45 return PETSC_TRUE;
46 }
47 #endif
48
49 24 static PetscErrorCode RGPolygonSetVertices_Polygon(RG rg,PetscInt n,PetscScalar *vr,PetscScalar *vi)
50 {
51 24 PetscInt i;
52 24 RG_POLYGON *ctx = (RG_POLYGON*)rg->data;
53
54
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
55
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
24 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 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
24 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 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 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 8 times.
24 if (ctx->n) {
61 PetscCall(PetscFree(ctx->vr));
62 #if !defined(PETSC_USE_COMPLEX)
63 PetscCall(PetscFree(ctx->vi));
64 #endif
65 }
66 24 ctx->n = n;
67
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
24 PetscCall(PetscMalloc1(n,&ctx->vr));
68 #if !defined(PETSC_USE_COMPLEX)
69
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
10 PetscCall(PetscMalloc1(n,&ctx->vi));
70 #endif
71
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
183 for (i=0;i<n;i++) {
72 159 ctx->vr[i] = vr[i];
73 #if !defined(PETSC_USE_COMPLEX)
74 70 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 <vr1,vr2,...> - comma-separated list of vertices
93 - -rg_polygon_verticesi <vi1,vi2,...> - comma-separated list of 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: [](sec:rg), `RGPOLYGON`, `RGPolygonGetVertices()`
109 @*/
110 24 PetscErrorCode RGPolygonSetVertices(RG rg,PetscInt n,PetscScalar vr[],PetscScalar vi[])
111 {
112
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 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.
24 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.
24 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.
24 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.
10 PetscAssertPointer(vi,4);
118 #endif
119
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ 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.
24 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.
24 PetscFunctionReturn(PETSC_SUCCESS);
121 }
122
123 16 static PetscErrorCode RGPolygonGetVertices_Polygon(RG rg,PetscInt *n,PetscScalar *vr[],PetscScalar *vi[])
124 {
125 16 RG_POLYGON *ctx = (RG_POLYGON*)rg->data;
126 16 PetscInt i;
127
128
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16 PetscFunctionBegin;
129
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
16 if (n) *n = ctx->n;
130
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
16 if (vr) {
131
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
16 if (!ctx->n) *vr = NULL;
132 else {
133
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
16 PetscCall(PetscMalloc1(ctx->n,vr));
134
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
128 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 4 times.
✗ Branch 1 not taken.
8 if (vi) {
139
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
8 if (!ctx->n) *vi = NULL;
140 else {
141
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8 PetscCall(PetscMalloc1(ctx->n,vi));
142
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
64 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: [](sec:rg), `RGPOLYGON`, `RGPolygonSetVertices()`
170 @*/
171 16 PetscErrorCode RGPolygonGetVertices(RG rg,PetscInt *n,PetscScalar *vr[],PetscScalar *vi[]) PeNS
172 {
173
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16 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.
16 PetscValidHeaderSpecific(rg,RG_CLASSID,1);
175
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 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.
16 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.
16 PetscFunctionReturn(PETSC_SUCCESS);
177 }
178
179 29 static PetscErrorCode RGView_Polygon(RG rg,PetscViewer viewer)
180 {
181 29 RG_POLYGON *ctx = (RG_POLYGON*)rg->data;
182 29 PetscBool isdraw,isascii;
183 29 int winw,winh;
184 29 PetscDraw draw;
185 29 PetscDrawAxis axis;
186 29 PetscReal a,b,c,d,ab,cd,lx,ly,w,x0,y0,x1,y1,scale=1.2;
187 29 PetscInt i;
188 29 char str[50];
189
190
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
29 PetscFunctionBegin;
191
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
29 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw));
192
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
29 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
193
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
29 if (isascii) {
194
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
21 PetscCall(PetscViewerASCIIPrintf(viewer," vertices: "));
195
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
21 PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE));
196
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
168 for (i=0;i<ctx->n;i++) {
197 #if defined(PETSC_USE_COMPLEX)
198
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
77 PetscCall(SlepcSNPrintfScalar(str,sizeof(str),ctx->vr[i],PETSC_FALSE));
199 #else
200
6/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
70 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 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
10 else PetscCall(PetscSNPrintf(str,sizeof(str),"%g",(double)ctx->vr[i]));
202 #endif
203
7/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
168 PetscCall(PetscViewerASCIIPrintf(viewer,"%s%s",str,(i<ctx->n-1)?", ":""));
204 }
205
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
21 PetscCall(PetscViewerASCIIPrintf(viewer,"\n"));
206
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
21 PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE));
207
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 } else if (isdraw) {
208
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscViewerDrawGetDraw(viewer,0,&draw));
209
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawCheckResizedWindow(draw));
210
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawGetWindowSize(draw,&winw,&winh));
211 8 winw = PetscMax(winw,1); winh = PetscMax(winh,1);
212
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawClear(draw));
213
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawSetTitle(draw,"Polygonal region"));
214
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawAxisCreate(draw,&axis));
215
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(RGComputeBoundingBox_Polygon(rg,&a,&b,&c,&d));
216 8 a *= rg->sfactor;
217 8 b *= rg->sfactor;
218 8 c *= rg->sfactor;
219 8 d *= rg->sfactor;
220 8 lx = b-a;
221 8 ly = d-c;
222 8 ab = (a+b)/2;
223 8 cd = (c+d)/2;
224
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 w = scale*PetscMax(lx/winw,ly/winh)/2;
225
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawAxisDraw(axis));
227
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawAxisDestroy(&axis));
228
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
64 for (i=0;i<ctx->n;i++) {
229 #if defined(PETSC_USE_COMPLEX)
230 28 x0 = PetscRealPart(ctx->vr[i]); y0 = PetscImaginaryPart(ctx->vr[i]);
231
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
28 if (i<ctx->n-1) {
232 24 x1 = PetscRealPart(ctx->vr[i+1]); y1 = PetscImaginaryPart(ctx->vr[i+1]);
233 } else {
234 4 x1 = PetscRealPart(ctx->vr[0]); y1 = PetscImaginaryPart(ctx->vr[0]);
235 }
236 #else
237 28 x0 = ctx->vr[i]; y0 = ctx->vi[i];
238
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
28 if (i<ctx->n-1) {
239 24 x1 = ctx->vr[i+1]; y1 = ctx->vi[i+1];
240 } else {
241 4 x1 = ctx->vr[0]; y1 = ctx->vi[0];
242 }
243 #endif
244
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
56 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawFlush(draw));
247
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscDrawSave(draw));
248
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 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 50 static PetscErrorCode RGIsTrivial_Polygon(RG rg,PetscBool *trivial)
254 {
255 50 RG_POLYGON *ctx = (RG_POLYGON*)rg->data;
256
257
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50 PetscFunctionBegin;
258 50 *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.
50 PetscFunctionReturn(PETSC_SUCCESS);
260 }
261
262 19 static PetscErrorCode RGComputeContour_Polygon(RG rg,PetscInt n,PetscScalar *ucr,PetscScalar *uci)
263 {
264 19 RG_POLYGON *ctx = (RG_POLYGON*)rg->data;
265 19 PetscReal length,h,d,rem=0.0;
266 19 PetscInt k=1,idx=ctx->n-1,i;
267 19 PetscBool ini=PETSC_FALSE;
268 19 PetscScalar incr,*cr=ucr,*ci=uci;
269 #if !defined(PETSC_USE_COMPLEX)
270 8 PetscScalar inci;
271 #endif
272
273
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
19 PetscFunctionBegin;
274
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
19 PetscCheck(ctx->n,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_WRONGSTATE,"No vertices have been set yet");
275 19 length = SlepcAbsEigenvalue(ctx->vr[0]-ctx->vr[ctx->n-1],ctx->vi[0]-ctx->vi[ctx->n-1]);
276
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
132 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 19 h = length/n;
278
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
19 if (!ucr) PetscCall(PetscMalloc1(n,&cr));
279
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
19 if (!uci) PetscCall(PetscMalloc1(n,&ci));
280 19 cr[0] = ctx->vr[0];
281 #if !defined(PETSC_USE_COMPLEX)
282 8 ci[0] = ctx->vi[0];
283 #endif
284 19 incr = ctx->vr[ctx->n-1]-ctx->vr[0];
285 #if !defined(PETSC_USE_COMPLEX)
286 8 inci = ctx->vi[ctx->n-1]-ctx->vi[0];
287 #endif
288 19 d = SlepcAbsEigenvalue(incr,inci);
289 19 incr /= d;
290 #if !defined(PETSC_USE_COMPLEX)
291 8 inci /= d;
292 #endif
293
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
565 while (k<n) {
294
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
546 if (ini) {
295 105 incr = ctx->vr[idx]-ctx->vr[idx+1];
296 #if !defined(PETSC_USE_COMPLEX)
297 48 inci = ctx->vi[idx]-ctx->vi[idx+1];
298 #endif
299 105 d = SlepcAbsEigenvalue(incr,inci);
300 105 incr /= d;
301 #if !defined(PETSC_USE_COMPLEX)
302 48 inci /= d;
303 #endif
304
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
105 if (rem+d>h) {
305 105 cr[k] = ctx->vr[idx+1]+incr*(h-rem);
306 #if !defined(PETSC_USE_COMPLEX)
307 48 ci[k] = ctx->vi[idx+1]+inci*(h-rem);
308 #endif
309 105 k++;
310 105 ini = PETSC_FALSE;
311 } else {rem += d; idx--;}
312 } else {
313 #if !defined(PETSC_USE_COMPLEX)
314 72 rem = SlepcAbsEigenvalue(ctx->vr[idx]-cr[k-1],ctx->vi[idx]-ci[k-1]);
315 #else
316 369 rem = PetscAbsScalar(ctx->vr[idx]-cr[k-1]);
317 #endif
318
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
441 if (rem>h) {
319 336 cr[k] = cr[k-1]+incr*h;
320 #if !defined(PETSC_USE_COMPLEX)
321 24 ci[k] = ci[k-1]+inci*h;
322 #endif
323 336 k++;
324 105 } else {ini = PETSC_TRUE; idx--;}
325 }
326 }
327
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
19 if (!ucr) PetscCall(PetscFree(cr));
328
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
19 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 24 static PetscErrorCode RGComputeBoundingBox_Polygon(RG rg,PetscReal *a,PetscReal *b,PetscReal *c,PetscReal *d)
333 {
334 24 RG_POLYGON *ctx = (RG_POLYGON*)rg->data;
335 24 PetscInt i;
336
337
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
338
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
24 if (a) *a = PETSC_MAX_REAL;
339
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
24 if (b) *b = -PETSC_MAX_REAL;
340
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
24 if (c) *c = PETSC_MAX_REAL;
341
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
24 if (d) *d = -PETSC_MAX_REAL;
342
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
192 for (i=0;i<ctx->n;i++) {
343 #if defined(PETSC_USE_COMPLEX)
344
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
96 if (a) *a = PetscMin(*a,PetscRealPart(ctx->vr[i]));
345
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
96 if (b) *b = PetscMax(*b,PetscRealPart(ctx->vr[i]));
346
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
120 if (c) *c = PetscMin(*c,PetscImaginaryPart(ctx->vr[i]));
347
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
132 if (d) *d = PetscMax(*d,PetscImaginaryPart(ctx->vr[i]));
348 #else
349
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
108 if (a) *a = PetscMin(*a,ctx->vr[i]);
350
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
120 if (b) *b = PetscMax(*b,ctx->vr[i]);
351
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
120 if (c) *c = PetscMin(*c,ctx->vi[i]);
352
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
156 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.
24 PetscFunctionReturn(PETSC_SUCCESS);
356 }
357
358 17853 static PetscErrorCode RGCheckInside_Polygon(RG rg,PetscReal px,PetscReal py,PetscInt *inout)
359 {
360 17853 RG_POLYGON *ctx = (RG_POLYGON*)rg->data;
361 17853 PetscReal val,x[VERTMAX],y[VERTMAX];
362 17853 PetscBool mx,my,nx,ny;
363 17853 PetscInt i,j;
364
365
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
17853 PetscFunctionBegin;
366
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
89328 for (i=0;i<ctx->n;i++) {
367 #if defined(PETSC_USE_COMPLEX)
368 71405 x[i] = PetscRealPart(ctx->vr[i])-px;
369 71405 y[i] = PetscImaginaryPart(ctx->vr[i])-py;
370 #else
371 70 x[i] = ctx->vr[i]-px;
372 70 y[i] = ctx->vi[i]-py;
373 #endif
374 }
375 17853 *inout = -1;
376
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
89328 for (i=0;i<ctx->n;i++) {
377 71475 j = (i+1)%ctx->n;
378 71475 mx = PetscNot(x[i]<0.0);
379 71475 nx = PetscNot(x[j]<0.0);
380 71475 my = PetscNot(y[i]<0.0);
381 71475 ny = PetscNot(y[j]<0.0);
382
6/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 4 times.
71475 if (!((my||ny) && (mx||nx)) || (mx&&nx)) continue;
383
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
6811 if (((my && ny && (mx||nx)) && (!(mx&&nx)))) {
384 5876 *inout = -*inout;
385 5876 continue;
386 }
387 935 val = (y[i]*x[j]-x[i]*y[j])/(x[j]-x[i]);
388
3/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
935 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 4 times.
935 } 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 24 static PetscErrorCode RGSetFromOptions_Polygon(RG rg,PetscOptionItems PetscOptionsObject)
397 {
398 24 PetscScalar array[VERTMAX];
399 24 PetscInt i,k;
400 24 PetscBool flg,flgi=PETSC_FALSE;
401 #if !defined(PETSC_USE_COMPLEX)
402 10 PetscScalar arrayi[VERTMAX];
403 10 PetscInt ki;
404 #else
405 14 PetscScalar *arrayi=NULL;
406 #endif
407
408
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
409
1/12
✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
24 PetscOptionsHeadBegin(PetscOptionsObject,"RG Polygon Options");
410
411 24 k = VERTMAX;
412
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
744 for (i=0;i<k;i++) array[i] = 0;
413
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
24 PetscCall(PetscOptionsScalarArray("-rg_polygon_vertices","Vertices of polygon","RGPolygonSetVertices",array,&k,&flg));
414 #if !defined(PETSC_USE_COMPLEX)
415 10 ki = VERTMAX;
416
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
310 for (i=0;i<ki;i++) arrayi[i] = 0;
417
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
10 PetscCall(PetscOptionsScalarArray("-rg_polygon_verticesi","Vertices of polygon (imaginary part)","RGPolygonSetVertices",arrayi,&ki,&flgi));
418
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 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 7 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 6 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.
24 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.
24 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 24 static PetscErrorCode RGDestroy_Polygon(RG rg)
427 {
428 24 RG_POLYGON *ctx = (RG_POLYGON*)rg->data;
429
430
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
431
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
24 if (ctx->n) {
432
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
24 PetscCall(PetscFree(ctx->vr));
433 #if !defined(PETSC_USE_COMPLEX)
434
5/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
10 PetscCall(PetscFree(ctx->vi));
435 #endif
436 }
437
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
24 PetscCall(PetscFree(rg->data));
438
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
24 PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGPolygonSetVertices_C",NULL));
439
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
24 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 /*MC
444 RGPOLYGON - RGPOLYGON = "polygon" - A polygonal region defined by its
445 vertices, given via `RGPolygonSetVertices()`.
446
447 Note:
448 The following figure shows an example of a polygonal region.
449
450 ![Polygonal region](../../_static/images/manual/svg/fig-rg-polygon.svg)
451
452 Level: beginner
453
454 .seealso: [](sec:rg), `RG`, `RGType`, `RGSetType()`, `RGPolygonSetVertices()`
455 M*/
456
457 24 SLEPC_EXTERN PetscErrorCode RGCreate_Polygon(RG rg)
458 {
459 24 RG_POLYGON *polygon;
460
461
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
462
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
24 PetscCall(PetscNew(&polygon));
463 24 rg->data = (void*)polygon;
464
465 24 rg->ops->istrivial = RGIsTrivial_Polygon;
466 24 rg->ops->computecontour = RGComputeContour_Polygon;
467 24 rg->ops->computebbox = RGComputeBoundingBox_Polygon;
468 24 rg->ops->checkinside = RGCheckInside_Polygon;
469 24 rg->ops->setfromoptions = RGSetFromOptions_Polygon;
470 24 rg->ops->view = RGView_Polygon;
471 24 rg->ops->destroy = RGDestroy_Polygon;
472
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
24 PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGPolygonSetVertices_C",RGPolygonSetVertices_Polygon));
473
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
24 PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGPolygonGetVertices_C",RGPolygonGetVertices_Polygon));
474
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);
475 }
476