[cig-commits] [commit] master: add composition names (25cf84a)
cig_noreply at geodynamics.org
cig_noreply at geodynamics.org
Wed May 21 07:32:26 PDT 2014
Repository : https://github.com/geodynamics/aspect
On branch : master
Link : https://github.com/geodynamics/aspect/compare/497a2179702f669476083a98714879503e0dfa90...6aa7541c733b8fd1cc1b0c74536c8804aaeb7015
>---------------------------------------------------------------
commit 25cf84aeee8903fb5d3e1995c1acd0ed8ba29e77
Author: Juliane Dannberg <dannberg at gfz-potsdam.de>
Date: Wed May 21 05:36:12 2014 +0200
add composition names
>---------------------------------------------------------------
25cf84aeee8903fb5d3e1995c1acd0ed8ba29e77
include/aspect/introspection.h | 35 ++++++++++++++++++++++----
source/simulator/introspection.cc | 52 ++++++++++++++++++++++++++++++++-------
source/simulator/parameters.cc | 22 +++++++++++++++--
3 files changed, 93 insertions(+), 16 deletions(-)
diff --git a/include/aspect/introspection.h b/include/aspect/introspection.h
index 0c879a7..87ea537 100644
--- a/include/aspect/introspection.h
+++ b/include/aspect/introspection.h
@@ -54,14 +54,14 @@ namespace aspect
public:
/**
* Constructor.
- * @param n_compositional_fields The number of compositional fields that
- * will be used in this simulation. This is used in initializing the
- * fields of this class.
* @param split_vel_pressure Set to true if velocity and pressure should
* be in separate blocks.
+ * @param composition_names The names of compositional fields that
+ * will be used in this simulation. This is used in initializing the
+ * fields of this class.
*/
Introspection (const bool split_vel_pressure,
- const std::vector<std::string> &composition_names);
+ const std::vector<std::string> &names_of_compositional_fields);
/**
* @name Things that are independent of the current mesh
@@ -266,17 +266,42 @@ namespace aspect
* @}
*/
+ /**
+ * A function that gets the name of a compositional field as an
+ * input parameter and returns its index.
+ *
+ * @param name The name of compositional field (as specified in
+ * the input file)
+ */
unsigned int
compositional_index_for_name (const std::string &name) const;
+ /**
+ * A function that gets the index of a compositional field as an
+ * input parameter and returns its name.
+ *
+ * @param index The index of compositional field
+ */
std::string
name_for_compositional_index (const unsigned int index) const;
+ /**
+ * A function that gets the name of a compositional field as an
+ * input parameter and returns if the compositional field is
+ * used in this simulation.
+ *
+ * @param name The name of compositional field (as specified in
+ * the input file)
+ */
bool
compositional_name_exists (const std::string &name) const;
private:
- ...;
+ /**
+ * A vector that stores the names of the compositional fields
+ * that will be used in the simulation.
+ */
+ std::vector<std::string> composition_names;
};
}
diff --git a/source/simulator/introspection.cc b/source/simulator/introspection.cc
index 9ee37f7..ddc5fa7 100644
--- a/source/simulator/introspection.cc
+++ b/source/simulator/introspection.cc
@@ -86,17 +86,18 @@ namespace aspect
template <int dim>
- Introspection<dim>::Introspection(const unsigned int n_compositional_fields,
- const bool split_vel_pressure)
+ Introspection<dim>::Introspection(const bool split_vel_pressure,
+ const std::vector<std::string> &names_of_compositional_fields)
:
- n_components (dim+2+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),
+ n_components (dim+2+names_of_compositional_fields.size()),
+ n_blocks (((split_vel_pressure)?3:2)+names_of_compositional_fields.size()),
+ extractors (names_of_compositional_fields.size()),
+ component_indices (names_of_compositional_fields.size()),
+ block_indices (names_of_compositional_fields.size(), split_vel_pressure),
+ base_elements (names_of_compositional_fields.size()),
components_to_blocks (component_to_block_mapping<dim>(n_components, split_vel_pressure)),
- system_dofs_per_block (n_blocks)
+ system_dofs_per_block (n_blocks),
+ composition_names(names_of_compositional_fields)
{}
@@ -166,6 +167,39 @@ namespace aspect
compositional_fields (half_open_extractor_sequence (dim+2, dim+2+n_compositional_fields))
{
}
+
+ template <int dim>
+ unsigned int
+ Introspection<dim>::compositional_index_for_name (const std::string &name) const
+ {
+ if (compositional_name_exists(name))
+ return std::find(composition_names.begin(), composition_names.end(), name) - composition_names.begin();
+ else
+ AssertThrow (false, ExcMessage ("The compositional field " + name +
+ " you asked for is not used in the simulation."));
+ return numbers::invalid_unsigned_int;
+
+ }
+
+ template <int dim>
+ std::string
+ Introspection<dim>::name_for_compositional_index (const unsigned int index) const
+ {
+ // make sure that what we get here is really an index of one of the compositional fields
+ AssertIndexRange(index,composition_names.size());
+ return composition_names[index];
+ }
+
+ template <int dim>
+ bool
+ Introspection<dim>::compositional_name_exists (const std::string &name) const
+ {
+ return (std::find(composition_names.begin(), composition_names.end(), name) != composition_names.end()
+ ?
+ true
+ :
+ false);
+ }
}
diff --git a/source/simulator/parameters.cc b/source/simulator/parameters.cc
index b90dd0a..f3b8d24 100644
--- a/source/simulator/parameters.cc
+++ b/source/simulator/parameters.cc
@@ -528,7 +528,7 @@ namespace aspect
"velocity, pressure and temperature.");
prm.declare_entry ("Names of fields", "",
Patterns::List(Patterns::Anything()),
- "A user-defined name for each of the compositional fields requested."));
+ "A user-defined name for each of the compositional fields requested.");
prm.declare_entry ("List of normalized fields", "",
Patterns::List (Patterns::Integer(0)),
"A list of integers smaller than or equal to the number of "
@@ -803,7 +803,25 @@ namespace aspect
ExcMessage ("The length of the list of names for the compositional "
"fields needs to either be empty or have length equal to "
"the number of compositional fields."));
-//TODO: verify that names can only contain [a-zA-Z][a-zA-Z0-9_]*
+
+ // check that the names use only allowed characters
+ for (unsigned int i=0; i<names_of_compositional_fields.size(); ++i)
+ {
+ Assert (names_of_compositional_fields[i].find_first_not_of("abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789_") == std::string::npos,
+ ExcMessage("Invalid character in field " + names_of_compositional_fields[i] + ". "
+ "Names of compositional fields should consist of a "
+ "combination of letters, numbers and underscores."));
+ Assert (names_of_compositional_fields[i].size() > 0,
+ ExcMessage("Invalid name of field " + names_of_compositional_fields[i] + ". "
+ "Names of compositional fields need to be non-empty."));
+ }
+
+ // default names if list is empty
+ if (names_of_compositional_fields.size() == 0)
+ for (unsigned int i=0;i<n_compositional_fields;++i)
+ names_of_compositional_fields.push_back("C_" + Utilities::int_to_string(i+1));
const std::vector<int> n_normalized_fields = Utilities::string_to_int
(Utilities::split_string_list(prm.get ("List of normalized fields")));
More information about the CIG-COMMITS
mailing list