moab
|
Functions | |
void | iMesh_createStructuredMesh (iMesh_Instance instance, int *local_dims, int *global_dims, double *i_vals, double *j_vals, double *k_vals, int resolve_shared, int ghost_dim, int bridge_dim, int num_layers, int addl_ents, int vert_gids, int elem_gids, iBase_EntitySetHandle *set_handle, int *err) |
Create a structured mesh. |
void iMesh_createStructuredMesh | ( | iMesh_Instance | instance, |
int * | local_dims, | ||
int * | global_dims, | ||
double * | i_vals, | ||
double * | j_vals, | ||
double * | k_vals, | ||
int | resolve_shared, | ||
int | ghost_dim, | ||
int | bridge_dim, | ||
int | num_layers, | ||
int | addl_ents, | ||
int | vert_gids, | ||
int | elem_gids, | ||
iBase_EntitySetHandle * | set_handle, | ||
int * | err | ||
) |
Create a structured mesh.
Create a structured mesh, with local and (optionally) global ijk parameters and optional physical positions. If running in parallel, can request shared vertex resolution and optional number and type of ghost layers of elements. Global parameters are used to compute global ids, which are used in shared vertex resolution.
[in] | instance | iMesh instance handle |
[in] | local_dims | Min/max corners of local ijk parameters, -1 for unused dimensions; specified as ilo, jlo, klo, ihi, jhi, khi. |
[in] | global_dims | Min/max corners of global ijk parameters, -1 for unused dimensions; NULL if running in serial. Order similar to local_dims. |
[in] | i_vals | Physical positions of i values, NULL if not placed in physical space. |
[in] | j_vals | Physical positions of j values, NULL if not placed in physical space. |
[in] | k_vals | Physical positions of k values, NULL if not placed in physical space. |
[in] | resolve_shared | Non-zero if running in parallel and resolution of shared vertices is desired, zero otherwise. |
[in] | ghost_dim | Dimension of entities to ghost, -1 if none desired. |
[in] | bridge_dim | Dimension of bridge entities used to compute ghosts, -1 if no ghosts desired. |
[in] | num_layers | Number of layers of ghosts desired, -1 if no ghosts desired. |
[in] | addl_ents | Dimension of addition entities adjacent to ghosts to exchange. |
[in] | vert_gids | If non-zero, assigns global ids to vertices, according to global parameterization. |
[in] | elem_gids | If non-zero, assigns global ids to elements, according to global parameterization. |
[in,out] | set_handle | A set to which the underlying ScdBox set will be added. NULL if not desired. If *NULL, will be set directly to the underlying ScdBox's set. |
[out] | err | Error flag. |
Definition at line 3282 of file iMesh_MOAB.cpp.
{ ScdInterface *scdi = NULL; ErrorCode rval = MOABI->query_interface(scdi); CHKERR(rval, "Couldn't get structured mesh interface."); Range tmp_range; ScdBox *scd_box; rval = scdi->construct_box(HomCoord(local_dims[0], local_dims[1], (-1 != local_dims[2] ? local_dims[2] : 0), 1), HomCoord(local_dims[3], local_dims[4], (-1 != local_dims[5] ? local_dims[5] : 0), 1), NULL, 0, scd_box, NULL, NULL, (vert_gids ? true : false)); CHKERR(rval, "Trouble creating scd vertex sequence."); // set the global box parameters if (global_dims) { for (int i = 0; i < 6; i++) scd_box->par_data().gDims[i] = global_dims[i]; } tmp_range.insert(scd_box->start_vertex(), scd_box->start_vertex()+scd_box->num_vertices()-1); tmp_range.insert(scd_box->start_element(), scd_box->start_element()+scd_box->num_elements()-1); tmp_range.insert(scd_box->box_set()); if (set_handle) { if (!(*set_handle)) { // return the new ScdBox's set *set_handle = reinterpret_cast<iBase_EntitySetHandle>(scd_box->box_set()); } else{ // add the new ScdBox's set to the given file set EntityHandle s = scd_box->box_set(); rval = MOABI->add_entities(ENTITY_HANDLE(*set_handle), &s, 1 ); CHKERR(rval, "Couldn't add box set to file set."); } } // get a ptr to global id memory void *data; int count; Range::const_iterator topv, bote, tope; Tag gid_tag = 0; int *v_gid_data = NULL, *e_gid_data = NULL; if (vert_gids || elem_gids) { rval = MOABI->tag_get_handle(GLOBAL_ID_TAG_NAME, 1, MB_TYPE_INTEGER, gid_tag, MB_TAG_DENSE|MB_TAG_CREAT); CHKERR(rval, "Couldn't get GLOBAL_ID tag."); } if (vert_gids) { topv = tmp_range.upper_bound(tmp_range.begin(), tmp_range.end(), scd_box->start_vertex() + scd_box->num_vertices()); rval = MOABI->tag_iterate(gid_tag, tmp_range.begin(), topv, count, data); CHKERR(rval, "Failed to get tag iterator."); assert(count == scd_box->num_vertices()); v_gid_data = (int*)data; } if (elem_gids) { bote = tmp_range.lower_bound(tmp_range.begin(), tmp_range.end(), scd_box->start_element()); tope = tmp_range.upper_bound(tmp_range.begin(), tmp_range.end(), *bote + scd_box->num_elements()); rval = MOABI->tag_iterate(gid_tag, bote, tope, count, data); CHKERR(rval, "Failed to get tag iterator."); assert(count == scd_box->num_elements()); e_gid_data = (int*)data; } if (i_vals || j_vals || k_vals || v_gid_data || e_gid_data) { // set the vertex coordinates double *xc, *yc, *zc; rval = scd_box->get_coordinate_arrays(xc, yc, zc); CHKERR(rval, "Couldn't get vertex coordinate arrays."); int i, j, k, il, jl, kl; int dil = local_dims[3] - local_dims[0] + 1; int djl = local_dims[4] - local_dims[1] + 1; int di = (global_dims ? global_dims[3] - global_dims[0] + 1 : dil); int dj = (global_dims ? global_dims[4] - global_dims[1] + 1 : djl); for (kl = local_dims[2]; kl <= local_dims[5]; kl++) { k = kl - local_dims[2]; for (jl = local_dims[1]; jl <= local_dims[4]; jl++) { j = jl - local_dims[1]; for (il = local_dims[0]; il <= local_dims[3]; il++) { i = il - local_dims[0]; unsigned int pos = i + j*dil + k*dil*djl; xc[pos] = (i_vals ? i_vals[i] : -1.0); yc[pos] = (j_vals ? j_vals[j] : -1.0); zc[pos] = (-1 == local_dims[2] ? 0.0 : (k_vals ? k_vals[k] : -1.0)); if (v_gid_data) { *v_gid_data = (-1 != kl ? kl*di*dj : 0) + jl*di + il + 1; v_gid_data++; } if (e_gid_data && kl < local_dims[5] && jl < local_dims[4] && il < local_dims[3]) { *e_gid_data = (-1 != kl ? kl*(di-1)*(dj-1) : 0) + jl*(di-1) + il + 1; e_gid_data++; } } } } } #ifdef USE_MPI // do parallel stuff, if requested if (resolve_shared) { ParallelComm *pcomm = ParallelComm::get_pcomm(MOABI, 0); if (pcomm) { rval = pcomm->resolve_shared_ents(0, MOABI->dimension_from_handle(scd_box->start_element()), 0, &gid_tag); CHKERR(rval, "Trouble resolving shared vertices."); if (-1 != ghost_dim) { rval = pcomm->exchange_ghost_cells(ghost_dim, bridge_dim, num_layers, addl_ents, true); CHKERR(rval, "Trouble exchanging ghosts."); } } } #else // empty statement to remove compiler warning if (resolve_shared || ghost_dim || bridge_dim || num_layers || addl_ents) {} #endif RETURN(iBase_SUCCESS); }