MOAB: Mesh Oriented datABase  (version 5.5.0)
cubit_perf.cpp File Reference
#include <sys/resource.h>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include "CubitNode.hpp"
#include "NodeHex.hpp"
+ Include dependency graph for cubit_perf.cpp:

Go to the source code of this file.

Macros

#define VINDEX(i, j, k)   ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) )
 

Functions

void __ctype_toupper ()
 
void print_time (const bool print_em, double &tot_time, double &utime, double &stime)
 
void build_coords (const int nelem, double *&coords)
 
void build_connect (const int nelem, int *&connect)
 
int main (int argc, char *argv[])
 

Variables

const double LENGTH = 1.0
 

Macro Definition Documentation

◆ VINDEX

#define VINDEX (   i,
  j,
 
)    ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) )

Function Documentation

◆ __ctype_toupper()

void __ctype_toupper ( )

Definition at line 41 of file cubit_perf.cpp.

41 {}

◆ build_connect()

void build_connect ( const int  nelem,
int *&  connect 
)

Definition at line 75 of file cubit_perf.cpp.

76 {
77  // allocate the memory
78  int nume_tot = nelem * nelem * nelem;
79  connect = new int[8 * nume_tot];
80 
81  int numv = nelem + 1;
82  int numv_sq = numv * numv;
83  int idx = 0;
84  int vijk;
85  for( int i = 0; i < nelem; i++ )
86  {
87  for( int j = 0; j < nelem; j++ )
88  {
89  for( int k = 0; k < nelem; k++ )
90  {
91  vijk = VINDEX( i, j, k );
92  connect[idx++] = vijk;
93  connect[idx++] = vijk + 1;
94  connect[idx++] = vijk + 1 + numv;
95  connect[idx++] = vijk + numv;
96  connect[idx++] = vijk + numv * numv;
97  connect[idx++] = vijk + 1 + numv * numv;
98  connect[idx++] = vijk + 1 + numv + numv * numv;
99  connect[idx++] = vijk + numv + numv * numv;
100  assert( idx <= 8 * nume_tot );
101  }
102  }
103  }
104 }

References VINDEX.

Referenced by main().

◆ build_coords()

void build_coords ( const int  nelem,
double *&  coords 
)

Definition at line 46 of file cubit_perf.cpp.

47 {
48  // allocate the memory
49  int numv = nelem + 1;
50  int numv_sq = numv * numv;
51  int tot_numv = numv * numv * numv;
52  coords = new double[3 * tot_numv];
53 
54  double scale = LENGTH / nelem;
55 // use FORTRAN-like indexing
56 #define VINDEX( i, j, k ) ( ( i ) + ( (j)*numv ) + ( (k)*numv_sq ) )
57 
58  int idx;
59  for( int i = 0; i < numv; i++ )
60  {
61  for( int j = 0; j < numv; j++ )
62  {
63  for( int k = 0; k < numv; k++ )
64  {
65  idx = VINDEX( i, j, k );
66  // interleaved coordinate ordering
67  coords[3 * idx] = i * scale;
68  coords[3 * idx + 1] = j * scale;
69  coords[3 * idx + 2] = k * scale;
70  }
71  }
72  }
73 }

References LENGTH, and VINDEX.

Referenced by main().

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 106 of file cubit_perf.cpp.

107 {
108  int nelem = 20;
109  if( argc > 1 )
110  {
111  sscanf( argv[1], "%d", &nelem );
112  }
113  std::cout << "number of elements: " << nelem << std::endl;
114 
115  // create a hex mesh in a 1x1x1 cube with nelem number of
116  // elements along an edge
117  int nnodes = nelem + 1;
118 
119  double* coords = NULL;
120  int* connect = NULL;
121 
122  // build the coordinates
123  build_coords( nelem, coords );
124 
125  // build the connectivity
126  build_connect( nelem, connect );
127 
128  assert( NULL != connect && NULL != coords );
129 
130  double ttime0, ttime1, ttime2, ttime3, utime, stime;
131  print_time( false, ttime0, utime, stime );
132  int nodes_tot = nnodes * nnodes * nnodes;
133  CubitNode** node_array = new CubitNode*[nodes_tot];
134  int i;
135  for( i = 0; i < nodes_tot; i++ )
136  node_array[i] = new CubitNode( coords[3 * i], coords[3 * i + 1], coords[3 * i + 2] );
137 
138  int nelem_tot = nelem * nelem * nelem;
139  NodeHex** hex_array = new NodeHex*[nelem_tot];
140  int j = 0;
141  CubitNode* conn[8];
142  for( i = 0; i < nelem_tot; i++ )
143  {
144  conn[0] = node_array[connect[j]];
145  conn[1] = node_array[connect[j + 1]];
146  conn[2] = node_array[connect[j + 2]];
147  conn[3] = node_array[connect[j + 3]];
148  conn[4] = node_array[connect[j + 4]];
149  conn[5] = node_array[connect[j + 5]];
150  conn[6] = node_array[connect[j + 6]];
151  conn[7] = node_array[connect[j + 7]];
152  j += 8;
153 
154  hex_array[i] = new NodeHex( conn );
155  }
156 
157  print_time( false, ttime1, utime, stime );
158 
159  // query element to vertex
160 
161  for( i = 0; i < nelem_tot; i++ )
162  {
163  double centroid[3] = { 0.0, 0.0, 0.0 };
164  hex_array[i]->hex_nodes( conn[0], conn[1], conn[2], conn[3], conn[4], conn[5], conn[6], conn[7] );
165  for( j = 0; j < 8; j++ )
166  {
167  centroid[0] += conn[j]->node_x();
168  centroid[1] += conn[j]->node_y();
169  centroid[2] += conn[j]->node_z();
170  }
171  }
172 
173  print_time( false, ttime2, utime, stime );
174 
175  // need to allocate & populate TDHexKnowing for these
176  for( i = 0; i < nelem_tot; i++ )
177  hex_array[i]->add_hex_to_nodes();
178 
179  DLIList< CubitHex* > hexes;
180  for( i = 0; i < nodes_tot; i++ )
181  {
182  node_array[i]->all_hexes( hexes );
183  }
184 
185  print_time( false, ttime3, utime, stime );
186 
187  std::cout << "CUBIT: nelem, construct, e_to_v query, v_to_e query = " << nelem << ", " << ttime1 - ttime0 << ", "
188  << ttime2 - ttime1 << ", " << ttime3 - ttime2 << " seconds" << std::endl;
189  return 0;
190 }

References build_connect(), build_coords(), and print_time().

◆ print_time()

void print_time ( const bool  print_em,
double &  tot_time,
double &  utime,
double &  stime 
)

Definition at line 192 of file cubit_perf.cpp.

193 {
194  struct rusage r_usage;
195  getrusage( RUSAGE_SELF, &r_usage );
196  utime = (double)r_usage.ru_utime.tv_sec + ( (double)r_usage.ru_utime.tv_usec / 1.e6 );
197  stime = (double)r_usage.ru_stime.tv_sec + ( (double)r_usage.ru_stime.tv_usec / 1.e6 );
198  tot_time = utime + stime;
199  if( print_em )
200  std::cout << "User, system, total time = " << utime << ", " << stime << ", " << tot_time << std::endl;
201 #ifndef LINUX
202  std::cout << "Max resident set size = " << r_usage.ru_maxrss * 4096 << " bytes" << std::endl;
203  std::cout << "Int resident set size = " << r_usage.ru_idrss << std::endl;
204 #else
205  system( "ps o args,drs,rss | grep perf | grep -v grep" ); // RedHat 9.0 doesnt fill in actual
206  // memory data
207 #endif
208 }

Referenced by main().

Variable Documentation

◆ LENGTH

const double LENGTH = 1.0

Definition at line 38 of file cubit_perf.cpp.

Referenced by build_coords().