22 #include "SheafSystem/assert_contract.h" 23 #include "SheafSystem/base_space_map.h" 24 #include "SheafSystem/base_space_map_push_action.h" 25 #include "SheafSystem/binary_section_space_schema_member.h" 26 #include "SheafSystem/binary_section_space_schema_poset.h" 27 #include "SheafSystem/block.impl.h" 28 #include "SheafSystem/constant_base_space_map_push_action.h" 29 #include "SheafSystem/copy_base_space_map_push_action.h" 30 #include "SheafSystem/discretization_context.h" 31 #include "SheafSystem/discretization_iterator.h" 32 #include "SheafSystem/discretization_pusher.h" 33 #include "SheafSystem/error_message.h" 34 #include "SheafSystem/eval_iterator.h" 35 #include "SheafSystem/namespace_poset.h" 36 #include "SheafSystem/postorder_iterator.h" 37 #include "SheafSystem/preorder_iterator.h" 38 #include "SheafSystem/property_disc_iterator.h" 39 #include "SheafSystem/sec_ed_invertible.h" 40 #include "SheafSystem/sec_vd_space.h" 41 #include "SheafSystem/section_evaluator.h" 42 #include "SheafSystem/std_utility.h" 43 #include "SheafSystem/field_vd.h" 55 pullback_map::iterator& xitr,
58 cout <<
"eval id: " << setw(5) << xeval_client_id;
60 cout <<
" disc_id: " << setw(5) << lmap.
pod(xitr->disc_id);
61 cout <<
" domain point:";
62 int ldb = xitr->domain_pt.db();
65 cout << setw(12) << setprecision(3) << xitr->domain_pt.local_coord(j);
67 cout << setw(5) << xitr->domain_pt.chart_id();
70 for(
int i=0; i<xout_dofs.ct(); ++i)
72 for(
size_type j=0; j<xout_dofs[i]->ct(); ++j)
74 cout << setw(12) << setprecision(3) << (*xout_dofs[i])[j];
91 : _coord_branch_id_space(0)
98 require(
same_fiber(xdomain_coord, xrange_coord, xauto_access));
100 define_old_variable(
int old_xdomain_coord_access_request_depth =
102 define_old_variable(
int old_xrange_coord_access_request_depth =
114 require(dynamic_cast<const binary_section_space_schema_member*>
115 (&(xrange_coord.
schema())));
173 delete _default_overlap_action;
174 delete _default_extension_action;
176 if(_coord_branch_id_space != 0)
181 for(
int i = 0; i < _prop_branch_id_spaces.ub(); i++)
183 if(_prop_branch_id_spaces[i] != 0)
185 _prop_branch_id_spaces[i]->release_id_space();
254 const sec_ed& result = _range_coords;
276 linputs.
push_back(&const_cast<sec_vd&>(xinput));
282 push(linputs, loutputs, xauto_access);
298 #ifdef DIAGNOSTIC_OUTPUT 299 post_information_message(
"Entering push:");
304 require(xinputs.
ct() > 0);
305 require(xoutputs.
ct() == xinputs.
ct());
308 require_for_all(i, 0, xinputs.
ct(),
309 xauto_access || xinputs[i]->state_is_read_accessible());
310 require_for_all(i, 0, xoutputs.
ct(),
311 xauto_access || xoutputs[i]->state_is_read_write_accessible());
313 require(xauto_access ||
domain_coords().state_is_read_accessible());
314 require(xauto_access ||
range_coords().state_is_read_accessible());
316 require_for_all(i, 1, xoutputs.
ct(),
317 same_base(*xoutputs[i], *xoutputs[0], xauto_access));
318 require_for_all(i, 1, xoutputs.
ct(),
319 same_rep(*xoutputs[i], *xoutputs[0], xauto_access));
321 require(unexecutable(
"all multisection inputs must be defined on the same decomposition"));
323 define_old_variable(
int old_domain_coord_access_request_depth =
325 define_old_variable(
int old_range_coord_access_request_depth =
331 for(
int i=0; i<xinputs.
ct(); ++i)
333 xinputs[i]->get_read_access();
334 xoutputs[i]->get_read_write_access(
true);
341 require_for_all(i, 0, xinputs.
ct(),
343 require_for_all(i, 0, xoutputs.
ct(),
348 set_control_section(xinputs);
350 sec_vd& linput = *xinputs[_control_section];
351 sec_vd& loutput = *xoutputs[_control_section];
353 set_branch_id_spaces(xinputs);
357 make_dof_buffers(xinputs, xoutputs);
366 pull_back_output_disc(linput, loutput.
schema());
370 define_overlap(xinputs, xoutputs);
374 define_extension(xoutputs);
386 for(
int i=0; i<xinputs.
ct(); ++i)
388 xoutputs[i]->release_access();
389 xinputs[i]->release_access();
395 ensure(
domain_coords().access_request_depth() == old_domain_coord_access_request_depth);
396 ensure(
range_coords().access_request_depth() == old_range_coord_access_request_depth);
398 #ifdef DIAGNOSTIC_OUTPUT 400 post_information_message(
"Leaving push:");
518 return *_overlap_action;
525 return *_default_overlap_action;
532 return *_extension_action;
539 return *_default_extension_action;
552 _overlap_action = &xoverlap_action;
572 _extension_action = &xextension_action;
606 fields::base_space_map::
609 #ifdef DIAGNOSTIC_OUTPUT 610 post_information_message(
"Entering pull_back_output");
623 set< stl_scoped_index<> > lbranches;
659 pull_back_output_disc_mono_mono(lcontext, lpb);
662 pull_back_output_disc_mono_multi(lcontext, lpb, lbranches);
665 pull_back_output_disc_multi_mono(lcontext, lpb);
668 pull_back_output_disc_multi_multi(lcontext, lpb);
683 #ifdef DIAGNOSTIC_OUTPUT 685 post_information_message(
"Leaving pull_back_output_disc:");
692 fields::base_space_map::
695 #ifdef DIAGNOSTIC_OUTPUT 696 post_information_message(
"Entering pull_back_output_disc_mono_mono:");
712 #ifdef DIAGNOSTIC_OUTPUT 714 cout <<
"inserting pullback entry: " << xpb << endl;
717 _pb_maps[_first_branch.
pod()]->insert(xpb);
724 #ifdef DIAGNOSTIC_OUTPUT 726 post_information_message(
"Leaving pull_back_output_disc_mono_mono:");
733 fields::base_space_map::
738 #ifdef DIAGNOSTIC_OUTPUT 739 post_information_message(
"Entering pull_back_output_disc_mono_multi:");
751 _chart_pts.set_ct(0);
757 if(_chart_pts.ct() > 0)
771 for(
int i=0; i<_chart_pts.ct(); ++i)
774 #ifdef DIAGNOSTIC_OUTPUT 775 cout <<
"i: " << i <<
" chart pt[i]: " << _chart_pts[i] << endl;
779 typedef chart_to_branch_map_type::iterator map_itr_type;
780 typedef pair<map_itr_type, map_itr_type> map_range_type;
782 map_range_type lrange =
783 _chart_to_branch_map.equal_range(_chart_pts[i].chart_id());
785 map_itr_type lmap_itr = lrange.first;
786 while(lmap_itr != lrange.second)
789 if(xbranches.find(lbranch_id) == xbranches.end())
797 #ifdef DIAGNOSTIC_OUTPUT 799 cout <<
"inserting pullback entry: " << xpb << endl;
804 _pb_maps[lbranch_id.
pod()]->insert(xpb);
808 xbranches.insert(lbranch_id);
815 #ifdef DIAGNOSTIC_OUTPUT 816 cout <<
"Ignoring chart pt." << endl;
831 _pb_maps[_first_branch.
pod()]->insert(xpb);
839 #ifdef DIAGNOSTIC_OUTPUT 840 post_information_message(
"Leaving pull_back_output_disc_mono_multi:");
847 fields::base_space_map::
850 #ifdef DIAGNOSTIC_OUTPUT 851 post_information_message(
"Entering pull_back_output_disc_multi_mono:");
869 if(_branch_pts.
ct() > 0)
874 for(
int i=0; i<_branch_pts.
ct(); ++i)
878 _pb_maps[_first_branch.
pod()]->insert(xpb);
880 #ifdef DIAGNOSTIC_OUTPUT 882 cout <<
"inserted pullback entry: " << xpb << endl;
892 #ifdef DIAGNOSTIC_OUTPUT 893 cout <<
"no pullback for disc id " << xpb.
disc_id 895 << setw(18) << xcontext.
values[0]
896 << setw(18) << xcontext.
values[1]
897 << setw(18) << xcontext.
values[2]
903 _pb_maps[_first_branch.
pod()]->insert(xpb);
911 #ifdef DIAGNOSTIC_OUTPUT 913 post_information_message(
"Leaving pull_back_output_disc_multi_mono:");
920 fields::base_space_map::
923 #ifdef DIAGNOSTIC_OUTPUT 924 post_information_message(
"Entering pull_back_output_disc_multi_mono:");
945 if(_branch_pts.
ct() > 0)
950 for(
int i=0; i<_branch_pts.
ct(); ++i)
956 _coord_branch_id_space->
pod(_branch_pts[i].first);
959 _control_branch_id_space->
hub_pod(lseq_id);
961 _pb_maps[lbranch_id]->insert(xpb);
963 #ifdef DIAGNOSTIC_OUTPUT 965 cout <<
"inserting pullback entry: " << xpb
966 <<
" in branch " << lbranch_id
977 #ifdef DIAGNOSTIC_OUTPUT 978 cout <<
"no pullback for disc id " << xpb.
disc_id 980 << setw(18) << xcontext.
values[0]
981 << setw(18) << xcontext.
values[1]
982 << setw(18) << xcontext.
values[2]
988 _pb_maps[_first_branch.
pod()]->insert(xpb);
996 #ifdef DIAGNOSTIC_OUTPUT 997 post_information_message(
"Leaving pull_back_output_disc_multi_mono:");
1004 fields::base_space_map::
1009 require(xinputs.
ct() > 0);
1010 require_for_all(i, 0, xinputs.
ct(), xinputs[i]->state_is_read_accessible());
1014 _control_section = 0;
1015 for(
int i=0; i<xinputs.
ct(); ++i)
1017 if(xinputs[i]->is_multisection(
false))
1019 _control_section = i;
1027 ensure((0 <= _control_section) && (_control_section < xinputs.
ct()));
1035 fields::base_space_map::
1040 require(xinputs.
ct() > 0);
1041 require_for_all(i, 0, xinputs.
ct(), xinputs[i]->state_is_read_accessible());
1047 if(_coord_branch_id_space != 0)
1052 for(
int i=0; i<_prop_branch_id_spaces.ub(); ++i)
1054 if(_prop_branch_id_spaces[i] != 0)
1056 _prop_branch_id_spaces[i]->release_id_space();
1068 _coord_branch_id_space = 0;
1071 _prop_branch_id_spaces.reserve(xinputs.
ct());
1072 _prop_branch_id_spaces.set_ct(0);
1073 for(
int i=0; i<xinputs.
ct(); ++i)
1075 if(xinputs[i]->is_multisection(
false))
1077 _prop_branch_id_spaces.push_back(&xinputs[i]->get_branch_id_space(
false));
1081 _prop_branch_id_spaces.push_back(0);
1085 _control_branch_id_space = _prop_branch_id_spaces[_control_section];
1089 ensure(_prop_branch_id_spaces.ct() == xinputs.
ct());
1097 fields::base_space_map::
1098 make_maps(
sec_vd& xinput)
1112 _pb_maps.set_ct(_pb_maps.ub());
1123 leval_itr.put_visit_once(
false);
1129 _first_branch = lbranch_itr.
index();
1144 leval_itr.reset(
false);
1149 while(!leval_itr.is_done())
1151 chart_to_branch_map_type::value_type lval(leval_itr.index().hub_pod(), lbranch_id);
1152 _chart_to_branch_map.insert(lval);
1153 leval_itr.truncate();
1170 fields::base_space_map::
1180 for(
int i=0; i<_pb_maps.ct(); ++i)
1197 _chart_to_branch_map.clear();
1208 fields::base_space_map::
1213 require(xinputs.
ct() == xoutputs.
ct());
1217 int lct = xinputs.
ct();
1219 _in_dofs.reserve(lct);
1222 _out_dofs.reserve(lct);
1223 _out_dofs.set_ct(0);
1225 for(
int i=0; i<lct; ++i)
1240 fields::base_space_map::
1248 for(
int i=0; i<_in_dofs.ct(); ++i)
1251 delete _out_dofs[i];
1255 _out_dofs.set_ct(0);
1266 fields::base_space_map::
1269 #ifdef DIAGNOSTIC_OUTPUT 1270 post_information_message(
"Entering define_overlap:");
1275 require(xinputs.
ct() > 0);
1276 require(xoutputs.
ct() == xinputs.
ct());
1278 require_for_all(i, 0, xinputs.
ct(), xinputs[i]->state_is_read_accessible());
1279 require_for_all(i, 0, xoutputs.
ct(), xoutputs[i]->state_is_read_write_accessible());
1281 require(unexecutable(
"all multisection inputs must be defined on the same decomposition"));
1282 require_for_all(i, 0, xinputs.
ct(),
1283 xinputs[i]->is_multisection(
false) ?
1284 xinputs[i]->has_branch_id_space(
false) :
true);
1296 for(
int i=0; i<xinputs.
ct(); ++i)
1301 assertion(linputs.ct() == xinputs.
ct());
1303 sec_vd* lcontrol_section = xinputs[_control_section];
1304 sec_vd* lcontrol_branch = linputs[_control_section];
1326 for(
int i=0; i<linputs.ct(); ++i)
1328 if(xinputs[i]->is_multisection(
false))
1332 scoped_index lposet_id(lseq_id, *_prop_branch_id_spaces[i]);
1334 linputs[i]->attach_to_state(lposet_id);
1343 leval_itr.put_schema_anchor(lcontrol_branch->
schema().
index());
1344 leval_itr.reset(
false);
1346 while(!leval_itr.is_done())
1348 push_eval_mbr(leval_itr, linputs, xoutputs);
1360 _overlap_action->
finalize(xoutputs);
1364 for(
int i=0; i<linputs.ct(); ++i)
1366 linputs[i]->detach_from_state();
1375 #ifdef DIAGNOSTIC_OUTPUT 1376 post_information_message(
"Leaving define_overlap:");
1383 fields::base_space_map::
1390 require_for_all(i, 0, xinputs.
ct(), xinputs[i]->state_is_read_accessible());
1391 require_for_all(i, 0, xinputs.
ct(), xinputs[i]->is_jim(
false));
1393 require_for_all(i, 0, xoutputs.
ct(), xoutputs[i]->state_is_read_write_accessible());
1394 require_for_all(i, 0, xinputs.
ct(), xoutputs[i]->is_jim(
false));
1400 pb_map_range_type litr_range =
1401 _pb_maps[xinputs[_control_section]->index().pod()]->
1404 if(litr_range.first != litr_range.second)
1415 for(
int i=0; i<xinputs.
ct(); ++i)
1417 _in_dofs[i]->set_ct(0);
1430 for(pb_map_itr_type itr = litr_range.first; itr != litr_range.second; ++itr)
1434 for(
int i=0; i<xinputs.
ct(); ++i)
1436 _out_dofs[i]->set_ct(_out_dofs[i]->ub());
1439 itr->domain_pt.local_coords(),
1441 _out_dofs[i]->base(),
1442 _out_dofs[i]->ct());
1448 (*_overlap_action)(itr, xoutputs, _out_dofs);
1451 #ifdef DIAGNOSTIC_OUTPUT 1453 print_debug_info(xeval_itr.range_id(), *xoutputs[_control_section], itr, _out_dofs);
1458 for(
int i=0; i<xoutputs.ct(); ++i)
1460 xoutputs[i]->put_fiber(itr->disc_id,
1461 _out_dofs[i]->base(),
1484 fields::base_space_map::
1487 #ifdef DIAGNOSTIC_OUTPUT 1488 post_information_message(
"Entering define_extension:");
1511 for(pb_map_itr_type itr = litr_range.first; itr != litr_range.second; ++itr)
1516 (*_extension_action)(itr, xoutputs, _out_dofs);
1519 #ifdef DIAGNOSTIC_OUTPUT 1521 print_debug_info(NOT_AN_INDEX, *xoutputs[_control_section], itr, _out_dofs);
1526 for(
int i=0; i<xoutputs.ct(); ++i)
1528 xoutputs[i]->put_fiber(itr->disc_id,
1529 _out_dofs[i]->base(),
1538 _extension_action->
finalize(xoutputs);
1545 #ifdef DIAGNOSTIC_OUTPUT 1547 post_information_message(
"Leaving define_extension:");
1554 fields::base_space_map::
1559 require(
domain().state_is_read_accessible());
1563 _domain_db = _domain->
max_db();
1568 _overlap_action = _default_overlap_action;
1571 _extension_action = _default_extension_action;
1578 _pb_maps.set_ct(_pb_maps.ub());
1585 _chart_pts.reserve(32);
virtual bool invariant() const
Class invariant, intended to be redefined in each descendant. See below for template for invariant in...
A context for discretization members. Intended for implementing various iterators, especially concurrent iterations over multiple sections.
virtual void force_is_done()
Force the iterator to be done.
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...
scoped_index disc_id
The global index of the disc member.
void truncate()
Makes this the next member of the subset which is not less than old this, i.e. the depth-first descen...
const geometry::sec_ed_invertible & domain_coords() const
The coordinates section for the domain.
host_type * host() const
The poset this is a member of.
section_space_schema_poset * host() const
The poset which this is a handle to a component of.
size_type ct() const
The number of items currently in use.
const pod_type & pod() const
The "plain old data" storage of this; the value in the external id space.
virtual void get_prop_disc_values(const sec_vd &xsec)=0
The gets the values of xsec at the property discretization points.
section_evaluator & evaluator()
The section evaluator associated with the current evaluation member (mutable version).
schema_poset_member & fiber_schema()
The fiber schema component of this (mutable version).
bool same_rep(const sec_vd &xsec1, const sec_vd &xsec2, bool xauto_access) const
True if and only if xsec1 and xsec2 have the same rep.
Namespace for fields component of sheaf system.
base_space_map()
Default constructor; protected to prevent default construction.
bool state_is_read_accessible() const
True if this is attached and if the state is accessible for read or access control is disabled...
virtual void force_is_done()
Force the iterator to be done.
An iterator over the members of the evaluation subposet contained in the downset of the base space of...
void put_extension_action(base_space_map_push_action &xextension_action)
Sets the extension action to xextension_action.
virtual void initialize_point_locator(bool xauto_access)
Initializes point locater search structure using default values.
subposet & evaluation()
The evaluation subposet for section spaces on this schema (mutable version).
Abstract functor to compute the dofs at a destination discretization point.
bool is_invertible() const
True if this can be inverted.
base_space_map_push_action & default_overlap_action() const
Overlap action if none specified by clinet.
void reserve(index_type xub)
Makes ub() at least xub; if new storage is allocated, it is uninitialized.
bool is_same_state(const poset_state_handle *xhost, pod_index_type xhub_id) const
True is this is attached to state with hub id xhub_id in host xhost.
An abstract handle to a space of alternate integer identifiers (aliases) for a subset of a hub set of...
virtual void point_at_value_ua(const sec_vd_dof_type *xvalue, size_type xvalue_ub, chart_point &xresult)
Finds a chart point which is the preimage in this of xvalue; unattached version.
virtual void release_id_space() const =0
Returns this id space handle to the handle pool.
virtual void get_read_access() const
Get read access to the state associated with this.
void invalidate()
Make this id invalid.
const scoped_index & index() const
The index of the component state this handle is attached to.
virtual dof_type value_at_coord(const dof_type xdofs[], size_type xdofs_ub, const dof_type xlocal_coords[], size_type xlocal_coords_ub) const
Value at a specified local_coordinate. Single component version.
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...
A section of a fiber bundle with a d-dimensional Euclidean vector space fiber.
void invalidate()
Makes this invalid.
The lattice of closed cells of a cellular space; a lattice representation of a computational mesh...
virtual void finalize(block< sec_vd *> &xoutputs)
Finalizes outputs as needed.
base_space_map_push_action & overlap_action() const
Computes value of destination dofs where dst overlaps src.
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.
const base_space_poset & range() const
The range of the push-forward map.
An abstract invertible section of a fiber bundle with a d-dimensional base space and a d-dimensional ...
virtual void all_points_at_value_ua(const sec_vd_value_type *xvalue, size_type xvalue_ub, block< chart_point_3d > &xresult)
Finds all chart points at which this has value xvalue and appends them to xresult. Note that charts overlap at their boundaries and hence if xvalue lies on a boundary it is contained in more than one chart.
const base_space_poset & domain() const
The domain of the push-forward map.
void set_ct(size_type xct)
Sets ct() == xct.
An index within the external ("client") scope of a given id space.
void push(const sec_vd &xinput, sec_vd &xoutput, bool xauto_access)
Pushes section xinput on domain() to xoutput on range().
unsigned long size_type
An unsigned integral type used to represent sizes and capacities.
scattered_insertion_index_space_handle & get_branch_id_space(bool xauto_access)
Allocate an id space handle from the handle pool attached to the branch id space for this member...
virtual any * clone() const
Virtual constructor, makes a new instance of the same type as this.
virtual void initialize(block< sec_vd *> &xoutputs)
Initializes outputs as needed.
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 sec_ed & range_coords() const
The coordinates section for the range.
void next()
Makes this the next member of the subset.
subposet & discretization()
The discretization subposet for section spaces on this schema (mutable version).
void disable_invariant_check() const
Disable invariant check. Intended for preventing recursive calls to invariant and for suppressing inv...
An entry in a discretization map.
sec_vd_value_type values[values_ub]
The values of another section (typically the global coordinates) at this disc point.
virtual pod_type pod(pod_type xid) const =0
The pod index in this space equivalent to xid in the hub id space.
const block< discretization_context > & property_discretization_members() const
The property discretization members in the downset of the current evaluation member.
chart_point_3d domain_pt
The location of the discretization member.
An abstract local section evaluator; a map from {local coordinates x dofs} to section value...
A section of a fiber bundle with a d-dimensional vector space fiber.
bool is_done() const
True if iteration finished.
void detach_from_state()
Detaches field from state it is currently attached to.
const scattered_insertion_index_space_handle & id_space() const
The id space for the members of with this (const version).
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...
void put_overlap_action(base_space_map_push_action &xoverlap_action)
Sets the overlap action to xoverlap_action.
int access_request_depth() const
The number of times access has been requested and granted without being released. ...
bool invariant_check() const
True if invariant checking is enabled.
total_poset_member & base_space()
The base space component of this (mutable version).
virtual section_space_schema_member & schema()
The restricted schema for this (mutable version).
bool same_fiber(const sec_vd &xsec1, const sec_vd &xsec2, bool xauto_access) const
True if and only if xsec1 and xsec2 have the same fiber type and dimension.
Abstract functor to compute the dofs at a destination discretization point.
int_type pod_index_type
The plain old data index type.
static property_disc_iterator * new_property_disc_iterator(const section_space_schema_member &xcoords_schema, const section_space_schema_member &xprop_schema)
Creates an iterator appropriate for xcoords and xprop.
virtual scoped_index member_index_ub() const
The upper bound on the member_index;.
Functor to compute the dofs at a destination discretization point by copying the source value to the ...
base_space_map_push_action & extension_action() const
Computes value of destination dofs where dst does not overlap src.
bool same_base(const sec_vd &xsec1, const sec_vd &xsec2, bool xauto_access) const
True if and only if xsec1 and xsec2 have the same base space.
void gather_dofs(const sec_vd &xsec, block< sec_vd::dof_type > &xdofs)
Gathers the dofs for the current evalaution member from section xsec and appends them to the back of ...
A client handle for a poset member which has been prepared for use as a schema for a section space...
virtual void branch_points_at_value_ua(const sec_vd_value_type *xvalue, size_type xvalue_ub, block< branch_point_pair > &xresult)
Finds one chart point in each branch at which this has value xvalue and appends them to xresult...
int df() const
The dimension of the fiber space component.
A map from members of a discretization subposet to points in a base space.
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.
int max_db() const
The maximum dimension of the members of this base space.
double sec_vd_dof_type
The type of degree of freedom in the section space.
bool is_multisection(bool xauto_access) const
True if this is a multisection.
scoped_index disc_id
The id of a discretization member.
sec_rep_descriptor & rep()
The representation for section spaces on this schema (mutable version).
A map from one base space to another generated by coordinate sections.
An auto_block with a no-initialization initialization policy.
SHEAF_DLL_SPEC pod_index_type invalid_pod_index()
The invalid pod index value.
virtual ~base_space_map()
Destructor.
void enable_invariant_check() const
Enable invariant checking.
virtual bool invariant() const
Class invariant.
base_space_map_push_action & default_extension_action() const
Extension action if none specified by clinet.
Abstract iterator over the discretization of the property section of a field_vd. Concurrently travers...
base_space_poset & base_space()
The base space for section spaces on this schema.
const scoped_index & index() const
The index of the current member of the iteration.
pod_index_type base_space_id() const
The member id of the base space component of this.