ASPECT
utilities.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2011 - 2024 by the authors of the ASPECT code.
3 
4  This file is part of ASPECT.
5 
6  ASPECT is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2, or (at your option)
9  any later version.
10 
11  ASPECT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with ASPECT; see the file LICENSE. If not see
18  <http://www.gnu.org/licenses/>.
19 */
20 
21 #ifndef _aspect_material_model_utilities_h
22 #define _aspect_material_model_utilities_h
23 
24 #include <aspect/global.h>
25 #include <deal.II/base/point.h>
30 
31 #include <mpi.h>
32 
33 #include <limits>
34 
35 
36 namespace aspect
37 {
38  template <int dim> class SimulatorAccess;
39  namespace Utilities
40  {
55  using namespace ::Utilities;
56 
57  template <int dim>
58  class StructuredDataLookup;
59  }
60  namespace MaterialModel
61  {
62  template <int dim> class MaterialModelOutputs;
63  template <int dim> struct EquationOfStateOutputs;
64 
70  namespace MaterialUtilities
71  {
72  namespace Lookup
73  {
81  {
82  public:
83 
84  double
85  specific_heat(const double temperature,
86  const double pressure) const;
87 
88  double
89  density(const double temperature,
90  const double pressure) const;
91 
92  double
93  thermal_expansivity(const double temperature,
94  const double pressure) const;
95 
96  double
97  seismic_Vp(const double temperature,
98  const double pressure) const;
99 
100  double
101  seismic_Vs(const double temperature,
102  const double pressure) const;
103 
104  double
105  enthalpy(const double temperature,
106  const double pressure) const;
107 
113  double
114  dHdT (const double temperature,
115  const double pressure) const;
116 
122  double
123  dHdp (const double temperature,
124  const double pressure) const;
125 
138  std::array<std::pair<double, unsigned int>,2>
139  enthalpy_derivatives(const std::vector<double> &temperatures,
140  const std::vector<double> &pressures,
141  const unsigned int n_substeps = 1) const;
142 
143  double
144  dRhodp (const double temperature,
145  const double pressure) const;
146 
151  unsigned int
152  dominant_phase (const double temperature,
153  const double pressure) const;
154 
159  bool
160  has_dominant_phase() const;
161 
166  std::vector<std::string>
167  phase_volume_column_names() const;
168 
173  double
174  phase_volume_fraction(const int phase_id,
175  const double temperature,
176  const double pressure) const;
177 
182  std::array<double,2>
183  get_pT_steps() const;
184 
185 
192  const std::vector<std::string> &
193  get_dominant_phase_names() const;
194 
195  protected:
203  double
204  value (const double temperature,
205  const double pressure,
206  const Table<2, double> &values,
207  const bool interpol) const;
208 
214  unsigned int
215  value (const double temperature,
216  const double pressure,
217  const Table<2, unsigned int> &values) const;
218 
222  double get_nT(const double temperature) const;
223 
227  double get_np(const double pressure) const;
228 
236 
243  std::vector<std::string> phase_column_names;
244  std::vector<::Table<2,double>> phase_volume_fractions;
245 
246  double delta_press;
247  double min_press;
248  double max_press;
249  double delta_temp;
250  double min_temp;
251  double max_temp;
252  unsigned int n_temperature;
253  unsigned int n_pressure;
254  unsigned int n_phases;
255  unsigned int n_columns;
258  std::vector<std::string> dominant_phase_names;
259  };
260 
266  {
267  public:
268  HeFESToReader(const std::string &material_filename,
269  const std::string &derivatives_filename,
270  const bool interpol,
271  const MPI_Comm comm);
272  };
273 
279  {
280  public:
281  PerplexReader(const std::string &filename,
282  const bool interpol,
283  const MPI_Comm comm);
284  };
285 
291  {
292  public:
293 
297  void
298  initialize(const MPI_Comm comm,
299  const std::string &data_directory,
300  const std::string &material_file_name);
301 
305  double
306  specific_heat(const double entropy,
307  const double pressure) const;
308 
312  double
313  density(const double entropy,
314  const double pressure) const;
315 
319  double
320  thermal_expansivity(const double entropy,
321  const double pressure) const;
322 
326  double
327  temperature(const double entropy,
328  const double pressure) const;
329 
333  double
334  seismic_vp(const double entropy,
335  const double pressure) const;
336 
340  double
341  seismic_vs(const double entropy,
342  const double pressure) const;
343 
348  density_gradient(const double entropy,
349  const double pressure) const;
350 
351  private:
355  std::unique_ptr<Utilities::StructuredDataLookup<2>> material_lookup;
356  };
357  }
358 
377  std::vector<double>
378  compute_only_composition_fractions(const std::vector<double> &compositional_fields,
379  const std::vector<unsigned int> &indices_to_use,
380  const double minimum_fraction = -std::numeric_limits<double>::max());
381 
403  std::vector<double>
404  compute_composition_fractions(const std::vector<double> &compositional_fields,
405  const ComponentMask &field_mask = ComponentMask(),
406  const double minimum_fraction = -std::numeric_limits<double>::max());
407 
415  std::vector<double>
416  compute_volumes_from_masses(const std::vector<double> &masses,
417  const std::vector<double> &densities,
418  const bool return_as_fraction);
419 
429  {
434  };
435 
436 
437 
444  parse_compositional_averaging_operation (const std::string &parameter_name,
445  const ParameterHandler &prm);
446 
447 
448 
468  double average_value (const std::vector<double> &volume_fractions,
469  const std::vector<double> &parameter_values,
470  const CompositionalAveragingOperation &average_type);
471 
472 
473 
488  template <int dim>
489  void
491  const std::vector<double> &mass_fractions,
492  const std::vector<double> &volume_fractions,
493  const unsigned int i,
495 
496 
497 
501  namespace PhaseUtilities
502  {
509  {
512  };
513  }
514 
515 
516 
537  void
538  reaction_progress_modify_values (const std::vector<double> &reaction_progress_values,
539  const std::vector<unsigned int> &reaction_progress_mapping,
540  const std::vector<unsigned int> &n_phase_transitions_per_composition,
541  std::vector<double> &parameter_values,
542  const unsigned int composition_index,
544 
545 
546 
563  double phase_average_value (const std::vector<double> &phase_function_values,
564  const std::vector<unsigned int> &n_phase_transitions_per_composition,
565  const std::vector<double> &parameter_values,
566  const unsigned int composition_index,
574  std::pair<bool, double>
575  get_reaction_progress_for_phase_transition(const std::vector<double> &reaction_progress_values,
576  const std::vector<unsigned> &reaction_progress_mapping,
577  const unsigned int phase_transition_index);
578 
584  template <int dim>
586  {
591  PhaseFunctionInputs(const double temperature,
592  const double pressure,
593  const double depth,
594  const double pressure_depth_derivative,
595  const unsigned int phase_transition_index);
596 
597  double temperature;
598  double pressure;
599  double depth;
601 
614  };
615 
624  template <int dim>
626  {
627  public:
628 
633  void initialize();
634 
641  double compute_value (const PhaseFunctionInputs<dim> &in) const;
642 
648  double compute_derivative () const;
649 
653  unsigned int n_phase_transitions () const;
654 
658  unsigned int n_phases () const;
659 
663  unsigned int n_phases_over_all_chemical_compositions () const;
664 
668  const std::vector<unsigned int> &
669  n_phase_transitions_for_each_chemical_composition () const;
670 
674  const std::vector<unsigned int> &
675  n_phases_for_each_chemical_composition () const;
676 
683  const std::vector<unsigned int> &
684  n_phase_transitions_for_each_composition () const;
685 
692  const std::vector<unsigned int> &
693  n_phases_for_each_composition () const;
694 
701  static
702  void
704 
711  void
712  parse_parameters (ParameterHandler &prm);
713 
714 
715  private:
721  std::string data_directory;
722 
728  std::vector<std::string> material_file_names;
729 
733  std::vector<double> minimum_temperature;
734 
738  std::vector<double> maximum_temperature;
739 
743  std::vector<double> interval_temperature;
744 
748  std::vector<double> minimum_pressure;
749 
753  std::vector<double> maximum_pressure;
754 
758  std::vector<double> interval_pressure;
759 
764  std::vector<std::unique_ptr<Utilities::StructuredDataLookup<2>>> material_lookup;
765 
772  std::vector<unsigned int> transition_indicators;
773 
777  std::unique_ptr<std::vector<unsigned int>> n_phase_transitions_per_composition;
778 
782  std::vector<unsigned int> n_phases_per_composition;
783 
788 
792  std::vector<unsigned int> n_phases_per_chemical_composition;
793 
797  unsigned int n_phases_total;
798 
803  };
804 
812  template <int dim>
814  {
815  public:
821  double compute_value (const PhaseFunctionInputs<dim> &in) const;
822 
827  double compute_derivative (const PhaseFunctionInputs<dim> &in) const;
828 
832  unsigned int n_phase_transitions () const;
833 
837  unsigned int n_phases () const;
838 
842  unsigned int n_phases_over_all_chemical_compositions () const;
843 
848  double get_transition_slope (const unsigned int phase_transition_index) const;
849 
853  double get_transition_depth (const unsigned int phase_transition_index) const;
854 
858  const std::vector<unsigned int> &
859  n_phase_transitions_for_each_chemical_composition () const;
860 
864  const std::vector<unsigned int> &
865  n_phases_for_each_chemical_composition () const;
866 
873  const std::vector<unsigned int> &
874  n_phase_transitions_for_each_composition () const;
875 
882  const std::vector<unsigned int> &
883  n_phases_for_each_composition () const;
884 
891  static
892  void
894 
901  void
902  parse_parameters (ParameterHandler &prm);
903 
904 
905  private:
910  std::vector<double> transition_depths;
911  std::vector<double> transition_pressures;
912  std::vector<double> transition_temperatures;
913  std::vector<double> transition_widths;
914  std::vector<double> transition_pressure_widths;
915  std::vector<double> transition_slopes;
918 
926 
930  std::unique_ptr<std::vector<unsigned int>> n_phase_transitions_per_composition;
931 
935  std::vector<unsigned int> n_phases_per_composition;
936 
941 
945  std::vector<unsigned int> n_phases_per_chemical_composition;
946 
950  unsigned int n_phases_total;
951 
956  };
957  }
958  }
959 }
960 
961 
962 #endif
void fill_averaged_equation_of_state_outputs(const EquationOfStateOutputs< dim > &eos_outputs, const std::vector< double > &mass_fractions, const std::vector< double > &volume_fractions, const unsigned int i, MaterialModelOutputs< dim > &out)
std::vector< unsigned int > n_phases_per_composition
Definition: utilities.h:935
std::unique_ptr< Utilities::StructuredDataLookup< 2 > > material_lookup
Definition: utilities.h:355
std::vector<::Table< 2, double > > phase_volume_fractions
Definition: utilities.h:244
void declare_parameters(ParameterHandler &prm)
std::unique_ptr< std::vector< unsigned int > > n_phase_transitions_per_composition
Definition: utilities.h:777
std::vector< double > compute_composition_fractions(const std::vector< double > &compositional_fields, const ComponentMask &field_mask=ComponentMask(), const double minimum_fraction=-std::numeric_limits< double >::max())
std::unique_ptr< std::vector< unsigned int > > n_phase_transitions_per_composition
Definition: utilities.h:930
std::vector< unsigned int > n_phase_transitions_per_chemical_composition
Definition: utilities.h:787
double average_value(const std::vector< double > &volume_fractions, const std::vector< double > &parameter_values, const CompositionalAveragingOperation &average_type)
std::vector< std::unique_ptr< Utilities::StructuredDataLookup< 2 > > > material_lookup
Definition: utilities.h:764
double phase_average_value(const std::vector< double > &phase_function_values, const std::vector< unsigned int > &n_phase_transitions_per_composition, const std::vector< double > &parameter_values, const unsigned int composition_index, const PhaseUtilities::PhaseAveragingOperation operation=PhaseUtilities::arithmetic)
std::vector< unsigned int > n_phase_transitions_per_chemical_composition
Definition: utilities.h:940
void reaction_progress_modify_values(const std::vector< double > &reaction_progress_values, const std::vector< unsigned int > &reaction_progress_mapping, const std::vector< unsigned int > &n_phase_transitions_per_composition, std::vector< double > &parameter_values, const unsigned int composition_index, const PhaseUtilities::PhaseAveragingOperation operation=PhaseUtilities::arithmetic)
CompositionalAveragingOperation parse_compositional_averaging_operation(const std::string &parameter_name, const ParameterHandler &prm)
std::vector< unsigned int > n_phases_per_chemical_composition
Definition: utilities.h:945
*braid_SplitCommworld & comm
std::vector< double > compute_volumes_from_masses(const std::vector< double > &masses, const std::vector< double > &densities, const bool return_as_fraction)
std::pair< bool, double > get_reaction_progress_for_phase_transition(const std::vector< double > &reaction_progress_values, const std::vector< unsigned > &reaction_progress_mapping, const unsigned int phase_transition_index)
std::vector< double > compute_only_composition_fractions(const std::vector< double > &compositional_fields, const std::vector< unsigned int > &indices_to_use, const double minimum_fraction=-std::numeric_limits< double >::max())