]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fix an inconsistency.
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 17 Jul 2015 16:17:07 +0000 (11:17 -0500)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 17 Jul 2015 16:22:42 +0000 (11:22 -0500)
My understanding is that when FEValues calls the mapping, the mapping puts
its results into the FEValuesData base class of the FEValues object. Then,
FEValues calls FiniteElement::fill_fe_values which uses the mapping data
and its InternalData object to compute shape function information and again
put it into the FEValuesData base class of the FEValues object.

In the case of FESystem, this is a bit more complicated: Here, we don't want
the base elements to put their stuff into the FEValuesData base object
because the results of *all* base elements will go there (and because,
consequently, array sizes don't match, etc). Thus, FESystem::fill_fe_values
creates an array of scratch FEValuesData objects, passes these to the
base elements that fill them, and the copies back the data from the scratch
objects to its own base element. To make this work, FESystem has to also first
copy everything that's in its own FEValuesData base object to each of the scratch
objects.

This is where the bug lies: Currently, only one of the elements that the mapping
has computed is copied; we need to be consistent and do this with all
mapping related arrays in FEValuesData.

source/fe/fe_system.cc

index f087c92ba53d026bf42213fbf16d1d6f1dd59521..e460f80e0b8a8a926f2e4e0d2299f9453f570648 100644 (file)
@@ -1180,14 +1180,17 @@ FESystem<dim,spacedim>::compute_fill (
           FEValuesData<dim,spacedim> &
           base_data    = fe_data.get_fe_values_data(base_no);
 
-          // Copy quadrature points. These are required for computing
-          // the determinant in the FEPolyTensor class. The
-          // determinant is one ingredient of the Piola
-          // transformation, which is applied to correctly map the RT
-          // space from the reference element to the global coordinate
-          // system.
-          if (cell_similarity != CellSimilarity::translation)
-            base_data.JxW_values = data.JxW_values;
+          // Copy all of the things that the mapping set in the FEValuesData
+          // that we store here into the corresponding objects we pass down
+          // to the various base elements. some of these arrays may be empty,
+          // in which case copying is cheap
+          base_data.JxW_values        = data.JxW_values;
+          base_data.jacobians         = data.jacobians;
+          base_data.jacobian_grads    = data.jacobian_grads;
+          base_data.inverse_jacobians = data.inverse_jacobians;
+          base_data.quadrature_points = data.quadrature_points;
+          base_data.normal_vectors    = data.normal_vectors;
+          base_data.boundary_forms    = data.boundary_forms;
 
 
           // Make sure that in the case of fill_fe_values the data is only

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.