21 #ifndef _aspect_particle_property_cpo_h 22 #define _aspect_particle_property_cpo_h 28 DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
29 #include <boost/random.hpp> 30 DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
157 initialize_one_particle_property (
const Point<dim> &position,
158 std::vector<double> &particle_properties)
const override;
165 typename ParticleHandler<dim>::particle_iterator_range &particles)
const override;
172 need_update ()
const override;
178 late_initialization_mode ()
const override;
184 get_update_flags (
const unsigned int component)
const override;
193 std::vector<std::pair<std::string, unsigned int>>
194 get_property_information()
const override;
214 std::pair<std::vector<double>, std::vector<Tensor<2,3>>>
215 compute_derivatives(
const unsigned int cpo_index,
216 const ArrayView<double> &data,
217 const unsigned int mineral_i,
218 const SymmetricTensor<2,3> &strain_rate_3d,
219 const Tensor<2,3> &velocity_gradient_tensor,
220 const Point<dim> &position,
221 const typename DoFHandler<dim>::active_cell_iterator &cell,
224 const Tensor<1,dim> &velocity,
225 const std::vector<double> &compositions,
227 const SymmetricTensor<2,dim> &deviatoric_strain_rate,
228 const double water_content)
const;
246 std::pair<std::vector<double>, std::vector<Tensor<2,3>>>
248 const unsigned int cpo_index,
249 const ArrayView<double> &data,
250 const unsigned int mineral_i,
251 const SymmetricTensor<2,3> &strain_rate_3d,
252 const Tensor<2,3> &velocity_gradient_tensor,
253 const std::array<double,4> ref_resolved_shear_stress,
254 const bool prevent_nondimensionalization =
false)
const;
268 parse_parameters (ParameterHandler &prm)
override;
274 get_number_of_grains()
const;
280 get_number_of_minerals()
const;
293 const Point<dim> &position,
294 const typename DoFHandler<dim>::active_cell_iterator &cell,
295 const double temperature,
296 const double pressure,
297 const Tensor<1,dim> &velocity,
298 const std::vector<double> &compositions,
299 const SymmetricTensor<2,dim> &strain_rate,
300 const SymmetricTensor<2,dim> &deviatoric_strain_rate,
301 const double water_content)
const;
308 determine_deformation_type_karato_2008(
const double stress,
309 const double water_content)
const;
321 reference_resolved_shear_stress_from_deformation_type(
DeformationType deformation_type,
322 double max_value = 1e60)
const;
333 const ArrayView<double> &data,
334 const unsigned int mineral_i)
const 336 return static_cast<DeformationType>(data[cpo_data_position + 0 + mineral_i * (n_grains * 10 + 2)]);
349 const ArrayView<double> &data,
350 const unsigned int mineral_i,
353 data[cpo_data_position + 0 + mineral_i * (n_grains * 10 + 2)] = static_cast<double>(deformation_type);
365 const ArrayView<double> &data,
366 const unsigned int mineral_i)
const 368 return data[cpo_data_position + 1 + mineral_i *(n_grains * 10 + 2)];
381 const ArrayView<double> &data,
382 const unsigned int mineral_i,
383 const double volume_fraction_mineral)
const 385 data[cpo_data_position + 1 + mineral_i *(n_grains * 10 + 2)] = volume_fraction_mineral;
398 const ArrayView<const double> &data,
399 const unsigned int mineral_i,
400 const unsigned int grain_i)
const 402 return data[cpo_data_position + 2 + grain_i * 10 + mineral_i * (n_grains * 10 + 2)];
416 const ArrayView<double> &data,
417 const unsigned int mineral_i,
418 const unsigned int grain_i,
419 const double volume_fractions_grains)
const 421 data[cpo_data_position + 2 + grain_i * 10 + mineral_i * (n_grains * 10 + 2)] = volume_fractions_grains;
435 const ArrayView<const double> &data,
436 const unsigned int mineral_i,
437 const unsigned int grain_i)
const 439 Tensor<2,3> rotation_matrix;
440 for (
unsigned int i = 0; i < Tensor<2,3>::n_independent_components ; ++i)
442 const ::TableIndices<2> index = Tensor<2,3>::unrolled_to_component_indices(i);
443 rotation_matrix[index] = data[cpo_data_position + 3 + grain_i * 10 + mineral_i * (n_grains * 10 + 2) + i];
445 return rotation_matrix;
459 const ArrayView<double> &data,
460 const unsigned int mineral_i,
461 const unsigned int grain_i,
462 const Tensor<2,3> &rotation_matrix)
const 464 for (
unsigned int i = 0; i < Tensor<2,3>::n_independent_components ; ++i)
466 const ::TableIndices<2> index = Tensor<2,3>::unrolled_to_component_indices(i);
467 data[cpo_data_position + 3 + grain_i * 10 + mineral_i * (n_grains * 10 + 2) + i] = rotation_matrix[index];
477 compute_random_rotation_matrix(Tensor<2,3> &rotation_matrix)
const;
495 advect_forward_euler(
const unsigned int cpo_data_position,
496 const ArrayView<double> &data,
497 const unsigned int mineral_i,
499 const std::pair<std::vector<double>, std::vector<Tensor<2,3>>> &derivatives)
const;
517 advect_backward_euler(
const unsigned int cpo_data_position,
518 const ArrayView<double> &data,
519 const unsigned int mineral_i,
521 const std::pair<std::vector<double>, std::vector<Tensor<2,3>>> &derivatives)
const;
530 std::pair<std::vector<double>, std::vector<Tensor<2,3>>>
531 compute_derivatives_spin_tensor(
const Tensor<2,3> &velocity_gradient_tensor)
const;
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.
DeformationTypeSelector
The type of deformation selector used by the CPO code.
double nucleation_efficiency
CPODerivativeAlgorithm
The algorithm used to compute the derivatives of the grain size and rotation matrix used in the advec...
DeformationType
The type of deformation used by the CPO code.
InitializationModeForLateParticles
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.
unsigned int property_advection_max_iterations
void declare_parameters(ParameterHandler &prm)
AdvectionMethod
The type of Advection method used to advect the CPO properties.
std::vector< double > CPX_RRSS
std::vector< double > OlivineD_RRSS
CPOInitialGrainsModel
An enum used to determine how the initial grain sizes and orientations are set for all particles...
AdvectionMethod advection_method
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.
CPODerivativeAlgorithm cpo_derivative_algorithm
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.
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
std::vector< DeformationTypeSelector > deformation_type_selector
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.
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.
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.
boost::mt19937 random_number_generator
double property_advection_tolerance
unsigned int random_number_seed
CPOInitialGrainsModel initial_grains_model