@@ -35,93 +35,6 @@ SOFTWARE.*/
35
35
36
36
extern double gain2 (double x, double r, double n);
37
37
38
- class FECylinderShapeModifier
39
- {
40
- public:
41
- FECylinderShapeModifier (double radius, double ratio, bool br, double gr, int ns)
42
- {
43
- m_R = radius;
44
- m_r = ratio;
45
- m_br = br;
46
- m_gr = gr;
47
- m_ns = ns;
48
- }
49
-
50
- vec3d Apply (const vec3d& r)
51
- {
52
- vec3d rn = r;
53
-
54
- double R1 = m_R;
55
- double R0 = m_r;
56
- if (R0 < 0 ) R0 = 0 ;
57
- if (R0 > 1 ) R0 = 1 ;
58
- R0 *= R1;
59
-
60
- double d0 = R0 / sqrt (2.0 );
61
- double d1 = R1 / sqrt (2.0 );
62
-
63
- // project the nodes onto a cylinder
64
- vec3d r0, r1;
65
-
66
- // get the nodal coordinate in the template
67
- double x = rn.x ;
68
- double y = rn.y ;
69
-
70
- // get the max-distance
71
- double D = fmax (fabs (x), fabs (y));
72
-
73
- if (D <= 1 )
74
- {
75
- rn.x *= d0;
76
- rn.y *= d0;
77
- }
78
- else
79
- {
80
- // "normalize" the coordinates
81
- // with respect to the max distance
82
- double r = x / D;
83
- double s = y / D;
84
-
85
- vec3d r0;
86
- if (fabs (x) >= fabs (y))
87
- {
88
- double u = x / fabs (x);
89
- r0.x = u * R1*cos (PI*0.25 *s);
90
- r0.y = R1 * sin (PI*0.25 *s);
91
- }
92
- else
93
- {
94
- double u = y / fabs (y);
95
- r0.y = u * R1*cos (PI*0.25 *r);
96
- r0.x = R1 * sin (PI*0.25 *r);
97
- }
98
-
99
- vec3d r1 (r*d0, s*d0, 0 );
100
- double a = D - 1 ;
101
-
102
- if (m_br)
103
- {
104
- if (a <= 0.5 )
105
- a = 0.5 *gain2 (2 * a, m_gr, m_ns);
106
- else
107
- a = 1 - 0.5 *gain2 (2 - 2 * a, m_gr, m_ns);
108
- }
109
- else a = gain2 (a, m_gr, m_ns);
110
-
111
- rn.x = r0.x *a + r1.x *(1 - a);
112
- rn.y = r0.y *a + r1.y *(1 - a);
113
- }
114
-
115
- return rn;
116
- }
117
-
118
- private:
119
- double m_R, m_r;
120
- bool m_br;
121
- double m_gr;
122
- int m_ns;
123
- };
124
-
125
38
// -----------------------------------------------------------------------------
126
39
// Constructor
127
40
FECylinder::FECylinder (GCylinder* po)
@@ -192,7 +105,7 @@ FEMesh* FECylinder::BuildButterfly()
192
105
int ns = m_ns;
193
106
int nz = m_nz;
194
107
double fz = m_gz;
195
- double fr = 1 ;
108
+ double fr = m_gr ;
196
109
197
110
// check parameters
198
111
if (nd < 1 ) nd = 1 ;
@@ -203,45 +116,49 @@ FEMesh* FECylinder::BuildButterfly()
203
116
double R1 = param.GetFloatValue (GCylinder::RADIUS);
204
117
m_r = GetFloatValue (RATIO);
205
118
119
+ double b = R1 * sqrt (2.0 ) / 2.0 ;
120
+ double a = m_r * b;
121
+ double c = R1;
122
+
206
123
// create the MB nodes
207
124
m_MBNode.resize (34 );
208
- m_MBNode[ 0 ].m_r = vec3d ( -1 , -1 , 0 );
209
- m_MBNode[ 1 ].m_r = vec3d ( 0 , -1 , 0 );
210
- m_MBNode[ 2 ].m_r = vec3d ( 1 , -1 , 0 );
211
- m_MBNode[ 3 ].m_r = vec3d ( -1 , 0 , 0 );
125
+ m_MBNode[ 0 ].m_r = vec3d ( -a , -a , 0 );
126
+ m_MBNode[ 1 ].m_r = vec3d ( 0 , -a , 0 );
127
+ m_MBNode[ 2 ].m_r = vec3d ( a , -a , 0 );
128
+ m_MBNode[ 3 ].m_r = vec3d ( -a , 0 , 0 );
212
129
m_MBNode[ 4 ].m_r = vec3d ( 0 , 0 , 0 );
213
- m_MBNode[ 5 ].m_r = vec3d ( 1 , 0 , 0 );
214
- m_MBNode[ 6 ].m_r = vec3d ( -1 , 1 , 0 );
215
- m_MBNode[ 7 ].m_r = vec3d ( 0 , 1 , 0 );
216
- m_MBNode[ 8 ].m_r = vec3d ( 1 , 1 , 0 );
217
-
218
- m_MBNode[ 9 ].m_r = vec3d (-1 , -1 , h);
219
- m_MBNode[10 ].m_r = vec3d ( 0 , -1 , h);
220
- m_MBNode[11 ].m_r = vec3d ( 1 , -1 , h);
221
- m_MBNode[12 ].m_r = vec3d (-1 , 0 , h);
130
+ m_MBNode[ 5 ].m_r = vec3d ( a , 0 , 0 );
131
+ m_MBNode[ 6 ].m_r = vec3d ( -a , a , 0 );
132
+ m_MBNode[ 7 ].m_r = vec3d ( 0 , a , 0 );
133
+ m_MBNode[ 8 ].m_r = vec3d ( a , a , 0 );
134
+
135
+ m_MBNode[ 9 ].m_r = vec3d (-a , -a , h);
136
+ m_MBNode[10 ].m_r = vec3d ( 0 , -a , h);
137
+ m_MBNode[11 ].m_r = vec3d ( a , -a , h);
138
+ m_MBNode[12 ].m_r = vec3d (-a , 0 , h);
222
139
m_MBNode[13 ].m_r = vec3d ( 0 , 0 , h);
223
- m_MBNode[14 ].m_r = vec3d ( 1 , 0 , h);
224
- m_MBNode[15 ].m_r = vec3d (-1 , 1 , h);
225
- m_MBNode[16 ].m_r = vec3d ( 0 , 1 , h);
226
- m_MBNode[17 ].m_r = vec3d ( 1 , 1 , h);
227
-
228
- m_MBNode[18 ].m_r = vec3d (-2 , -2 , 0 );
229
- m_MBNode[19 ].m_r = vec3d ( 0 , -2 , 0 );
230
- m_MBNode[20 ].m_r = vec3d ( 2 , -2 , 0 );
231
- m_MBNode[21 ].m_r = vec3d ( 2 , 0 , 0 );
232
- m_MBNode[22 ].m_r = vec3d ( 2 , 2 , 0 );
233
- m_MBNode[23 ].m_r = vec3d ( 0 , 2 , 0 );
234
- m_MBNode[24 ].m_r = vec3d (-2 , 2 , 0 );
235
- m_MBNode[25 ].m_r = vec3d (-2 , 0 , 0 );
236
-
237
- m_MBNode[26 ].m_r = vec3d (-2 , -2 , h);
238
- m_MBNode[27 ].m_r = vec3d ( 0 , -2 , h);
239
- m_MBNode[28 ].m_r = vec3d ( 2 , -2 , h);
240
- m_MBNode[29 ].m_r = vec3d ( 2 , 0 , h);
241
- m_MBNode[30 ].m_r = vec3d ( 2 , 2 , h);
242
- m_MBNode[31 ].m_r = vec3d ( 0 , 2 , h);
243
- m_MBNode[32 ].m_r = vec3d (-2 , 2 , h);
244
- m_MBNode[33 ].m_r = vec3d (-2 , 0 , h);
140
+ m_MBNode[14 ].m_r = vec3d ( a , 0 , h);
141
+ m_MBNode[15 ].m_r = vec3d (-a , a , h);
142
+ m_MBNode[16 ].m_r = vec3d ( 0 , a , h);
143
+ m_MBNode[17 ].m_r = vec3d ( a , a , h);
144
+
145
+ m_MBNode[18 ].m_r = vec3d (-b , -b , 0 );
146
+ m_MBNode[19 ].m_r = vec3d ( 0 , -c , 0 );
147
+ m_MBNode[20 ].m_r = vec3d ( b , -b , 0 );
148
+ m_MBNode[21 ].m_r = vec3d ( c , 0 , 0 );
149
+ m_MBNode[22 ].m_r = vec3d ( b , b , 0 );
150
+ m_MBNode[23 ].m_r = vec3d ( 0 , c , 0 );
151
+ m_MBNode[24 ].m_r = vec3d (-b , b , 0 );
152
+ m_MBNode[25 ].m_r = vec3d (-c , 0 , 0 );
153
+
154
+ m_MBNode[26 ].m_r = vec3d (-b , -b , h);
155
+ m_MBNode[27 ].m_r = vec3d ( 0 , -c , h);
156
+ m_MBNode[28 ].m_r = vec3d ( b , -b , h);
157
+ m_MBNode[29 ].m_r = vec3d ( c , 0 , h);
158
+ m_MBNode[30 ].m_r = vec3d ( b , b , h);
159
+ m_MBNode[31 ].m_r = vec3d ( 0 , c , h);
160
+ m_MBNode[32 ].m_r = vec3d (-b , b , h);
161
+ m_MBNode[33 ].m_r = vec3d (-c , 0 , h);
245
162
246
163
// create the MB blocks
247
164
m_MBlock.resize (12 );
@@ -358,6 +275,23 @@ FEMesh* FECylinder::BuildButterfly()
358
275
MBFace& F7 = GetBlockFace ( 5 , 1 ); SetFaceEdgeID (F7, 3 , -1 , 7 , 11 );
359
276
MBFace& F8 = GetBlockFace ( 6 , 1 ); SetFaceEdgeID (F8, 3 , 8 , 7 , -1 );
360
277
278
+ GetFaceEdge (F1, 0 ).edge .m_ntype = EDGE_ZARC;
279
+ GetFaceEdge (F1, 2 ).edge .m_ntype = EDGE_ZARC; GetFaceEdge (F1, 2 ).m_winding = -1 ;
280
+ GetFaceEdge (F2, 0 ).edge .m_ntype = EDGE_ZARC;
281
+ GetFaceEdge (F2, 2 ).edge .m_ntype = EDGE_ZARC; GetFaceEdge (F2, 2 ).m_winding = -1 ;
282
+ GetFaceEdge (F3, 0 ).edge .m_ntype = EDGE_ZARC;
283
+ GetFaceEdge (F3, 2 ).edge .m_ntype = EDGE_ZARC; GetFaceEdge (F3, 2 ).m_winding = -1 ;
284
+ GetFaceEdge (F4, 0 ).edge .m_ntype = EDGE_ZARC;
285
+ GetFaceEdge (F4, 2 ).edge .m_ntype = EDGE_ZARC; GetFaceEdge (F4, 2 ).m_winding = -1 ;
286
+ GetFaceEdge (F5, 0 ).edge .m_ntype = EDGE_ZARC;
287
+ GetFaceEdge (F5, 2 ).edge .m_ntype = EDGE_ZARC; GetFaceEdge (F5, 2 ).m_winding = -1 ;
288
+ GetFaceEdge (F6, 0 ).edge .m_ntype = EDGE_ZARC;
289
+ GetFaceEdge (F6, 2 ).edge .m_ntype = EDGE_ZARC; GetFaceEdge (F6, 2 ).m_winding = -1 ;
290
+ GetFaceEdge (F7, 0 ).edge .m_ntype = EDGE_ZARC;
291
+ GetFaceEdge (F7, 2 ).edge .m_ntype = EDGE_ZARC; GetFaceEdge (F7, 2 ).m_winding = -1 ;
292
+ GetFaceEdge (F8, 0 ).edge .m_ntype = EDGE_ZARC;
293
+ GetFaceEdge (F8, 2 ).edge .m_ntype = EDGE_ZARC; GetFaceEdge (F8, 2 ).m_winding = -1 ;
294
+
361
295
m_MBNode[21 ].SetID (0 );
362
296
m_MBNode[23 ].SetID (1 );
363
297
m_MBNode[25 ].SetID (2 );
@@ -370,27 +304,12 @@ FEMesh* FECylinder::BuildButterfly()
370
304
// create the MB
371
305
FEMesh* pm = FEMultiBlockMesh::BuildMesh ();
372
306
373
- // apply a global shape modifier
374
- FECylinderShapeModifier* mod = new FECylinderShapeModifier (R1, m_r, m_br, m_gr, m_ns);
375
- for (int i = 0 ; i < pm->Nodes (); ++i)
376
- {
377
- vec3d r0 = pm->Node (i).pos ();
378
- vec3d rn = mod->Apply (r0);
379
- pm->Node (i).pos (rn);
380
- }
381
-
382
- // update the mesh
383
- pm->UpdateMesh ();
384
-
385
307
// the Multi-block mesher will assign a different smoothing ID
386
308
// to each face, but we don't want that here.
387
309
// For now, we autosmooth the mesh although we should think of a
388
310
// better way
389
311
pm->AutoSmooth (60 );
390
312
391
- // cleanup
392
- delete mod;
393
-
394
313
return pm;
395
314
}
396
315
0 commit comments