[cig-commits] [commit] master: fix block indices in several places (95c9804)
cig_noreply at geodynamics.org
cig_noreply at geodynamics.org
Mon May 19 20:13:26 PDT 2014
Repository : https://github.com/geodynamics/aspect
On branch : master
Link : https://github.com/geodynamics/aspect/compare/76d4275352ef2cae5de9a073acd1c03a92c2670c...4f3d06fd1f3754419813db37ec9ef7f0f6f3cb15
>---------------------------------------------------------------
commit 95c9804ddcbe1e30cd3b8dae43ae96e75f2ebae7
Author: Timo Heister <timo.heister at gmail.com>
Date: Mon May 12 17:03:05 2014 -0400
fix block indices in several places
>---------------------------------------------------------------
95c9804ddcbe1e30cd3b8dae43ae96e75f2ebae7
source/simulator/core.cc | 30 +++++++++++++++++++++---------
source/simulator/introspection.cc | 34 ++++++++++++++++++++++++----------
2 files changed, 45 insertions(+), 19 deletions(-)
diff --git a/source/simulator/core.cc b/source/simulator/core.cc
index 298a075..d7e30fb 100644
--- a/source/simulator/core.cc
+++ b/source/simulator/core.cc
@@ -474,14 +474,16 @@ namespace aspect
statistics.add_value("Number of mesh cells",
triangulation.n_global_active_cells());
- statistics.add_value("Number of Stokes degrees of freedom",
- introspection.system_dofs_per_block[0] +
- introspection.system_dofs_per_block[1]);
+ unsigned int n_stokes_dofs = introspection.system_dofs_per_block[0];
+ if (introspection.block_indices.velocities != introspection.block_indices.pressure)
+ n_stokes_dofs += introspection.system_dofs_per_block[introspection.block_indices.pressure];
+
+ statistics.add_value("Number of Stokes degrees of freedom", n_stokes_dofs);
statistics.add_value("Number of temperature degrees of freedom",
- introspection.system_dofs_per_block[2]);
+ introspection.system_dofs_per_block[introspection.block_indices.temperature]);
if (parameters.n_compositional_fields > 0)
statistics.add_value("Number of composition degrees of freedom",
- introspection.system_dofs_per_block[3]);
+ introspection.system_dofs_per_block[introspection.block_indices.compositional_fields[0]]);
// then interpolate the current boundary velocities. this adds to
@@ -887,10 +889,19 @@ namespace aspect
introspection.system_dofs_per_block,
introspection.components_to_blocks);
{
- const types::global_dof_index n_u = introspection.system_dofs_per_block[0],
- n_p = introspection.system_dofs_per_block[1],
- n_T = introspection.system_dofs_per_block[2];
- std::vector<types::global_dof_index> n_C (parameters.n_compositional_fields+1);
+ types::global_dof_index n_u = introspection.system_dofs_per_block[0],
+ n_p = introspection.system_dofs_per_block[introspection.block_indices.pressure],
+ n_T = introspection.system_dofs_per_block[introspection.block_indices.temperature];
+
+ Assert(!parameters.direct_stokes_solver ||
+ (introspection.block_indices.velocities == introspection.block_indices.pressure),
+ ExcInternalError());
+
+ // only count pressure once if they are in the same block
+ if (parameters.direct_stokes_solver)
+ n_p = 0;
+
+ std::vector<types::global_dof_index> n_C (parameters.n_compositional_fields);
for (unsigned int c=0; c<parameters.n_compositional_fields; ++c)
n_C[c] = introspection.system_dofs_per_block
[introspection.block_indices.compositional_fields[c]];
@@ -908,6 +919,7 @@ namespace aspect
introspection.index_sets.system_partitioning.push_back(system_index_set.get_view(n_u,n_u+n_p));
}
introspection.index_sets.system_partitioning.push_back(system_index_set.get_view(n_u+n_p,n_u+n_p+n_T));
+
introspection.index_sets.stokes_partitioning.clear ();
if (parameters.direct_stokes_solver)
{
diff --git a/source/simulator/introspection.cc b/source/simulator/introspection.cc
index b9aeaad..6d52362 100644
--- a/source/simulator/introspection.cc
+++ b/source/simulator/introspection.cc
@@ -58,16 +58,28 @@ namespace aspect
{
template <int dim>
std::vector<unsigned int>
- component_to_block_mapping (const unsigned int n_components)
+ component_to_block_mapping (const unsigned int n_components,
+ const bool split_vel_pressure)
{
// set up a mapping between vector components to the blocks they
- // correspond to. each variable has its own block except
- // for the velocities which are all mapped into block 0
+ // correspond to.
std::vector<unsigned int> components_to_blocks (n_components, 0U);
- components_to_blocks[dim] = 1;
- components_to_blocks[dim+1] = 2;
- for (unsigned int i=dim+2; i<n_components; ++i)
- components_to_blocks[i] = i-dim+1;
+ if (split_vel_pressure)
+ {
+ // each variable has its own block except
+ // for the velocities which are all mapped into block 0
+ components_to_blocks[dim] = 1;
+ components_to_blocks[dim+1] = 2;
+ for (unsigned int i=dim+2; i<n_components; ++i)
+ components_to_blocks[i] = i-dim+1;
+ }
+ else
+ {
+ // here velocity and pressure is block 0:
+ components_to_blocks[dim+1] = 1;
+ for (unsigned int i=dim+2; i<n_components; ++i)
+ components_to_blocks[i] = i-dim;
+ }
return components_to_blocks;
}
@@ -79,12 +91,12 @@ namespace aspect
const bool split_vel_pressure)
:
n_components (dim+2+n_compositional_fields),
- n_blocks (3+n_compositional_fields),
+ n_blocks (((split_vel_pressure)?3:2)+n_compositional_fields),
extractors (n_compositional_fields),
component_indices (n_compositional_fields),
block_indices (n_compositional_fields, split_vel_pressure),
base_elements (n_compositional_fields),
- components_to_blocks (component_to_block_mapping<dim>(n_components)),
+ components_to_blocks (component_to_block_mapping<dim>(n_components, split_vel_pressure)),
system_dofs_per_block (n_blocks)
{}
@@ -119,7 +131,9 @@ namespace aspect
velocities(0),
pressure (split_vel_pressure?1:0),
temperature (split_vel_pressure?2:1),
- compositional_fields (half_open_sequence(3, 3+n_compositional_fields))
+ compositional_fields (half_open_sequence(
+ (split_vel_pressure?3:2),
+ (split_vel_pressure?3:2)+n_compositional_fields))
{}
More information about the CIG-COMMITS
mailing list