ASPECT
utilities.h
Go to the documentation of this file.
1 // ------------------------------------------------------
2 //
3 // SPDX-License-Identifier: GPL-2.0-or-later
4 //
5 // SPDX-FileCopyrightText: Copyright (C) 2011-2026 by the ASPECT authors.
6 //
7 // This file is part of ASPECT.
8 //
9 // Detailed license information governing the source code and
10 // contributions can be found in the folder LICENSES and in
11 // LICENSE and CONTRIBUTING.md at the top level directory.
12 //
13 // ------------------------------------------------------
14 
15 #ifndef _aspect_material_model_utilities_h
16 #define _aspect_material_model_utilities_h
17 
18 #include <aspect/global.h>
19 #include <deal.II/base/point.h>
24 
25 #include <mpi.h>
26 
27 #include <limits>
28 
29 
30 namespace aspect
31 {
32  template <int dim> class SimulatorAccess;
33  namespace Utilities
34  {
49  using namespace ::Utilities;
50 
51  template <int dim>
52  class StructuredDataLookup;
53  }
54  namespace MaterialModel
55  {
56  template <int dim> class MaterialModelOutputs;
57  template <int dim> struct EquationOfStateOutputs;
58 
64  namespace MaterialUtilities
65  {
66  namespace Lookup
67  {
75  {
76  public:
77 
78  double
79  specific_heat(const double temperature,
80  const double pressure) const;
81 
82  double
83  density(const double temperature,
84  const double pressure) const;
85 
86  double
87  thermal_expansivity(const double temperature,
88  const double pressure) const;
89 
90  double
91  seismic_Vp(const double temperature,
92  const double pressure) const;
93 
94  double
95  seismic_Vs(const double temperature,
96  const double pressure) const;
97 
98  double
99  enthalpy(const double temperature,
100  const double pressure) const;
101 
107  double
108  dHdT (const double temperature,
109  const double pressure) const;
110 
116  double
117  dHdp (const double temperature,
118  const double pressure) const;
119 
132  std::array<std::pair<double, unsigned int>,2>
133  enthalpy_derivatives(const std::vector<double> &temperatures,
134  const std::vector<double> &pressures,
135  const unsigned int n_substeps = 1) const;
136 
137  double
138  dRhodp (const double temperature,
139  const double pressure) const;
140 
145  unsigned int
146  dominant_phase (const double temperature,
147  const double pressure) const;
148 
153  bool
154  has_dominant_phase() const;
155 
160  std::vector<std::string>
161  phase_volume_column_names() const;
162 
167  double
168  phase_volume_fraction(const int phase_id,
169  const double temperature,
170  const double pressure) const;
171 
176  std::array<double,2>
177  get_pT_steps() const;
178 
179 
186  const std::vector<std::string> &
187  get_dominant_phase_names() const;
188 
189  protected:
197  double
198  value (const double temperature,
199  const double pressure,
200  const Table<2, double> &values,
201  const bool interpol) const;
202 
208  unsigned int
209  value (const double temperature,
210  const double pressure,
211  const Table<2, unsigned int> &values) const;
212 
216  double get_nT(const double temperature) const;
217 
221  double get_np(const double pressure) const;
222 
230 
237  std::vector<std::string> phase_column_names;
238  std::vector<::Table<2,double>> phase_volume_fractions;
239 
240  double delta_press;
241  double min_press;
242  double max_press;
243  double delta_temp;
244  double min_temp;
245  double max_temp;
246  unsigned int n_temperature;
247  unsigned int n_pressure;
248  unsigned int n_phases;
249  unsigned int n_columns;
252  std::vector<std::string> dominant_phase_names;
253  };
254 
260  {
261  public:
262  HeFESToReader(const std::string &material_filename,
263  const std::string &derivatives_filename,
264  const bool interpol,
265  const MPI_Comm comm);
266  };
267 
273  {
274  public:
275  PerplexReader(const std::string &filename,
276  const bool interpol,
277  const MPI_Comm comm);
278  };
279 
285  {
286  public:
287 
291  void
292  initialize(const MPI_Comm comm,
293  const std::string &data_directory,
294  const std::string &material_file_name);
295 
299  double
300  specific_heat(const double entropy,
301  const double pressure) const;
302 
306  double
307  density(const double entropy,
308  const double pressure) const;
309 
313  double
314  thermal_expansivity(const double entropy,
315  const double pressure) const;
316 
320  double
321  temperature(const double entropy,
322  const double pressure) const;
323 
327  double
328  seismic_vp(const double entropy,
329  const double pressure) const;
330 
334  double
335  seismic_vs(const double entropy,
336  const double pressure) const;
337 
342  density_gradient(const double entropy,
343  const double pressure) const;
344 
345  private:
349  std::unique_ptr<Utilities::StructuredDataLookup<2>> material_lookup;
350  };
351  }
352 
371  std::vector<double>
372  compute_only_composition_fractions(const std::vector<double> &compositional_fields,
373  const std::vector<unsigned int> &indices_to_use,
374  const double minimum_fraction = -std::numeric_limits<double>::max());
375 
397  std::vector<double>
398  compute_composition_fractions(const std::vector<double> &compositional_fields,
399  const ComponentMask &field_mask = ComponentMask(),
400  const double minimum_fraction = -std::numeric_limits<double>::max());
401 
409  std::vector<double>
410  compute_volumes_from_masses(const std::vector<double> &masses,
411  const std::vector<double> &densities,
412  const bool return_as_fraction);
413 
423  {
428  };
429 
430 
431 
438  parse_compositional_averaging_operation (const std::string &parameter_name,
439  const ParameterHandler &prm);
440 
441 
442 
462  double average_value (const std::vector<double> &volume_fractions,
463  const std::vector<double> &parameter_values,
464  const CompositionalAveragingOperation &average_type);
465 
466 
467 
482  template <int dim>
483  void
485  const std::vector<double> &mass_fractions,
486  const std::vector<double> &volume_fractions,
487  const unsigned int i,
489 
490 
491 
495  namespace PhaseUtilities
496  {
503  {
506  };
507  }
508 
509 
510 
531  void
532  reaction_progress_modify_values (const std::vector<double> &reaction_progress_values,
533  const std::vector<unsigned int> &reaction_progress_mapping,
534  const std::vector<unsigned int> &n_phase_transitions_per_composition,
535  std::vector<double> &parameter_values,
536  const unsigned int composition_index,
538 
539 
540 
557  double phase_average_value (const std::vector<double> &phase_function_values,
558  const std::vector<unsigned int> &n_phase_transitions_per_composition,
559  const std::vector<double> &parameter_values,
560  const unsigned int composition_index,
568  std::pair<bool, double>
569  get_reaction_progress_for_phase_transition(const std::vector<double> &reaction_progress_values,
570  const std::vector<unsigned> &reaction_progress_mapping,
571  const unsigned int phase_transition_index);
572 
578  template <int dim>
580  {
585  PhaseFunctionInputs(const double temperature,
586  const double pressure,
587  const double depth,
588  const double pressure_depth_derivative,
589  const unsigned int phase_transition_index);
590 
591  double temperature;
592  double pressure;
593  double depth;
595 
608  };
609 
618  template <int dim>
620  {
621  public:
622 
627  void initialize();
628 
635  double compute_value (const PhaseFunctionInputs<dim> &in) const;
636 
642  double compute_derivative () const;
643 
647  unsigned int n_phase_transitions () const;
648 
652  unsigned int n_phases () const;
653 
657  unsigned int n_phases_over_all_chemical_compositions () const;
658 
662  const std::vector<unsigned int> &
663  n_phase_transitions_for_each_chemical_composition () const;
664 
668  const std::vector<unsigned int> &
669  n_phases_for_each_chemical_composition () const;
670 
677  const std::vector<unsigned int> &
678  n_phase_transitions_for_each_composition () const;
679 
686  const std::vector<unsigned int> &
687  n_phases_for_each_composition () const;
688 
695  static
696  void
698 
705  void
706  parse_parameters (ParameterHandler &prm);
707 
708 
709  private:
715  std::string data_directory;
716 
722  std::vector<std::string> material_file_names;
723 
727  std::vector<double> minimum_temperature;
728 
732  std::vector<double> maximum_temperature;
733 
737  std::vector<double> interval_temperature;
738 
742  std::vector<double> minimum_pressure;
743 
747  std::vector<double> maximum_pressure;
748 
752  std::vector<double> interval_pressure;
753 
758  std::vector<std::unique_ptr<Utilities::StructuredDataLookup<2>>> material_lookup;
759 
766  std::vector<unsigned int> transition_indicators;
767 
771  std::unique_ptr<std::vector<unsigned int>> n_phase_transitions_per_composition;
772 
776  std::vector<unsigned int> n_phases_per_composition;
777 
782 
786  std::vector<unsigned int> n_phases_per_chemical_composition;
787 
791  unsigned int n_phases_total;
792 
797  };
798 
806  template <int dim>
808  {
809  public:
815  double compute_value (const PhaseFunctionInputs<dim> &in) const;
816 
821  double compute_derivative (const PhaseFunctionInputs<dim> &in) const;
822 
826  unsigned int n_phase_transitions () const;
827 
831  unsigned int n_phases () const;
832 
836  unsigned int n_phases_over_all_chemical_compositions () const;
837 
842  double get_transition_slope (const unsigned int phase_transition_index) const;
843 
847  double get_transition_depth (const unsigned int phase_transition_index) const;
848 
852  const std::vector<unsigned int> &
853  n_phase_transitions_for_each_chemical_composition () const;
854 
858  const std::vector<unsigned int> &
859  n_phases_for_each_chemical_composition () const;
860 
867  const std::vector<unsigned int> &
868  n_phase_transitions_for_each_composition () const;
869 
876  const std::vector<unsigned int> &
877  n_phases_for_each_composition () const;
878 
885  static
886  void
888 
895  void
896  parse_parameters (ParameterHandler &prm);
897 
898 
899  private:
904  std::vector<double> transition_depths;
905  std::vector<double> transition_pressures;
906  std::vector<double> transition_temperatures;
907  std::vector<double> transition_widths;
908  std::vector<double> transition_pressure_widths;
909  std::vector<double> transition_slopes;
912 
920 
924  std::unique_ptr<std::vector<unsigned int>> n_phase_transitions_per_composition;
925 
929  std::vector<unsigned int> n_phases_per_composition;
930 
935 
939  std::vector<unsigned int> n_phases_per_chemical_composition;
940 
944  unsigned int n_phases_total;
945 
950  };
951  }
952  }
953 }
954 
955 
956 #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:929
std::unique_ptr< Utilities::StructuredDataLookup< 2 > > material_lookup
Definition: utilities.h:349
std::vector<::Table< 2, double > > phase_volume_fractions
Definition: utilities.h:238
void declare_parameters(ParameterHandler &prm)
std::unique_ptr< std::vector< unsigned int > > n_phase_transitions_per_composition
Definition: utilities.h:771
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:924
std::vector< unsigned int > n_phase_transitions_per_chemical_composition
Definition: utilities.h:781
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:758
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:934
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:939
*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())