MOAB: Mesh Oriented datABase  (version 5.5.0)
test_rms.cpp
Go to the documentation of this file.
1 /**
2  * MOAB, a Mesh-Oriented datABase, is a software component for creating,
3  * storing and accessing finite element mesh data.
4  *
5  * Copyright 2004 Sandia Corporation. Under the terms of Contract
6  * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
7  * retains certain rights in this software.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  */
15 
16 #include "TSTT_MB_QueryInterface.h"
17 #include "moab/_RMBSet.hpp"
18 
19 using namespace moab;
20 
21 int compare_coords( double* xval,
22  double* yval,
23  double* zval,
24  double* nodex,
25  double* nodey,
26  double* nodez,
27  const int num_nodes );
28 int compare_connect( int* connect1, int* connect2, const int num_comps );
29 
30 #include <iostream>
31 
32 int main()
33 {
34  // very basic test of RMBSet
35  // The test: instantiate a mesh with 2 tet elements sharing a face;
36  // represent just the 5 nodes (1-5) and 2 elements (1234 & 3215)
37  //
38 
39  // nodal coordinates: shared tri in x-y plane with edges on x and y
40  // axes and a node at the origin, plus nodes at z = +- 1
41  //
42  // x4
43  // . .
44  // . x1 z
45  // . .\ /\ /\y
46  // . . \ E1 . |
47  // .. \ .|
48  // 2x------x3 .---->x
49  // . .
50  // .E2 .
51  // . .
52  // x5
53  // . .
54  // . x6
55  // . .\
56  // . . \ E3
57  // .. \
58  // 7x------x8
59  // . .
60  // . . E4
61  // . .
62  // x9
63  //
64  //
65  double nodex[] = { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 };
66  double nodey[] = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 };
67  double nodez[] = { 0.0, 0.0, 0.0, 1.0, -1.0, -2.0, -2.0, -2.0, -3.0 };
68  int connect[] = { 1, 2, 3, 4, 3, 2, 1, 5, 6, 7, 8, 5, 8, 7, 6, 9 };
69 
70  const int NUM_NODES = 9;
71 
72  // construct the RMS holding the nodes
73  MB_RMBSet node_rms( NUM_NODES, nodex, nodey, nodez, 1, 0 );
74 
75  // construct two RMS's holding each pair of elements
76  MB_RMBSet elem_rms1( 2, connect, 1, TSTT_REGION, TSTT_TETRAHEDRON );
77  MB_RMBSet elem_rms2( 2, &connect[8], 3, TSTT_REGION, TSTT_TETRAHEDRON );
78 
79  // now do some querying on this mesh
80 
81  // INFO FUNCTIONS
82  int entity_type1 = node_rms.entity_type();
83  int entity_type2 = elem_rms1.entity_type();
84  if( entity_type1 != TSTT_VERTEX || entity_type2 != TSTT_REGION )
85  std::cout << "entity_type() function failed." << std::endl;
86 
87  int entity_topo = elem_rms1.entity_topology();
88  if( entity_topo != TSTT_TETRAHEDRON ) std::cout << "entity_topology() function failed." << std::endl;
89 
90  int num_ents1 = node_rms.num_entities();
91  int num_ents2 = elem_rms1.num_entities();
92  if( num_ents1 != NUM_NODES || num_ents2 != 2 )
93  std::cout << "num_entities() function failed for" << ( num_ents1 != NUM_NODES ? "(nodes)" : "" )
94  << ( num_ents2 != 2 ? "(elems)" : "" ) << std::endl;
95 
96  int vpe = elem_rms1.vertices_per_element();
97  if( vpe != 4 ) std::cout << "vertices_per_element() failed." << std::endl;
98 
99  // NODES
100  /*
101  // get_coordinates
102  double coords[15];
103  coords[1] = node_rms.get_coordinates(1);
104  coords[2] = node_rms.get_coordinates(2);
105  coords[3] = node_rms.get_coordinates(3);
106  coords[4] = node_rms.get_coordinates(4);
107  coords[5] = node_rms.get_coordinates(5);
108  int result = compare_coords(coords, nodex, nodey, nodez, 5);
109  if (result == 0) std::cout << "get_coordinates works." << std::endl;
110  else std::cout << "get_coordinates didn't work; result = " << result << "." << std::endl;
111  */
112  // node_x, node_y, node_z
113  int num_nodes = NUM_NODES;
114  double xval[NUM_NODES], yval[NUM_NODES], zval[NUM_NODES];
115  double *xvalp = &xval[0], *yvalp = &yval[0], *zvalp = &zval[0];
116  node_rms.node_x( 1, NUM_NODES, &xvalp, &num_nodes );
117  node_rms.node_y( 1, NUM_NODES, &yvalp, &num_nodes );
118  node_rms.node_z( 1, NUM_NODES, &zvalp, &num_nodes );
119  int result = compare_coords( xval, yval, zval, nodex, nodey, nodez, NUM_NODES );
120  if( result != 0 ) std::cout << "node_[xyz] didn't work; result = " << result << "." << std::endl;
121 
122  // set_node_x, set_node_y, set_node_z
123  int i;
124  for( i = 1; i <= NUM_NODES; i++ )
125  {
126  nodex[i - 1] = (double)i;
127  nodey[i - 1] = (double)i;
128  nodez[i - 1] = (double)i;
129  }
130  node_rms.set_node_x( 1, NUM_NODES, nodex, NUM_NODES );
131  node_rms.set_node_y( 1, NUM_NODES, nodey, NUM_NODES );
132  node_rms.set_node_z( 1, NUM_NODES, nodez, NUM_NODES );
133  node_rms.node_x( 1, NUM_NODES, &xvalp, &num_nodes );
134  node_rms.node_y( 1, NUM_NODES, &yvalp, &num_nodes );
135  node_rms.node_z( 1, NUM_NODES, &zvalp, &num_nodes );
136  result = compare_coords( xval, yval, zval, nodex, nodey, nodez, NUM_NODES );
137  if( result != 0 ) std::cout << "node_[xyz] didn't work; result = " << result << "." << std::endl;
138 
139  // ELEMENTS
140  // elem_connectivity
141  int* connect2 = NULL;
142  int size_connect2 = 0;
143  bool status = elem_rms1.elem_connectivity( 1, 2, &connect2, &size_connect2 );
144  if( status != true ) std::cout << "elem_connectivity() RETURN VALUE failed." << std::endl;
145  if( 8 != size_connect2 ) std::cout << "re-sizing of connect2 vector failed." << std::endl;
146 
147  result = compare_connect( connect2, connect, 8 );
148  if( result != 0 ) std::cout << "elem_connectivity() VALUES failed." << std::endl;
149 
150  // set_elem_connectivity
151  // reverse the connectivity
152  for( i = 1; i <= 8; i++ )
153  connect2[i - 1] = connect[8 - i];
154  elem_rms1.set_elem_connectivity( 1, 2, connect2, size_connect2 );
155  status = elem_rms1.elem_connectivity( 1, 2, &connect2, &size_connect2 );
156  if( status != true ) std::cout << "set_elem_connectivity() RETURN VALUE failed." << std::endl;
157 
158  result = compare_connect( connect2, connect, 8 );
159  if( result != 0 ) std::cout << "elem_connectivity() VALUES failed." << std::endl;
160 
161  // RMESHSET FIND FUNCTIONS
162  // find the rmeshsets for a node, and an element in each set
163  MB_RMBSet *new_rms1, *new_rms2, *new_rms3;
164  new_rms1 = MB_RMBSet::find_rmeshset( TSTT_VERTEX, TSTT_LAST_TOPOLOGY, reinterpret_cast< const void* >( 2 ) );
165  new_rms2 = MB_RMBSet::find_rmeshset( TSTT_REGION, TSTT_TETRAHEDRON, reinterpret_cast< const void* >( 2 ) );
166  new_rms3 = MB_RMBSet::find_rmeshset( TSTT_REGION, TSTT_TETRAHEDRON, reinterpret_cast< const void* >( 4 ) );
167  if( new_rms1 != &node_rms || new_rms2 != &elem_rms1 || new_rms3 != &elem_rms2 )
168  std::cout << "find_rmeshset() function failed." << std::endl;
169 
170  // now test NULL returns
171  new_rms1 = MB_RMBSet::find_rmeshset( TSTT_VERTEX, TSTT_LAST_TOPOLOGY, reinterpret_cast< const void* >( 10 ) );
172  new_rms2 = MB_RMBSet::find_rmeshset( TSTT_REGION, TSTT_TETRAHEDRON, reinterpret_cast< const void* >( 0 ) );
173  new_rms3 = MB_RMBSet::find_rmeshset( TSTT_REGION, TSTT_TETRAHEDRON, reinterpret_cast< const void* >( 5 ) );
174  if( NULL != new_rms1 || NULL != new_rms2 || NULL != new_rms3 )
175  std::cout << "find_rmeshset() for NULL RETURN failed." << std::endl;
176 
177  // test is_in_rmeshset
178  bool result1, result2, result3;
179  result1 = node_rms.is_in_rmeshset( reinterpret_cast< const void* >( 6 ) );
180  result2 = elem_rms1.is_in_rmeshset( reinterpret_cast< const void* >( 2 ) );
181  result3 = elem_rms2.is_in_rmeshset( reinterpret_cast< const void* >( 4 ) );
182  if( false == result1 || false == result2 || false == result3 ) std::cout << "is_in_rmeshset() failed." << std::endl;
183 
184  // test is_in_rmeshset
185  result1 = node_rms.is_in_rmeshset( reinterpret_cast< const void* >( 10 ) );
186  result2 = elem_rms1.is_in_rmeshset( reinterpret_cast< const void* >( 4 ) );
187  result3 = elem_rms2.is_in_rmeshset( reinterpret_cast< const void* >( 2 ) );
188  if( true == result1 || true == result2 || true == result3 )
189  std::cout << "is_in_rmeshset() for NULL RETURN failed." << std::endl;
190 
191  return 1;
192 }
193 
194 int compare_coords( double* xval,
195  double* yval,
196  double* zval,
197  double* nodex,
198  double* nodey,
199  double* nodez,
200  const int num_nodes )
201 {
202  int i, result = 0;
203  for( i = 0; i < num_nodes; i++ )
204  {
205  if( xval[i] != nodex[i] || yval[i] != nodey[i] || zval[i] != nodez[i] ) result++;
206  xval[i] = yval[i] = zval[i] = -2.0;
207  }
208  return result;
209 }
210 
211 int compare_connect( int* connect1, int* connect2, const int num_comps )
212 {
213  int i, result = 0;
214  for( i = 0; i < num_comps; i++ )
215  {
216  if( connect1[i] != connect2[i] ) result++;
217  connect2[i] = -1;
218  }
219 
220  return result;
221 }