20 #include "SheafSystem/unstructured_block_builder.h" 22 #include "SheafSystem/error_message.h" 23 #include "SheafSystem/index_space_iterator.h" 24 #include "SheafSystem/poset.h" 25 #include "SheafSystem/poset_path.h" 26 #include "SheafSystem/postorder_iterator.h" 27 #include "SheafSystem/preorder_iterator.h" 28 #include "SheafSystem/ragged_array.h" 29 #include "SheafSystem/assert_contract.h" 30 #include "SheafSystem/sheaves_namespace.h" 31 #include "SheafSystem/std_iostream.h" 32 #include "SheafSystem/std_iomanip.h" 33 #include "SheafSystem/subposet.h" 34 #include "SheafSystem/triorder_iterator.h" 35 #include "SheafSystem/unstructured_block.h" 36 #include "SheafSystem/tern.h" 45 using namespace sheaf;
61 set<pod_index_type> lcover0;
65 lcover0.insert(litr0.
hub_pod());
71 set<pod_index_type> lcover1;
72 unstructured_block_builder::list_type::const_iterator litr1 = xcover.begin();
73 while(litr1 != xcover.end())
75 lcover1.insert(*litr1);
80 bool result = (lcover0 == lcover1);
102 fiber_bundle::unstructured_block_builder::
120 _template_has_boundary =
false;
138 while(!_free_covers.empty())
140 delete (_free_covers.top());
144 while(!_used_covers.empty())
146 delete (_used_covers.top());
150 _boundary_jims.detach_from_state();
151 _block_boundaries.detach_from_state();
167 bool xcompute_upper_cover,
173 require(xtemplate != 0);
176 require(xtemplate->
is_jim());
178 require(xtemplate->
atom_ct() > 0);
181 require(xglue_ub > 0);
182 require((xglue_ub % xtemplate->
atom_ct()) == 0);
184 require(result != 0);
195 require(unexecutable(
"result host is base space poset"));
238 require(result->
is_jim());
251 initialize_template(xtemplate);
252 initialize_glue(xglue, xglue_ub);
253 initialize_block(result);
254 initialize_boundary();
255 initialize_dof_maps();
259 make_block(xcompute_upper_cover);
272 if(_template_has_boundary)
283 ensure(unexecutable(
"result->host()->blocks().contains_member(result)"));
284 ensure(!result->
name().empty());
285 ensure(!result->
is_jim());
304 bool xcompute_upper_cover,
317 int* lint_glue =
new int[xglue_ub];
318 for(
int i=0; i<xglue_ub; ++i)
320 lint_glue[i] = xglue[i].
pod();
323 build_block_pa(xtemplate,
327 xcompute_upper_cover,
356 require(xblock_dbs.
ct() == xblock_ids.
ct());
357 require(xblock_local_cell_paths.
ct() == xblock_ids.
ct());
359 require_for_all(i, 0, xblock_dbs.
ct(), xblock_dbs[i] >= 0);
361 require_for_all(i, 0, xblock_local_cell_paths.
ct(),
364 require_for_all(i, 0, xblock_local_cell_paths.
ct(),
377 for(
int i=0; i<xblock_ids.
ct(); i++)
384 lblock.new_state(xmesh, xblock_local_cell_paths[i].member_name(),
false);
391 lblock_sp.insert_member(&lblock);
393 lid_space.insert(xblock_ids[i], lblock.index());
395 lblock.put_name(poset_path::block_name(xblock_ids[i]),
true,
false);
398 lblock.detach_from_state();
399 lblock_sp.detach_from_state();
404 make_block_neighborhoods(xmesh, xblock_ids, xblock_nbrs, lid_space);
407 #ifdef DIAGNOSTIC_OUTPUT 409 cout << endl <<
"after creating block decomposition:" << endl;
410 cout << *xmesh << endl;
436 require(xblock_db >= 0);
461 for(
int i=0; i<xblock_ids.
ct(); i++)
483 lblock.
put_name(poset_path::block_name(xblock_ids[i]),
true,
false);
492 make_block_neighborhoods(xmesh, xblock_ids, xblock_nbrs, lid_space);
495 #ifdef DIAGNOSTIC_OUTPUT 497 cout << endl <<
"after creating block decomposition:" << endl;
498 cout << *xmesh << endl;
554 ensure(name_mode() == xmode);
564 fiber_bundle::unstructured_block_builder::
569 require(xtemplate != 0);
572 require(unexecutable(
"template contains atoms"));
578 _template_map.clear();
579 _template_db = _template->db();
584 ensure(_template == xtemplate);
585 ensure(_template_map.empty());
586 ensure(_template_db >= 0);
595 fiber_bundle::unstructured_block_builder::
596 initialize_glue(
const int* xglue,
int xglue_ub)
601 require(xglue_ub > 0);
605 _glue =
const_cast<int*
>(xglue);
611 ensure(_glue == xglue);
612 ensure(_glue_ub == xglue_ub);
613 ensure(_glue_index == 0);
622 fiber_bundle::unstructured_block_builder::
627 require(result != 0);
631 require(result->
is_jim());
644 _block_host.attach_to_state(result->
host());
645 _block_mbrs_sp.new_state(&_block_host);
649 _block_mbrs.reserve(_glue_ub/_template->atom_ct());
653 ensure(_block == result);
654 ensure(_block_host.is_same_state(result->
host()));
663 fiber_bundle::unstructured_block_builder::
664 initialize_boundary()
668 require(_template_db >= 0);
669 require(_template != 0);
670 require(_template->state_is_read_accessible());
671 require(_block_host.state_is_read_write_accessible());
686 _boundary_db = _block_host.max_db() - 1;
687 if(_boundary_db >= 0)
689 int lc_dim = _template_host.db(_template->first_cover_member(
LOWER));
690 _template_has_boundary = ( lc_dim == _boundary_db);
694 _template_has_boundary =
false;
697 _boundary_jims.detach_from_state();
698 if(_block_host.includes_subposet(
"__boundary_jims"))
700 _boundary_jims.attach_to_state(&_block_host,
"__boundary_jims");
704 _boundary_jims.new_state(&_block_host);
705 _boundary_jims.put_name(
"__boundary_jims",
true,
false);
708 _block_boundaries.detach_from_state();
709 if(_block_host.includes_subposet(
"__block_boundaries"))
711 _block_boundaries.attach_to_state(&_block_host,
"__block_boundaries");
715 _block_boundaries.new_state(&_block_host);
716 _block_boundaries.put_name(
"__block_boundaries",
true,
false);
721 ensure(_boundary_db == _block_host.max_db() - 1);
722 ensure(_template_has_boundary ? _boundary_db >= 0 :
true);
723 ensure(_block_host.includes_subposet(
"__boundary_jims"));
724 ensure(_boundary_jims.is_attached());
725 ensure(_boundary_jims.host()->is_same_state(&_block_host));
726 ensure(_block_host.includes_subposet(
"__block_boundaries"));
727 ensure(_block_boundaries.is_attached());
728 ensure(_block_boundaries.host()->is_same_state(&_block_host));
738 fiber_bundle::unstructured_block_builder::
739 initialize_dof_maps()
743 require(_template->schema().row_conforms_to(_block_host.schema()));
744 require(_template->name_space()->state_is_read_accessible());
745 require(_block_host.state_is_read_write_accessible());
762 scoped_index ltype_id_ub = lprototypes.member_index_ub();
766 ltype_map.
set_ct(ltype_id_ub.pod());
774 void* ltuple_ptr = _block_host.row_dof_map(i).dof_tuple();
779 ltype_map[lrow_tuple_ptr->
type_id] = i;
784 _dof_tuple_id_map.reserve(_template_host.member_index_ub().pod());
786 _dof_tuple_id_map.set_ct(_dof_tuple_id_map.ub());
788 _dof_tuple_id_map.assign(scoped_index::INVALID());
797 scoped_index lblk_tuple_id = _block_host.dof_tuple_id(
false);
800 _template_host.member_dof_tuple_id(lindex.
pod(),
false);
807 lblk_tuple_id = ltype_map[ltype_id];
818 lblk_tuple_id = _block_host.new_row_dof_map();
820 poset_dof_map& lblk_dof_map = _block_host.row_dof_map(lblk_tuple_id,
true);
826 ltype_map[ltype_id] = lblk_tuple_id;
838 _dof_tuple_id_map[lindex.
pod()] = lblk_tuple_id;
845 ensure(unexecutable(
"template dof maps duplicated in block host"));
846 ensure(unexecutable(
"_dof_tuple_id_map initialized"));
856 fiber_bundle::unstructured_block_builder::
857 make_block(
bool xcompute_upper_cover)
861 require(_block->is_jim());
862 require(unexecutable(
"all data members initialized"));
872 bool ltruncate =
false;
874 while(_glue_index < _glue_ub)
880 switch(ltmplt_itr.
action())
882 case triorder_iterator::PREVISIT_ACTION:
883 previsit_action(ltmplt_itr, ltruncate);
885 case triorder_iterator::LINK_ACTION:
886 link_action(ltmplt_itr);
889 case triorder_iterator::POSTVISIT_ACTION:
890 postvisit_action(ltmplt_itr);
895 post_fatal_error_message(
"Unrecognized iterator action.");
898 ltmplt_itr.
next(ltruncate);
907 _template_map.clear();
911 if(xcompute_upper_cover)
929 _block->delete_state();
937 lhost->
new_link(TOP_INDEX, _block_mbrs[i].hub_pod());
942 _block->new_jrm_state(lhost, _block_mbrs.base(), _block_mbrs.ct(), tern::TRUE,
false);
946 _block->put_dof_tuple_id(lhost->
dof_tuple_id(ltuple_id,
false),
false);
957 _block_host.new_link(lblk_id, _block_mbrs[i]);
963 _block->put_size(lblk_size);
967 _block_host.jims().remove_member(_block);
971 subposet& lblocks_sp = _block_host.blocks();
980 if(_block->name().empty())
982 scoped_index lseq_id(_block_host.blocks().id_space(), _block->index());
984 _block->put_name(poset_path::make_name(
"__block_", lseq_id.pod(),
""),
true,
false);
990 ensure(_block->db() == _template_db);
991 ensure(_block->local_cell_type_id() == _template->type_id());
992 ensure(_block->size() > 0);
993 ensure(!_block->is_jim());
994 ensure(_block_host.blocks().contains_member(_block));
995 ensure(!_block->name().empty());
1005 fiber_bundle::unstructured_block_builder::
1012 if(_template_host.is_atom(xtmplt_itr.
index()))
1026 if(_free_covers.empty())
1036 lcover = _free_covers.top();
1040 _used_covers.push(lcover);
1056 fiber_bundle::unstructured_block_builder::
1063 unordered_map<int,int>::iterator itr = _template_map.find(xtmplt_itr.
lesser_index().
pod());
1067 assertion(itr != _template_map.end());
1071 _used_covers.top()->push_back(itr->second);
1082 fiber_bundle::unstructured_block_builder::
1088 require(xtmplt_itr.
index() != BOTTOM_INDEX);
1093 int lmbr_db = _template_host.db(ltmplt_mbr_id);
1095 scoped_index lblk_mbr_id(_block_host.member_hub_id_space(
false));
1099 if(_template_host.is_atom(ltmplt_mbr_id))
1105 glue_id = _glue[_glue_index];
1113 lblk_mbr_id = lid_space.
hub_pod(glue_id);
1115 if(!lblk_mbr_id.is_valid())
1121 _dof_tuple_id_map[ltmplt_mbr_id.pod()];
1123 _block_host.new_member(_template_host.is_jim(ltmplt_mbr_id.pod()),
1129 _block_host.new_link(lblk_mbr_id.pod(), BOTTOM_INDEX);
1133 _block_mbrs_sp.insert_member(lblk_mbr_id.pod());
1135 if(_template_has_boundary && (_boundary_db == 0))
1140 _boundary_jims.insert_member(lblk_mbr_id.pod());
1145 _block_host.d_cells(lmbr_db).insert_member(lblk_mbr_id.pod());
1147 lid_space.
insert(glue_id, lblk_mbr_id.pod());
1149 _block_host.cells().insert_member(lblk_mbr_id);
1158 string lsp_name(_block_host.d_cells(lmbr_db).name());
1159 string lname(poset_path::make_name(lsp_name, glue_id,
""));
1160 _block_host.put_member_name(lblk_mbr_id.pod(), lname,
true,
false);
1167 _template_map.insert(unordered_map<int, int>::value_type(ltmplt_mbr_id.pod(), lblk_mbr_id.pod()));
1186 assertion(!lc->empty());
1189 _block_host.get_cover_id_space_iterator(
UPPER, *(lc->begin()));
1191 while(!uc_itr.is_done())
1193 lblk_mbr_id = uc_itr.
hub_pod();
1194 if(lower_cover_is_equal(_block_host, lblk_mbr_id.pod(), *lc))
1202 if(uc_itr.is_done())
1207 scoped_index lblk_tuple_id = _dof_tuple_id_map[ltmplt_mbr_id.pod()];
1209 _block_host.new_member(_template_host.is_jim(ltmplt_mbr_id),
1215 _block_mbrs_sp.insert_member(lblk_mbr_id.pod());
1219 _block_host.d_cells(lmbr_db).insert_member(lblk_mbr_id.pod());
1224 _block_host.cells().insert_member(lblk_mbr_id);
1235 string lname = _block_host.d_cells(lmbr_db).name();
1237 lname = poset_path::make_name(lname, lclient_id,
"");
1239 _block_host.put_member_name(lblk_mbr_id.pod(), lname,
true,
false);
1243 if(_template_has_boundary && (lmbr_db == _boundary_db))
1248 _boundary_jims.insert_member(lblk_mbr_id.pod());
1254 if(_template_has_boundary && lmbr_db == _template_db)
1261 list_type::iterator lc_itr = lc->begin();
1262 while(lc_itr != lc->end())
1265 _block_host.new_link(lblk_mbr_id.pod(), lc_mbr_id);
1266 update_boundary(lc_mbr_id);
1276 list_type::iterator lc_itr = lc->begin();
1277 while(lc_itr != lc->end())
1279 _block_host.new_link(lblk_mbr_id.pod(), *lc_itr);
1290 uc_itr.force_is_done();
1293 _block_host.release_cover_id_space_iterator(uc_itr);
1298 _template_map.insert(unordered_map<int, int>::value_type(ltmplt_mbr_id.pod(), lblk_mbr_id.pod()));
1306 _free_covers.push(cover);
1311 #ifdef DIAGNOSTIC_OUTPUT 1312 cout <<
"mbr: " << setw(2) << lblk_mbr_id;
1313 cout <<
" lower cover: ";
1314 cover_set_iterator litr = _block_host.cover_iterator(
LOWER, lblk_mbr_id.pod());
1315 while(!litr.is_done())
1317 cout << litr.item() <<
" ";
1323 if(ltmplt_mbr_id ==~ _template->index())
1329 _block_mbrs.push_back(lblk_mbr_id);
1349 fiber_bundle::unstructured_block_builder::
1354 require(_template_has_boundary);
1373 if(lblock_bdy_jims.
ct() > 0)
1378 lblock_bdy_jims.
base(),
1379 lblock_bdy_jims.
ct(),
1382 lbdy.
put_name(poset_path::boundary_prefix() + _block->name(),
true,
false);
1383 _block_boundaries.insert_member(&lbdy);
1384 lbdy.detach_from_state();
1398 fiber_bundle::unstructured_block_builder::
1406 _template_host.detach_from_state();
1407 _template_map.clear();
1416 _block_mbrs_sp.delete_state();
1420 _template_has_boundary =
false;
1423 _dof_tuple_id_map.set_ct(0);
1425 _block_host.detach_from_state();
1436 fiber_bundle::unstructured_block_builder::
1441 require(_block_host.contains_member(xhub_id));
1442 require(!_block_host.cover_is_empty(
UPPER, xhub_id));
1443 require(_block_host.is_jim(xhub_id));
1444 require(_block_host.db(xhub_id) == _boundary_db);
1462 if(!_block_host.cover_is_singleton(
UPPER, xhub_id) &&
1463 _block_mbrs_sp.contains_member(_block_host.first_cover_member(
UPPER, xhub_id)))
1465 _boundary_jims.remove_member(xhub_id);
1477 fiber_bundle::unstructured_block_builder::
1482 require(_block_host.contains_member(xid));
1483 require(!_block_host.cover_is_empty(
UPPER, xid));
1484 require(_block_host.is_jim(xid));
1485 require(_block_host.db(xid) == _boundary_db);
1489 update_boundary(xid.
hub_pod());
1501 fiber_bundle::unstructured_block_builder::
1509 require(xmesh != 0);
1516 lnbrhd_sp.
put_name(
"__neighborhoods",
true,
false);
1519 for(
int i=0; i<xblock_nbrs.
row_ct(); i++)
1525 for(
int j=0; j<xblock_nbrs.
col_ct(i); j++)
1527 lid = xid_space.
hub_pod(xblock_nbrs[i][j]);
1533 lnbrhd.new_jrm_state(xmesh, lnbrs.
base(), lnbrs.
ct(), tern::TRUE,
false);
1537 lnbrhd.put_name(poset_path::block_neighborhood_name(xblock_ids[i]),
true,
false);
1543 lnbrhd.detach_from_state();
virtual void get_read_write_access(bool xrelease_read_only_access=false)
Get read write access to the state associated with this. If release_read_only_access is requested...
virtual bool is_jim(bool xin_current_version=true) const
True if this member is join irreducible in the current version of the host (xin_current_version == tr...
A client handle for a subposet.
void truncate()
Makes this the next member of the subset which is not less than old this, i.e. the depth-first descen...
bool is_valid() const
True if this is a valid id.
pod_index_type dof_tuple_id(bool xauto_access) const
The dof tuple index of this member.
virtual void new_link(pod_index_type xgreater, pod_index_type xlesser)
Insert a cover link from greater to lesser (that is, hub id xgreater covers hub id xlesser)...
static void build_block_decomposition(base_space_poset *xmesh, const block< int > &xblock_ids, const block< int > &xblock_dbs, const block< poset_path > &xblock_local_cell_paths, const ragged_array< int > &xblock_nbrs, bool xauto_access)
Creates in xmesh the unrefined blocks and block neighborhoods described by the client ids in xblock_i...
size_type ct() const
The number of items currently in use.
virtual void new_jim_state(poset_dof_map *xdof_map=0, bool xcopy_dof_map=false, bool xauto_access=true)
Creates a new jim (join-irreducible member) state in host() and attaches this to it. If xdof_map == 0 a new dof map is created. If xdof_map != 0 and xcopy_dof_map == false, xdof_map is used as the dof map. If xdof_map != 0 and xcopy_dof_map is true, a copy of xdof_map is used.
const pod_type & pod() const
The "plain old data" storage of this; the value in the external id space.
std::list< pod_index_type > list_type
The type of the temporary cover set lists.
An abstract iterator over the ids of an id space.
index_space_iterator & get_cover_id_space_iterator(bool xlower, pod_index_type xmbr_hub_id) const
Allocates an iterator for the lower (xlower true) or upper (xlower false) cover id space of the membe...
~unstructured_block_builder()
Destructor.
action_type action() const
The type of action the client should take when the iterator returns control to the client...
bool state_is_read_accessible() const
True if this is attached and if the state is accessible for read or access control is disabled...
subposet & blocks()
The subposet containing all the blocks, const ver (mutable version).
bool contains_poset_member(pod_index_type xposet_hub_id, pod_index_type xmember_hub_id, bool xauto_access=true) const
True if this contains a poset with hub id xposet_hub_id which contains a member with hub id xmember_h...
unstructured_block_builder()
Default constructor.
virtual bool includes_subposet(pod_index_type xsubposet_hub_id, bool xauto_access=true) const
True if this poset includes subposet with hub id xsubposet_hub_id.
virtual int atom_ct() const
The number of members in the set of atoms contained in the down set of this member.
virtual void * dof_tuple()=0
The dof tuple (mutable version).
A path defined by a poset name and a member name separated by a forward slash ('/'). For example: "cell_definitions/triangle".
virtual const scoped_index & dof_tuple_id(bool xauto_access) const
An id in the dof tuple hub id space; intended for copying to initialize ids to the dof tuple id space...
virtual bool contains_member(pod_index_type xmbr_hub_id) const
True if this poset contains poset member with hub id xmbr_hub_id.
virtual bool invariant() const
Class invariant.
An abstract handle to a space of alternate integer identifiers (aliases) for a subset of a hub set of...
poset_state_handle & member_poset(pod_index_type xhub_id, bool xauto_access=true) const
The poset_state_handle object referred to by hub id xhub_id.
void invalidate()
Make this id invalid.
virtual namespace_poset * name_space() const
The namespace of host()
const scoped_index & index() const
The index of the component state this handle is attached to.
virtual void next()=0
Makes id() the next id in the iteration.
std::string name() const
A name for this.
OBSOLETE: use zone_nodes_block or point_block_*d. A client handle for a base space member which repre...
The general, abstract map from dof ids to dof values.
namespace_poset * host() const
The namespace this poset resides in. Obsolete; use name_space() instead.
static bool name_mode()
True if cells should be given unique names.
Dperecated. Use postorder_itr. Specialization of the filtered depth-first iterator which exposes the ...
virtual pod_type pod(pod_type xid) const
The pod index in this space equivalent to xid in the hub id space.
A client handle for a member of a base space poset.
virtual void release_access(bool xall=false) const
Release access. If xall is true, release all levels of access. Otherwise, release one level of access...
The lattice of closed cells of a cellular space; a lattice representation of a computational mesh...
virtual void put_name(const std::string &xname, bool xunique, bool xauto_access)
Make xname a name for this; if xunique, make xname the only name.
const bool NOT_STRICT
Iteration strictness control.
const bool DOWN
Iteration directions.
void push_back(const_reference_type item)
Insert item at the end of the items in the auto_block.
bool is_done() const
True if iteration is finished.
A client handle for a mutable partially ordered set.
bool state_is_read_write_accessible() const
True if this is attached and if the state is accessible for read and write or access control is disab...
poset * host() const
The poset which this is a handle to a member of.
pointer_type base() const
The underlying storage array.
size_t dof_tuple_ub() const
The size of the dof tuple in bytes.
void set_ct(size_type xct)
Sets ct() == xct.
An index within the external ("client") scope of a given id space.
virtual void get_read_access() const
Get read access to the state associated with this.
unsigned long size_type
An unsigned integral type used to represent sizes and capacities.
virtual void insert_member(pod_index_type xmbr_hub_id)
Inserts the member of host() with hub id xmbr_hub_id.
index_type row_ct() const
The number of rows.
virtual bool contains_member(pod_index_type xmbr_hub_id, bool xauto_access=true) const
True if some version of this poset contains poset member with hub id xmbr_hub_id. ...
const bool UPPER
Selector for upper cover.
void insert(pod_type xid, const scoped_index &xhub_id)
Make id xid in this id space equivalent to xhub_id in the hub id space. synonym for insert(xid...
virtual void put_name(const std::string &xname, bool xunique, bool xauto_access)
Make xname a name for this; if xunique, make xname the only name.
void next()
Makes this the next member of the subset.
virtual void release_access(bool xall=false) const
Release access. If xall is true, release all levels of access. Otherwise, release one level of access...
const scoped_index & lesser_index() const
The index of the lesser member of the current link.
const hub_index_space_handle & member_hub_id_space(bool xauto_access) const
The member hub id space.
bool is_done() const
True if iteration finished.
virtual bool is_atom() const
True if this member covers the bottom.
const bool LOWER
Selector for lower cover.
const scattered_insertion_index_space_handle & id_space() const
The id space for the members of with this (const version).
virtual void detach_from_state()
Detach this handle from its state, if any.
pod_type hub_pod(pod_type xid) const
The pod index in the unglued hub id space equivalent to xid in this id space; synonym for unglued_hub...
virtual poset_dof_map & row_dof_map(pod_index_type xtuple_hub_id, bool xrequire_write_access=false) const
The map from row dof client_ids to row dof values for dof tuple hub id xtuple_hub_id.
namespace_poset * name_space() const
The namespace this poset resides in.
virtual bool is_attached() const
True if this is attached to a state.
virtual void get_read_write_access(bool xrelease_read_only_access=false)
Get read write access to the state associated with this. If release_read_only_access is requested...
virtual poset_state_handle * host() const
The poset which owns this.
virtual void reset(bool xreset_markers=true)
Restarts the iteration over the down set of anchor().
int_type pod_index_type
The plain old data index type.
std::string member_name() const
The member name part of the path.
A handle for a scattered_insertion_index_space_state.
Namespace for the sheaves component of the sheaf system.
int type_id
The cell type id.
void push_back(const scoped_index &xhub_id)
Make the next id in this space equivalent to xhub_id in the hub id space. synonym for push_back(xhub_...
virtual void new_state(poset *xhost, const std::string &xlocal_cell_prototype_name, bool xauto_access)
Creates a new unrefined (jim) unstructured block state in xhost and attaches this to it...
virtual void end_jim_edit_mode(bool xensure_lattice_invariant=true, bool xauto_access=true)
Prevent editing of jims and jim order relation.
virtual void put_dof_tuple(const void *xbuf, size_t xbuflen)=0
Copies the entire dof tuple from xbuf into internal storage.
void attach_to_state(const namespace_poset *xns, const poset_path &xpath, bool xauto_access=true)
Attach to the state specified by path xpath in the namespace xns.
virtual void get_read_access() const
Get read access to the state associated with this.
A two index array with variable length rows.
bool row_conforms_to(const schema_poset_member &xother) const
True if the row dofs defined by this agree in type and in order with the dofs defined by xother...
The type of row dof tuple for base_space_member.
bool in_jim_edit_mode() const
True if editing jims and jim order relation is allowed.
virtual schema_poset_member & schema()
The schema for this member (mutable version).
virtual void delete_cover_link(abstract_poset_member *lesser)
Delete the link from this to lesser; make lesser incomparable to this.
SHEAF_DLL_SPEC bool is_valid(pod_index_type xpod_index)
True if an only if xpod_index is valid.
Namespace for the fiber_bundles component of the sheaf system.
SHEAF_DLL_SPEC pod_index_type invalid_pod_index()
The invalid pod index value.
void build_block_pa(const base_space_member *xtemplate, const int *xglue, size_type xglue_ub, unstructured_block *result, bool xcompute_upper_cover, bool xauto_access)
Build the unstructured block result using local cell template xtemplate and the atomic equivalences (...
index_type col_ct(const index_type xrow_index) const
The number of columns for the xrow_index-th row.
void release_cover_id_space_iterator(index_space_iterator &xcover_itr) const
Returns xcover_itr to the pool of id space iterators.
virtual void release_access(bool xall=false) const
Release access. If xall is true, release all levels of access. Otherwise, release one level of access...
pod_type hub_pod() const
The current unglued hub id in the iteration. synonym for unglued_hub_pod().
A client handle for an unrestricted member of a poset. A total_poset_member is guaranteed not to be r...
static void put_name_mode(bool xmode)
Sets name_mode to xmode. Warning: creating meshes with large numbers of names may exceed limits impos...
pod_type hub_pod() const
The pod value of this mapped to the unglued hub id space.
const scoped_index & index() const
The index of the current member of the iteration.
virtual void begin_jim_edit_mode(bool xauto_access=true)
Allow editing of jims and jim order relation.