Mesh Oriented datABase  (version 5.5.0)
An array-based unstructured mesh library
update_tracer.cpp
Go to the documentation of this file.
1 #include "iMesh.h"
2 #include "MBiMesh.hpp"
3 #include "moab/Core.hpp"
4 #include "moab/Range.hpp"
7 #include "IntxUtilsCSLAM.hpp"
8 
9 extern "C" void update_tracer( iMesh_Instance instance, iBase_EntitySetHandle imesh_euler_set, int* ierr )
10 {
11  using namespace moab;
12  const double radius = 1.;
13  const double gtol = 1.e-9;
14  const bool debug = false;
15 
16  Range ents;
17  moab::Interface* mb = MOABI;
18  *ierr = 1;
19 
20  EntityHandle euler_set = (EntityHandle)imesh_euler_set;
21 
22  Intx2MeshOnSphere worker( mb );
25  worker.set_error_tolerance( gtol );
26 
27  EntityHandle covering_lagr_set;
28 
29  ErrorCode rval = mb->create_meshset( MESHSET_SET, covering_lagr_set );MB_CHK_SET_ERR_RET( rval, "can't create covering set " );
30 
31  // we need to update the correlation tag and remote tuples
32  rval = worker.create_departure_mesh_2nd_alg( euler_set, covering_lagr_set );MB_CHK_SET_ERR_RET( rval, "can't populate covering set " );
33 
34  if( debug )
35  {
36  rval = mb->write_file( "lagr.h5m", 0, 0, &covering_lagr_set, 1 );MB_CHK_SET_ERR_RET( rval, "can't write covering set " );
37  }
38 
39  // enforce convexity for the set
40  rval = moab::IntxUtils::enforce_convexity( mb, covering_lagr_set );MB_CHK_SET_ERR_RET( rval, "can't write covering set " );
41 
42  EntityHandle outputSet;
43  rval = mb->create_meshset( MESHSET_SET, outputSet );MB_CHK_SET_ERR_RET( rval, "can't create output set " );
44 
45  rval = worker.intersect_meshes( covering_lagr_set, euler_set, outputSet );MB_CHK_SET_ERR_RET( rval, "can't intersect " );
46 
47  if( debug )
48  {
49  rval = mb->write_file( "output.vtk", 0, 0, &outputSet, 1 );MB_CHK_SET_ERR_RET( rval, "can't write covering set " );
50  }
51 
52  // tagElem is the average computed at each element, from nodal values
53  Tag tagElem = 0;
54  std::string tag_name2( "TracerAverage" );
55  rval = mb->tag_get_handle( tag_name2.c_str(), 1, MB_TYPE_DOUBLE, tagElem, MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR_RET( rval, "can't get tracer tag " );
56 
57  // area of the euler element is fixed, store it; it is used to recompute the averages at each
58  // time step
59  Tag tagArea = 0;
60  std::string tag_name4( "Area" );
61  rval = mb->tag_get_handle( tag_name4.c_str(), 1, MB_TYPE_DOUBLE, tagArea, MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR_RET( rval, "can't get area tag" );
62 
63  rval = worker.update_tracer_data( outputSet, tagElem, tagArea );MB_CHK_SET_ERR_RET( rval, "can't update tracer " );
64 
65  // everything can be deleted now from intx data; polygons, etc.
66 
67  *ierr = 0;
68  return;
69 }