ASPECT
melt_boukare.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2015 - 2023 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_melt_boukare_h
22 #define _aspect_material_model_melt_boukare_h
23 
26 #include <aspect/melt.h>
27 
28 namespace aspect
29 {
30  namespace MaterialModel
31  {
35  template <int dim>
37  {
38  public:
39  BoukareOutputs(const unsigned int n_points);
40 
41  std::vector<double> get_nth_output(const unsigned int idx) const override;
42 
46  std::vector<double> bulk_composition;
47  std::vector<double> molar_volatiles_in_melt;
48  };
49 
65  template <int dim>
68  public ::aspect::SimulatorAccess<dim>
69  {
70  public:
74  void
75  initialize () override;
76 
81  bool is_compressible () const override;
82 
84  typename Interface<dim>::MaterialModelOutputs &out) const override;
85 
99  std::vector<double> &melt_fractions,
100  const MaterialModel::MaterialModelOutputs<dim> *out = nullptr) const override;
101 
106  double reference_darcy_coefficient () const override;
107 
119  static
120  void
122 
126  void
128 
133  void
135 
136 
137  private:
138  // Thermodynamic parameters of the endmember components in the equation of state,
139  // needed to compute their material properties.
143  std::vector<std::string> endmember_names;
147  std::vector<double> molar_masses;
151  std::vector<double> number_of_atoms;
155  std::vector<double> reference_volumes;
159  std::vector<double> reference_thermal_expansivities;
163  std::vector<double> reference_bulk_moduli;
175  std::vector<double> Einstein_temperatures;
179  std::vector<double> reference_enthalpies;
183  std::vector<double> reference_entropies;
187  std::vector<double> reference_specific_heats;
199  std::vector<double> specific_heat_third_coefficients;
200 
201  std::vector<double> tait_parameters_a;
202  std::vector<double> tait_parameters_b;
203  std::vector<double> tait_parameters_c;
204 
205  // Reference conditions for computing the material properties in the equation of state.
214 
215  // Rheological properties.
219  double eta_0;
223  double xi_0;
227  double eta_f;
239  double alpha_phi;
240 
241  // Transport properties that are not computed from the equation of state.
247 
248  // Parameters controlling melting and solidification of melt.
257 
258  // Parameters defining the molar composition of the two endmember compositions we use
259  // in the melting model.
260  const double molar_MgO_in_Mg_mantle_endmember = 0.581;
261  const double molar_SiO2_in_Mg_mantle_endmember = 0.419;
262  const double molar_FeO_in_Fe_mantle_endmember = 0.908;
263  const double molar_SiO2_in_Fe_mantle_endmember = 0.092;
264 
265  // Parameters describing the melting properties of the two endmembers of the melting model.
266  const double melting_reference_pressure = 120.e9;
267 
268  // reference melting temperature for Fe and Mg mantle endmember at the reference pressure
277 
278  // molar entropy change of melting in J/mol K
279  const double Fe_mantle_melting_entropy = 33.77;
280  const double Mg_mantle_melting_entropy = 34.33;
281 
282  // molar volume change of melting of solid Fe and Mg mantle endmember in m3/mol
283  const double Fe_mantle_melting_volume = 1.51e-07;
284  const double Mg_mantle_melting_volume = 9.29e-08;
285 
286  // Number of moles of atoms mixing on pseudosite in mantle lattice (empirical model fitting the full Boukare model).
295 
296  // Indices for the endmembers in the equation of state.
297  unsigned int febdg_idx;
298  unsigned int mgbdg_idx;
299  unsigned int wus_idx;
300  unsigned int per_idx;
301  unsigned int femelt_idx;
302  unsigned int mgmelt_idx;
303 
304 
305  // Parameter describing if an endmember in the equation of state is solid or molten.
307  {
308  enum Kind
309  {
311  melt
312  };
313  };
314 
315  std::vector<typename EndmemberState::Kind> endmember_states;
316 
317 
318  // Material properties of the different endmembers of the equation of state.
320  {
325  EndmemberProperties(const unsigned int n_endmembers);
326 
327  std::vector<double> volumes;
328  std::vector<double> gibbs_energies;
329  std::vector<double> entropies;
330  std::vector<double> thermal_expansivities;
331  std::vector<double> bulk_moduli;
332  std::vector<double> heat_capacities;
333  };
334 
335 
339  virtual
340  void
342  const unsigned int q,
343  EndmemberProperties &properties) const;
344 
345 
349  virtual
350  double
352  const unsigned int endmember_index) const;
353 
354 
358  virtual
359  double
361  const unsigned int endmember_index) const;
362 
366  virtual
367  double
369  const unsigned int endmember_index) const;
370 
375  virtual
376  double
378  const unsigned int endmember_index) const;
379 
384  virtual
385  double
387  const unsigned int endmember_index) const;
388 
389 
395  virtual
396  void
398  const double molar_Fe_in_solid,
399  const double molar_Fe_in_melt,
400  const std::vector<double> &endmember_gibbs_energies,
401  std::vector<double> &endmember_mole_fractions_per_phase,
402  double &molar_bridgmanite_in_solid) const;
403 
404 
410  virtual
411  double
412  compute_melt_molar_fraction (const double porosity,
413  const double bridgmanite_molar_fraction_in_solid,
414  EndmemberProperties &properties,
415  const std::vector<double> &endmember_mole_fractions_per_phase) const;
416 
417 
422  virtual
423  double
424  assert_update_is_within_0_and_1 (const double value,
425  const double change_of_value) const;
426 
427 
435  virtual
436  double
437  melt_fraction (const double temperature,
438  const double pressure,
439  const double bulk_composition,
440  double &molar_volatiles_in_melt,
441  double &solid_composition,
442  double &melt_composition) const;
443  };
444 
445  }
446 }
447 
448 #endif
std::vector< double > bulk_composition
Definition: melt_boukare.h:46
std::vector< double > molar_volatiles_in_melt
Definition: melt_boukare.h:47
std::vector< double > get_nth_output(const unsigned int idx) const override
BoukareOutputs(const unsigned int n_points)
virtual double endmember_entropy_thermal_addition(const double temperature, const unsigned int endmember_index) const
std::vector< double > specific_heat_second_coefficients
Definition: melt_boukare.h:195
bool is_compressible() const override
std::vector< double > reference_thermal_expansivities
Definition: melt_boukare.h:159
virtual double assert_update_is_within_0_and_1(const double value, const double change_of_value) const
virtual double endmember_enthalpy_thermal_addition(const double temperature, const unsigned int endmember_index) const
virtual void fill_endmember_properties(const typename Interface< dim >::MaterialModelInputs &in, const unsigned int q, EndmemberProperties &properties) const
virtual double melt_fraction(const double temperature, const double pressure, const double bulk_composition, double &molar_volatiles_in_melt, double &solid_composition, double &melt_composition) const
double reference_darcy_coefficient() const override
virtual double endmember_thermal_energy(const double temperature, const unsigned int endmember_index) const
void parse_parameters(ParameterHandler &prm) override
std::vector< typename EndmemberState::Kind > endmember_states
Definition: melt_boukare.h:315
const double molar_SiO2_in_Mg_mantle_endmember
Definition: melt_boukare.h:261
std::vector< double > bulk_modulus_pressure_derivatives
Definition: melt_boukare.h:167
std::vector< double > tait_parameters_c
Definition: melt_boukare.h:203
std::vector< double > reference_bulk_moduli
Definition: melt_boukare.h:163
void create_additional_named_outputs(MaterialModel::MaterialModelOutputs< dim > &out) const override
void melt_fractions(const MaterialModel::MaterialModelInputs< dim > &in, std::vector< double > &melt_fractions, const MaterialModel::MaterialModelOutputs< dim > *out=nullptr) const override
void evaluate(const typename Interface< dim >::MaterialModelInputs &in, typename Interface< dim >::MaterialModelOutputs &out) const override
virtual double endmember_thermal_pressure(const double temperature, const unsigned int endmember_index) const
virtual double endmember_molar_heat_capacity(const double temperature, const unsigned int endmember_index) const
static void declare_parameters(ParameterHandler &prm)
std::vector< double > reference_entropies
Definition: melt_boukare.h:183
std::vector< double > reference_specific_heats
Definition: melt_boukare.h:187
virtual void convert_composition_to_fraction_of_endmembers(const double temperature, const double molar_Fe_in_solid, const double molar_Fe_in_melt, const std::vector< double > &endmember_gibbs_energies, std::vector< double > &endmember_mole_fractions_per_phase, double &molar_bridgmanite_in_solid) const
std::vector< double > reference_enthalpies
Definition: melt_boukare.h:179
std::vector< double > tait_parameters_a
Definition: melt_boukare.h:201
virtual double compute_melt_molar_fraction(const double porosity, const double bridgmanite_molar_fraction_in_solid, EndmemberProperties &properties, const std::vector< double > &endmember_mole_fractions_per_phase) const
std::vector< double > bulk_modulus_second_pressure_derivatives
Definition: melt_boukare.h:171
const double molar_SiO2_in_Fe_mantle_endmember
Definition: melt_boukare.h:263
std::vector< double > Einstein_temperatures
Definition: melt_boukare.h:175
std::vector< double > specific_heat_third_coefficients
Definition: melt_boukare.h:199
std::vector< double > molar_masses
Definition: melt_boukare.h:147
std::vector< double > number_of_atoms
Definition: melt_boukare.h:151
std::vector< double > reference_volumes
Definition: melt_boukare.h:155
std::vector< std::string > endmember_names
Definition: melt_boukare.h:143
std::vector< double > tait_parameters_b
Definition: melt_boukare.h:202
std::vector< double > specific_heat_linear_coefficients
Definition: melt_boukare.h:191
EndmemberProperties(const unsigned int n_endmembers)