Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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();
}
Пример #4
0
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;
}
Пример #5
0
// 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];
      }
    }
  }
}
Пример #6
0
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);
}
Пример #7
0
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);
}
Пример #8
0
static void s3c_pm_end(void)
{
	if (pm_end)
		pm_end();
}