Exemple #1
0
ErrorCode SpectralMeshTool::create_spectral_elems(const T *conn, int num_fine_elems, int dim,
                                                  Range &output_range, int start_idx, Range *local_gids) 
{
  assert(spectralOrder && num_fine_elems);
  
    // now create num_coarse_elems
    // compute the number of local elems, accounting for coarse or fine representation
    // spectral_unit is the # fine elems per coarse elem, or spectralOrder^2
  int spectral_unit = spectralOrder*spectralOrder;
  int num_coarse_elems = num_fine_elems / spectral_unit;

  EntityHandle *new_conn;
  EntityHandle start_elem;
  ReadUtilIface *rmi;
  ErrorCode rval = mbImpl->query_interface(rmi);
  if (MB_SUCCESS != rval) return rval;
  
  int verts_per_felem = spectralOrderp1*spectralOrderp1,
      verts_per_celem = std::pow((double)2.0, dim);

  rval = rmi->get_element_connect(num_coarse_elems, verts_per_celem,
                                  (2 == dim ? MBQUAD : MBHEX), 0,
                                  start_elem, new_conn);MB_CHK_SET_ERR(rval, "Failed to create elems");

  output_range.insert(start_elem, start_elem + num_coarse_elems - 1);

    // read connectivity into that space

    // permute_array takes a 4*order^2-long vector of integers, representing the connectivity of order^2
    // elems (fine elems in a coarse elem), and picks out the ids of the vertices necessary
    // to get a lexicographically-ordered array of vertices in a spectral element of that order
    //assert(verts_per_felem == (sizeof(permute_array)/sizeof(unsigned int)));
  
    // we're assuming here that elems was empty on input
  int count;
  EntityHandle *sv_ptr = NULL;
  rval = mbImpl->tag_iterate(spectral_vertices_tag(true), output_range.begin(), output_range.end(), count,
                            (void*&)sv_ptr);MB_CHK_SET_ERR(rval, "Failed to get SPECTRAL_VERTICES ptr");
  assert(count == num_coarse_elems);
  int f = start_idx, fs = 0, fl = 0;
  for (int c = 0; c < num_coarse_elems; c++) {
    for (int i = 0; i < verts_per_celem; i++)
      new_conn[fl+i] = conn[f+lin_permute_array[i]];
    fl += verts_per_celem;
    for (int i = 0; i < verts_per_felem; i++) 
      sv_ptr[fs+i] = conn[f+permute_array[i]];
    f += verts_per_celem*spectral_unit;
    fs += verts_per_felem;
  }
  if (local_gids) 
    std::copy(sv_ptr, sv_ptr+verts_per_felem*num_coarse_elems, range_inserter(*local_gids));

  return MB_SUCCESS;
}
Exemple #2
0
void test_write_invalid_elem()
{
  Core mbcore;
  Interface& moab = mbcore;
  ReadUtilIface* readtool = 0;
  ErrorCode rval;
  
  rval = moab.query_interface( readtool );
  CHECK_ERR(rval);
  CHECK( readtool != 0 );
  
    // create two nodes
  EntityHandle first_node;
  std::vector<double*> coords;
  rval = readtool->get_node_coords( 3, 2, 1, first_node, coords );
  CHECK_ERR(rval);
  coords[0][0] = coords[0][1] = 0.0;
  coords[1][0] = coords[1][1] = 0.0;
  coords[2][0] = coords[2][1] = 0.0;
  
    // create a triangle with an invalid node handle for its
    // third vertex
  EntityHandle tri;
  EntityHandle* conn = 0;
  rval = readtool->get_element_connect( 1, 3, MBTRI, 1, tri, conn );
  CHECK_ERR(rval);
  conn[0] = first_node;   // valid
  conn[1] = first_node+1; // valid
  conn[2] = first_node+2; // invalid
  
    // try to write the file (should fail)
  WriteHDF5 writer( &moab );
  FileOptions opts(0);
  rval = writer.write_file( filename, true, opts, 0, 0, std::vector<std::string>() );
  CHECK(MB_SUCCESS != rval);
}
Exemple #3
0
void test_gather_onevar()
{
  Core moab;
  Interface& mb = moab;

  EntityHandle file_set;
  ErrorCode rval = mb.create_meshset(MESHSET_SET, file_set);
  CHECK_ERR(rval);

  std::string opts;
  get_options(opts);

  // Read cell variable vorticity and create gather set on processor 0
  opts += ";VARIABLE=vorticity;GATHER_SET=0";
  rval = mb.load_file(example, &file_set, opts.c_str());
  CHECK_ERR(rval);

#ifdef MOAB_HAVE_MPI
  ParallelComm* pcomm = ParallelComm::get_pcomm(&mb, 0);
  int rank = pcomm->proc_config().proc_rank();

  Range cells, cells_owned;
  rval = mb.get_entities_by_type(file_set, MBPOLYGON, cells);
  CHECK_ERR(rval);

  // Get local owned cells
  rval = pcomm->filter_pstatus(cells, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, &cells_owned);
  CHECK_ERR(rval);

  EntityHandle gather_set = 0;
  if (0 == rank) {
    // Get gather set
    ReadUtilIface* readUtilIface;
    mb.query_interface(readUtilIface);
    rval = readUtilIface->get_gather_set(gather_set);
    CHECK_ERR(rval);
    assert(gather_set != 0);
  }

  Tag vorticity_tag0, gid_tag;
  rval = mb.tag_get_handle("vorticity0", layers, MB_TYPE_DOUBLE, vorticity_tag0, MB_TAG_DENSE);
  CHECK_ERR(rval);

  rval = mb.tag_get_handle(GLOBAL_ID_TAG_NAME, 1, MB_TYPE_INTEGER, gid_tag, MB_TAG_DENSE);
  CHECK_ERR(rval);

  pcomm->gather_data(cells_owned, vorticity_tag0, gid_tag, gather_set, 0);

  if (0 == rank) {
    // Get gather set cells
    Range gather_set_cells;
    rval = mb.get_entities_by_type(gather_set, MBPOLYGON, gather_set_cells);
    CHECK_ERR(rval);
    CHECK_EQUAL((size_t)642, gather_set_cells.size());
    CHECK_EQUAL((size_t)1, gather_set_cells.psize());

    // Check vorticity0 tag values on 4 gather set cells: first cell, two median cells, and last cell
    EntityHandle cell_ents[] = {gather_set_cells[0], gather_set_cells[320],
                                gather_set_cells[321], gather_set_cells[641]};
    double vorticity0_val[4 * layers];
    rval = mb.tag_get_data(vorticity_tag0, cell_ents, 4, vorticity0_val);
    CHECK_ERR(rval);

    // Only check first two layers
    // Layer 0
    CHECK_REAL_EQUAL(3.629994, vorticity0_val[0 * layers], eps);
    CHECK_REAL_EQUAL(0.131688, vorticity0_val[1 * layers], eps);
    CHECK_REAL_EQUAL(-0.554888, vorticity0_val[2 * layers], eps);
    CHECK_REAL_EQUAL(-0.554888, vorticity0_val[3 * layers], eps);
    // Layer 1
    CHECK_REAL_EQUAL(3.629944, vorticity0_val[0 * layers + 1], eps);
    CHECK_REAL_EQUAL(0.131686, vorticity0_val[1 * layers + 1], eps);
    CHECK_REAL_EQUAL(-0.554881, vorticity0_val[2 * layers + 1], eps);
    CHECK_REAL_EQUAL(-0.554881, vorticity0_val[3 * layers + 1], eps);
  }
#endif
}
Exemple #4
0
void gather_one_cell_var(int gather_set_rank)
{
  Core moab;
  Interface& mb = moab;

  EntityHandle file_set;
  ErrorCode rval = mb.create_meshset(MESHSET_SET, file_set);
  CHECK_ERR(rval);

  read_options = "PARALLEL=READ_PART;PARTITION_METHOD=TRIVIAL;PARALLEL_RESOLVE_SHARED_ENTS";
  std::ostringstream gather_set_option;
  gather_set_option << ";GATHER_SET=" << gather_set_rank;
  read_options += gather_set_option.str();

  rval = mb.load_file(example, &file_set, read_options.c_str());
  CHECK_ERR(rval);

  ParallelComm* pcomm = ParallelComm::get_pcomm(&mb, 0);
  int procs = pcomm->proc_config().proc_size();
  int rank = pcomm->proc_config().proc_rank();

  // Make sure gather_set_rank is valid
  if (gather_set_rank < 0 || gather_set_rank >= procs)
    return;

  Range cells, cells_owned;
  rval = mb.get_entities_by_type(file_set, MBPOLYGON, cells);
  CHECK_ERR(rval);

  // Get local owned cells
  rval = pcomm->filter_pstatus(cells, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, &cells_owned);
  CHECK_ERR(rval);

  EntityHandle gather_set = 0;
  if (gather_set_rank == rank) {
    // Get gather set
    ReadUtilIface* readUtilIface;
    mb.query_interface(readUtilIface);
    rval = readUtilIface->get_gather_set(gather_set);
    CHECK_ERR(rval);
    assert(gather_set != 0);
  }

  Tag vorticity_tag0, gid_tag;
  rval = mb.tag_get_handle("vorticity0", layers, MB_TYPE_DOUBLE, vorticity_tag0, MB_TAG_DENSE);
  CHECK_ERR(rval);

  rval = mb.tag_get_handle(GLOBAL_ID_TAG_NAME, 1, MB_TYPE_INTEGER, gid_tag, MB_TAG_DENSE);
  CHECK_ERR(rval);

  pcomm->gather_data(cells_owned, vorticity_tag0, gid_tag, gather_set, gather_set_rank);

  if (gather_set_rank == rank) {
    // Get gather set cells
    Range gather_set_cells;
    rval = mb.get_entities_by_type(gather_set, MBPOLYGON, gather_set_cells);
    CHECK_ERR(rval);
    CHECK_EQUAL((size_t)642, gather_set_cells.size());
    CHECK_EQUAL((size_t)1, gather_set_cells.psize());

    // Check vorticity0 tag values on 4 gather set cells: first cell, two median cells, and last cell
    EntityHandle cell_ents[] = {gather_set_cells[0], gather_set_cells[320],
                                gather_set_cells[321], gather_set_cells[641]};
    double vorticity0_val[4 * layers];
    rval = mb.tag_get_data(vorticity_tag0, &cell_ents[0], 4, vorticity0_val);
    CHECK_ERR(rval);

    // Only check first two layers
    // Layer 0
    CHECK_REAL_EQUAL(3.629994, vorticity0_val[0 * layers], eps);
    CHECK_REAL_EQUAL(0.131688, vorticity0_val[1 * layers], eps);
    CHECK_REAL_EQUAL(-0.554888, vorticity0_val[2 * layers], eps);
    CHECK_REAL_EQUAL(-0.554888, vorticity0_val[3 * layers], eps);
    // Layer 1
    CHECK_REAL_EQUAL(3.629944, vorticity0_val[0 * layers + 1], eps);
    CHECK_REAL_EQUAL(0.131686, vorticity0_val[1 * layers + 1], eps);
    CHECK_REAL_EQUAL(-0.554881, vorticity0_val[2 * layers + 1], eps);
    CHECK_REAL_EQUAL(-0.554881, vorticity0_val[3 * layers + 1], eps);
  }
}
Exemple #5
0
void test_gather_onevar()
{
  Core moab;
  Interface& mb = moab;

  EntityHandle file_set;
  ErrorCode rval = mb.create_meshset(MESHSET_SET, file_set);
  CHECK_ERR(rval);

  std::string opts;
  get_options(opts);

  // Read vertex variable T and create gather set on processor 0
  opts += ";VARIABLE=T;GATHER_SET=0";
#ifdef MOAB_HAVE_MPI
  opts += ";PARALLEL_RESOLVE_SHARED_ENTS";
#endif
  rval = mb.load_file(example, &file_set, opts.c_str());
  CHECK_ERR(rval);

#ifdef MOAB_HAVE_MPI
  ParallelComm* pcomm = ParallelComm::get_pcomm(&mb, 0);
  int rank = pcomm->proc_config().proc_rank();

  Range verts, verts_owned;
  rval = mb.get_entities_by_type(file_set, MBVERTEX, verts);
  CHECK_ERR(rval);

  // Get local owned vertices
  rval = pcomm->filter_pstatus(verts, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, &verts_owned);
  CHECK_ERR(rval);

  EntityHandle gather_set = 0;
  if (0 == rank) {
    // Get gather set
    ReadUtilIface* readUtilIface;
    mb.query_interface(readUtilIface);
    rval = readUtilIface->get_gather_set(gather_set);
    CHECK_ERR(rval);
    assert(gather_set != 0);
  }

  Tag Ttag0, gid_tag;
  rval = mb.tag_get_handle("T0", levels, MB_TYPE_DOUBLE, Ttag0, MB_TAG_DENSE);
  CHECK_ERR(rval);

  rval = mb.tag_get_handle(GLOBAL_ID_TAG_NAME, 1, MB_TYPE_INTEGER, gid_tag, MB_TAG_DENSE);
  CHECK_ERR(rval);

  pcomm->gather_data(verts_owned, Ttag0, gid_tag, gather_set, 0);

  if (0 == rank) {
    // Get gather set vertices
    Range gather_set_verts;
    rval = mb.get_entities_by_type(gather_set, MBVERTEX, gather_set_verts);
    CHECK_ERR(rval);
    CHECK_EQUAL((size_t)3458, gather_set_verts.size());

    // Get T0 tag values on 4 strategically selected gather set vertices
    double T0_val[4 * levels];
    EntityHandle vert_ents[] = {gather_set_verts[0], gather_set_verts[1728],
                                gather_set_verts[1729], gather_set_verts[3457]};
    rval = mb.tag_get_data(Ttag0, vert_ents, 4, T0_val);
    CHECK_ERR(rval);

    const double eps = 0.001;

    // Check first level values
    CHECK_REAL_EQUAL(233.1136, T0_val[0 * levels], eps); // First vert
    CHECK_REAL_EQUAL(236.1505, T0_val[1 * levels], eps); // Median vert
    CHECK_REAL_EQUAL(235.7722, T0_val[2 * levels], eps); // Median vert
    CHECK_REAL_EQUAL(234.0416, T0_val[3 * levels], eps); // Last vert
  }
#endif
}