[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