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 
34 namespace aspect
35 {
36  template <int dim> class SimulatorAccess;
37  namespace Utilities
38  {
53  using namespace ::Utilities;
54 
55  template <int dim>
56  class StructuredDataLookup;
57  }
58  namespace MaterialModel
59  {
60  template <int dim> class MaterialModelOutputs;
61  template <int dim> struct EquationOfStateOutputs;
62 
68  namespace MaterialUtilities
69  {
70  namespace Lookup
71  {
79  {
80  public:
81 
82  double
83  specific_heat(const double temperature,
84  const double pressure) const;
85 
86  double
87  density(const double temperature,
88  const double pressure) const;
89 
90  double
92  const double pressure) const;
93 
94  double
95  seismic_Vp(const double temperature,
96  const double pressure) const;
97 
98  double
99  seismic_Vs(const double temperature,
100  const double pressure) const;
101 
102  double
103  enthalpy(const double temperature,
104  const double pressure) const;
105 
111  double
112  dHdT (const double temperature,
113  const double pressure) const;
114 
120  double
121  dHdp (const double temperature,
122  const double pressure) const;
123 
136  std::array<std::pair<double, unsigned int>,2>
137  enthalpy_derivatives(const std::vector<double> &temperatures,
138  const std::vector<double> &pressures,
139  const unsigned int n_substeps = 1) const;
140 
141  double
142  dRhodp (const double temperature,
143  const double pressure) const;
144 
149  unsigned int
151  const double pressure) const;
152 
157  bool
159 
164  std::vector<std::string>
166 
171  double
172  phase_volume_fraction(const int phase_id,
173  const double temperature,
174  const double pressure) const;
175 
180  std::array<double,2>
181  get_pT_steps() const;
182 
183 
190  const std::vector<std::string> &
192 
193  protected:
201  double
202  value (const double temperature,
203  const double pressure,
204  const Table<2, double> &values,
205  const bool interpol) const;
206 
212  unsigned int
213  value (const double temperature,
214  const double pressure,
215  const Table<2, unsigned int> &values) const;
216 
220  double get_nT(const double temperature) const;
221 
225  double get_np(const double pressure) const;
226 
234 
241  std::vector<std::string> phase_column_names;
242  std::vector<::Table<2,double>> phase_volume_fractions;
243 
244  double delta_press;
245  double min_press;
246  double max_press;
247  double delta_temp;
248  double min_temp;
249  double max_temp;
250  unsigned int n_temperature;
251  unsigned int n_pressure;
252  unsigned int n_phases;
253  unsigned int n_columns;
256  std::vector<std::string> dominant_phase_names;
257  };
258 
264  {
265  public:
266  HeFESToReader(const std::string &material_filename,
267  const std::string &derivatives_filename,
268  const bool interpol,
269  const MPI_Comm comm);
270  };
271 
277  {
278  public:
279  PerplexReader(const std::string &filename,
280  const bool interpol,
281  const MPI_Comm comm);
282  };
283 
289  {
290  public:
291 
295  void
296  initialize(const MPI_Comm comm,
297  const std::string &data_directory,
298  const std::string &material_file_name);
299 
303  double
304  specific_heat(const double entropy,
305  const double pressure) const;
306 
310  double
311  density(const double entropy,
312  const double pressure) const;
313 
317  double
318  thermal_expansivity(const double entropy,
319  const double pressure) const;
320 
324  double
325  temperature(const double entropy,
326  const double pressure) const;
327 
331  double
332  seismic_vp(const double entropy,
333  const double pressure) const;
334 
338  double
339  seismic_vs(const double entropy,
340  const double pressure) const;
341 
346  density_gradient(const double entropy,
347  const double pressure) const;
348 
349  private:
353  std::unique_ptr<Utilities::StructuredDataLookup<2>> material_lookup;
354  };
355  }
356 
372  std::vector<double>
374  const std::vector<unsigned int> &indices_to_use);
375 
394  std::vector<double>
396  const ComponentMask &field_mask = ComponentMask());
397 
405  std::vector<double>
406  compute_volumes_from_masses(const std::vector<double> &masses,
407  const std::vector<double> &densities,
408  const bool return_as_fraction);
409 
419  {
424  };
425 
426 
427 
434  parse_compositional_averaging_operation (const std::string &parameter_name,
435  const ParameterHandler &prm);
436 
437 
438 
458  double average_value (const std::vector<double> &volume_fractions,
459  const std::vector<double> &parameter_values,
460  const CompositionalAveragingOperation &average_type);
461 
462 
463 
478  template <int dim>
479  void
481  const std::vector<double> &mass_fractions,
482  const std::vector<double> &volume_fractions,
483  const unsigned int i,
485 
486 
487 
491  namespace PhaseUtilities
492  {
499  {
502  };
503  }
504 
521  double phase_average_value (const std::vector<double> &phase_function_values,
522  const std::vector<unsigned int> &n_phase_transitions_per_composition,
523  const std::vector<double> &parameter_values,
524  const unsigned int composition_index,
526 
527 
528 
534  template <int dim>
536  {
542  const double pressure,
543  const double depth,
544  const double pressure_depth_derivative,
545  const unsigned int phase_transition_index);
546 
547  double temperature;
548  double pressure;
549  double depth;
551 
564  };
565 
574  template <int dim>
576  {
577  public:
578 
583  void initialize();
584 
591  double compute_value (const PhaseFunctionInputs<dim> &in) const;
592 
598  double compute_derivative () const;
599 
603  unsigned int n_phase_transitions () const;
604 
608  unsigned int n_phases () const;
609 
614 
618  const std::vector<unsigned int> &
620 
624  const std::vector<unsigned int> &
626 
633  const std::vector<unsigned int> &
635 
642  const std::vector<unsigned int> &
644 
651  static
652  void
654 
661  void
663 
664 
665  private:
671  std::string data_directory;
672 
678  std::vector<std::string> material_file_names;
679 
683  std::vector<double> minimum_temperature;
684 
688  std::vector<double> maximum_temperature;
689 
693  std::vector<double> interval_temperature;
694 
698  std::vector<double> minimum_pressure;
699 
703  std::vector<double> maximum_pressure;
704 
708  std::vector<double> interval_pressure;
709 
714  std::vector<std::unique_ptr<Utilities::StructuredDataLookup<2>>> material_lookup;
715 
722  std::vector<unsigned int> transition_indicators;
723 
727  std::unique_ptr<std::vector<unsigned int>> n_phase_transitions_per_composition;
728 
732  std::vector<unsigned int> n_phases_per_composition;
733 
738 
742  std::vector<unsigned int> n_phases_per_chemical_composition;
743 
747  unsigned int n_phases_total;
748 
753  };
754 
762  template <int dim>
764  {
765  public:
771  double compute_value (const PhaseFunctionInputs<dim> &in) const;
772 
778 
782  unsigned int n_phase_transitions () const;
783 
787  unsigned int n_phases () const;
788 
793 
798  double get_transition_slope (const unsigned int phase_transition_index) const;
799 
803  double get_transition_depth (const unsigned int phase_transition_index) const;
804 
808  const std::vector<unsigned int> &
810 
814  const std::vector<unsigned int> &
816 
823  const std::vector<unsigned int> &
825 
832  const std::vector<unsigned int> &
834 
841  static
842  void
844 
851  void
853 
854 
855  private:
860  std::vector<double> transition_depths;
861  std::vector<double> transition_pressures;
862  std::vector<double> transition_temperatures;
863  std::vector<double> transition_widths;
864  std::vector<double> transition_pressure_widths;
865  std::vector<double> transition_slopes;
868 
876 
880  std::unique_ptr<std::vector<unsigned int>> n_phase_transitions_per_composition;
881 
885  std::vector<unsigned int> n_phases_per_composition;
886 
891 
895  std::vector<unsigned int> n_phases_per_chemical_composition;
896 
900  unsigned int n_phases_total;
901 
906  };
907  }
908  }
909 }
910 
911 
912 #endif
Tensor< 1, 2 > density_gradient(const double entropy, const double pressure) const
std::unique_ptr< Utilities::StructuredDataLookup< 2 > > material_lookup
Definition: utilities.h:353
double density(const double entropy, const double pressure) const
double temperature(const double entropy, const double pressure) const
double seismic_vp(const double entropy, const double pressure) const
double thermal_expansivity(const double entropy, const double pressure) const
double specific_heat(const double entropy, const double pressure) const
double seismic_vs(const double entropy, const double pressure) const
void initialize(const MPI_Comm comm, const std::string &data_directory, const std::string &material_file_name)
HeFESToReader(const std::string &material_filename, const std::string &derivatives_filename, const bool interpol, const MPI_Comm comm)
std::array< std::pair< double, unsigned int >, 2 > enthalpy_derivatives(const std::vector< double > &temperatures, const std::vector< double > &pressures, const unsigned int n_substeps=1) const
double density(const double temperature, const double pressure) const
double value(const double temperature, const double pressure, const Table< 2, double > &values, const bool interpol) const
double seismic_Vs(const double temperature, const double pressure) const
double seismic_Vp(const double temperature, const double pressure) const
double phase_volume_fraction(const int phase_id, const double temperature, const double pressure) const
double specific_heat(const double temperature, const double pressure) const
double enthalpy(const double temperature, const double pressure) const
unsigned int value(const double temperature, const double pressure, const Table< 2, unsigned int > &values) const
double dHdT(const double temperature, const double pressure) const
const std::vector< std::string > & get_dominant_phase_names() const
unsigned int dominant_phase(const double temperature, const double pressure) const
double dHdp(const double temperature, const double pressure) const
double thermal_expansivity(const double temperature, const double pressure) const
double dRhodp(const double temperature, const double pressure) const
std::vector<::Table< 2, double > > phase_volume_fractions
Definition: utilities.h:242
PerplexReader(const std::string &filename, const bool interpol, const MPI_Comm comm)
const std::vector< unsigned int > & n_phase_transitions_for_each_chemical_composition() const
const std::vector< unsigned int > & n_phases_for_each_composition() const
const std::vector< unsigned int > & n_phases_for_each_chemical_composition() const
const std::vector< unsigned int > & n_phase_transitions_for_each_composition() const
std::unique_ptr< std::vector< unsigned int > > n_phase_transitions_per_composition
Definition: utilities.h:727
std::vector< std::unique_ptr< Utilities::StructuredDataLookup< 2 > > > material_lookup
Definition: utilities.h:714
std::vector< unsigned int > n_phase_transitions_per_chemical_composition
Definition: utilities.h:737
double compute_value(const PhaseFunctionInputs< dim > &in) const
std::vector< unsigned int > n_phases_per_chemical_composition
Definition: utilities.h:895
double compute_value(const PhaseFunctionInputs< dim > &in) const
double compute_derivative(const PhaseFunctionInputs< dim > &in) const
double get_transition_depth(const unsigned int phase_transition_index) const
std::unique_ptr< std::vector< unsigned int > > n_phase_transitions_per_composition
Definition: utilities.h:880
const std::vector< unsigned int > & n_phases_for_each_composition() const
const std::vector< unsigned int > & n_phases_for_each_chemical_composition() const
double get_transition_slope(const unsigned int phase_transition_index) const
const std::vector< unsigned int > & n_phase_transitions_for_each_chemical_composition() const
std::vector< unsigned int > n_phase_transitions_per_chemical_composition
Definition: utilities.h:890
const std::vector< unsigned int > & n_phase_transitions_for_each_composition() const
std::vector< unsigned int > n_phases_per_composition
Definition: utilities.h:885
static void declare_parameters(ParameterHandler &prm)
std::vector< double > compute_composition_fractions(const std::vector< double > &compositional_fields, const ComponentMask &field_mask=ComponentMask())
double average_value(const std::vector< double > &volume_fractions, const std::vector< double > &parameter_values, const CompositionalAveragingOperation &average_type)
std::vector< double > compute_volumes_from_masses(const std::vector< double > &masses, const std::vector< double > &densities, const bool return_as_fraction)
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)
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)
CompositionalAveragingOperation parse_compositional_averaging_operation(const std::string &parameter_name, const ParameterHandler &prm)
std::vector< double > compute_only_composition_fractions(const std::vector< double > &compositional_fields, const std::vector< unsigned int > &indices_to_use)
PhaseFunctionInputs(const double temperature, const double pressure, const double depth, const double pressure_depth_derivative, const unsigned int phase_transition_index)