[MOAB-dev] question about the order of the vertices of triangle in MOAB

Huayi Wei huayiwei1984 at gmail.com
Sun Jun 22 08:21:34 CDT 2014


Hi, Moab Developer,

I am learning how to use moab and meet a problem. I write a test to 
check the order of the vertices of a triangle based Moab.  Suppose we 
have two triangles (2, 4, 1) and (3, 1, 4) as following:

3--------------4
|               /  |
|           /      |
|       /          |
|   /              |
1--------------2

I create them in Moab and then get them again by `get_connectivity`. I 
found the orders were changed to (1,2,4) and ( 1, 3, 4).

I check the implement of `get_connectivity`, and find a `sort` operation 
in it.  But the comment of `get_connectivity` say the range is unordered!


```
     //! Gets the connectivity for a vector of elements
     /** Same as vector-based version except range is returned (unordered!)
      */
   virtual ErrorCode  get_connectivity(const EntityHandle *entity_handles,
                                         const int num_handles,
                                         Range &connectivity,
                                         bool corners_only = false) const;
```

My question is how can I get the same order  as my setting at beginning? 
You know the order is important for finite element method and I want to 
write some finite
element code based on Moab.

I am not familar with moab and I need your help. Thanks very much.

Best

Huayi


```
#include "moab/Core.hpp"
#include <iostream>
#include <assert.h>

using namespace moab;
using namespace std;

int main()
{
     string file_name = "order_mesh.vtk";
     Interface *iface = new Core;

     // ***************************
     // *   Create the vertexes   *
     // ***************************

     const double vertex_coords[3*4] = {0,0,0, 1,0,0, 0,1,0, 1,1,0 };

     Range vertex_handles;
     ErrorCode rval = 
iface->create_vertices(vertex_coords,4,vertex_handles);
     assert(rval == MB_SUCCESS);

     // You can print out a range to see what elements it contains:
     std::cout << "Just created the following entities:"
           << vertex_handles << std::endl;

     // ***************************
     // *   Create the faces      *
     // ***************************

     EntityHandle conn[2][3] = { {2,4,1}, {3,1,4} };

     Range tri_handles;
     EntityHandle tri_handle;
     for(int i = 0; i < 2; i++)
     {
         rval = iface->create_element(MBTRI,conn[i],3,tri_handle);
         tri_handles.insert(tri_handle);
     }

     // Let's see what entities we just created:
     cout << "Just created the following entities: "
           << tri_handles << endl;

     Range::iterator tit;
     for(tit = tri_handles.begin(); tit != tri_handles.end(); tit ++)
     {
         EntityHandle tri = *tit;

         Range conn;
         iface->get_connectivity(&tri, 1, conn);

         Range::iterator cit;
         for(cit = conn.begin(); cit != conn.end(); cit ++)
         {
             cout << " " << *cit;
         }
         cout << endl;

     }

     rval = iface->write_file(file_name.c_str());

     return 0 ;
}

```




More information about the moab-dev mailing list