SheafSystem  0.0.0.0
discretization_pusher.cc
Go to the documentation of this file.
1 
2 //
3 // Copyright (c) 2014 Limit Point Systems, Inc.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 
18 //
21 //
22 #include "SheafSystem/discretization_pusher.h"
23 
24 #include "SheafSystem/assert_contract.h"
25 #include "SheafSystem/chart_point.h"
26 #include "SheafSystem/binary_section_space_schema_member.h"
27 #include "SheafSystem/discretization_iterator.h"
28 #include "SheafSystem/discretization_push_action.h"
29 #include "SheafSystem/error_message.h"
30 #include "SheafSystem/eval_family.h"
31 #include "SheafSystem/eval_iterator.h"
32 #include "SheafSystem/postorder_iterator.h"
33 #include "SheafSystem/field_eval_iterator.h"
34 #include "SheafSystem/sec_vd.h"
35 #include "SheafSystem/sec_rep_descriptor.h"
36 #include "SheafSystem/section_evaluator.h"
37 #include "SheafSystem/structured_block_1d.h"
38 #include "SheafSystem/structured_block_2d.h"
39 #include "SheafSystem/structured_block_3d.h"
40 
41 using namespace std;
42 using namespace fields; // Workaround for MS C++ bug.
43 
44 //#define DIAGNOSTIC_OUTPUT 1
45 
46 
47 // ===========================================================
48 // DISCRETIZATION_PUSHER FACET
49 // ===========================================================
50 
51 // PUBLIC MEMBER FUNCTIONS
52 
55 {
56  // Preconditions:
57 
58  // Body:
59 
60  // Postconditions:
61 
62  // Exit:
63 
64  return;
65 }
66 
69 {
70  // Preconditions:
71 
72  // Body:
73 
74  // Postconditions:
75 
76  // Exit:
77 }
78 
79 void
82  const sec_vd& xglobal_coord,
83  discretization_push_action& xpush_action,
84  bool xauto_access)
85 {
86  // Preconditions:
87 
88  require(xauto_access || xsrc.state_is_read_accessible());
89  require(xauto_access || xglobal_coord.state_is_read_accessible());
90 
91  if(xauto_access)
92  {
93  xsrc.get_read_access();
94  xglobal_coord.get_read_access();
95  }
96 
97  require(xsrc.base_space().is_same_state(&xglobal_coord.schema().base_space()));
98  require(dynamic_cast<const binary_section_space_schema_member*>\
99  (&xglobal_coord.schema()));
100 
101  // Body:
102 
103  const subposet& lsrc_disc_sp = xsrc.discretization();
104  const subposet& lsrc_eval_sp = xsrc.evaluation();
105  const subposet& lcoord_disc_sp = xglobal_coord.schema().discretization();
106  const subposet& lcoord_eval_sp = xglobal_coord.schema().evaluation();
107 
108  // Push discretization back into the global coordinates.
109 
110  // Implementation of the push depends on 3 conditions:
111  //
112  // 1) Do we need to gather the coordinate dofs?
113  // If the coord evaluation subposet contains only
114  // one member then the dofs are already gathered, otherwise
115  // we need to gather them for each eval member.
116  //
117  // 2) Do we need to map the local coord of the source disc to the local
118  // coord of the global coord field? If the source eval subposet is the
119  // same as the global coord, we can just feed the local coord from
120  // the range evaluator to the global coord evaluator. If the source
121  // eval subposet is finer than the global coord eval subposet, then
122  // we need a map from each source eval member to the global coord
123  // eval member that contains it.
124  //
125  // 3) Do we need to evaluate the global coord at the local coord
126  // associated with each source disc member? If the source and the
127  // global coord share the same disc, we can just gather the global
128  // coord dofs, we don't need to evaluate the interploation method.
129  //
130  // These conditions are not entirely independent. In particular,
131  // if we don't need to evaluate then we don't need to map.
132 
133  bool lmust_gather = must_gather(xsrc, xglobal_coord.schema());
134  bool lmust_map = must_map(xsrc, xglobal_coord.schema());
135  bool lmust_evaluate = must_evaluate(xsrc, xglobal_coord.schema());
136 
139 
140  if(lmust_gather && lmust_map && lmust_evaluate)
141  {
142  post_fatal_error_message("(lmust_gather && lmust_map && lmust_evaluate) is not implemented");
143  }
144  else if(lmust_gather && lmust_map && !lmust_evaluate)
145  {
146  post_fatal_error_message("(lmust_gather && lmust_map && !lmust_evaluate) is not implemented");
147  }
148  else if(lmust_gather && !lmust_map && lmust_evaluate)
149  {
150  push_gather_no_map_evaluate(xsrc, xglobal_coord, xpush_action);
151  }
152  else if(lmust_gather && !lmust_map && !lmust_evaluate)
153  {
154  push_gather_no_map_no_evaluate(xsrc, xglobal_coord, xpush_action);
155  }
156  else if(!lmust_gather && lmust_map && lmust_evaluate)
157  {
158  push_no_gather_map_evaluate(xsrc, xglobal_coord, xpush_action);
159  }
160  else if(!lmust_gather && lmust_map && !lmust_evaluate)
161  {
162  post_fatal_error_message("(!lmust_gather && lmust_map && !lmust_evaluate) is not implemented");
163  }
164  else if(!lmust_gather && !lmust_map && lmust_evaluate)
165  {
166  post_fatal_error_message("(!lmust_gather && !lmust_map && lmust_evaluate) is not implemented");
167  }
168  else if(!lmust_gather && !lmust_map && !lmust_evaluate)
169  {
170  post_fatal_error_message("(!lmust_gather && !lmust_map && !lmust_evaluate) is not implemented");
171  }
172 
173  // Postconditions:
174 
175  if(xauto_access)
176  {
177  xsrc.release_access();
178  xglobal_coord.release_access();
179  }
180 
181  // Exit:
182 }
183 
184 
185 // PRIVATE MEMBER FUNCTIONS
186 
187 bool
188 fields::discretization_pusher::
189 must_gather(const section_space_schema_member& xrange_schema,
190  const section_space_schema_member& xglobal_coord_schema) const
191 {
192  bool result;
193 
194  // Preconditions:
195 
196  // Body:
197 
198  // True if range coord evaluation subposet contains more
199  // than a single member.
200 
201  result = (xglobal_coord_schema.evaluation().member_ct() > 1);
202 
203  // Postconditions:
204 
205  // Exit:
206 
207  return result;
208 }
209 
210 bool
211 fields::discretization_pusher::
212 must_map(const section_space_schema_member& xsrc,
213  const section_space_schema_member& xglobal_coord_schema) const
214 {
215  bool result;
216 
217  // Preconditions:
218 
219  // Body:
220 
221  const subposet& lrange_eval = xsrc.evaluation();
222  const subposet& lglobal_coord_eval = xglobal_coord_schema.evaluation();
223 
224  // True if source eval is strictly finer than global coord eval.
225 
229 
230  result = !lrange_eval.is_same_state(&lglobal_coord_eval);
231 
232  // Postconditions:
233 
234  // Exit:
235 
236  return result;
237 }
238 
239 bool
240 fields::discretization_pusher::
241 must_evaluate(const section_space_schema_member& xsrc,
242  const section_space_schema_member& xglobal_coord_schema) const
243 {
244  bool result;
245 
246  // Preconditions:
247 
248  // Body:
249 
250  const subposet& lrange_disc = xsrc.discretization();
251  const subposet& lglobal_coord_disc = xglobal_coord_schema.discretization();
252 
253  // True if source disc is not the same as the global coord disc.
254 
255  result = !lrange_disc.is_same_state(&lglobal_coord_disc);
256 
257  // Postconditions:
258 
259  // Exit:
260 
261  return result;
262 }
263 
264 void
265 fields::discretization_pusher::
266 push_gather_no_map_no_evaluate(const section_space_schema_member& xsrc,
267  const sec_vd& xglobal_coord,
268  discretization_push_action& xpush_action)
269 {
270 
271 #ifdef DIAGNOSTIC_OUTPUT
272  post_information_message("push_gather_no_map_no_evaluate:");
273 #endif
274 
275  // Preconditions:
276 
277  require(xsrc.state_is_read_accessible());
278  require(xglobal_coord.state_is_read_accessible());
279  require(dynamic_cast<const binary_section_space_schema_member*>(&xglobal_coord.schema()));
280  require(xsrc.base_space().is_same_state(&xglobal_coord.schema().base_space()));
281  require(xsrc.discretization().is_same_state(&xglobal_coord.schema().discretization()));
282 
283  // Body:
284 
285  // Allocate a buffer for the global coordinate dofs associated with a disc member.
286  // Binary schema requirement ensures there are df dofs for each disc member.
287 
289 
290  int ldc = xglobal_coord.schema().df();
291  block<sec_vd_dof_type> lcoord_dofs(ldc);
292  lcoord_dofs.set_ct(ldc);
293 
294  discretization_iterator lsrc_disc_itr(xsrc);
295  while(!lsrc_disc_itr.is_done())
296  {
297  scoped_index ldisc_id = lsrc_disc_itr.discretization_member_index();
298 
299  // Gather the global coordinate field dofs for this discretization member.
300  // Uses the precondition that the source and the global coordinate
301  // discretizations are the same to avoid evaluating the coordinates.
302 
303  xglobal_coord.get_fiber(ldisc_id, lcoord_dofs.base(),
304  lcoord_dofs.ub()*sizeof(sec_vd_dof_type), false);
305 
306  // Execute the push action.
307 
308  xpush_action(ldisc_id, lcoord_dofs);
309 
310  // Move to the next discretization member
311 
312  lsrc_disc_itr.next();
313  }
314 
315  // Postconditions:
316 
317  // Exit:
318 
319  return;
320 }
321 
322 void
323 fields::discretization_pusher::
324 push_gather_no_map_evaluate(const section_space_schema_member& xsrc,
325  const sec_vd& xglobal_coord,
326  discretization_push_action& xpush_action)
327 {
328 
329 #ifdef DIAGNOSTIC_OUTPUT
330  post_information_message("push_gather_no_map_evaluate:");
331 #endif
332 
333  // Preconditions:
334 
335  require(xsrc.state_is_read_accessible());
336  require(xglobal_coord.state_is_read_accessible());
337  require(xsrc.base_space().is_same_state(&xglobal_coord.schema().base_space()));
338 
339  // Body:
340 
341  // Allocate a buffer for the global coordinate dofs associated with an eval member.
342  // Binary schema requirement ensures there are df dofs for each disc member.
343  // Assume some number of disc members, e.g. 32, will auto resize if needed.
344 
346 
347  block<sec_vd_dof_type> lcoord_dofs(xglobal_coord.schema().df()*32);
348 
349  // Allocate a buffer for the local and global coordinates associated
350  // with a source discretization member.
351 
352  block<chart_point_coord_type> lsrc_lc(xsrc.db());
353  lsrc_lc.set_ct(xsrc.db());
354  block<sec_vd_dof_type> lsrc_gc(xglobal_coord.schema().df());
355  lsrc_gc.set_ct(xglobal_coord.schema().df());
356 
357 
358  field_eval_iterator litr(xglobal_coord.schema(), xsrc);
359  while(!litr.is_done())
360  {
361  // Get the evaluators for this member of the evaluation subposet.
362 
363  section_evaluator& lsrc_evlr = litr.property_evaluator();
364  section_evaluator& lcoord_evlr = litr.coordinate_evaluator();
365 
366  // Gather the global coordinate dofs for this evaluation member.
367 
368  litr.gather_coordinate_dofs(xglobal_coord, lcoord_dofs);
369 
370  // Iterate over the source discretization members for this evaluation member.
371 
372  const block<scoped_index>& lsrc_disc_ids =
373  litr.property_discretization_members();
374  size_type lsrc_disc_ct = lsrc_disc_ids.ct();
375 
376  for(size_type i=0; i<lsrc_disc_ct; ++i)
377  {
378  scoped_index ldisc_id = lsrc_disc_ids[i];
379 
380  if(!litr.property_has_been_visited(ldisc_id))
381  {
382  // Get the local coordinates of this discretization member.
383 
384  lsrc_evlr.local_coordinates(i, lsrc_lc.base(), lsrc_lc.ub());
385 
386  // Evaluate the global coordinates at the local coordinates
387  // of this source discretization member.
388 
389  lcoord_evlr.value_at_coord(lcoord_dofs.base(),
390  lcoord_dofs.ct(),
391  lsrc_lc.base(),
392  lsrc_lc.ct(),
393  lsrc_gc.base(),
394  lsrc_gc.ct());
395 
396  // Execute the push action.
397 
398  xpush_action(ldisc_id, lsrc_gc);
399  }
400  }
401 
402  // Move to the next evaluation member.
403 
404  litr.next();
405  }
406 
407  // Postconditions:
408 
409  // Exit:
410 }
411 
412 
413 void
414 fields::discretization_pusher::
415 push_no_gather_map_evaluate(const section_space_schema_member& xsrc,
416  const sec_vd& xglobal_coord,
417  discretization_push_action& xpush_action)
418 {
419 
420 #ifdef DIAGNOSTIC_OUTPUT
421  post_information_message("push_no_gather_map_evaluate:");
422 #endif
423 
424  // Preconditions:
425 
426  require(xsrc.state_is_read_accessible());
427  require(xglobal_coord.state_is_read_accessible());
428  require(xsrc.base_space().is_same_state(&xglobal_coord.schema().base_space()));
429 
430  // Body:
431 
432  // !must_gather implies the coordinate field has a single eval member.
433  // must_map implies the eval sp of the property is finer than the coordinates,
434  // which in turn implies we will have to evaluate the coordinate field.
435 
438 
439  // Allocate two chart points for the property discretization members;
440  // one will use the "refined" local coordinates of the property eval sp,
441  // the other will use the "unrefined" local coordinates of the coordinates
442  // eval sp.
443 
444  int ldb = xsrc.db();
445  chart_point* lref_prop_lc = chart_point::new_chart_point(ldb);
446  chart_point* lunref_prop_lc = chart_point::new_chart_point(ldb);
447 
448 
449  // Allocate a buffer for the global coordinates associated
450  // with a property discretization member.
451 
452  block<sec_vd_dof_type> lprop_gc(xglobal_coord.schema().df());
453  lprop_gc.set_ct(lprop_gc.ub());
454 
455  // Allocate a buffer for the dofs of a propert disc member.
456 
457  block<sec_vd_dof_type> lprop_dofs(xsrc.df());
458  lprop_dofs.set_ct(lprop_dofs.ub());
459 
460  // Get the base space for the coordinates.
462 
463  structured_block* lbase;
464  switch(ldb)
465  {
466  case 1:
467  lbase = new structured_block_1d(xglobal_coord.schema().base_space());
468  break;
469  case 2:
470  lbase = new structured_block_2d(xglobal_coord.schema().base_space());
471  break;
472  case 3:
473  lbase = new structured_block_3d(xglobal_coord.schema().base_space());
474  break;
475  default:
476  post_fatal_error_message("Unsupported base space dimension");
477  break;
478  }
479 
480  // Get the evaluator for the coordinates field.
481 
482  string lfamily_name(xglobal_coord.schema().rep().evaluator_family_name());
483  eval_family* lfamily =
484  eval_family::new_family(lfamily_name, *xglobal_coord.name_space());
485  section_evaluator* lcoords_evlr = lfamily->member(lbase->type_id());
486 
487  // Get the dofs for the coordinates field.
488  // Note that given the uniform mesh hack, this is not a large array.
489 
490  block<sec_vd_dof_type> lcoords_dofs(xglobal_coord.schema().row_dof_ct());
491  lcoords_dofs.set_ct(lcoords_dofs.ub());
492  xglobal_coord.dof_tuple(lcoords_dofs.base(), lcoords_dofs.ct());
493 
494 #ifdef DIAGNOSTIC_OUTPUT
495 
496  cout << " global coords dofs:";
497  for(size_type c=0; c<lcoords_dofs.ub(); ++c)
498  {
499  cout << setw(6) << lcoords_dofs[c];
500  }
501  cout << endl;
502 #endif
503 
504  // Allocate a marker for discretization members we've already visited.
505 
506  zn_to_bool lvisited(xsrc.base_space().host()->member_index_ub().pod());
507 
508  eval_iterator lprop_eval_itr(xsrc);
509  while(!lprop_eval_itr.is_done())
510  {
511  // Get the evaluator for this eval member.
512 
513  section_evaluator& lprop_evlr = lprop_eval_itr.evaluator();
514 
515  // Set the chart id for the refined local coordinates.
516 
517  lref_prop_lc->put_chart_id(lprop_eval_itr.index());
518 
519  // Iterate over the property discretization members for this eval member.
520 
521  block<scoped_index>& lprop_disc_ids =
522  lprop_eval_itr.discretization_members();
523  size_type lprop_disc_ct = lprop_disc_ids.ct();
524 
525  for(size_type i=0; i<lprop_disc_ct; ++i)
526  {
527  scoped_index ldisc_id = lprop_disc_ids[i];
528 
529  if(!lvisited[ldisc_id.pod()])
530  {
531  // Haven't evaluated this member yet.
532 
533  // Get its local coordinates in the property (refined) mesh.
534 
535  lprop_evlr.local_coordinates(i,
536  lref_prop_lc->local_coords(),
537  lref_prop_lc->db());
538 
539  // Map the refined local coordinates to the unrefined local coordinates.
540 
541 
542  lbase->unrefine_point_pa(*lref_prop_lc, *lunref_prop_lc);
543 
544  // Evaluate the global coordinates at the unrefined local coordinates.
545 
546  lcoords_evlr->value_at_coord(lcoords_dofs.base(),
547  lcoords_dofs.ct(),
548  lunref_prop_lc->local_coords(),
549  lunref_prop_lc->db(),
550  lprop_gc.base(),
551  lprop_gc.ct());
552 
553  // Execute the push action.
554 
555  xpush_action(ldisc_id, lprop_gc);
556 
557 
558  // Mark this member so we don't process it again.
559 
560  lvisited.put(ldisc_id.pod(), true);
561 
562 #ifdef DIAGNOSTIC_OUTPUT
563 
564  index_space_handle& ldisc_space = xsrc.discretization().id_space();
565  cout << endl
566  << " disc_id: " << setw(5) << ldisc_space.pod(ldisc_id)
567  << endl;
568 
569  cout << " refined property point:" << *lref_prop_lc << endl;
570  cout << " unrefined property point:" << *lunref_prop_lc << endl;
571 
572  cout << " disc mbr global coords:";
573  for(size_type c=0; c<lprop_gc.ub(); ++c)
574  {
575  cout << setw(6) << lprop_gc[c];
576  }
577  cout << endl;
578 #endif
579 
580  }
581  }
582 
583  // Move to the next evaluation member.
584 
585  lprop_eval_itr.next();
586  }
587 
588  // Clean up.
589 
590  lbase->detach_from_state();
591  delete lfamily;
592 
593  // Postconditions:
594 
595  // Exit:
596 
597  return;
598 }
599 
600 
601 // ===========================================================
602 // ANY FACET
603 // ===========================================================
604 
605 // PUBLIC MEMBER FUNCTIONS
606 
607 bool
609 invariant() const
610 {
611  bool result = true;
612 
613  // Preconditions:
614 
615  // Body:
616 
617  invariance(any::invariant());
618 
619  if(invariant_check())
620  {
621  disable_invariant_check();
622 
623  // State has required access:
624 
625  // Finished, turn invariant checking back on.
626 
627  enable_invariant_check();
628  }
629 
630  // Postconditions:
631 
632  // Exit
633 
634  return result;
635 }
636 
637 
638 // ===========================================================
639 // NONMEMBER FUNCTIONS
640 // ===========================================================
641 
poset_state_handle * host() const
The poset which this is a handle to a component of.
A client handle for a subposet.
Definition: subposet.h:86
std::string evaluator_family_name() const
The name of the evaluator family.
index_type ub() const
The upper bound on the storage array. The number of items current allocated in the storage array...
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.
Definition: scoped_index.h:672
A homogeneous collection of connected quads arranged in an i_size() x j_size() array.
discretization_pusher()
Default constructor.
Namespace for fields component of sheaf system.
bool state_is_read_accessible() const
True if this is attached and if the state is accessible for read or access control is disabled...
void get_fiber(pod_index_type xdisc_id, vd_lite &xfiber) const
Sets xfiber to the fiber referred to by discretization id xdisc_id.
Definition: sec_vd.cc:1087
An iterator which concurrently traverses the schema of both the coordinates and property sections of ...
An iterator over the members of the evaluation subposet contained in the downset of the base space of...
Definition: eval_iterator.h:66
subposet & evaluation()
The evaluation subposet for section spaces on this schema (mutable version).
virtual int db() const =0
The dimension of this chart.
Definition: chart_point.cc:141
STL namespace.
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.
void put_chart_id(pod_index_type xchart)
Sets chart_id() to xchart_id.
Definition: chart_point.cc:103
A point in chart space.
Definition: chart_point.h:52
An abstract handle to a space of alternate integer identifiers (aliases) for a subset of a hub set of...
void next()
Makes this the next member of the subset.
virtual void get_read_access() const
Get read access to the state associated with this.
virtual namespace_poset * name_space() const
The namespace of host()
const pod_index_type & type_id() const
The cell type id of this. The id of the prototype of this in the "cell_types" id space of the prototy...
The action to executed by discretization_pusher::push on each member of a discretization subposet...
A homogeneous collection of connected segments arranged in an i_size() array.
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.
A client handle for a base space member which represents a homgeneous collection of local cells...
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 map from Zn (the integers mod n) to bools. A characteristic function used to represent subsets of Z...
Definition: zn_to_bool.h:52
void dof_tuple(dof_type *xbuf, int xbuflen) const
Copies the entire dof tuple into xbuf.
Definition: sec_vd.cc:847
virtual coord_type * local_coords()=0
The array of local coordinates.
Definition: chart_point.cc:209
pointer_type base() const
The underlying storage array.
void set_ct(size_type xct)
Sets ct() == xct.
An index within the external ("client") scope of a given id space.
Definition: scoped_index.h:116
A family of compatible section evaluators, one for each member of some family of cell types; a map fr...
Definition: eval_family.h:67
unsigned long size_type
An unsigned integral type used to represent sizes and capacities.
Definition: sheaf.h:52
void push(const section_space_schema_member &xsrc, const sec_vd &xglobal_coord, discretization_push_action &xpush_action, bool xauto_access)
Pushes each member of the discretization of xsrc into the fiber space of xglobal_coord and then execu...
Iterator over the discretization subposet associated with a section_space_schema_member anchor...
static int row_dof_ct(const namespace_poset &xns, const poset_path &xpath, bool xauto_access=true)
The number of row dofs defined by the schema specified by xns and xpath. Synonym for dof_ct(xns...
subposet & discretization()
The discretization subposet for section spaces on this schema (mutable version).
int member_ct() const
The number of members of this subposet.
Definition: subposet.cc:887
virtual pod_type pod(pod_type xid) const =0
The pod index in this space equivalent to xid in the hub id space.
const scoped_index & discretization_member_index() const
The current discretization member index.
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.
Definition: sec_vd.h:54
A homogeneous collection of connected hexahedra arranged in an i_size() x j_size() x k_size() array...
bool is_done() const
True if iteration finished.
const scattered_insertion_index_space_handle & id_space() const
The id space for the members of with this (const version).
Definition: subposet.cc:508
virtual void detach_from_state()
Detach this handle from its state, if any.
virtual bool invariant() const
Class invariant.
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).
virtual scoped_index member_index_ub() const
The upper bound on the member_index;.
A client handle for a poset member which has been prepared for use as a schema for a section space...
virtual void unrefine_point_pa(const chart_point &xpt, chart_point &result) const =0
The point in this which is the same as xpt in the direct refinement of this; pre-allocated version...
int db() const
The dimension of the base space component.
int df() const
The dimension of the fiber space component.
double sec_vd_dof_type
The type of degree of freedom in the section space.
Definition: fiber_bundle.h:78
virtual void local_coordinates(pod_index_type xindex, coord_type xresult[], size_type xresult_ub) const =0
The local coordinates of the dof with local index xindex.
sec_rep_descriptor & rep()
The representation for section spaces on this schema (mutable version).
virtual ~discretization_pusher()
Destructor.