void Window_manifold_2:: update_bd_flags( const COM::DataItem *flags) { const COM::DataItem *flags_inherited = flags; COM_assertion( flags->size_of_components()== 1 && COM_compatible_types(flags->data_type(), COM_INT)); // Allocate buffer arrays if ( flags->window()!=_buf_window) flags_inherited = _buf_window->inherit ( const_cast< COM::DataItem *>(flags), "faceflags__CNNTEMP", false, true, NULL, 0); COM::DataItem *flg=_buf_window->new_dataitem( "flags__PMTEMP", 'p', COM_INT, 1, ""); COM::DataItem *pconn_g=_buf_window->new_dataitem( "pconn__PMTEMP", 'p', COM_INT, 1, ""); COM::DataItem *pconn_e=_buf_window->dataitem( "pconn_e"); // Fill in flags and pconn for ( PM_iterator it=pm_begin(), iend=pm_end(); it != iend; ++it) { // COM::Pane *pn = const_cast<COM::Pane*>(it->pane()); COM::Pane *pn = const_cast<COM::Pane*>((*it)->pane()); const int *flgs_face = reinterpret_cast<int *> (pn->dataitem( flags_inherited->id())->pointer()); COM::DataItem *flg_pn = pn->dataitem( flg->id()); // int n = it->size_of_real_border_edges(); int n = (*it)->size_of_real_border_edges(); flg_pn->set_size( n, 0); // it->_bd_flgs.resize( n); (*it)->_bd_flgs.resize( n); // int *flgs_bd = &it->_bd_flgs[0]; int *flgs_bd = &(*it)->_bd_flgs[0]; _buf_window->set_array( flg->name(), pn->id(), flgs_bd); for ( int i=0; i<n; ++i) { // Edge_ID eid=it->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); Edge_ID eid=(*it)->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); flgs_bd[i] = flgs_face[eid.eid()-1]; } // Construct pane-connectivity // it->convert_pconn_edge2ghost( pn->dataitem( pconn_e->id()), (*it)->convert_pconn_edge2ghost( pn->dataitem( pconn_e->id()), pn->dataitem( pconn_g->id())); } _buf_window->init_done(false); // Perform communication MAP::Rocmap::update_ghosts( flg, pconn_g); _buf_window->delete_dataitem( pconn_g->name()); _buf_window->delete_dataitem( flg->name()); if ( flags_inherited != flags) _buf_window->delete_dataitem( flags_inherited->name()); _buf_window->init_done(false); }
void Window_manifold_2:: update_bdedge_bitmap( const COM::DataItem *bitmap) { const COM::DataItem *bm_inherited = bitmap; COM_assertion( bm_inherited->size_of_components()== 1 && COM_compatible_types(bm_inherited->data_type(), COM_CHAR)); // Allocate buffer arrays if ( bm_inherited->window()!=_buf_window) bm_inherited = _buf_window->inherit ( const_cast< COM::DataItem *>(bitmap), "facebm__CNNTEMP", false, true, NULL, 0); COM::DataItem *bm=_buf_window->new_dataitem( "bm__PMTEMP", 'p', COM_CHAR, 1, ""); COM::DataItem *pconn_g=_buf_window->new_dataitem( "pconn__PMTEMP", 'p', COM_INT, 1, ""); COM::DataItem *pconn_e=_buf_window->dataitem( "pconn_e"); // Fill in bm and pconn for ( PM_iterator it=pm_begin(), iend=pm_end(); it != iend; ++it) { // COM::Pane *pn = const_cast<COM::Pane*>(it->pane()); COM::Pane *pn = const_cast<COM::Pane*>((*it)->pane()); const char *bms_face = reinterpret_cast<char *> (pn->dataitem( bm_inherited->id())->pointer()); COM::DataItem *bm_pn = pn->dataitem( bm->id()); // int n = it->size_of_real_border_edges(); int n = (*it)->size_of_real_border_edges(); bm_pn->set_size( n, 0); // it->_bd_bm.resize( n); (*it)->_bd_bm.resize( n); // char *bms_bd = &it->_bd_bm[0]; char *bms_bd = &(*it)->_bd_bm[0]; _buf_window->set_array( bm->name(), pn->id(), bms_bd); for ( int i=0; i<n; ++i) { // Edge_ID eid=it->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); Edge_ID eid=(*it)->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); bms_bd[i] = bms_face[eid.eid()-1] & (1<<eid.lid()); } // Construct pane-connectivity // it->convert_pconn_edge2ghost( pn->dataitem( pconn_e->id()), (*it)->convert_pconn_edge2ghost( pn->dataitem( pconn_e->id()), pn->dataitem( pconn_g->id())); } _buf_window->init_done(false); // Perform communication MAP::Rocmap::update_ghosts( bm, pconn_g); _buf_window->delete_dataitem( pconn_g->name()); _buf_window->delete_dataitem( bm->name()); if ( bm_inherited != bitmap) _buf_window->delete_dataitem( bm_inherited->name()); _buf_window->init_done(false); }
void Window_manifold_2::serialize_window( COM::Window *outwin) const { // Clearn up the output window outwin->delete_pane(0); // Build a renumbering of nodes std::vector<std::vector<int> > nodes_gids; assign_global_nodeIDs( nodes_gids); Access_Mode mode = ACROSS_PANE; // Create a pane int nnodes=size_of_nodes( mode); outwin->set_size( "nc", 1, nnodes); double *coors; outwin->resize_array( "nc",1,(void**)&coors); // Mesh vertices int gid=0; // Loop through the panes to write the nodes PM_const_iterator it=pm_begin(), iend=pm_end(); for ( ; it!=iend; ++it) { // const COM::Pane &pn = *it->pane(); const COM::Pane &pn = *(*it)->pane(); const double *p = pn.coordinates(); for ( int i=0, nn=pn.size_of_real_nodes(); i<nn; ++i) { // if ( it->is_primary( i+1, mode)) { if ( (*it)->is_primary( i+1, mode)) { std::copy( &p[3*i], &p[3*i+3], &coors[3*gid]); ++gid; } } } COM_assertion( gid==nnodes); // Mesh triangles. int *tris; outwin->set_size( ":t3:", 1, size_of_faces(REAL_PANE)); outwin->resize_array( ":t3:", 1, (void**)&tris); int i=0, k=0; for ( it=pm_begin(); it!=iend; ++it, ++i) { // int fn=it->size_of_faces(REAL_PANE); if ( fn==0) continue; int fn=(*it)->size_of_faces(REAL_PANE); if ( fn==0) continue; // Element_node_enumerator ene( it->pane(), 1); Element_node_enumerator ene( (*it)->pane(), 1); for ( int f=0; f<fn; ++f, ++k, ene.next()) { for ( int j=0; j<3; ++j) { tris[3*k+j] = nodes_gids[i][ene[j]-1]; } } } outwin->init_done(); }
int Window_manifold_2::size_of_nodes( Access_Mode mode) const { int n = 0; // Loop through panes PM_const_iterator it=pm_begin(), iend=pm_end(); for ( ; it != iend; ++it) { // n += it->size_of_nodes( mode); n += (*it)->size_of_nodes( mode); } return n; }
// Assign global ids for all nodes void Window_manifold_2:: assign_global_nodeIDs( std::vector<std::vector<int> > &gids) const { // Initialize the vector gids gids.clear(); gids.resize( size_of_panes()); std::map<int, std::vector<int>*> maps; PM_const_iterator it=pm_begin(), iend=pm_end(); for ( int i=0; it!=iend; ++it, ++i) { // gids[i].resize( it->size_of_real_nodes(), 0); // maps[it->pane()->id()] = &gids[i]; gids[i].resize( (*it)->size_of_real_nodes(), 0); maps[(*it)->pane()->id()] = &gids[i]; } Access_Mode mode = ACROSS_PANE; // Loop through the panes to assign primary nodes int gid = 0; it=pm_begin(); for ( int i=0; it!=iend; ++it, ++i) { // for (int v=0, nv=it->size_of_real_nodes(); v<nv; ++v) { // if ( it->is_primary( v+1, mode)) for (int v=0, nv=(*it)->size_of_real_nodes(); v<nv; ++v) { if ( (*it)->is_primary( v+1, mode)) gids[i][v] = ++gid; } } COM_assertion( gid == size_of_nodes( mode)); // Loop through the panes to assign other nodes it=pm_begin(); for ( int i=0; it!=iend; ++it, ++i) { for (int v=0, nv=(*it)->size_of_real_nodes(); v<nv; ++v) { // for (int v=0, nv=it->size_of_real_nodes(); v<nv; ++v) { if (gids[i][v]==0) { // Obtain the primary. // Node nd = it->get_primary(v+1, mode); Node nd = (*it)->get_primary(v+1, mode); gids[i][v] = (*maps[nd.pane()->id()])[nd.id()-1]; } } } }
void Window_manifold_2:: accumulate_bd_values( const COM::DataItem *vals) { COM_assertion( vals->size_of_components()==1); const COM::DataItem *vals_inherited = vals; // Allocate buffer arrays if ( vals->window()!=_buf_window) vals_inherited = _buf_window->inherit ( const_cast< COM::DataItem *>(vals), "vals__CNNTEMP", false, true, NULL, 0); COM::DataItem *buf=_buf_window->new_dataitem( "buf__PMTEMP", 'p', vals->data_type(), 1, ""); COM::DataItem *pconn_g=_buf_window->new_dataitem( "pconn__PMTEMP", 'p', COM_INT, 1, ""); COM::DataItem *pconn_e=_buf_window->dataitem( "pconn_e"); int size_base_type = COM_get_sizeof( vals->data_type(),1); // Fill in vals and pconn for ( PM_iterator it=pm_begin(), iend=pm_end(); it != iend; ++it) { // COM::Pane *pn = const_cast<COM::Pane*>(it->pane()); COM::Pane *pn = const_cast<COM::Pane*>((*it)->pane()); const char *vals_face = reinterpret_cast<char *> (pn->dataitem( vals_inherited->id())->pointer()); COM::DataItem *buf_pn = pn->dataitem( buf->id()); // int n = it->size_of_real_border_edges(); int n = (*it)->size_of_real_border_edges(); buf_pn->set_size( n, 0); char *val_bd; _buf_window->resize_array( buf->name(), pn->id(), (void**)&val_bd); for ( int i=0; i<n; ++i) { // Edge_ID eid=it->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); Edge_ID eid=(*it)->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); int fid = eid.eid(); std::copy( &vals_face[(fid-1)*size_base_type], &vals_face[fid*size_base_type], &val_bd[i*size_base_type]); } // Construct pane-connectivity // it->convert_pconn_edge2ghost( pn->dataitem( pconn_e->id()), (*it)->convert_pconn_edge2ghost( pn->dataitem( pconn_e->id()), pn->dataitem( pconn_g->id())); } _buf_window->init_done(false); // Perform communication MAP::Rocmap::update_ghosts( buf, pconn_g); // Reduce on the values. for ( PM_iterator it=pm_begin(), iend=pm_end(); it != iend; ++it) { // COM::Pane *pn = const_cast<COM::Pane*>(it->pane()); COM::Pane *pn = const_cast<COM::Pane*>((*it)->pane()); char *vals_face = reinterpret_cast<char *> (pn->dataitem( vals_inherited->id())->pointer()); // int n = it->size_of_real_border_edges(); int n = (*it)->size_of_real_border_edges(); COM::Window::Pointer_descriptor ptr(NULL); _buf_window->get_array( buf->name(), pn->id(), ptr); char *val_bd = (char*)ptr.ptr; for ( int i=0; i<n; ++i) { // Edge_ID eid=it->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); Edge_ID eid=(*it)->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); switch (vals->data_type()) { case COM_CHAR: vals_face[eid.eid()-1] += val_bd[i]; break; case COM_INT: case COM_INTEGER: (int&)vals_face[(eid.eid()-1)*size_base_type] += (int&)val_bd[i*size_base_type]; break; case COM_FLOAT: case COM_REAL: (float&)vals_face[(eid.eid()-1)*size_base_type] += (float&)val_bd[i*size_base_type]; break; case COM_DOUBLE: case COM_DOUBLE_PRECISION: (double&)vals_face[(eid.eid()-1)*size_base_type] += (double&)val_bd[i*size_base_type]; break; default: COM_assertion_msg( false, "Unsupported type for reduction"); break; } } } _buf_window->delete_dataitem( pconn_g->name()); _buf_window->delete_dataitem( buf->name()); if ( vals_inherited != vals) _buf_window->delete_dataitem( vals_inherited->name()); _buf_window->init_done(false); }
void Window_manifold_2:: update_bd_normals( const COM::DataItem *normals, bool to_normalize) { const COM::DataItem *normals_inherited = normals; COM_assertion( normals->size_of_components()== 3 && COM_compatible_types(normals->data_type(), COM_DOUBLE)); // Allocate buffer arrays if ( normals->window()!=_buf_window) normals_inherited = _buf_window->inherit ( const_cast< COM::DataItem *>(normals), "facenormals__CNNTEMP", false, true, NULL, 0); COM::DataItem *nrm=_buf_window->new_dataitem( "normals__PMTEMP", 'p', COM_DOUBLE, 3, ""); COM::DataItem *pconn_g=_buf_window->new_dataitem( "pconn__PMTEMP", 'p', COM_INT, 1, ""); COM::DataItem *pconn_e=_buf_window->dataitem( "pconn_e"); // Fill in normals and pconn for ( PM_iterator it=pm_begin(), iend=pm_end(); it != iend; ++it) { // COM::Pane *pn = const_cast<COM::Pane*>(it->pane()); COM::Pane *pn = const_cast<COM::Pane*>((*it)->pane()); const Vector_3<Real> *nrms_face = reinterpret_cast<Vector_3<Real> *> (pn->dataitem( normals_inherited->id())->pointer()); COM::DataItem *nrm_pn = pn->dataitem( nrm->id()); // int n = it->size_of_real_border_edges(); int n = (*it)->size_of_real_border_edges(); nrm_pn->set_size( n, 0); // it->_bd_nrms.resize( n); (*it)->_bd_nrms.resize( n); // Vector_3<Real> *nrms_bd = &it->_bd_nrms[0]; Vector_3<Real> *nrms_bd = &(*it)->_bd_nrms[0]; _buf_window->set_array( nrm->name(), pn->id(), nrms_bd); for ( int i=0; i<n; ++i) { // Edge_ID eid=it->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); Edge_ID eid=(*it)->get_opposite_real_edge(Edge_ID(i+1, Edge_ID::BndID)); nrms_bd[i] = nrms_face[eid.eid()-1]; if ( to_normalize) nrms_bd[i].normalize(); } // Construct pane-connectivity // it->convert_pconn_edge2ghost( pn->dataitem( pconn_e->id()), (*it)->convert_pconn_edge2ghost( pn->dataitem( pconn_e->id()), pn->dataitem( pconn_g->id())); } _buf_window->init_done(false); // Perform communication MAP::Rocmap::update_ghosts( nrm, pconn_g); _buf_window->delete_dataitem( pconn_g->name()); _buf_window->delete_dataitem( nrm->name()); if ( normals_inherited != normals) _buf_window->delete_dataitem( normals_inherited->name()); _buf_window->init_done(false); }
static void s3c_pm_end(void) { if (pm_end) pm_end(); }