GCC Code Coverage Report


Directory: ./
File: src/sys/classes/rg/impls/ring/rgring.c
Date: 2025-12-10 04:20:18
Exec Total Coverage
Lines: 247 253 97.6%
Functions: 14 14 100.0%
Branches: 550 1074 51.2%

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 Ring region, similar to the ellipse but with a start and end angle,
12 together with the width
13 */
14
15 #include <slepc/private/rgimpl.h> /*I "slepcrg.h" I*/
16 #include <petscdraw.h>
17
18 typedef struct {
19 PetscScalar center; /* center of the ellipse */
20 PetscReal radius; /* radius of the ellipse */
21 PetscReal vscale; /* vertical scale of the ellipse */
22 PetscReal start_ang; /* start angle */
23 PetscReal end_ang; /* end angle */
24 PetscReal width; /* ring width */
25 } RG_RING;
26
27 146 static PetscErrorCode RGRingSetParameters_Ring(RG rg,PetscScalar center,PetscReal radius,PetscReal vscale,PetscReal start_ang,PetscReal end_ang,PetscReal width)
28 {
29 146 RG_RING *ctx = (RG_RING*)rg->data;
30
31
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
146 PetscFunctionBegin;
32 146 ctx->center = center;
33
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
146 if (radius == (PetscReal)PETSC_DETERMINE) {
34 50 ctx->radius = 1.0;
35
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
96 } else if (radius != (PetscReal)PETSC_CURRENT) {
36
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
96 PetscCheck(radius>0.0,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"The radius argument must be > 0.0");
37 96 ctx->radius = radius;
38 }
39
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
146 if (vscale == (PetscReal)PETSC_DETERMINE) {
40 ctx->vscale = 1.0;
41
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
146 } else if (vscale != (PetscReal)PETSC_CURRENT) {
42
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 PetscCheck(vscale>0.0,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"The vscale argument must be > 0.0");
43 146 ctx->vscale = vscale;
44 }
45
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
146 if (start_ang == (PetscReal)PETSC_DETERMINE) {
46 ctx->start_ang = 0.0;
47
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
146 } else if (start_ang != (PetscReal)PETSC_CURRENT) {
48
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 PetscCheck(start_ang>=0.0,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"The right-hand side angle argument must be >= 0.0");
49
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 PetscCheck(start_ang<=1.0,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"The right-hand side angle argument must be <= 1.0");
50 146 ctx->start_ang = start_ang;
51 }
52
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
146 if (end_ang == (PetscReal)PETSC_DETERMINE) {
53 ctx->end_ang = 1.0;
54
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
146 } else if (end_ang != (PetscReal)PETSC_CURRENT) {
55
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 PetscCheck(end_ang>=0.0,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"The left-hand side angle argument must be >= 0.0");
56
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 PetscCheck(end_ang<=1.0,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"The left-hand side angle argument must be <= 1.0");
57 146 ctx->end_ang = end_ang;
58 }
59 #if !defined(PETSC_USE_COMPLEX)
60
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
55 PetscCheck(ctx->start_ang+ctx->end_ang==1.0,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_WRONG,"In real scalars the region must be symmetric wrt real axis");
61 #endif
62
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
146 if (width == (PetscReal)PETSC_DETERMINE) {
63 ctx->width = 0.1;
64
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
146 } else if (width != (PetscReal)PETSC_CURRENT) {
65
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 PetscCheck(width>0.0,PetscObjectComm((PetscObject)rg),PETSC_ERR_ARG_OUTOFRANGE,"The width argument must be > 0.0");
66 146 ctx->width = width;
67 }
68
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);
69 }
70
71 /*@
72 RGRingSetParameters - Sets the parameters defining the ring region.
73
74 Logically Collective
75
76 Input Parameters:
77 + rg - the region context
78 . center - center of the ellipse
79 . radius - radius of the ellipse
80 . vscale - vertical scale of the ellipse
81 . start_ang - the right-hand side angle
82 . end_ang - the left-hand side angle
83 - width - width of the ring
84
85 Options Database Keys:
86 + -rg_ring_center \<center\> - sets the center
87 . -rg_ring_radius \<radius\> - sets the radius
88 . -rg_ring_vscale \<vscale\> - sets the vertical scale
89 . -rg_ring_startangle \<start_ang\> - sets the right-hand side angle
90 . -rg_ring_endangle \<end_ang\> - sets the left-hand side angle
91 - -rg_ring_width \<width\> - sets the width of the ring
92
93 Notes:
94 The values of `center`, `radius` and `vscale` have the same meaning as in the
95 ellipse region. The `startangle` and `endangle` define the span of the ring
96 (by default it is the whole ring), while the `width` is the separation
97 between the two concentric ellipses (above and below the radius by
98 `width/2`).
99
100 The start and end angles are expressed as a fraction of the circumference.
101 The allowed range is $[0,\dots,1]$, with `0` corresponding to 0 radians, `0.25` to
102 $\pi/2$ radians, and so on. It is allowed to have `startangle`>`endangle`, in
103 which case the ring region crosses over the zero angle.
104
105 In the case of complex scalars, a complex center can be provided in the
106 command line with `[+/-][realnumber][+/-]realnumberi` with no spaces, e.g.,
107 `-rg_ring_center 1.0+2.0i`.
108
109 When PETSc is built with real scalars, the center is restricted to a real value,
110 and the start and end angles must be such that the region is symmetric with
111 respect to the real axis.
112
113 For all arguments except `center`, you can use `PETSC_CURRENT` to keep the current
114 value, and `PETSC_DETERMINE` to set them to a default value (1 for `radius`, `vscale`,
115 `end_ang`, 0 for `start_and`, and 0.1 for `width`).
116
117 Level: advanced
118
119 .seealso: [](sec:rg), `RGRING`, `RGRingGetParameters()`, `RGELLIPSE`
120 @*/
121 146 PetscErrorCode RGRingSetParameters(RG rg,PetscScalar center,PetscReal radius,PetscReal vscale,PetscReal start_ang,PetscReal end_ang,PetscReal width)
122 {
123
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
146 PetscFunctionBegin;
124
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.
146 PetscValidHeaderSpecific(rg,RG_CLASSID,1);
125
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.
146 PetscValidLogicalCollectiveScalar(rg,center,2);
126
29/66
✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
146 PetscValidLogicalCollectiveReal(rg,radius,3);
127
29/66
✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
146 PetscValidLogicalCollectiveReal(rg,vscale,4);
128
29/66
✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
146 PetscValidLogicalCollectiveReal(rg,start_ang,5);
129
29/66
✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
146 PetscValidLogicalCollectiveReal(rg,end_ang,6);
130
29/66
✗ 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 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
146 PetscValidLogicalCollectiveReal(rg,width,7);
131
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.
146 PetscTryMethod(rg,"RGRingSetParameters_C",(RG,PetscScalar,PetscReal,PetscReal,PetscReal,PetscReal,PetscReal),(rg,center,radius,vscale,start_ang,end_ang,width));
132
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.
146 PetscFunctionReturn(PETSC_SUCCESS);
133 }
134
135 176 static PetscErrorCode RGRingGetParameters_Ring(RG rg,PetscScalar *center,PetscReal *radius,PetscReal *vscale,PetscReal *start_ang,PetscReal *end_ang,PetscReal *width)
136 {
137 176 RG_RING *ctx = (RG_RING*)rg->data;
138
139
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
176 PetscFunctionBegin;
140
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
176 if (center) *center = ctx->center;
141
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
176 if (radius) *radius = ctx->radius;
142
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
176 if (vscale) *vscale = ctx->vscale;
143
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
176 if (start_ang) *start_ang = ctx->start_ang;
144
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
176 if (end_ang) *end_ang = ctx->end_ang;
145
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
176 if (width) *width = ctx->width;
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.
176 PetscFunctionReturn(PETSC_SUCCESS);
147 }
148
149 /*@
150 RGRingGetParameters - Gets the parameters that define the ring region.
151
152 Not Collective
153
154 Input Parameter:
155 . rg - the region context
156
157 Output Parameters:
158 + center - center of the region
159 . radius - radius of the region
160 . vscale - vertical scale of the region
161 . start_ang - the right-hand side angle
162 . end_ang - the left-hand side angle
163 - width - width of the ring
164
165 Level: advanced
166
167 .seealso: [](sec:rg), `RGRING`, `RGRingSetParameters()`
168 @*/
169 176 PetscErrorCode RGRingGetParameters(RG rg,PetscScalar *center,PetscReal *radius,PetscReal *vscale,PetscReal *start_ang,PetscReal *end_ang,PetscReal *width)
170 {
171
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
176 PetscFunctionBegin;
172
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.
176 PetscValidHeaderSpecific(rg,RG_CLASSID,1);
173
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.
176 PetscUseMethod(rg,"RGRingGetParameters_C",(RG,PetscScalar*,PetscReal*,PetscReal*,PetscReal*,PetscReal*,PetscReal*),(rg,center,radius,vscale,start_ang,end_ang,width));
174
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.
176 PetscFunctionReturn(PETSC_SUCCESS);
175 }
176
177 60 static PetscErrorCode RGView_Ring(RG rg,PetscViewer viewer)
178 {
179 60 RG_RING *ctx = (RG_RING*)rg->data;
180 60 int winw,winh;
181 60 PetscBool isdraw,isascii;
182 60 PetscDraw draw;
183 60 PetscDrawAxis axis;
184 60 PetscReal cx,cy,radius,width,ab,cd,lx,ly,w,end_ang,x1,y1,x2,y2,r,theta,scale=1.2;
185 60 char str[50];
186
187
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBegin;
188
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.
60 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw));
189
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.
60 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
190
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60 if (isascii) {
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.
50 PetscCall(SlepcSNPrintfScalar(str,sizeof(str),ctx->center,PETSC_FALSE));
192
7/10
✓ 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 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
50 PetscCall(PetscViewerASCIIPrintf(viewer," center: %s, radius: %g, vscale: %g, start angle: %g, end angle: %g, ring width: %g\n",str,RGShowReal(ctx->radius),RGShowReal(ctx->vscale),(double)ctx->start_ang,(double)ctx->end_ang,(double)ctx->width));
193
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 } else if (isdraw) {
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.
10 PetscCall(PetscViewerDrawGetDraw(viewer,0,&draw));
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.
10 PetscCall(PetscDrawCheckResizedWindow(draw));
196
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));
197 10 winw = PetscMax(winw,1); winh = PetscMax(winh,1);
198
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));
199
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,"Ring region"));
200
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));
201 10 cx = PetscRealPart(ctx->center)*rg->sfactor;
202 10 cy = PetscImaginaryPart(ctx->center)*rg->sfactor;
203 10 radius = ctx->radius*rg->sfactor;
204 10 width = ctx->width*rg->sfactor;
205 10 lx = 2*(radius+width);
206 10 ly = 2*(radius+width)*ctx->vscale;
207 10 ab = cx;
208 10 cd = cy;
209
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 w = scale*PetscMax(lx/winw,ly/winh)/2;
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(PetscDrawAxisSetLimits(axis,ab-w*winw,ab+w*winw,cd-w*winh,cd+w*winh));
211
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));
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(PetscDrawAxisDestroy(&axis));
213 /* draw outer ellipse */
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(PetscDrawEllipse(draw,cx,cy,2*(radius+width),2*(radius+width)*ctx->vscale,PETSC_DRAW_ORANGE));
215 /* remove inner part */
216
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(PetscDrawEllipse(draw,cx,cy,2*(radius-width),2*(radius-width)*ctx->vscale,PETSC_DRAW_WHITE));
217
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (ctx->start_ang!=ctx->end_ang) {
218 /* remove section from end_ang to start_ang */
219
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 end_ang = (ctx->start_ang<ctx->end_ang)? ctx->end_ang-1: ctx->end_ang;
220 10 theta = end_ang;
221 10 r = scale*(radius+width);
222
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (ctx->vscale>1) r *= ctx->vscale;
223
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
20 x1 = PetscMin(PetscMax(ab+r*PetscCosReal(2.0*PETSC_PI*theta),ab-w*winw),ab+w*winw);
224
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
20 y1 = PetscMin(PetscMax(cd+r*PetscSinReal(2.0*PETSC_PI*theta),cd-w*winh),cd+w*winh);
225 40 do {
226
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
40 theta = PetscMin(PetscFloorReal(8*theta+1)/8,ctx->start_ang);
227
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
80 x2 = PetscMin(PetscMax(ab+r*PetscCosReal(2.0*PETSC_PI*theta),ab-w*winw),ab+w*winw);
228
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
80 y2 = PetscMin(PetscMax(cd+r*PetscSinReal(2.0*PETSC_PI*theta),cd-w*winh),cd+w*winh);
229
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.
40 PetscCall(PetscDrawTriangle(draw,cx,cy,x1,y1,x2,y2,PETSC_DRAW_WHITE,PETSC_DRAW_WHITE,PETSC_DRAW_WHITE));
230 40 x1 = x2; y1 = y2;
231
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
40 } while (theta<ctx->start_ang);
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.
10 PetscCall(PetscDrawFlush(draw));
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.
10 PetscCall(PetscDrawSave(draw));
235
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));
236 }
237
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.
12 PetscFunctionReturn(PETSC_SUCCESS);
238 }
239
240 113 static PetscErrorCode RGIsTrivial_Ring(RG rg,PetscBool *trivial)
241 {
242 113 RG_RING *ctx = (RG_RING*)rg->data;
243
244
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
113 PetscFunctionBegin;
245
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
113 if (rg->complement) *trivial = PetscNot(ctx->radius);
246 113 else *trivial = PetscNot(ctx->radius<PETSC_MAX_REAL);
247
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.
113 PetscFunctionReturn(PETSC_SUCCESS);
248 }
249
250 63 static PetscErrorCode RGComputeContour_Ring(RG rg,PetscInt n,PetscScalar *cr,PetscScalar *ci)
251 {
252 63 RG_RING *ctx = (RG_RING*)rg->data;
253 63 PetscReal theta,start_ang;
254 63 PetscInt i,n2=n/2;
255
256
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
63 PetscFunctionBegin;
257
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
63 start_ang = (ctx->start_ang>ctx->end_ang)? ctx->start_ang-1: ctx->start_ang;
258
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1029 for (i=0;i<n;i++) {
259
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
966 if (i < n2) {
260 458 theta = ((ctx->end_ang-start_ang)*i/n2 + start_ang)*2.0*PETSC_PI;
261 #if defined(PETSC_USE_COMPLEX)
262 333 cr[i] = ctx->center + (ctx->radius+ctx->width/2.0)*PetscCMPLX(PetscCosReal(theta),ctx->vscale*PetscSinReal(theta));
263 #else
264
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
125 if (cr) cr[i] = ctx->center + (ctx->radius+ctx->width/2.0)*PetscCosReal(theta);
265
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
125 if (ci) ci[i] = (ctx->radius+ctx->width/2.0)*ctx->vscale*PetscSinReal(theta);
266 #endif
267 } else {
268 508 theta = ((ctx->end_ang-start_ang)*(n-i)/n2 + start_ang)*2.0*PETSC_PI;
269 #if defined(PETSC_USE_COMPLEX)
270 358 cr[i] = ctx->center + (ctx->radius-ctx->width/2.0)*PetscCMPLX(PetscCosReal(theta),ctx->vscale*PetscSinReal(theta));
271 #else
272
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
150 if (cr) cr[i] = ctx->center + (ctx->radius-ctx->width/2.0)*PetscCosReal(theta);
273
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
150 if (ci) ci[i] = (ctx->radius-ctx->width/2.0)*ctx->vscale*PetscSinReal(theta);
274 #endif
275 }
276 }
277
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.
63 PetscFunctionReturn(PETSC_SUCCESS);
278 }
279
280 50 static PetscErrorCode RGComputeBoundingBox_Ring(RG rg,PetscReal *a,PetscReal *b,PetscReal *c,PetscReal *d)
281 {
282 50 RG_RING *ctx = (RG_RING*)rg->data;
283
284
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50 PetscFunctionBegin;
285 /* current implementation does not return a tight bounding box */
286
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
50 if (a) *a = PetscRealPart(ctx->center) - (ctx->radius+ctx->width/2.0);
287
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
50 if (b) *b = PetscRealPart(ctx->center) + (ctx->radius+ctx->width/2.0);
288
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
50 if (c) *c = PetscImaginaryPart(ctx->center) - (ctx->radius+ctx->width/2.0)*ctx->vscale;
289
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
50 if (d) *d = PetscImaginaryPart(ctx->center) + (ctx->radius+ctx->width/2.0)*ctx->vscale;
290
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);
291 }
292
293 13 static PetscErrorCode RGComputeQuadrature_Ring(RG rg,RGQuadRule quad,PetscInt n,PetscScalar *z,PetscScalar *zn,PetscScalar *w)
294 {
295 13 RG_RING *ctx = (RG_RING*)rg->data;
296 13 PetscReal max_w=0.0;
297 13 PetscScalar tmp,tmp2;
298 13 PetscInt i,j;
299
300
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
13 PetscFunctionBegin;
301
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
13 if (quad == RG_QUADRULE_CHEBYSHEV) {
302 #if defined(PETSC_USE_COMPLEX)
303 PetscReal theta;
304
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
99 for (i=0;i<n;i++) {
305 96 theta = PETSC_PI*(i+0.5)/n;
306 96 zn[i] = PetscCosReal(theta);
307 96 w[i] = PetscCosReal((n-1)*theta)/n;
308 96 theta = (ctx->start_ang*2.0+(ctx->end_ang-ctx->start_ang)*(PetscRealPart(zn[i])+1.0))*PETSC_PI;
309 96 z[i] = rg->sfactor*(ctx->center + ctx->radius*PetscCMPLX(PetscCosReal(theta),ctx->vscale*PetscSinReal(theta)));
310 }
311 #else
312 SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Integration points on a vertical line require complex arithmetic");
313 #endif
314 } else { /* RG_QUADRULE_TRAPEZOIDAL */
315
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
330 for (i=0;i<n;i++) {
316 320 zn[i] = (z[i]-rg->sfactor*ctx->center)/(rg->sfactor*ctx->radius);
317 320 tmp = 1.0; tmp2 = 1.0;
318
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10560 for (j=0;j<n;j++) {
319 10240 tmp *= z[j];
320
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10240 if (i != j) tmp2 *= z[j]-z[i];
321 }
322 320 w[i] = tmp/tmp2;
323
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
430 max_w = PetscMax(PetscAbsScalar(w[i]),max_w);
324 }
325
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
330 for (i=0;i<n;i++) w[i] /= (PetscScalar)max_w;
326 }
327
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
13 PetscFunctionReturn(PETSC_SUCCESS);
328 }
329
330 327 static PetscErrorCode RGCheckInside_Ring(RG rg,PetscReal px,PetscReal py,PetscInt *inside)
331 {
332 327 RG_RING *ctx = (RG_RING*)rg->data;
333 327 PetscReal dx,dy,r;
334
335
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
327 PetscFunctionBegin;
336 /* outer ellipse */
337 #if defined(PETSC_USE_COMPLEX)
338 277 dx = (px-PetscRealPart(ctx->center))/(ctx->radius+ctx->width/2.0);
339 277 dy = (py-PetscImaginaryPart(ctx->center))/(ctx->radius+ctx->width/2.0);
340 #else
341 50 dx = (px-ctx->center)/(ctx->radius+ctx->width/2.0);
342 50 dy = py/(ctx->radius+ctx->width/2.0);
343 #endif
344 327 r = 1.0-dx*dx-(dy*dy)/(ctx->vscale*ctx->vscale);
345
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
327 *inside = PetscSign(r);
346 /* inner ellipse */
347 #if defined(PETSC_USE_COMPLEX)
348 277 dx = (px-PetscRealPart(ctx->center))/(ctx->radius-ctx->width/2.0);
349 277 dy = (py-PetscImaginaryPart(ctx->center))/(ctx->radius-ctx->width/2.0);
350 #else
351 50 dx = (px-ctx->center)/(ctx->radius-ctx->width/2.0);
352 50 dy = py/(ctx->radius-ctx->width/2.0);
353 #endif
354 327 r = -1.0+dx*dx+(dy*dy)/(ctx->vscale*ctx->vscale);
355
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
327 *inside *= PetscSign(r);
356
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
327 if (*inside == 1) { /* check angles */
357 #if defined(PETSC_USE_COMPLEX)
358 192 dx = (px-PetscRealPart(ctx->center));
359 192 dy = (py-PetscImaginaryPart(ctx->center));
360 #else
361 20 dx = px-ctx->center;
362 20 dy = py;
363 #endif
364
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
212 if (dx == 0) {
365
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (dy == 0) r = -1;
366
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 else if (dy > 0) r = 0.25;
367 else r = 0.75;
368
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
202 } else if (dx > 0) {
369 130 r = PetscAtanReal((dy/ctx->vscale)/dx);
370
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
130 if (dy >= 0) r /= 2*PETSC_PI;
371 60 else r = r/(2*PETSC_PI)+1;
372 72 } else r = PetscAtanReal((dy/ctx->vscale)/dx)/(2*PETSC_PI)+0.5;
373
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
212 if (ctx->start_ang>ctx->end_ang) {
374
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
130 if (r>ctx->end_ang && r<ctx->start_ang) *inside = -1;
375 } else {
376
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 10 times.
82 if (r<ctx->start_ang || r>ctx->end_ang) *inside = -1;
377 }
378 }
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.
327 PetscFunctionReturn(PETSC_SUCCESS);
380 }
381
382 30 static PetscErrorCode RGIsAxisymmetric_Ring(RG rg,PetscBool vertical,PetscBool *symm)
383 {
384 30 RG_RING *ctx = (RG_RING*)rg->data;
385
386
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
387
6/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
40 if (vertical) *symm = (PetscRealPart(ctx->center) == 0.0 && PetscAbs(ctx->start_ang+ctx->end_ang-PetscRealConstant(1.0)) == 0.5)? PETSC_TRUE: PETSC_FALSE;
388
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
20 else *symm = (PetscImaginaryPart(ctx->center) == 0.0 && ctx->start_ang+ctx->end_ang == 1.0)? PETSC_TRUE: PETSC_FALSE;
389
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);
390 }
391
392 106 static PetscErrorCode RGSetFromOptions_Ring(RG rg,PetscOptionItems PetscOptionsObject)
393 {
394 106 PetscScalar s;
395 106 PetscReal r1,r2,r3,r4,r5;
396 106 PetscBool flg1,flg2,flg3,flg4,flg5,flg6;
397
398
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
106 PetscFunctionBegin;
399
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.
106 PetscOptionsHeadBegin(PetscOptionsObject,"RG Ring Options");
400
401
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.
106 PetscCall(RGRingGetParameters(rg,&s,&r1,&r2,&r3,&r4,&r5));
402
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.
106 PetscCall(PetscOptionsScalar("-rg_ring_center","Center of ellipse","RGRingSetParameters",s,&s,&flg1));
403
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.
106 PetscCall(PetscOptionsReal("-rg_ring_radius","Radius of ellipse","RGRingSetParameters",r1,&r1,&flg2));
404
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.
106 PetscCall(PetscOptionsReal("-rg_ring_vscale","Vertical scale of ellipse","RGRingSetParameters",r2,&r2,&flg3));
405
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.
106 PetscCall(PetscOptionsReal("-rg_ring_startangle","Right-hand side angle","RGRingSetParameters",r3,&r3,&flg4));
406
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.
106 PetscCall(PetscOptionsReal("-rg_ring_endangle","Left-hand side angle","RGRingSetParameters",r4,&r4,&flg5));
407
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.
106 PetscCall(PetscOptionsReal("-rg_ring_width","Width of ring","RGRingSetParameters",r5,&r5,&flg6));
408
12/18
✓ 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 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 10 times.
✓ Branch 11 taken 10 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 8 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
106 if (flg1 || flg2 || flg3 || flg4 || flg5 || flg6) PetscCall(RGRingSetParameters(rg,s,r1,r2,r3,r4,r5));
409
410
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.
106 PetscOptionsHeadEnd();
411
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.
22 PetscFunctionReturn(PETSC_SUCCESS);
412 }
413
414 93 static PetscErrorCode RGDestroy_Ring(RG rg)
415 {
416
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
93 PetscFunctionBegin;
417
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.
93 PetscCall(PetscFree(rg->data));
418
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.
93 PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGRingSetParameters_C",NULL));
419
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.
93 PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGRingGetParameters_C",NULL));
420
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.
19 PetscFunctionReturn(PETSC_SUCCESS);
421 }
422
423 /*MC
424 RGRING - RGRING = "ring" - A ring region similar to an ellipse but consisting
425 of a thin stripe along the ellipse with optional start and end angles.
426
427 Note:
428 The parameters can be set with `RGRingSetParameters()`.
429 The following figure shows an example of a ring region.
430
431 ![Ring region](../../_static/images/manual/svg/fig-rg-ring.svg)
432
433 Level: beginner
434
435 .seealso: [](sec:rg), `RG`, `RGType`, `RGSetType()`, `RGRingSetParameters()`
436 M*/
437
438 93 SLEPC_EXTERN PetscErrorCode RGCreate_Ring(RG rg)
439 {
440 93 RG_RING *ring;
441
442
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
93 PetscFunctionBegin;
443
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.
93 PetscCall(PetscNew(&ring));
444 93 ring->center = 0.0;
445 93 ring->radius = PETSC_MAX_REAL;
446 93 ring->vscale = 1.0;
447 93 ring->start_ang = 0.0;
448 93 ring->end_ang = 1.0;
449 93 ring->width = 0.1;
450 93 rg->data = (void*)ring;
451
452 93 rg->ops->istrivial = RGIsTrivial_Ring;
453 93 rg->ops->computecontour = RGComputeContour_Ring;
454 93 rg->ops->computebbox = RGComputeBoundingBox_Ring;
455 93 rg->ops->computequadrature = RGComputeQuadrature_Ring;
456 93 rg->ops->checkinside = RGCheckInside_Ring;
457 93 rg->ops->isaxisymmetric = RGIsAxisymmetric_Ring;
458 93 rg->ops->setfromoptions = RGSetFromOptions_Ring;
459 93 rg->ops->view = RGView_Ring;
460 93 rg->ops->destroy = RGDestroy_Ring;
461
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.
93 PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGRingSetParameters_C",RGRingSetParameters_Ring));
462
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.
93 PetscCall(PetscObjectComposeFunction((PetscObject)rg,"RGRingGetParameters_C",RGRingGetParameters_Ring));
463
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.
19 PetscFunctionReturn(PETSC_SUCCESS);
464 }
465