moab
ElemUtilTest.cpp File Reference
#include "TestUtil.hpp"
#include "ElemUtil.hpp"
#include <iostream>

Go to the source code of this file.

Functions

void test_hex_nat_coords ()
int main ()
CartVect hex_map (const CartVect &xi, const CartVect *corners)
static void hex_bounding_box (const CartVect *corners, CartVect &min, CartVect &max)
static bool in_range (const CartVect &xi)

Variables

const CartVect cube_corners [8]
const CartVect hex_corners [8]

Function Documentation

static void hex_bounding_box ( const CartVect corners,
CartVect min,
CartVect max 
) [static]

Definition at line 50 of file ElemUtilTest.cpp.

{
  min = max = corners[0];
  for (unsigned i = 1; i < 8; ++i)
    for (unsigned d = 0; d < 3; ++d)
      if (corners[i][d] < min[d])
        min[d] = corners[i][d];
      else if (corners[i][d] > max[d])
        max[d] = corners[i][d];
}
CartVect hex_map ( const CartVect xi,
const CartVect corners 
)

shape function for trilinear hex

Definition at line 36 of file ElemUtilTest.cpp.

{
  CartVect x(0.0);
  x += (1 - xi[0]) * (1 - xi[1]) * (1 - xi[2]) * corners[0];
  x += (1 + xi[0]) * (1 - xi[1]) * (1 - xi[2]) * corners[1];
  x += (1 + xi[0]) * (1 + xi[1]) * (1 - xi[2]) * corners[2];
  x += (1 - xi[0]) * (1 + xi[1]) * (1 - xi[2]) * corners[3];
  x += (1 - xi[0]) * (1 - xi[1]) * (1 + xi[2]) * corners[4];
  x += (1 + xi[0]) * (1 - xi[1]) * (1 + xi[2]) * corners[5];
  x += (1 + xi[0]) * (1 + xi[1]) * (1 + xi[2]) * corners[6];
  x += (1 - xi[0]) * (1 + xi[1]) * (1 + xi[2]) * corners[7];
  return x *= 0.125;
}
static bool in_range ( const CartVect xi) [static]

Definition at line 61 of file ElemUtilTest.cpp.

  { return fabs(xi[0]) <= 1 
        && fabs(xi[1]) <= 1 
        && fabs(xi[2]) <= 1; 
  }        
int main ( )

Definition at line 9 of file ElemUtilTest.cpp.

{
  int rval = 0;
  rval += RUN_TEST(test_hex_nat_coords);
  return rval;
}

Definition at line 67 of file ElemUtilTest.cpp.

{
  CartVect xi, result_xi;
  bool valid;
  // rename EPS to EPS1 because of conflict with definition of EPS in types.h
  // types.h is now included in the header.
  const double EPS1 = 1e-6;
  
    // first test with cube because it's easier to debug failures
  std::vector<CartVect> cube_corners2;
  std::copy(cube_corners, cube_corners+8, std::back_inserter(cube_corners2));
  Element::LinearHex hex(cube_corners2);
  for (xi[0] = -1; xi[0] <= 1; xi[0] += 0.2) {
    for (xi[1] = -1; xi[1] <= 1; xi[1] += 0.2) {
      for (xi[2] = -1; xi[2] <= 1; xi[2] += 0.2) {
        const CartVect pt = hex_map(xi, cube_corners);
        result_xi = hex.ievaluate(pt, EPS1/10);
        double dum = EPS1/10;
        valid = hex.inside_nat_space(result_xi, dum);
        CHECK(valid);
        CHECK_REAL_EQUAL( xi[0], result_xi[0], EPS1 );
        CHECK_REAL_EQUAL( xi[1], result_xi[1], EPS1 );
        CHECK_REAL_EQUAL( xi[2], result_xi[2], EPS1 );
      }
    }
  }
  
    // now test with distorted hex
  std::vector<CartVect> hex_corners2;
  std::copy(hex_corners, hex_corners+8, std::back_inserter(hex_corners2));
  Element::LinearHex hex2(hex_corners2);
  for (xi[0] = -1; xi[0] <= 1; xi[0] += 0.2) {
    for (xi[1] = -1; xi[1] <= 1; xi[1] += 0.2) {
      for (xi[2] = -1; xi[2] <= 1; xi[2] += 0.2) {
        const CartVect pt = hex_map(xi, hex_corners);
        result_xi = hex2.ievaluate(pt, EPS1/10);
        double dum = EPS1/10;
        valid = hex2.inside_nat_space(result_xi, dum);
        CHECK(valid);
        CHECK_REAL_EQUAL( xi[0], result_xi[0], EPS1 );
        CHECK_REAL_EQUAL( xi[1], result_xi[1], EPS1 );
        CHECK_REAL_EQUAL( xi[2], result_xi[2], EPS1 );
      }
    }
  }
  
    // test points outside of element
  CartVect x, min, max;
  hex_bounding_box( cube_corners, min, max );
  for (x[0] = -1; x[0] <= 2; x[0] += 0.4) {
    for (x[1] = -1; x[1] <= 2; x[1] += 0.4) {
      for (x[2] = -1; x[2] <= 2; x[2] += 0.4) {
        bool in_box = x[0] >= min[0] && x[0] <= max[0] 
                   && x[1] >= min[1] && x[1] <= max[1]
                   && x[2] >= min[2] && x[2] <= max[2];
        if (in_box)
          continue;
        result_xi = hex.ievaluate(x, EPS1/10);
        double dum = EPS1/10;
        valid = hex.inside_nat_space(result_xi, dum);
        
//std::cout << (valid ? 'y' : 'n');
        CHECK(!valid || !in_range(result_xi));
      }
    }
  }
//std::cout << std::endl;

  hex_bounding_box( hex_corners, min, max );
  for (x[0] = -1; x[0] <= 3; x[0] += 0.5) {
    for (x[1] = -2; x[1] <= 4; x[1] += 0.5) {
      for (x[2] = -1; x[2] <= 2; x[2] += 0.4) {
        bool in_box = x[0] >= min[0] && x[0] <= max[0] 
                   && x[1] >= min[1] && x[1] <= max[1]
                   && x[2] >= min[2] && x[2] <= max[2];
        if (in_box)
          continue;
        try {
          result_xi = hex2.ievaluate(x, EPS1/10);
        }
        catch (Element::Map::EvaluationError err) {
          valid = false;
        }
//std::cout << (valid ? 'y' : 'n');
        CHECK(!valid || !in_range(result_xi));
      }
    }
  }
//std::cout << std::endl;
}

Variable Documentation

Initial value:
 { CartVect( 0, 0, 0 ),
                                     CartVect( 1, 0, 0 ),
                                     CartVect( 1, 1, 0 ),
                                     CartVect( 0, 1, 0 ),
                                     CartVect( 0, 0, 1 ),
                                     CartVect( 1, 0, 1 ),
                                     CartVect( 1, 1, 1 ),
                                     CartVect( 0, 1, 1 ) }

Definition at line 16 of file ElemUtilTest.cpp.

Initial value:
 { CartVect( 1.0e0, 0.0e0, 0.0e0 ),
                                    CartVect( 1.0e0, 1.0e0, 0.3e0 ),
                                    CartVect( 0.0e0, 2.0e0, 0.6e0 ),
                                    CartVect( 0.2e0, 1.1e0, 0.4e0 ),
                                    CartVect( 1.5e0, 0.3e0, 1.0e0 ),
                                    CartVect( 1.5e0, 1.3e0, 1.0e0 ),
                                    CartVect( 0.5e0, 2.3e0, 1.0e0 ),
                                    CartVect( 0.7e0, 1.4e0, 1.0e0 ) }

Definition at line 26 of file ElemUtilTest.cpp.

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines