MOAB: Mesh Oriented datABase  (version 5.5.0)
ScdMesh

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. More...
 

Detailed Description

Structured Mesh

iMeshExtensions

Function Documentation

◆ iMesh_createStructuredMesh()

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.

Parameters
[in]instanceiMesh instance handle
[in]local_dimsMin/max corners of local ijk parameters, -1 for unused dimensions; specified as ilo, jlo, klo, ihi, jhi, khi.
[in]global_dimsMin/max corners of global ijk parameters, -1 for unused dimensions; NULL if running in serial. Order similar to local_dims.
[in]i_valsPhysical positions of i values, NULL if not placed in physical space.
[in]j_valsPhysical positions of j values, NULL if not placed in physical space.
[in]k_valsPhysical positions of k values, NULL if not placed in physical space.
[in]resolve_sharedNon-zero if running in parallel and resolution of shared vertices is desired, zero otherwise.
[in]ghost_dimDimension of entities to ghost, -1 if none desired.
[in]bridge_dimDimension of bridge entities used to compute ghosts, -1 if no ghosts desired.
[in]num_layersNumber of layers of ghosts desired, -1 if no ghosts desired.
[in]addl_entsDimension of addition entities adjacent to ghosts to exchange.
[in]vert_gidsIf non-zero, assigns global ids to vertices, according to global parameterization.
[in]elem_gidsIf non-zero, assigns global ids to elements, according to global parameterization.
[in,out]set_handleA 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]errError flag.

Definition at line 3235 of file iMesh_MOAB.cpp.

3250 {
3251  ScdInterface* scdi = NULL;
3252  ErrorCode rval = MOABI->query_interface( scdi );CHKERR( rval, "Couldn't get structured mesh interface." );
3253 
3254  Range tmp_range;
3255  ScdBox* scd_box;
3256  rval =
3257  scdi->construct_box( HomCoord( local_dims[0], local_dims[1], ( -1 != local_dims[2] ? local_dims[2] : 0 ), 1 ),
3258  HomCoord( local_dims[3], local_dims[4], ( -1 != local_dims[5] ? local_dims[5] : 0 ), 1 ),
3259  NULL, 0, scd_box, NULL, NULL, ( vert_gids ? true : false ) );CHKERR( rval, "Trouble creating scd vertex sequence." );
3260 
3261  // set the global box parameters
3262  if( global_dims )
3263  {
3264  for( int i = 0; i < 6; i++ )
3265  scd_box->par_data().gDims[i] = global_dims[i];
3266  }
3267 
3268  tmp_range.insert( scd_box->start_vertex(), scd_box->start_vertex() + scd_box->num_vertices() - 1 );
3269  tmp_range.insert( scd_box->start_element(), scd_box->start_element() + scd_box->num_elements() - 1 );
3270  tmp_range.insert( scd_box->box_set() );
3271 
3272  if( set_handle )
3273  {
3274  if( !( *set_handle ) )
3275  {
3276  // return the new ScdBox's set
3277  *set_handle = reinterpret_cast< iBase_EntitySetHandle >( scd_box->box_set() );
3278  }
3279  else
3280  {
3281  // add the new ScdBox's set to the given file set
3282  EntityHandle s = scd_box->box_set();
3283  rval = MOABI->add_entities( ENTITY_HANDLE( *set_handle ), &s, 1 );CHKERR( rval, "Couldn't add box set to file set." );
3284  }
3285  }
3286 
3287  // get a ptr to global id memory
3288  void* data;
3289  int count;
3290  Range::const_iterator topv, bote, tope;
3291 
3292  Tag gid_tag = 0;
3293  int *v_gid_data = NULL, *e_gid_data = NULL;
3294  if( vert_gids || elem_gids )
3295  {
3296  gid_tag = MOABI->globalId_tag();
3297  }
3298 
3299  if( vert_gids )
3300  {
3301  topv = tmp_range.upper_bound( tmp_range.begin(), tmp_range.end(),
3302  scd_box->start_vertex() + scd_box->num_vertices() );
3303 
3304  rval = MOABI->tag_iterate( gid_tag, tmp_range.begin(), topv, count, data );CHKERR( rval, "Failed to get tag iterator." );
3305  assert( count == scd_box->num_vertices() );
3306  v_gid_data = (int*)data;
3307  }
3308 
3309  if( elem_gids )
3310  {
3311  bote = tmp_range.lower_bound( tmp_range.begin(), tmp_range.end(), scd_box->start_element() );
3312  tope = tmp_range.upper_bound( tmp_range.begin(), tmp_range.end(), *bote + scd_box->num_elements() );
3313 
3314  rval = MOABI->tag_iterate( gid_tag, bote, tope, count, data );CHKERR( rval, "Failed to get tag iterator." );
3315  assert( count == scd_box->num_elements() );
3316  e_gid_data = (int*)data;
3317  }
3318 
3319  if( i_vals || j_vals || k_vals || v_gid_data || e_gid_data )
3320  {
3321 
3322  // set the vertex coordinates
3323  double *xc, *yc, *zc;
3324  rval = scd_box->get_coordinate_arrays( xc, yc, zc );CHKERR( rval, "Couldn't get vertex coordinate arrays." );
3325 
3326  int i, j, k, il, jl, kl;
3327  int dil = local_dims[3] - local_dims[0] + 1;
3328  int djl = local_dims[4] - local_dims[1] + 1;
3329  int di = ( global_dims ? global_dims[3] - global_dims[0] + 1 : dil );
3330  int dj = ( global_dims ? global_dims[4] - global_dims[1] + 1 : djl );
3331  for( kl = local_dims[2]; kl <= local_dims[5]; kl++ )
3332  {
3333  k = kl - local_dims[2];
3334  for( jl = local_dims[1]; jl <= local_dims[4]; jl++ )
3335  {
3336  j = jl - local_dims[1];
3337  for( il = local_dims[0]; il <= local_dims[3]; il++ )
3338  {
3339  i = il - local_dims[0];
3340  unsigned int pos = i + j * dil + k * dil * djl;
3341  xc[pos] = ( i_vals ? i_vals[i] : -1.0 );
3342  yc[pos] = ( j_vals ? j_vals[j] : -1.0 );
3343  zc[pos] = ( -1 == local_dims[2] ? 0.0 : ( k_vals ? k_vals[k] : -1.0 ) );
3344  if( v_gid_data )
3345  {
3346  *v_gid_data = ( -1 != kl ? kl * di * dj : 0 ) + jl * di + il + 1;
3347  v_gid_data++;
3348  }
3349  if( e_gid_data && kl < local_dims[5] && jl < local_dims[4] && il < local_dims[3] )
3350  {
3351  *e_gid_data = ( -1 != kl ? kl * ( di - 1 ) * ( dj - 1 ) : 0 ) + jl * ( di - 1 ) + il + 1;
3352  e_gid_data++;
3353  }
3354  }
3355  }
3356  }
3357  }
3358 
3359 #ifdef MOAB_HAVE_MPI
3360  // do parallel stuff, if requested
3361  if( resolve_shared )
3362  {
3363  ParallelComm* pcomm = ParallelComm::get_pcomm( MOABI, 0 );
3364  if( pcomm )
3365  {
3366 
3367  rval =
3368  pcomm->resolve_shared_ents( 0, MOABI->dimension_from_handle( scd_box->start_element() ), 0, &gid_tag );CHKERR( rval, "Trouble resolving shared vertices." );
3369 
3370  if( -1 != ghost_dim )
3371  {
3372  rval = pcomm->exchange_ghost_cells( ghost_dim, bridge_dim, num_layers, addl_ents, true );CHKERR( rval, "Trouble exchanging ghosts." );
3373  }
3374  }
3375  }
3376 #else
3377  // empty statement to remove compiler warning
3378  if( resolve_shared || ghost_dim || bridge_dim || num_layers || addl_ents )
3379  {
3380  }
3381 #endif
3382 
3383  RETURN( iBase_SUCCESS );
3384 }

References moab::Range::begin(), moab::ScdBox::box_set(), CHKERR, moab::ScdInterface::construct_box(), moab::Range::end(), ENTITY_HANDLE, ErrorCode, moab::ParallelComm::exchange_ghost_cells(), moab::ScdParData::gDims, moab::ScdBox::get_coordinate_arrays(), iBase_SUCCESS, moab::Range::insert(), moab::Range::lower_bound(), MOABI, moab::ScdBox::num_elements(), moab::ScdBox::num_vertices(), moab::ScdBox::par_data(), moab::ParallelComm::resolve_shared_ents(), RETURN, moab::ScdBox::start_element(), moab::ScdBox::start_vertex(), and moab::Range::upper_bound().