Mesh Oriented datABase  (version 5.5.0)
An array-based unstructured mesh library
case1_test.cpp
Go to the documentation of this file.
1 /*
2  * case1_test.cpp
3  *
4  * Created on: Feb 12, 2013
5  */
6 
7 // copy from par_sph_intx
8 // will save the LOC tag on the euler nodes? maybe
9 #include <iostream>
10 #include <cmath> // for M_PI
11 
12 #include "moab/Core.hpp"
13 #include "moab/Interface.hpp"
15 #include "moab/ProgOptions.hpp"
16 #include "MBTagConventions.hpp"
17 
19 #include "IntxUtilsCSLAM.hpp"
20 
21 #include "TestUtil.hpp"
22 
23 using namespace moab;
24 // some input data
25 double gtol = 0.0001; // this is for geometry tolerance
26 double CubeSide = 6.; // the above file starts with cube side 6; radius depends on cube side
27 double t = 0.1, delta_t = 0.43; // check the script
28 
30 {
31  /*
32  * get all quads first, then vertices, then move them on the surface of the sphere
33  * radius is in, it comes from MeshKit/python/examples/manufHomme.py :
34  * length = 6.
35  * each edge of the cube will be divided using this meshcount
36  * meshcount = 11
37  * circumscribed sphere radius
38  * radius = length * math.sqrt(3) /2
39  */
40  double radius = CubeSide / 2 * sqrt( 3. ); // our value depends on cube side
41  Range quads;
42  ErrorCode rval = mb->get_entities_by_type( euler_set, MBQUAD, quads );
43  if( MB_SUCCESS != rval ) return rval;
44 
45  Range connecVerts;
46  rval = mb->get_connectivity( quads, connecVerts );
47  if( MB_SUCCESS != rval ) return rval;
48 
49  // create new set
50  rval = mb->create_meshset( MESHSET_SET, lagr_set );
51  if( MB_SUCCESS != rval ) return rval;
52 
53  // get the coordinates of the old mesh, and move it around the sphere according to case 1
54  // now put the vertices in the right place....
55  // int vix=0; // vertex index in new array
56 
57  // first create departure points (vertices in the lagrange mesh)
58  // then connect them in quads
59  std::map< EntityHandle, EntityHandle > newNodes;
60  for( Range::iterator vit = connecVerts.begin(); vit != connecVerts.end(); ++vit )
61  {
62  EntityHandle oldV = *vit;
63  CartVect posi;
64  rval = mb->get_coords( &oldV, 1, &( posi[0] ) );
65  if( MB_SUCCESS != rval ) return rval;
66  // Intx utils, case 1
67  CartVect newPos;
69  newPos = radius * newPos;
70  EntityHandle new_vert;
71  rval = mb->create_vertex( &( newPos[0] ), new_vert );
72  if( MB_SUCCESS != rval ) return rval;
73  newNodes[oldV] = new_vert;
74  }
75  for( Range::iterator it = quads.begin(); it != quads.end(); ++it )
76  {
77  EntityHandle q = *it;
78  int nnodes;
79  const EntityHandle* conn4;
80  rval = mb->get_connectivity( q, conn4, nnodes );
81  if( MB_SUCCESS != rval ) return rval;
82  EntityHandle new_conn[4];
83  for( int i = 0; i < nnodes; i++ )
84  {
85  EntityHandle v1 = conn4[i];
86  new_conn[i] = newNodes[v1];
87  }
88  EntityHandle new_quad;
89  rval = mb->create_element( MBQUAD, new_conn, 4, new_quad );
90  if( MB_SUCCESS != rval ) return rval;
91  rval = mb->add_entities( lagr_set, &new_quad, 1 );
92  if( MB_SUCCESS != rval ) return rval;
93  }
94 
95  return rval;
96 }
97 int main( int argc, char** argv )
98 {
99 
100  const char* filename_mesh1 = STRINGIFY( MESHDIR ) "/mbcslam/eulerHomme.vtk";
101  if( argc > 1 )
102  {
103  int index = 1;
104  while( index < argc )
105  {
106  if( !strcmp( argv[index], "-gtol" ) ) // this is for geometry tolerance
107  {
108  gtol = atof( argv[++index] );
109  }
110  if( !strcmp( argv[index], "-cube" ) )
111  {
112  CubeSide = atof( argv[++index] );
113  }
114  if( !strcmp( argv[index], "-dt" ) )
115  {
116  delta_t = atof( argv[++index] );
117  }
118  if( !strcmp( argv[index], "-input" ) )
119  {
120  filename_mesh1 = argv[++index];
121  }
122  index++;
123  }
124  }
125  std::cout << " case 1: use -gtol " << gtol << " -dt " << delta_t << " -cube " << CubeSide << " -input "
126  << filename_mesh1 << "\n";
127 
128  Core moab;
129  Interface& mb = moab;
130  EntityHandle euler_set;
131  ErrorCode rval;
132  rval = mb.create_meshset( MESHSET_SET, euler_set );
133  if( MB_SUCCESS != rval ) return 1;
134 
135  rval = mb.load_file( filename_mesh1, &euler_set );
136 
137  if( MB_SUCCESS != rval ) return 1;
138 
139  // everybody will get a DP tag, including the non owned entities; so exchange tags is not
140  // required for LOC (here)
141  EntityHandle lagrange_set;
142  rval = manufacture_lagrange_mesh_on_sphere( &mb, euler_set, lagrange_set );
143  if( MB_SUCCESS != rval ) return 1;
144  rval = mb.write_file( "lagrIni.h5m", 0, 0, &lagrange_set, 1 );
145  if( MB_SUCCESS != rval ) std::cout << "can't write lagr set\n";
146 
147  rval = moab::IntxUtils::enforce_convexity( &mb, lagrange_set );
148  if( MB_SUCCESS != rval ) return 1;
149 
150  rval = mb.write_file( "lagr.h5m", 0, 0, &lagrange_set, 1 );
151  if( MB_SUCCESS != rval ) std::cout << "can't write lagr set\n";
152 
153  Intx2MeshOnSphere worker( &mb );
154 
155  double radius = CubeSide / 2 * sqrt( 3. ); // input
156 
157  worker.set_radius_source_mesh( radius );
159 
160  // worker.SetEntityType(MBQUAD);
161 
162  worker.set_error_tolerance( gtol );
163  std::cout << "error tolerance epsilon_1=" << gtol << "\n";
164 
165  EntityHandle outputSet;
166  rval = mb.create_meshset( MESHSET_SET, outputSet );
167  if( MB_SUCCESS != rval ) return 1;
168  rval = worker.FindMaxEdges( lagrange_set, euler_set );
169  if( MB_SUCCESS != rval ) return 1;
170  rval = worker.intersect_meshes( lagrange_set, euler_set, outputSet );
171  if( MB_SUCCESS != rval ) return 1;
172 
173  // std::string opts_write("");
174  std::stringstream outf;
175  outf << "intersect1"
176  << ".h5m";
177  rval = mb.write_file( outf.str().c_str(), 0, 0, &outputSet, 1 );
178  if( MB_SUCCESS != rval ) std::cout << "can't write output\n";
179 
180  moab::IntxAreaUtils sphAreaUtils;
181  double intx_area = sphAreaUtils.area_on_sphere( &mb, outputSet, radius );
182  double arrival_area = sphAreaUtils.area_on_sphere( &mb, euler_set, radius );
183  std::cout << " Arrival area: " << arrival_area << " intersection area:" << intx_area
184  << " rel error: " << fabs( ( intx_area - arrival_area ) / arrival_area ) << "\n";
185  if( MB_SUCCESS != rval ) return 1;
186 
187  return 0;
188 }