1
//---------------------------------------------------------------------------
2
// $Id: tria_objects.all_dimensions.cc 16430 2008-07-08 15:25:01Z hartmann $
5
// Copyright (C) 2006, 2007 by the deal.II authors
7
// This file is subject to QPL and may not be distributed
8
// without copyright and license information. Please refer
9
// to the file deal.II/doc/license.html for the text and
10
// further information on this license.
12
//---------------------------------------------------------------------------
15
#include <base/memory_consumption.h>
16
#include <grid/tria_objects.h>
17
#include <grid/tria.h>
18
#include <grid/tria_iterator.h>
19
#include <grid/tria_accessor.h>
26
DEAL_II_NAMESPACE_OPEN
30
namespace Triangulation
34
TriaObjects<TriaObject<1> >::reserve_space (const unsigned int new_lines_in_pairs,
35
const unsigned int new_lines_single)
37
Assert(new_lines_in_pairs%2==0, ExcInternalError());
41
reverse_order_next_free_single=false;
43
// count the number of lines, of
44
// unused single lines and of
45
// unused pairs of lines
46
unsigned int n_lines=0;
47
unsigned int n_unused_pairs=0;
48
unsigned int n_unused_singles=0;
49
for (unsigned int i=0; i<used.size(); ++i)
53
else if (i+1<used.size())
58
if (next_free_single==0)
64
if (next_free_pair==0)
72
Assert(n_lines+2*n_unused_pairs+n_unused_singles==used.size(),
75
// how many single lines are needed in
76
// addition to n_unused_singles?
77
const int additional_single_lines=
78
new_lines_single-n_unused_singles;
80
unsigned int new_size=
81
used.size() + new_lines_in_pairs - 2*n_unused_pairs;
82
if (additional_single_lines>0)
83
new_size+=additional_single_lines;
85
// only allocate space if necessary
86
if (new_size>cells.size())
88
cells.reserve (new_size);
89
cells.insert (cells.end(),
90
new_size-cells.size(),
93
used.reserve (new_size);
94
used.insert (used.end(),
98
user_flags.reserve (new_size);
99
user_flags.insert (user_flags.end(),
100
new_size-user_flags.size(),
103
children.reserve (new_size);
104
children.insert (children.end(),
105
new_size-children.size(),
108
material_id.reserve (new_size);
109
material_id.insert (material_id.end(),
110
new_size-material_id.size(),
113
user_data.reserve (new_size);
114
user_data.insert (user_data.end(),
115
new_size-user_data.size(),
119
if (n_unused_singles==0)
121
next_free_single=new_size-1;
122
reverse_order_next_free_single=true;
129
TriaObjects<TriaObject<2> >::reserve_space (const unsigned int new_quads_in_pairs,
130
const unsigned int new_quads_single)
132
Assert(new_quads_in_pairs%2==0, ExcInternalError());
136
reverse_order_next_free_single=false;
138
// count the number of lines, of
139
// unused single lines and of
140
// unused pairs of lines
141
unsigned int n_quads=0;
142
unsigned int n_unused_pairs=0;
143
unsigned int n_unused_singles=0;
144
for (unsigned int i=0; i<used.size(); ++i)
148
else if (i+1<used.size())
153
if (next_free_single==0)
159
if (next_free_pair==0)
167
Assert(n_quads+2*n_unused_pairs+n_unused_singles==used.size(),
170
// how many single quads are needed in
171
// addition to n_unused_quads?
172
const int additional_single_quads=
173
new_quads_single-n_unused_singles;
175
unsigned int new_size=
176
used.size() + new_quads_in_pairs - 2*n_unused_pairs;
177
if (additional_single_quads>0)
178
new_size+=additional_single_quads;
180
// only allocate space if necessary
181
if (new_size>cells.size())
183
cells.reserve (new_size);
184
cells.insert (cells.end(),
185
new_size-cells.size(),
188
used.reserve (new_size);
189
used.insert (used.end(),
190
new_size-used.size(),
193
user_flags.reserve (new_size);
194
user_flags.insert (user_flags.end(),
195
new_size-user_flags.size(),
198
children.reserve (2*new_size);
199
children.insert (children.end(),
200
2*new_size-children.size(),
203
refinement_cases.reserve (new_size);
204
refinement_cases.insert (refinement_cases.end(),
205
new_size - refinement_cases.size(),
206
RefinementCase<2>::no_refinement);
209
material_id.reserve (new_size);
210
material_id.insert (material_id.end(),
211
new_size-material_id.size(),
214
user_data.reserve (new_size);
215
user_data.insert (user_data.end(),
216
new_size-user_data.size(),
220
if (n_unused_singles==0)
222
next_free_single=new_size-1;
223
reverse_order_next_free_single=true;
229
TriaObjectsHex::reserve_space (const unsigned int new_hexes)
231
const unsigned int new_size = new_hexes +
232
std::count_if (used.begin(),
234
std::bind2nd (std::equal_to<bool>(), true));
237
if (new_size>cells.size())
239
cells.reserve (new_size);
240
cells.insert (cells.end(),
241
new_size-cells.size(),
244
used.reserve (new_size);
245
used.insert (used.end(),
246
new_size-used.size(),
249
user_flags.reserve (new_size);
250
user_flags.insert (user_flags.end(),
251
new_size-user_flags.size(),
254
children.reserve (4*new_size);
255
children.insert (children.end(),
256
4*new_size-children.size(),
259
material_id.reserve (new_size);
260
material_id.insert (material_id.end(),
261
new_size-material_id.size(),
264
user_data.reserve (new_size);
265
user_data.insert (user_data.end(),
266
new_size-user_data.size(),
269
face_orientations.reserve (new_size * GeometryInfo<3>::faces_per_cell);
270
face_orientations.insert (face_orientations.end(),
271
new_size * GeometryInfo<3>::faces_per_cell
272
- face_orientations.size(),
275
refinement_cases.reserve (new_size);
276
refinement_cases.insert (refinement_cases.end(),
277
new_size-refinement_cases.size(),
278
RefinementCase<3>::no_refinement);
280
face_flips.reserve (new_size * GeometryInfo<3>::faces_per_cell);
281
face_flips.insert (face_flips.end(),
282
new_size * GeometryInfo<3>::faces_per_cell
285
face_rotations.reserve (new_size * GeometryInfo<3>::faces_per_cell);
286
face_rotations.insert (face_rotations.end(),
287
new_size * GeometryInfo<3>::faces_per_cell
288
- face_rotations.size(),
291
next_free_single=next_free_pair=0;
296
TriaObjectsQuad3D::reserve_space (const unsigned int new_quads_in_pairs,
297
const unsigned int new_quads_single)
299
Assert(new_quads_in_pairs%2==0, ExcInternalError());
303
reverse_order_next_free_single=false;
305
// count the number of lines, of unused
306
// single lines and of unused pairs of
308
unsigned int n_quads=0;
309
unsigned int n_unused_pairs=0;
310
unsigned int n_unused_singles=0;
311
for (unsigned int i=0; i<used.size(); ++i)
315
else if (i+1<used.size())
320
if (next_free_single==0)
326
if (next_free_pair==0)
334
Assert(n_quads+2*n_unused_pairs+n_unused_singles==used.size(),
337
// how many single quads are needed in
338
// addition to n_unused_quads?
339
const int additional_single_quads=
340
new_quads_single-n_unused_singles;
342
unsigned int new_size=
343
used.size() + new_quads_in_pairs - 2*n_unused_pairs;
344
if (additional_single_quads>0)
345
new_size+=additional_single_quads;
348
if (new_size>cells.size())
350
// reseve space for the base class
351
TriaObjects<TriaObject<2> >::reserve_space(new_quads_in_pairs,new_quads_single);
352
// reserve the field of the derived
354
line_orientations.reserve (new_size * GeometryInfo<2>::lines_per_cell);
355
line_orientations.insert (line_orientations.end(),
356
new_size * GeometryInfo<2>::lines_per_cell
357
- line_orientations.size(),
361
if (n_unused_singles==0)
363
next_free_single=new_size-1;
364
reverse_order_next_free_single=true;
371
TriaObjects<TriaObject<1> >::monitor_memory (const unsigned int) const
373
// check that we have not allocated
374
// too much memory. note that bool
375
// vectors allocate their memory in
376
// chunks of whole integers, so
377
// they may over-allocate by up to
378
// as many elements as an integer
380
Assert (cells.size() <=
381
cells.capacity() + DEAL_II_MIN_VECTOR_CAPACITY,
382
ExcMemoryWasted ("lines",
383
cells.size(), cells.capacity()));
384
Assert (children.size() <=
385
children.capacity() + DEAL_II_MIN_VECTOR_CAPACITY,
386
ExcMemoryWasted ("children",
387
children.size(), children.capacity()));
388
Assert (used.size() <= used.capacity() + sizeof(int)*8 ||
389
used.size()<DEAL_II_MIN_BOOL_VECTOR_CAPACITY,
390
ExcMemoryWasted ("used",
391
used.size(), used.capacity()));
392
Assert (user_flags.size() <= user_flags.capacity() + sizeof(int)*8 ||
393
user_flags.size()<DEAL_II_MIN_BOOL_VECTOR_CAPACITY,
394
ExcMemoryWasted ("user_flags",
395
user_flags.size(), user_flags.capacity()));
396
Assert (cells.size() == used.size(),
397
ExcMemoryInexact (cells.size(), used.size()));
398
Assert (cells.size() == user_flags.size(),
399
ExcMemoryInexact (cells.size(), user_flags.size()));
400
Assert (cells.size() == children.size(),
401
ExcMemoryInexact (cells.size(), children.size()));
402
Assert (cells.size() == material_id.size(),
403
ExcMemoryInexact (cells.size(), material_id.size()));
404
Assert (cells.size() == user_data.size(),
405
ExcMemoryInexact (cells.size(), user_data.size()));
411
TriaObjects<TriaObject<2> >::monitor_memory (const unsigned int) const
413
// check that we have not allocated
414
// too much memory. note that bool
415
// vectors allocate their memory in
416
// chunks of whole integers, so
417
// they may over-allocate by up to
418
// as many elements as an integer
420
Assert (cells.size() <=
421
cells.capacity() + DEAL_II_MIN_VECTOR_CAPACITY,
422
ExcMemoryWasted ("quads",
423
cells.size(), cells.capacity()));
424
Assert (children.size() <=
425
children.capacity() + DEAL_II_MIN_VECTOR_CAPACITY,
426
ExcMemoryWasted ("children",
427
children.size(), children.capacity()));
428
Assert (used.size() <= used.capacity() + sizeof(int)*8 ||
429
used.size()<DEAL_II_MIN_BOOL_VECTOR_CAPACITY,
430
ExcMemoryWasted ("used",
431
used.size(), used.capacity()));
432
Assert (user_flags.size() <= user_flags.capacity() + sizeof(int)*8 ||
433
user_flags.size()<DEAL_II_MIN_BOOL_VECTOR_CAPACITY,
434
ExcMemoryWasted ("user_flags",
435
user_flags.size(), user_flags.capacity()));
436
Assert (cells.size() == used.size(),
437
ExcMemoryInexact (cells.size(), used.size()));
438
Assert (cells.size() == user_flags.size(),
439
ExcMemoryInexact (cells.size(), user_flags.size()));
440
Assert (2*cells.size() == children.size(),
441
ExcMemoryInexact (cells.size(), children.size()));
442
Assert (cells.size() == refinement_cases.size(),
443
ExcMemoryInexact (cells.size(), refinement_cases.size()));
444
Assert (cells.size() == material_id.size(),
445
ExcMemoryInexact (cells.size(), material_id.size()));
446
Assert (cells.size() == user_data.size(),
447
ExcMemoryInexact (cells.size(), user_data.size()));
452
TriaObjectsHex::monitor_memory (const unsigned int) const
454
// check that we have not allocated
455
// too much memory. note that bool
456
// vectors allocate their memory in
457
// chunks of whole integers, so
458
// they may over-allocate by up to
459
// as many elements as an integer
461
Assert (cells.size() <=
462
cells.capacity() + DEAL_II_MIN_VECTOR_CAPACITY,
463
ExcMemoryWasted ("hexes",
464
cells.size(), cells.capacity()));
465
Assert (children.size() <=
466
children.capacity() + DEAL_II_MIN_VECTOR_CAPACITY,
467
ExcMemoryWasted ("children",
468
children.size(), children.capacity()));
469
Assert (used.size() <= used.capacity() + sizeof(int)*8 ||
470
used.size()<DEAL_II_MIN_BOOL_VECTOR_CAPACITY,
471
ExcMemoryWasted ("used",
472
used.size(), used.capacity()));
473
Assert (user_flags.size() <= user_flags.capacity() + sizeof(int)*8 ||
474
user_flags.size()<DEAL_II_MIN_BOOL_VECTOR_CAPACITY,
475
ExcMemoryWasted ("user_flags",
476
user_flags.size(), user_flags.capacity()));
477
Assert (cells.size() == used.size(),
478
ExcMemoryInexact (cells.size(), used.size()));
479
Assert (cells.size() == user_flags.size(),
480
ExcMemoryInexact (cells.size(), user_flags.size()));
481
Assert (4*cells.size() == children.size(),
482
ExcMemoryInexact (cells.size(), children.size()));
483
Assert (cells.size() == material_id.size(),
484
ExcMemoryInexact (cells.size(), material_id.size()));
485
Assert (cells.size() == user_data.size(),
486
ExcMemoryInexact (cells.size(), user_data.size()));
487
Assert (cells.size() * GeometryInfo<3>::faces_per_cell
488
== face_orientations.size(),
489
ExcMemoryInexact (cells.size() * GeometryInfo<3>::faces_per_cell,
490
face_orientations.size()));
491
Assert (cells.size() * GeometryInfo<3>::faces_per_cell
492
== face_flips.size(),
493
ExcMemoryInexact (cells.size() * GeometryInfo<3>::faces_per_cell,
495
Assert (cells.size() * GeometryInfo<3>::faces_per_cell
496
== face_rotations.size(),
497
ExcMemoryInexact (cells.size() * GeometryInfo<3>::faces_per_cell,
498
face_rotations.size()));
503
TriaObjectsQuad3D::monitor_memory (const unsigned int) const
505
// check that we have not allocated
506
// too much memory. note that bool
507
// vectors allocate their memory in
508
// chunks of whole integers, so
509
// they may over-allocate by up to
510
// as many elements as an integer
512
Assert (cells.size() * GeometryInfo<2>::lines_per_cell
513
== line_orientations.size(),
514
ExcMemoryInexact (cells.size() * GeometryInfo<2>::lines_per_cell,
515
line_orientations.size()));
516
TriaObjects<TriaObject<2> >::monitor_memory (3);
521
template <typename G>
523
TriaObjects<G>::clear()
527
refinement_cases.clear();
532
user_data_type = data_unknown;
537
TriaObjectsHex::clear()
539
TriaObjects<TriaObject<3> >::clear();
540
face_orientations.clear();
542
face_rotations.clear();
547
TriaObjectsQuad3D::clear()
549
TriaObjects<TriaObject<2> >::clear();
550
line_orientations.clear();
556
TriaObjects<G>::memory_consumption () const
558
return (MemoryConsumption::memory_consumption (cells) +
559
MemoryConsumption::memory_consumption (children) +
560
MemoryConsumption::memory_consumption (used) +
561
MemoryConsumption::memory_consumption (user_flags) +
562
MemoryConsumption::memory_consumption (material_id) +
563
MemoryConsumption::memory_consumption (refinement_cases) +
564
user_data.capacity() * sizeof(UserData) + sizeof(user_data));
569
TriaObjectsHex::memory_consumption () const
571
return (MemoryConsumption::memory_consumption (face_orientations) +
572
MemoryConsumption::memory_consumption (face_flips) +
573
MemoryConsumption::memory_consumption (face_rotations) +
574
TriaObjects<TriaObject<3> >::memory_consumption() );
579
TriaObjectsQuad3D::memory_consumption () const
581
return (MemoryConsumption::memory_consumption (line_orientations) +
582
this->TriaObjects<TriaObject<2> >::memory_consumption() );
587
// explicit instantiations
589
template class TriaObjects<TriaObject<1> >;
590
template class TriaObjects<TriaObject<2> >;
594
DEAL_II_NAMESPACE_CLOSE