File: test-axisalignedcubegeometry.cc

package info (click to toggle)
dune-geometry 2.10.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 2,304 kB
  • sloc: cpp: 15,221; python: 253; makefile: 3
file content (153 lines) | stat: -rw-r--r-- 3,726 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception

/** \file
    \brief A unit test for the AxisAlignedCubeGeometry class
 */

#include <iostream>

#include <dune/common/exceptions.hh>
#include <dune/common/ios_state.hh>

#include <dune/geometry/axisalignedcubegeometry.hh>
#include <dune/geometry/test/checkgeometry.hh>


using namespace Dune;

void fail(int &result) {
  result = 1;
}
void pass(int &result) {
  if(result == 77) result = 0;
}

/** \brief Test whether the given BasicGeometry object 'affine' attribute is
 *         set correctly
 *
 * \param geometry       The Geometry object to test.
 * \param expectedAffine Whether the geometry should be affine.
 * \param result         Collect pass/fail results.
 */
template <class TestGeometry>
void testBasicGeometryAffine(const TestGeometry& geometry, int &result)
{
  if( not geometry.affine() ) {
    Dune::ios_base_all_saver saver(std::cerr);
    std::cerr << std::boolalpha;
    std::cerr << "Error: Hypercube geometry is not affine!" << std::endl;
    fail(result);
  }
  else
    pass(result);
}


template <int dim, int coorddim>
void testCodimZero(int& result)
{
  std::cout << "== coorddimension = " << coorddim << std::endl;
  std::cout << "=== mydimension = " << dim << std::endl;

  typedef AxisAlignedCubeGeometry<double, dim, coorddim> ElementGeometry;

  FieldVector<double,coorddim> lower(0);
  FieldVector<double,coorddim> upper(1);
  std::bitset<coorddim> axes(0);
  for (int i=0; i<dim; i++)
    axes[i] = true;

  ElementGeometry geometry( lower, upper, axes );

  if (checkGeometry(geometry))
    pass(result);
  else
    fail(result);

  testBasicGeometryAffine(geometry, result);

  // test default construction and assignment
  ElementGeometry geometry2;
  geometry2 = geometry;

  if (checkGeometry(geometry2))
    pass(result);
  else
    fail(result);
}

template <int dim, int coorddim>
void testCodimNonZero(int& result)
{
  std::cout << "== coorddimension = " << coorddim << std::endl;
  std::cout << "=== mydimension = " << dim << std::endl;

  typedef AxisAlignedCubeGeometry<double, dim, coorddim> ElementGeometry;

  FieldVector<double,coorddim> lower(-1);
  FieldVector<double,coorddim> upper(3);

  for (size_t i=0; i<(1<<coorddim)-1; i++) {

    std::bitset<coorddim> axes(i);
    if (axes.count() != dim)
      continue;

    ElementGeometry geometry( lower, upper, axes );

    if (checkGeometry(geometry))
      pass(result);
    else
      fail(result);

    testBasicGeometryAffine(geometry, result);

    // test default construction and assignment
    ElementGeometry geometry2;
    geometry2 = geometry;

    if (checkGeometry(geometry2))
      pass(result);
    else
      fail(result);
  }

}


int main (int /* argc */ , char ** /* argv */) try
{
  // 77 means "SKIP"
  int result = 77;

  testCodimZero<0,0>(result);
  testCodimZero<1,1>(result);
  testCodimZero<2,2>(result);
  testCodimZero<3,3>(result);

  testCodimNonZero<0,2>(result);
  testCodimNonZero<1,2>(result);
  testCodimNonZero<2,2>(result);

  testCodimNonZero<0,3>(result);
  testCodimNonZero<1,3>(result);
  testCodimNonZero<2,3>(result);
  testCodimNonZero<3,3>(result);

  // Test what happens when a zero-dimensional geometry (a point) is
  // constructed with the codim-zero constructor (taking lower and upper
  // corners).
  testCodimZero<0,3>(result);

  return result;
}
catch (Dune::Exception& e) {
  std::cerr << e << std::endl;
  throw;
} catch (...) {
  std::cerr << "Generic exception!" << std::endl;
  throw;
}