Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/csg/singularref.cpp
3206 views
1
#include <mystdlib.h>
2
#include <myadt.hpp>
3
4
#include <linalg.hpp>
5
#include <csg.hpp>
6
#include <meshing.hpp>
7
8
namespace netgen
9
{
10
11
SingularEdge :: SingularEdge (double abeta, int adomnr,
12
const CSGeometry & ageom,
13
const Solid * asol1,
14
const Solid * asol2, double sf,
15
const double maxh_at_initialization)
16
: geom(ageom), domnr(adomnr)
17
{
18
beta = abeta;
19
maxhinit = maxh_at_initialization;
20
21
if (beta > 1)
22
{
23
beta = 1;
24
cout << "Warning: beta set to 1" << endl;
25
}
26
if (beta <= 1e-3)
27
{
28
beta = 1e-3;
29
cout << "Warning: beta set to minimal value 0.001" << endl;
30
}
31
32
sol1 = asol1;
33
sol2 = asol2;
34
factor = sf;
35
}
36
37
void SingularEdge :: FindPointsOnEdge (class Mesh & mesh)
38
{
39
(*testout) << "find points on edge" << endl;
40
points.SetSize(0);
41
segms.SetSize(0);
42
43
44
ARRAY<int> si1, si2;
45
sol1->GetSurfaceIndices (si1);
46
sol2->GetSurfaceIndices (si2);
47
48
for (int i = 0; i < si1.Size(); i++)
49
si1[i] = geom.GetSurfaceClassRepresentant(si1[i]);
50
for (int i = 0; i < si2.Size(); i++)
51
si2[i] = geom.GetSurfaceClassRepresentant(si2[i]);
52
53
54
for (SegmentIndex si = 0; si < mesh.GetNSeg(); si++)
55
{
56
INDEX_2 i2 (mesh[si].p1, mesh[si].p2);
57
/*
58
59
bool onedge = 1;
60
for (j = 1; j <= 2; j++)
61
{
62
const Point<3> p = mesh[ PointIndex (i2.I(j)) ];
63
if (sol1->IsIn (p, 1e-3) && sol2->IsIn(p, 1e-3) &&
64
!sol1->IsStrictIn (p, 1e-3) && !sol2->IsStrictIn(p, 1e-3))
65
{
66
;
67
}
68
else
69
onedge = 0;
70
}
71
*/
72
73
if (domnr != -1 && domnr != mesh[si].domin && domnr != mesh[si].domout)
74
continue;
75
76
/*
77
bool onedge = 1;
78
for (int j = 0; j < 2; j++)
79
{
80
int surfi = (j == 0) ? mesh[si].surfnr1 : mesh[si].surfnr2;
81
surfi = geom.GetSurfaceClassRepresentant(surfi);
82
if (!si1.Contains(surfi) && !si2.Contains(surfi))
83
onedge = 0;
84
}
85
*/
86
int surfi1 = geom.GetSurfaceClassRepresentant(mesh[si].surfnr1);
87
int surfi2 = geom.GetSurfaceClassRepresentant(mesh[si].surfnr2);
88
89
if (si1.Contains(surfi1) && si2.Contains(surfi2) ||
90
si1.Contains(surfi2) && si2.Contains(surfi1))
91
92
// if (onedge)
93
{
94
segms.Append (i2);
95
// PrintMessage (5, "sing segment ", i2.I1(), " - ", i2.I2());
96
points.Append (mesh[ PointIndex (i2.I1())]);
97
points.Append (mesh[ PointIndex (i2.I2())]);
98
mesh[si].singedge_left = factor;
99
mesh[si].singedge_right = factor;
100
}
101
}
102
103
/*
104
(*testout) << "Singular edge points:" << endl;
105
for (int i = 0; i < points.Size(); i++)
106
(*testout) << points[i] << endl;
107
*/
108
109
}
110
111
void SingularEdge :: SetMeshSize (class Mesh & mesh, double globalh)
112
{
113
double hloc = pow (globalh, 1/beta);
114
if(maxhinit > 0 && maxhinit < hloc)
115
{
116
hloc = maxhinit;
117
if(points.Size() > 1)
118
{
119
for (int i = 0; i < points.Size()-1; i++)
120
mesh.RestrictLocalHLine(points[i],points[i+1],hloc);
121
}
122
else
123
{
124
for (int i = 0; i < points.Size(); i++)
125
mesh.RestrictLocalH (points[i], hloc);
126
}
127
}
128
else
129
{
130
for (int i = 0; i < points.Size(); i++)
131
mesh.RestrictLocalH (points[i], hloc);
132
}
133
}
134
135
136
137
SingularPoint :: SingularPoint (double abeta,
138
const Solid * asol1,
139
const Solid * asol2,
140
const Solid * asol3, double sf)
141
{
142
beta = abeta;
143
sol1 = asol1;
144
sol2 = asol2;
145
sol3 = asol3;
146
factor = sf;
147
}
148
149
150
void SingularPoint :: FindPoints (class Mesh & mesh)
151
{
152
points.SetSize(0);
153
ARRAY<int> surfk, surf;
154
155
156
for (PointIndex pi = PointIndex::BASE;
157
pi < mesh.GetNP()+PointIndex::BASE; pi++)
158
{
159
if (mesh[pi].Type() != FIXEDPOINT) continue;
160
const Point<3> p = mesh[pi];
161
162
(*testout) << "check singular point" << p << endl;
163
164
if (sol1->IsIn (p) && sol2->IsIn(p) && sol3->IsIn(p) &&
165
!sol1->IsStrictIn (p) && !sol2->IsStrictIn(p) && !sol3->IsStrictIn(p))
166
{
167
surf.SetSize (0);
168
for (int k = 1; k <= 3; k++)
169
{
170
const Solid * solk(NULL);
171
Solid *tansol;
172
switch (k)
173
{
174
case 1: solk = sol1; break;
175
case 2: solk = sol2; break;
176
case 3: solk = sol3; break;
177
}
178
179
solk -> TangentialSolid (p, tansol, surfk, 1e-3);
180
(*testout) << "Tansol = " << *tansol << endl;
181
182
if (!tansol) continue;
183
184
ReducePrimitiveIterator rpi(Box<3> (p-Vec<3> (1e-3,1e-3,1e-3),
185
p+Vec<3> (1e-3,1e-3,1e-3)));
186
UnReducePrimitiveIterator urpi;
187
188
tansol -> IterateSolid (rpi);
189
tansol->GetSurfaceIndices (surfk);
190
tansol -> IterateSolid (urpi);
191
192
(*testout) << "surfinds = " << surfk << endl;
193
194
for (int i = 0; i < surfk.Size(); i++)
195
if (!surf.Contains (surfk[i]))
196
surf.Append (surfk[i]);
197
198
delete tansol;
199
}
200
201
if (surf.Size() < 3) continue;
202
203
points.Append (p);
204
PrintMessage (5, "Point (", p(0), ", ", p(1), ", ", p(2), ") is singular");
205
mesh[pi].Singularity(factor);
206
}
207
}
208
}
209
210
211
void SingularPoint :: SetMeshSize (class Mesh & mesh, double globalh)
212
{
213
double hloc = pow (globalh, 1/beta);
214
for (int i = 1; i <= points.Size(); i++)
215
mesh.RestrictLocalH (points.Get(i), hloc);
216
}
217
}
218
219