Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
makehalfcircle.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright © DUNE-FUFEM Project contributors, see file AUTHORS.md
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
3
4#ifndef DUNE_FUFEM_MAKE_HALF_CIRCLE_HH
5#define DUNE_FUFEM_MAKE_HALF_CIRCLE_HH
6
7#include <cmath>
8#include <memory>
9#include <vector>
10
12
13#include <dune/grid/common/gridfactory.hh>
15
16#include "arcofcircle.hh"
17
18template<class GridType>
20{
21 static_assert(GridType::dimension==2, "createCircle can only be instantiated for 2d grids");
22
24
25 // ///////////////////////
26 // Insert vertices
27 // ///////////////////////
28 double x = std::sqrt((r*r)/2.0);
29
30 factory.insertVertex({center[0]-x, center[1]-x});
31 factory.insertVertex({center[0]+x, center[1]-x});
32 factory.insertVertex({center[0]-x, center[1]+x});
33 factory.insertVertex({center[0]+x, center[1]+x});
34
35 factory.insertVertex(center);
36
37
38 // /////////////////
39 // Insert elements
40 // /////////////////
41
42 factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 0, 1});
43 factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 1, 3});
44 factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 3, 2});
45 factory.insertElement(Dune::GeometryTypes::simplex(2), {4, 2, 0});
46
47
48 // /////////////////////////////
49 // Create boundary segments
50 // /////////////////////////////
51
52 typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
53
54 factory.insertBoundarySegment({0, 1}, SegmentPointer(new ArcOfCircle(center, r, M_PI*5/4, M_PI*7/4)));
55 factory.insertBoundarySegment({1, 3}, SegmentPointer(new ArcOfCircle(center, r, M_PI*7/4, M_PI*9/4)));
56 factory.insertBoundarySegment({3, 2}, SegmentPointer(new ArcOfCircle(center, r, M_PI*1/4, M_PI*3/4)));
57 factory.insertBoundarySegment({2, 0}, SegmentPointer(new ArcOfCircle(center, r, M_PI*3/4, M_PI*5/4)));
58
59
60 // //////////////////////////////////////
61 // Finish initialization
62 // //////////////////////////////////////
63 return factory.createGrid();
64}
65
66
67
68template <class GridType>
69void makeHalfCircle(GridType& grid)
70{
71 static_assert(GridType::dimension==2, "makeHalfCircle can only be instantiated for 2d grids");
72
73 Dune::GridFactory<GridType> factory(&grid);
74
75 // /////////////////////////////
76 // Create boundary segments
77 // /////////////////////////////
78
79 Dune::FieldVector<double,2> center = {0,15};
80
81 typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
82
83 factory.insertBoundarySegment({1, 2}, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
84 factory.insertBoundarySegment({2, 3}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
85 factory.insertBoundarySegment({3, 0}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
86
87
88 // ////////////////////////
89 // Insert vertices
90 // ////////////////////////
91
92 factory.insertVertex({15,15});
93 factory.insertVertex({-15,15});
94 factory.insertVertex({-7.5,2.00962});
95 factory.insertVertex({7.5,2.00962});
96
97 // /////////////////
98 // Insert elements
99 // /////////////////
100
101 factory.insertElement(Dune::GeometryTypes::simplex(2), {0,1,2});
102 factory.insertElement(Dune::GeometryTypes::simplex(2), {2,3,0});
103
104 // //////////////////////////////////////
105 // Finish initialization
106 // //////////////////////////////////////
107 factory.createGrid();
108}
109
110template <class GridType>
111void makeHalfCircleQuadTri(GridType& grid)
112{
113 static_assert(GridType::dimension==2, "makeHalfCircleQuadTri can only be instantiated for 2d grids");
114
115 Dune::GridFactory<GridType> factory(&grid);
116
117 // ////////////////////
118 // Create the domain
119 // //////////////////////
120 Dune::FieldVector<double,2> center = {0,0.4};
121
122 typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
123
124 factory.insertBoundarySegment({1,8}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI, M_PI*9/8)));
125 factory.insertBoundarySegment({8,2}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*9/8, M_PI*10/8)));
126 factory.insertBoundarySegment({2,4}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*10/8, M_PI*12/8)));
127 factory.insertBoundarySegment({4,3}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*12/8, M_PI*14/8)));
128 factory.insertBoundarySegment({3,9}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*14/8, M_PI*15/8)));
129 factory.insertBoundarySegment({9,0}, SegmentPointer(new ArcOfCircle(center, 0.4, M_PI*15/8, M_PI*2)));
130
131 // ////////////////////
132 // Insert inner nodes
133 // ////////////////////
134 std::vector<Dune::FieldVector<double,2> > nodePos = {{0.4, 0.4},
135 {-0.4, 0.4},
136 {-0.282843, 0.117157},
137 {0.282843, 0.117157},
138 {-7.34788e-17, 0},
139 {0, 0.4},
140 {0.2, 0.4},
141 {-0.2, 0.4},
142 {-0.369552, 0.246927},
143 {0.369552, 0.246927},
144 {0.113395, 0.270427},
145 {0.170737, 0.329338},
146 {-0.170737, 0.329338},
147 {-0.113395, 0.270427},
148 {1.25898e-10, 0.235214}};
149
150 for (int i=0; i<15; i++)
151 factory.insertVertex(nodePos[i]);
152
153 // /////////////////
154 // Insert elements
155 // /////////////////
156
157 std::vector<std::vector<unsigned int> > vertices = {{5, 11, 6},
158 {5, 10, 11},
159 {5, 14, 10},
160 {14, 5, 13},
161 {13, 5, 12},
162 {5, 7, 12},
163 {7, 1, 12, 8},
164 {12, 8, 13, 2},
165 {13, 2, 14, 4},
166 {14, 4, 10, 3},
167 {10, 3, 11, 9},
168 {11, 9, 6, 0}};
169
170 for (int i=0; i<6; i++)
171 factory.insertElement(Dune::GeometryTypes::simplex(2), vertices[i]);
172
173 for (int i=6; i<12; i++)
174 factory.insertElement(Dune::GeometryTypes::cube(2), vertices[i]);
175
176 // //////////////////////////////////////
177 // Finish initialization
178 // //////////////////////////////////////
179 factory.createGrid();
180}
181
182
183template <class GridType>
184void makeHalfCircleQuad(GridType& grid)
185{
186 static_assert(GridType::dimension==2, "makeHalfCircleQuad can only be instantiated for 2d grids");
187
188 Dune::GridFactory<GridType> factory(&grid);
189
190 // /////////////////////////////
191 // Create boundary segments
192 // /////////////////////////////
193 Dune::FieldVector<double,2> center = {0,15};
194
195 typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
196
197 factory.insertBoundarySegment({1,2}, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
198 factory.insertBoundarySegment({2,3}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
199 factory.insertBoundarySegment({3,0}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
200
201 // ///////////////////////
202 // Insert vertices
203 // ///////////////////////
204
205 factory.insertVertex({15,15});
206 factory.insertVertex({-15,15});
207 factory.insertVertex({-7.5,2.00962});
208 factory.insertVertex({7.5,2.00962});
209
210 // /////////////////
211 // Insert elements
212 // /////////////////
213
214 factory.insertElement(Dune::GeometryTypes::cube(2), {0,1,3,2});
215
216 // //////////////////////////////////////
217 // Finish initialization
218 // //////////////////////////////////////
219 factory.createGrid();
220}
221
222
223template <class GridType>
224void makeHalfCircleThreeTris(GridType& grid)
225{
226 static_assert(GridType::dimension==2, "makeHalfCircleThreeTris can only be instantiated for 2d grids");
227
228 Dune::GridFactory<GridType> factory(&grid);
229
230 // /////////////////////////////
231 // Create boundary segments
232 // /////////////////////////////
233 Dune::FieldVector<double,2> center = {0,15};
234
235 typedef typename std::shared_ptr<Dune::BoundarySegment<2> > SegmentPointer;
236
237 factory.insertBoundarySegment({1,2}, SegmentPointer(new ArcOfCircle(center, 15, M_PI, M_PI*4/3)));
238 factory.insertBoundarySegment({2,3}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*4/3, M_PI*5/3)));
239 factory.insertBoundarySegment({3,0}, SegmentPointer(new ArcOfCircle(center, 15, M_PI*5/3, M_PI*2)));
240
241 // ///////////////////////
242 // Insert vertices
243 // ///////////////////////
244
245 factory.insertVertex({15,15});
246 factory.insertVertex({-15,15});
247 factory.insertVertex({-7.5,2.00962});
248 factory.insertVertex({7.5,2.00962});
249 factory.insertVertex(center);
250
251 // /////////////////
252 // Insert elements
253 // /////////////////
254
255 factory.insertElement(Dune::GeometryTypes::simplex(2), {1,2,4});
256 factory.insertElement(Dune::GeometryTypes::simplex(2), {2,3,4});
257 factory.insertElement(Dune::GeometryTypes::simplex(2), {3,0,4});
258
259 // //////////////////////////////////////
260 // Finish initialization
261 // //////////////////////////////////////
262 factory.createGrid();
263}
264
265#endif
void makeHalfCircleQuad(GridType &grid)
Definition makehalfcircle.hh:184
std::unique_ptr< GridType > createCircle(const Dune::FieldVector< double, 2 > &center, double r)
Definition makehalfcircle.hh:19
void makeHalfCircleThreeTris(GridType &grid)
Definition makehalfcircle.hh:224
void makeHalfCircle(GridType &grid)
Definition makehalfcircle.hh:69
void makeHalfCircleQuadTri(GridType &grid)
Definition makehalfcircle.hh:111
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices)
virtual void insertVertex(const FieldVector< ctype, dimworld > &pos)
virtual void insertBoundarySegment(const std::vector< unsigned int > &vertices)
virtual std::unique_ptr< GridType > createGrid()
Definition arcofcircle.hh:11
T sqrt(T... args)