46 std::vector<COM::Connectivity*> conn;
47 _pane->connectivities(conn);
52 for(uint
i=0;
i<conn.size(); ++
i){
54 cout <<
"Connectivity " <<
i <<
" has name " << conn[
i]->name() << endl;
55 cout <<
"offset = " << offset << endl;
57 cptr = conn[
i]->pointer();
58 uint
nj = _with_ghost ? (uint)conn[
i]->size_of_elements() :
59 (uint)conn[
i]->size_of_real_elements();
60 for(uint
j = 0;
j<
nj; ++
j){
61 temp = cptr[offset+4*
j];
62 cptr[offset+4*
j] = cptr[offset+4*
j+2];
63 cptr[offset+4*
j+2] = temp;
70 cout <<
"MesqPane::init" << endl;
71 _dc =
new MAP::Pane_dual_connectivity(_pane, _with_ghost);
73 cout <<
"Building pb" << endl;
74 MAP::Pane_boundary pb(_pane);
76 cout <<
"Finished building pb" << endl;
77 std::vector<bool> _is_isolated;
80 cout <<
"Determining border nodes" << endl;
82 pb.determine_border_nodes(_is_border, _is_isolated, NULL, 1);
84 pb.determine_border_nodes(_is_border, _is_isolated, NULL, 0);
86 cout <<
"Finished determining border nodes" << endl;
87 int siz = _is_border.size();
88 for(
int i =0;
i < siz; ++
i){
89 if(_is_border[
i] && _verb >1)
90 cout <<
" node " <<
i+1 <<
" is on the border" << endl;
91 if(_is_isolated[
i] && _verb >1)
92 cout <<
" node " <<
i+1 <<
" is isolated" << endl;
93 if(!(_is_border[
i] || _is_isolated[
i]) && _verb >1)
94 cout <<
" node " << i+1 <<
" is free" << endl;
95 _is_border[
i] = (_is_border[
i] || _is_isolated[
i]);
98 _vertexBytes.resize(_with_ghost ? _pane->size_of_nodes() :
99 _pane->size_of_real_nodes());
101 cout <<
" size_of_elements = " << _pane->size_of_elements() << endl;
102 cout <<
" size_of_ghost_elements = " << _pane->size_of_ghost_elements() << endl;
103 cout <<
" size_of_real_elements = " << _pane->size_of_real_elements() << endl;
104 cout <<
" size_of_nodes = " << _pane->size_of_nodes() << endl;
105 cout <<
" size_of_ghost_nodes = " << _pane->size_of_ghost_nodes() << endl;
106 cout <<
" size_of_real_nodes = " << _pane->size_of_real_nodes() << endl;
109 cout <<
"MesqPane::init done" << endl;
115 cout <<
"MesqPane::get_all_vertices" << endl;
116 int pane_size = _with_ghost ? _pane->size_of_nodes() :
117 _pane->size_of_real_nodes();
119 "Array_Size Must Be At Least Number of Nodes");
120 for(
int i = 1;
i <= pane_size; ++
i){
121 vert_array[
i-1] = ((
char*)NULL)+
i;
124 cout <<
"MesqPane::get_all_vertices done" << endl;
130 cout <<
"MesqPane::get_all_elements" << endl;
131 int pane_size = _with_ghost ? _pane->size_of_elements() :
132 _pane->size_of_real_elements();
134 "Array_Size Must Be At Least Number of Nodes");
135 for(
int i = 1;
i <= pane_size; ++
i){
136 elem_array[
i-1] = ((
char*)NULL)+
i;
139 cout <<
"MesqPane::get_all_elements done" << endl;
144 cout <<
"MesqPane::vertex_iterator" << endl;
146 _pane->size_of_real_nodes());
151 cout <<
"MesqPane::element_iterator" << endl;
153 _pane->size_of_real_elements());
158 cout <<
"MesqPane::vertex_is_fixed" << endl;
159 uint node_id = (
char*)vertex - (
char*)NULL;
161 "Invalid vertex for MesqPane::vertex_is_fixed()");
162 return _is_border[node_id-1];
164 cout <<
"MesqPane::vertex_is_fixed finished" << endl;
170 cout <<
"MesqPane::vertices_are_on_boundary" << endl;
171 for (
size_t i = 0;
i < num_vtx; ++
i){
172 uint node_id = (((
char*)vert_array[
i]) - (
char*)NULL);
173 if (_is_border[node_id-1]){
176 std::cout <<
"Node " << node_id <<
" is on the boundary." << endl;
183 cout <<
"MesqPane::vertices_are_on_boundary finished" << endl;
188 const size_t &num_vtx,
191 cout <<
"MesqPane::vertices_get_coordinates" << endl;
192 const double *xptr = _pane->coordinates(), *yptr=NULL, *zptr=NULL;
193 const COM::Attribute *nc = _pane->attribute(
COM::COM_NC);
194 int stride = nc->stride();
196 const COM::Attribute *xc = _pane->attribute(
COM::COM_NC1);
197 const COM::Attribute *yc = _pane->attribute(
COM::COM_NC2);
198 const COM::Attribute *zc = _pane->attribute(
COM::COM_NC3);
199 int stride1 = xc->stride();
200 int stride2 = yc->stride();
201 int stride3 = zc->stride();
202 xptr = _pane->x_coordinates();
203 yptr = _pane->y_coordinates();
204 zptr = _pane->z_coordinates();
205 for (
size_t i = 0;
i < num_vtx; ++
i){
206 int offset = (
char*)vert_array[
i]-(
char*)NULL -1;
207 coordinates[
i].
set(*(xptr+offset*stride1),
208 *(yptr+offset*stride2),
209 *(zptr+offset*stride3));
213 int nn = _with_ghost ? _pane->size_of_nodes() :
214 _pane->size_of_real_nodes();
215 xptr = _pane->x_coordinates();
216 for (
size_t i = 0;
i < num_vtx; ++
i){
217 int offset = (
char*)vert_array[
i]-(
char*)NULL -1;
218 coordinates[
i].
set(*(xptr+offset),
220 *(xptr+offset+2*nn));
224 xptr = _pane->x_coordinates();
225 for (
size_t i = 0;
i < num_vtx; ++
i){
226 int offset = (
char*)vert_array[
i]-(
char*)NULL -1;
227 coordinates[
i].
set(xptr + offset * stride);
229 cout <<
"Coords of node " << offset+1 <<
" = ["
230 << coordinates[
i][0] <<
","
231 << coordinates[
i][1] <<
","
232 << coordinates[
i][2] <<
"]" << endl;
238 "Invalid stride length for nodal coordinates.");
241 cout <<
"MesqPane::vertices_get_coordinates finished" << endl;
247 int node_id = ((
char*)vertex-(
char*)NULL);
249 cout <<
"MesqPane::vertex_set_coordinates, node = " << node_id << endl;
251 double * xptr = _pane->coordinates();
255 cout <<
"Coordinate: [" << *xptr <<
" , "
256 << *(xptr+1) <<
" , " << *(xptr+2) <<
"], ";
260 cout <<
"-> [" << *xptr <<
" , "
261 << *(xptr+1) <<
" , " << *(xptr+2) <<
"]" << endl;
266 *(_pane->y_coordinates()+
offset),
267 *(_pane->z_coordinates()+
offset));
270 cout <<
"MesqPane::vertex_set_coordinates finished" << endl;
276 cout <<
"MesqPane::vertex_set_byte" << endl;
277 int offset = ((
char*)vertex - (
char*)NULL) - 1;
278 _vertexBytes[
offset] = byte;
280 cout <<
"MesqPane::vertex_set_byte finished" << endl;
284 unsigned char *byte_array,
287 cout <<
"MesqPane::vertices_set_byte" << endl;
289 for(
size_t i = 0;
i < array_size; ++
i){
290 offset = ((
char*)vert_array[
i] - (
char*)NULL) - 1;
291 _vertexBytes[
offset] = byte_array[
i];
294 cout <<
"MesqPane::vertices_set_byte" << endl;
298 unsigned char *byte,
MsqError &err){
300 cout <<
"MesqPane::vertex_get_byte" << endl;
301 int offset = ((
char*)vertex - (
char*)NULL) - 1;
302 *byte = _vertexBytes[
offset];
306 unsigned char *byte_array,
309 cout <<
"MesqPane::vertices_get_byte" << endl;
311 for(
size_t i = 0;
i < array_size; ++
i){
312 offset = ((
char*)vertex[
i] - (
char*)NULL) - 1;
313 byte_array[
i] = _vertexBytes[
offset];
316 cout <<
"MesqPane::vertices_get_byte finished" << endl;
322 cout <<
"MesqPane::vertex_get_attached_element_count" << endl;
323 int node_id = ((
char*)vertex - (
char*)NULL);
324 std::vector<int> elist;
325 _dc->incident_elements(node_id,elist);
328 cout <<
"MesqPane::vertex_get_attached_element_count finished" << endl;
333 size_t sizeof_elem_array,
336 cout <<
"MesqPane::vertex_get_attached_elements" << endl;
337 int node_id = ((
char*)vertex - (
char*)NULL);
338 std::vector<int> elist;
339 _dc->incident_elements(node_id,elist);
340 if(sizeof_elem_array > elist.size())
341 sizeof_elem_array = elist.size();
342 for(uint
i = 0;
i < sizeof_elem_array;
i++){
343 elem_array[
i] = ((
char*)NULL+elist[
i]);
346 cout <<
"MesqPane::vertex_get_attached_elements finished" << endl;
352 cout <<
"MesqPane::element_get_attached_vertex_count" << endl;
353 int element_id = ((
char*)elem - (
char*)NULL);
354 const COM::Connectivity *con = _pane->connectivity(element_id);
355 return con->size_of_nodes_pe();
361 size_t &sizeof_vert_handles,
363 size_t &sizeof_csr_data,
367 cout <<
"MesqPane::elements_get_attached_vertices" << endl;
370 std::map<int,int> itop_map;
371 std::map<int,int>::iterator pos;
376 for (
size_t i = 0;
i < num_elems; ++
i){
377 int elem_id = ((
char*)elem_handles[
i] - (
char*)NULL);
378 std::cout <<
"\n element " << elem_id <<
" has nodes : ";
379 std::vector<int> elist;
380 _dc->incident_elements(elem_id,elist);
381 size_t nodes_in_elem = elist.size();
382 csr_offsets[
i+1] = csr_offsets[
i] + nodes_in_elem;
385 "Not enough space in arg. csr_data");
388 for( uint
j = 0 ;
j < nodes_in_elem; ++
j){
389 int node_id = ((
char*)elist[
j] - (
char*)NULL);
390 std::cout << node_id <<
" ";
391 pos = itop_map.find(node_id);
393 if(pos == itop_map.end()){
394 itop_map.insert(std::map<int,int>::value_type(node_id,num_elems));
395 vert_handles[vert_count] = ((
char*)(NULL)+node_id);
396 csr_data[csr_offsets[
i]+
j] = vert_count;
400 csr_data[csr_offsets[
i] +
j] = pos->second;
404 sizeof_csr_data = csr_offsets[num_elems];
405 sizeof_vert_handles = vert_count;
407 cout <<
"MesqPane::elements_get_attached_vertices" << endl;
412 size_t index_array[],
417 cout <<
"MesqPane::elements_get_attached_vertex_indices" << endl;
422 Element_node_enumerator *ene;
423 for(uint
i = 0;
i < num_elems; ++
i){
425 elem_id = ((
char*)element[
i] - (
char*)NULL);
427 cout <<
" element " << elem_id <<
" contains nodes ";
430 ene =
new Element_node_enumerator(_pane,elem_id);
431 int nodes_in_elem = ene->size_of_nodes();
432 offsets[
i+1] = offsets[
i] + nodes_in_elem;
434 std::vector<int> nodes;
435 ene->get_nodes(nodes);
437 for(
int j = 0;
j < nodes_in_elem; ++
j){
439 index_array[offsets[
i]+
j] = nodes[
j]-1;
451 cout <<
" MesqPane::e_g_a_v_i loop finished " << endl;
457 cout <<
"MesqPane::element_get_topology" << endl;
458 int elem_id = ((
char*)entity_handle-(
char*)NULL);
460 const COM::Connectivity *con = _pane->connectivity(elem_id);
462 switch(con->element_type()){
463 case COM::Connectivity::TRI3 :
466 case COM::Connectivity::QUAD4 :
469 case COM::Connectivity::TET4 :
472 case COM::Connectivity::HEX8 :
477 "Element type not supported by Mesquite.");
487 size_t num_elements,
MsqError &err){
489 cout <<
"MesqPane::element_get_topologies" << endl;
490 for (
size_t i = 0;
i < num_elements;
i++){
491 element_topologies[
i] = element_get_topology(element_handle_array[
i],err);
494 cout <<
"MesqPane::element_get_topologies done" << endl;
503 cout <<
"MesqPane::element_tag_create" << endl;
506 new_tag.
size = tag_size;
507 denseTags[tag_name] = new_tag;
508 tag_handle = tag_get_handle(tag_name, err);
511 cout <<
"MesqPane::element_tag_create finished" << endl; }
517 cout <<
"MesqPane::tag_get_handle" << endl;
518 return (
void*) &(denseTags[tag_name]);
520 cout <<
"MesqPane::tag_get_handle finished" << endl;
530 TagDataPt
const tag_data_array,
535 cout <<
"MesqPane::element_set_tag_data" << endl;
536 if (_with_ghost && (num_elements != _pane->size_of_elements())) {
537 err.set_msg(
"Incorrect num_elements. Must be equal to the total number of elements "
538 "since only dense tags are supported.");
541 else if(num_elements != _pane->size_of_real_elements()){
542 err.set_msg(
"Incorrect num_elements. Must be equal to the number of real elements "
543 "since only dense tags are supported.");
546 else if (((
tag*)tag_handle)->size != tag_size) {
547 err.set_msg(
"tag_size does not correspong to actual tag size.");
551 ((
tag*)tag_handle)->pt = tag_data_array;
553 cout <<
"MesqPane::element_set_tag_data" << endl;
562 TagDataPt &tag_data_array,
566 cout <<
"MesqPane::elements_get_tag_data" << endl;
567 if (_with_ghost && (num_elements != _pane->size_of_elements())) {
568 err.set_msg(
"Incorrect num_elements. Must be equal to the total number of elements "
569 "since only dense tags are supported.");
571 else if (num_elements != _pane->size_of_real_elements()) {
572 err.set_msg(
"Incorrect num_elements. Must be equal to the number of real elements "
573 "since only dense tags are supported.");
576 else if (((
tag*)tag_handle)->size != tag_size) {
577 err.set_msg(
"tag_size does not correspong to actual tag size.");
581 tag_data_array = ((
tag*)tag_handle)->pt;
583 cout <<
"MesqPane::elements_get_tag_data finished" << endl;
590 cout <<
"MesqPane::release_entity_handles" << endl;
596 cout <<
"MesqPane::release()" << endl;
Iterates through a set of entities. An EntityIterator is typically obtained via Mesh::vertex_iterator...
virtual void vertices_get_byte(VertexHandle *vertex, unsigned char *byte_array, size_t array_size, MsqError &err)
Retrieve the byte value for the specified vertices.
void invert()
Invert Tetrahedrons.
virtual void elements_get_tag_data(const size_t num_elements, const TagHandle tag_handle, TagDataPt &tag_data_array, int &tag_size, MsqError &err)
Gets the Tag data for an array of entities.
virtual ElementIterator * element_iterator(MsqError &err)
Returns a pointer to an element iterator over this Pane.
A tag structure required by Mesquite.
Used to hold the error state and return it to the application.
#define COM_assertion_msg(EX, msg)
virtual void vertices_get_coordinates(VertexHandle vert_array[], Mesquite::MsqVertex *const &coordinates, const size_t &num_vtx, MsqError &err)
Get the location of a vertex.
virtual ~MesqPane()
Destructor.
A class for iterating through a Panes vertices or elements.
EntityHandle VertexHandle
virtual void * tag_get_handle(const string tag_name, MsqError &err)
Returns the tag handle corresponding to the string.
EntityHandle ElementHandle
Vector3D is the object that effeciently stores information about about three-deminsional vectors...
virtual void get_all_elements(ElementHandle *elem_array, size_t array_size, MsqError &err)
Fills array with handles to all elements in the mesh.
void * EntityHandle
Opaque EntityHandle type and tag type.
virtual void vertices_are_on_boundary(VertexHandle vert_array[], bool on_bnd[], size_t num_vtx, MsqError &err)
Tells whether the vertex is on the boundary.
real *8 function offset(vNorm, x2, y2, z2)
virtual void elements_get_attached_vertices(ElementHandle *elem_handles, size_t num_elems, VertexHandle *vert_handles, size_t &sizeof_vert_handles, size_t *csr_data, size_t &sizeof_csr_data, size_t *csr_offsets, MsqError &err)
Returns vertices which are part of each element in the "elem_handles" array.
virtual void elements_get_attached_vertex_indices(ElementHandle element[], size_t num_elems, size_t index_array[], size_t array_size, size_t *offsets, MsqError &err)
Return each vertex's global index.
virtual size_t element_get_attached_vertex_count(ElementHandle elem, MsqError &err) const
Gets the number of vertices in this element.
virtual bool vertex_is_fixed(VertexHandle vertex, MsqError &err)
Tells wheter the vertex is allowed to be repositioned.
void get_coordinates(double &x, double &y, double &z) const
#define MSQ_CHKERR(err)
Mesquite's Error Checking macro.
virtual void release()
Release a MesqPane from use.
virtual void elements_get_topologies(ElementHandle *element_handle_array, EntityTopology *element_topologies, size_t num_elements, MsqError &err)
Returns the topologies of the given entities.
virtual void elements_set_tag_data(const size_t num_elements, const TagHandle tag_handle, TagDataPt const tag_data_array, const int &tag_size, MsqError &err)
Sets the Tag data pointers for an array of entities.
virtual void vertices_set_byte(VertexHandle *vert_array, unsigned char *byte_array, size_t array_size, MsqError &err)
Set mutliple vertex flags.
virtual size_t vertex_get_attached_element_count(VertexHandle vertex, MsqError &err) const
Gets the number of elements attached to this vertex.
virtual void element_tag_create(const string tag_name, int tag_size, TagHandle &tag_handle, MsqError &err)
Add a new tag with given name and size to the dense tag map.
virtual void release_entity_handles(EntityHandle *handle_array, size_t num_handles, MsqError &err)
Tells the mesh that the client is finished with a given entity handle.
virtual VertexIterator * vertex_iterator(MsqError &err)
Returns a pointer to a vertex iterator over this Pane.
void set(const double x, const double y, const double z)
virtual void vertex_get_attached_elements(VertexHandle vertex, ElementHandle *elem_array, size_t sizeof_elem_array, MsqError &err)
Gets the elements attached to this vertex.
MsqVertex is the Mesquite object that stores information about the vertices in the mesh...
virtual void vertex_get_byte(VertexHandle vertex, unsigned char *byte, MsqError &err)
Retrieve the byte value for the specified vertex.
virtual void get_all_vertices(VertexHandle *vert_array, size_t array_size, MsqError &err)
Fills array with handles to all vertices.
virtual void vertex_set_byte(VertexHandle vertex, unsigned char byte, MsqError &err)
Set a vertex flag.
virtual EntityTopology element_get_topology(ElementHandle entity_handle, MsqError &err) const
Returns the topology of the given entity.
virtual void vertex_set_coordinates(VertexHandle vertex, const Vector3D &coordinates, MsqError &err)
Set the Location of a vertex.
void init()
Initialize the MesqPane.