ASPECT
melt.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) 2016-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 
16 #ifndef _aspect_melt_h
17 #define _aspect_melt_h
18 
20 #include <aspect/global.h>
24 
25 namespace aspect
26 {
27  namespace MaterialModel
28  {
34  template <int dim>
36  {
37  public:
46  MeltInputs (const unsigned int n_points);
47 
51  std::vector<double> compaction_pressures;
52 
57  std::vector<Tensor<1,dim>> fluid_velocities;
58 
62  void fill (const LinearAlgebra::BlockVector &solution,
63  const FEValuesBase<dim> &fe_values,
64  const Introspection<dim> &introspection) override;
65  };
66 
67  template <int dim>
69  {
70  public:
79  MeltOutputs (const unsigned int n_points,
80  const unsigned int n_comp);
81 
87  std::vector<double> compaction_viscosities;
88 
92  std::vector<double> fluid_viscosities;
93 
97  std::vector<double> permeabilities;
98 
102  std::vector<double> fluid_densities;
103 
110  std::vector<Tensor<1,dim>> fluid_density_gradients;
111 
117  void average (const MaterialAveraging::AveragingOperation operation,
118  const FullMatrix<double> &projection_matrix,
119  const FullMatrix<double> &expansion_matrix) override;
120  };
121 
133  template <int dim>
135  {
136  public:
141  virtual ~MeltFractionModel () = default;
142 
155  virtual void melt_fractions (const MaterialModel::MaterialModelInputs<dim> &in,
156  std::vector<double> &melt_fractions,
157  const MaterialModel::MaterialModelOutputs<dim> *out = nullptr) const = 0;
158 
166  template <typename ModelType>
167  static
168  bool is_melt_fraction_model (const ModelType &model_object);
169 
175  template <typename ModelType>
176  static
177  const MeltFractionModel<dim> &
178  as_melt_fraction_model (const ModelType &model_object);
179  };
180 
181 
182 
183  template <int dim>
184  template <typename ModelType>
185  inline
186  bool
187  MeltFractionModel<dim>::is_melt_fraction_model (const ModelType &model_object)
188  {
189  return (dynamic_cast<const MeltFractionModel<dim>*>(&model_object)
190  != nullptr);
191  }
192 
193 
194  template <int dim>
195  template <typename ModelType>
196  inline
197  const MeltFractionModel<dim> &
198  MeltFractionModel<dim>::as_melt_fraction_model (const ModelType &model_object)
199  {
200  Assert (is_melt_fraction_model(model_object) == true,
201  ExcMessage ("This function can only be called for model objects "
202  "whose types are derived from MeltFractionModel."));
203 
204  return dynamic_cast<const MeltFractionModel<dim>&>(model_object);
205  }
206 
207 
208 
212  template <int dim>
214  {
215  public:
220  virtual double reference_darcy_coefficient () const = 0;
221 
239  double p_c_scale (const MaterialModel::MaterialModelInputs<dim> &inputs,
241  const MeltHandler<dim> &melt_handler,
242  const bool consider_is_melt_cell) const;
243  };
244 
245 
246  }
247 
248 
249 
250  namespace Assemblers
251  {
257  template <int dim>
259  public SimulatorAccess<dim>
260  {
261  public:
267  void
268  create_additional_material_model_outputs(MaterialModel::MaterialModelOutputs<dim> &outputs) const override;
269  };
270 
275  template <int dim>
277  {
278  public:
279  void
280  execute(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base,
281  internal::Assembly::CopyData::CopyDataBase<dim> &data_base) const override;
282  };
283 
288  template <int dim>
289  class MeltStokesSystem : public MeltInterface<dim>
290  {
291  public:
292  void
293  execute(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base,
294  internal::Assembly::CopyData::CopyDataBase<dim> &data_base) const override;
295 
296  void
297  create_additional_material_model_outputs(MaterialModel::MaterialModelOutputs<dim> &outputs) const override;
298  };
299 
300 
306  template <int dim>
308  {
309  public:
310  void
311  execute(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base,
312  internal::Assembly::CopyData::CopyDataBase<dim> &data_base) const override;
313  };
314 
319  template <int dim>
321  {
322  public:
323  void
324  execute(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base,
325  internal::Assembly::CopyData::CopyDataBase<dim> &data_base) const override;
326 
331  std::vector<double>
332  compute_residual(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base) const override;
333  };
334 
340  template <int dim>
342  {
343  public:
344  void
345  execute(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base,
346  internal::Assembly::CopyData::CopyDataBase<dim> &data_base) const override;
347  };
348 
352  template <int dim>
354  {
355  public:
356  void
357  execute(internal::Assembly::Scratch::ScratchBase<dim> &scratch_base,
358  internal::Assembly::CopyData::CopyDataBase<dim> &data_base) const override;
359  };
360  }
361 
362 
363  namespace Melt
364  {
365  template <int dim>
366  struct Parameters
367  {
372  static void declare_parameters (ParameterHandler &prm);
373 
383  void parse_parameters (ParameterHandler &prm);
384 
396 
406 
411 
421  };
422  }
423 
424 
431  template <int dim>
432  class MeltHandler: public SimulatorAccess<dim>
433  {
434  public:
436 
443  static void create_material_model_outputs(MaterialModel::MaterialModelOutputs<dim> &output);
444 
450  void edit_finite_element_variables(const Parameters<dim> &parameters,
451  std::vector<VariableDeclaration<dim>> &variables);
452 
459  void initialize_stokes_dof_info(Introspection<dim> &introspection,
460  const FiniteElement<dim> &finite_element) const;
461 
467  void set_assemblers (Assemblers::Manager<dim> &assemblers) const;
468 
469 
476  void initialize() const;
477 
481  void initialize_simulator (const Simulator<dim> &simulator_object) override;
482 
497  void compute_melt_variables(LinearAlgebra::BlockSparseMatrix &system_matrix,
498  LinearAlgebra::BlockVector &solution,
499  LinearAlgebra::BlockVector &system_rhs) const;
500 
504  bool is_porosity (const AdvectionField &advection_field) const;
505 
510  void apply_free_surface_stabilization_with_melt (const double free_surface_theta,
511  const typename DoFHandler<dim>::active_cell_iterator &cell,
514 
521  void add_current_constraints(AffineConstraints<double> &constraints);
522 
528  bool is_melt_cell(const typename DoFHandler<dim>::active_cell_iterator &cell) const;
529 
537  double limited_darcy_coefficient(const double K_D,
538  const bool is_melt_cell) const;
539 
544  get_boundary_fluid_pressure () const;
545 
551 
552  private:
558  const std::unique_ptr<aspect::BoundaryFluidPressure::Interface<dim>> boundary_fluid_pressure;
559 
567  std::vector<bool> is_melt_cell_vector;
568 
576 
577  };
578 
579 }
580 
581 #endif
bool average_melt_velocity
Definition: melt.h:420
std::vector< index_type > data
std::vector< bool > is_melt_cell_vector
Definition: melt.h:567
Melt::Parameters< dim > melt_parameters
Definition: melt.h:550
void declare_parameters(ParameterHandler &prm)
static const MeltFractionModel< dim > & as_melt_fraction_model(const ModelType &model_object)
Definition: melt.h:198
std::vector< Tensor< 1, dim > > fluid_density_gradients
Definition: melt.h:110
bool heat_advection_by_melt
Definition: melt.h:405
#define Assert(cond, exc)
std::vector< Tensor< 1, dim > > fluid_velocities
Definition: melt.h:57
std::vector< double > fluid_viscosities
Definition: melt.h:92
std::vector< double > compaction_viscosities
Definition: melt.h:87
std::vector< double > permeabilities
Definition: melt.h:97
double melt_scaling_factor_threshold
Definition: melt.h:395
static ::ExceptionBase & ExcMessage(std::string arg1)
const std::unique_ptr< aspect::BoundaryFluidPressure::Interface< dim > > boundary_fluid_pressure
Definition: melt.h:558
MeltInputs(const unsigned int n_points)
void fill(const LinearAlgebra::BlockVector &solution, const FEValuesBase< dim > &fe_values, const Introspection< dim > &introspection) override
std::vector< double > compaction_pressures
Definition: melt.h:51
static bool is_melt_fraction_model(const ModelType &model_object)
Definition: melt.h:187
void average(const AveragingOperation operation, const typename DoFHandler< dim >::active_cell_iterator &cell, const Quadrature< dim > &quadrature_formula, const Mapping< dim > &mapping, const MaterialProperties::Property &requested_properties, MaterialModelOutputs< dim > &values_out)
std::vector< double > fluid_densities
Definition: melt.h:102
bool use_discontinuous_p_c
Definition: melt.h:410
AffineConstraints< double > current_constraints
Definition: melt.h:575