21 #ifndef _aspect_particle_property_cpo_h
22 #define _aspect_particle_property_cpo_h
29 #include <boost/random.hpp>
158 std::vector<double> &particle_properties)
const override;
193 std::vector<std::pair<std::string, unsigned int>>
214 std::pair<std::vector<double>, std::vector<Tensor<2,3>>>
217 const unsigned int mineral_i,
225 const std::vector<double> &compositions,
228 const double water_content)
const;
246 std::pair<std::vector<double>, std::vector<Tensor<2,3>>>
248 const unsigned int cpo_index,
250 const unsigned int mineral_i,
253 const std::array<double,4> ref_resolved_shear_stress,
254 const bool prevent_nondimensionalization =
false)
const;
271 save (std::map<std::string, std::string> &status_strings)
const override;
274 load (
const std::map<std::string, std::string> &status_strings)
override;
304 const std::vector<double> &compositions,
307 const double water_content)
const;
315 const double water_content)
const;
328 double max_value = 1e60)
const;
340 const unsigned int mineral_i)
const
356 const unsigned int mineral_i,
359 data[cpo_data_position + 0 + mineral_i * (
n_grains * 10 + 2)] =
static_cast<double>(deformation_type);
372 const unsigned int mineral_i)
const
374 return data[cpo_data_position + 1 + mineral_i *(
n_grains * 10 + 2)];
388 const unsigned int mineral_i,
389 const double volume_fraction_mineral)
const
391 data[cpo_data_position + 1 + mineral_i *(
n_grains * 10 + 2)] = volume_fraction_mineral;
405 const unsigned int mineral_i,
406 const unsigned int grain_i)
const
408 return data[cpo_data_position + 2 + grain_i * 10 + mineral_i * (
n_grains * 10 + 2)];
423 const unsigned int mineral_i,
424 const unsigned int grain_i,
425 const double volume_fractions_grains)
const
427 data[cpo_data_position + 2 + grain_i * 10 + mineral_i * (
n_grains * 10 + 2)] = volume_fractions_grains;
442 const unsigned int mineral_i,
443 const unsigned int grain_i)
const
446 for (
unsigned int i = 0; i < Tensor<2,3>::n_independent_components ; ++i)
449 rotation_matrix[index] =
data[cpo_data_position + 3 + grain_i * 10 + mineral_i * (
n_grains * 10 + 2) + i];
451 return rotation_matrix;
466 const unsigned int mineral_i,
467 const unsigned int grain_i,
470 for (
unsigned int i = 0; i < Tensor<2,3>::n_independent_components ; ++i)
473 data[cpo_data_position + 3 + grain_i * 10 + mineral_i * (
n_grains * 10 + 2) + i] = rotation_matrix[index];
503 const unsigned int mineral_i,
505 const std::pair<std::vector<double>, std::vector<
Tensor<2,3>>> &derivatives)
const;
525 const unsigned int mineral_i,
527 const std::pair<std::vector<double>, std::vector<
Tensor<2,3>>> &derivatives)
const;
536 std::pair<std::vector<double>, std::vector<Tensor<2,3>>>
boost::iterator_range< particle_iterator > particle_iterator_range
static constexpr TableIndices< rank_ > unrolled_to_component_indices(const unsigned int i)
double nucleation_efficiency
void initialize() override
static void declare_parameters(ParameterHandler &prm)
std::vector< double > OlivineD_RRSS
std::vector< std::pair< std::string, unsigned int > > get_property_information() const override
void set_deformation_type(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i, const DeformationType deformation_type) const
Sets the value in the data array representing the deformation type.
void set_volume_fraction_mineral(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i, const double volume_fraction_mineral) const
Sets the value in the data array representing the volume fraction of a mineral.
CrystalPreferredOrientation()=default
DeformationType determine_deformation_type_karato_2008(const double stress, const double water_content) const
Computes the deformation type given the stress and water content according to the table in Karato 200...
void parse_parameters(ParameterHandler &prm) override
void set_volume_fractions_grains(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i, const unsigned int grain_i, const double volume_fractions_grains) const
Sets the value in the data array representing the volume fraction of a grain.
std::vector< double > CPX_RRSS
double advect_backward_euler(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i, const double dt, const std::pair< std::vector< double >, std::vector< Tensor< 2, 3 >>> &derivatives) const
Updates the volume fractions and rotation matrices with a Backward Euler scheme.
void load(const std::map< std::string, std::string > &status_strings) override
double get_volume_fractions_grains(const unsigned int cpo_data_position, const ArrayView< const double > &data, const unsigned int mineral_i, const unsigned int grain_i) const
Returns the value in the data array representing the volume fraction of a grain.
std::pair< std::vector< double >, std::vector< Tensor< 2, 3 > > > compute_derivatives_drex_2004(const DeformationType deformation_type, const unsigned int cpo_index, const ArrayView< double > &data, const unsigned int mineral_i, const SymmetricTensor< 2, 3 > &strain_rate_3d, const Tensor< 2, 3 > &velocity_gradient_tensor, const std::array< double, 4 > ref_resolved_shear_stress, const bool prevent_nondimensionalization=false) const
Computes the CPO derivatives with the D-Rex 2004 algorithm.
boost::mt19937 random_number_generator
unsigned int random_number_seed
double get_volume_fraction_mineral(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i) const
Returns the value in the data array representing the volume fraction of a mineral.
CPOInitialGrainsModel initial_grains_model
UpdateTimeFlags need_update() const override
AdvectionMethod advection_method
void compute_random_rotation_matrix(Tensor< 2, 3 > &rotation_matrix) const
Tensor< 2, 3 > get_rotation_matrix_grains(const unsigned int cpo_data_position, const ArrayView< const double > &data, const unsigned int mineral_i, const unsigned int grain_i) const
Gets the rotation matrix for a grain in a mineral.
std::array< double, 4 > reference_resolved_shear_stress_from_deformation_type(DeformationType deformation_type, double max_value=1e60) const
Computes the reference resolved shear stress (RRSS) based on the selected deformation type.
std::pair< std::vector< double >, std::vector< Tensor< 2, 3 > > > compute_derivatives_spin_tensor(const Tensor< 2, 3 > &velocity_gradient_tensor) const
double advect_forward_euler(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i, const double dt, const std::pair< std::vector< double >, std::vector< Tensor< 2, 3 >>> &derivatives) const
Updates the volume fractions and rotation matrices with a Forward Euler scheme.
DeformationType determine_deformation_type(const DeformationTypeSelector deformation_type_selector, const Point< dim > &position, const typename DoFHandler< dim >::active_cell_iterator &cell, const double temperature, const double pressure, const Tensor< 1, dim > &velocity, const std::vector< double > &compositions, const SymmetricTensor< 2, dim > &strain_rate, const SymmetricTensor< 2, dim > &deviatoric_strain_rate, const double water_content) const
Determines the deformation type from the deformation type selector. If the provided deformation_type_...
CPODerivativeAlgorithm cpo_derivative_algorithm
void update_particle_properties(const ParticleUpdateInputs< dim > &inputs, typename ParticleHandler< dim >::particle_iterator_range &particles) const override
InitializationModeForLateParticles late_initialization_mode() const override
unsigned int property_advection_max_iterations
unsigned int get_number_of_grains() const
unsigned int get_number_of_minerals() const
std::pair< std::vector< double >, std::vector< Tensor< 2, 3 > > > compute_derivatives(const unsigned int cpo_index, const ArrayView< double > &data, const unsigned int mineral_i, const SymmetricTensor< 2, 3 > &strain_rate_3d, const Tensor< 2, 3 > &velocity_gradient_tensor, const Point< dim > &position, const typename DoFHandler< dim >::active_cell_iterator &cell, const double temperature, const double pressure, const Tensor< 1, dim > &velocity, const std::vector< double > &compositions, const SymmetricTensor< 2, dim > &strain_rate, const SymmetricTensor< 2, dim > &deviatoric_strain_rate, const double water_content) const
Computes the volume fraction and grain orientation derivatives of all the grains of a mineral.
void set_rotation_matrix_grains(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i, const unsigned int grain_i, const Tensor< 2, 3 > &rotation_matrix) const
Sets the rotation matrix for a grain in a mineral.
void initialize_one_particle_property(const Point< dim > &position, std::vector< double > &particle_properties) const override
double property_advection_tolerance
UpdateFlags get_update_flags(const unsigned int component) const override
std::vector< DeformationTypeSelector > deformation_type_selector
DeformationType get_deformation_type(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i) const
Returns the value in the data array representing the deformation type.
std::vector< double > volume_fractions_minerals
void save(std::map< std::string, std::string > &status_strings) const override
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
std::vector< index_type > data
CPOInitialGrainsModel
An enum used to determine how the initial grain sizes and orientations are set for all particles.
@ uniform_grains_and_random_uniform_rotations
DeformationTypeSelector
The type of deformation selector used by the CPO code.
DeformationType
The type of deformation used by the CPO code.
CPODerivativeAlgorithm
The algorithm used to compute the derivatives of the grain size and rotation matrix used in the advec...
InitializationModeForLateParticles
AdvectionMethod
The type of Advection method used to advect the CPO properties.