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
146 initialize_one_particle_property (
const Point<dim> &position,
147 std::vector<double> &particle_properties)
const override;
171 update_one_particle_property (
const unsigned int data_position,
172 const Point<dim> &position,
173 const Vector<double> &solution,
174 const std::vector<Tensor<1,dim>> &gradients,
175 const ArrayView<double> &particle_properties)
const override;
182 need_update ()
const override;
188 late_initialization_mode ()
const override;
195 get_needed_update_flags ()
const override;
204 std::vector<std::pair<std::string, unsigned int>>
205 get_property_information()
const override;
224 std::pair<std::vector<double>, std::vector<Tensor<2,3>>>
225 compute_derivatives(
const unsigned int cpo_index,
226 const ArrayView<double> &data,
227 const unsigned int mineral_i,
228 const SymmetricTensor<2,3> &strain_rate_3d,
229 const Tensor<2,3> &velocity_gradient_tensor,
230 const Point<dim> &position,
233 const Tensor<1,dim> &velocity,
234 const std::vector<double> &compositions,
236 const SymmetricTensor<2,dim> &deviatoric_strain_rate,
237 const double water_content)
const;
254 std::pair<std::vector<double>, std::vector<Tensor<2,3>>>
255 compute_derivatives_drex_2004(
const unsigned int cpo_index,
256 const ArrayView<double> &data,
257 const unsigned int mineral_i,
258 const SymmetricTensor<2,3> &strain_rate_3d,
259 const Tensor<2,3> &velocity_gradient_tensor,
260 const std::array<double,4> ref_resolved_shear_stress,
261 const bool prevent_nondimensionalization =
false)
const;
275 parse_parameters (ParameterHandler &prm)
override;
281 get_number_of_grains()
const;
287 get_number_of_minerals()
const;
300 const Point<dim> &position,
301 const double temperature,
302 const double pressure,
303 const Tensor<1,dim> &velocity,
304 const std::vector<double> &compositions,
305 const SymmetricTensor<2,dim> &strain_rate,
306 const SymmetricTensor<2,dim> &deviatoric_strain_rate,
307 const double water_content)
const;
314 determine_deformation_type_karato_2008(
const double stress,
315 const double water_content)
const;
327 reference_resolved_shear_stress_from_deformation_type(
DeformationType deformation_type,
328 double max_value = 1e60)
const;
339 const ArrayView<double> &data,
340 const unsigned int mineral_i)
const 342 return data[cpo_data_position + 0 + mineral_i * (n_grains * 10 + 2)];
355 const ArrayView<double> &data,
356 const unsigned int mineral_i,
357 const double deformation_type)
const 359 data[cpo_data_position + 0 + mineral_i * (n_grains * 10 + 2)] = deformation_type;
371 const ArrayView<double> &data,
372 const unsigned int mineral_i)
const 374 return data[cpo_data_position + 1 + mineral_i *(n_grains * 10 + 2)];
387 const ArrayView<double> &data,
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;
404 const ArrayView<const double> &data,
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)];
422 const ArrayView<double> &data,
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;
441 const ArrayView<const double> &data,
442 const unsigned int mineral_i,
443 const unsigned int grain_i)
const 445 Tensor<2,3> rotation_matrix;
446 for (
unsigned int i = 0; i < Tensor<2,3>::n_independent_components ; ++i)
448 const ::TableIndices<2> index = Tensor<2,3>::unrolled_to_component_indices(i);
449 rotation_matrix[index] = data[cpo_data_position + 3 + grain_i * 10 + mineral_i * (n_grains * 10 + 2) + i];
451 return rotation_matrix;
465 const ArrayView<double> &data,
466 const unsigned int mineral_i,
467 const unsigned int grain_i,
468 const Tensor<2,3> &rotation_matrix)
const 470 for (
unsigned int i = 0; i < Tensor<2,3>::n_independent_components ; ++i)
472 const ::TableIndices<2> index = Tensor<2,3>::unrolled_to_component_indices(i);
473 data[cpo_data_position + 3 + grain_i * 10 + mineral_i * (n_grains * 10 + 2) + i] = rotation_matrix[index];
483 compute_random_rotation_matrix(Tensor<2,3> &rotation_matrix)
const;
501 advect_forward_euler(
const unsigned int cpo_data_position,
502 const ArrayView<double> &data,
503 const unsigned int mineral_i,
505 const std::pair<std::vector<double>, std::vector<Tensor<2,3>>> &derivatives)
const;
523 advect_backward_euler(
const unsigned int cpo_data_position,
524 const ArrayView<double> &data,
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>>>
537 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)
double 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.
AdvectionMethod
The type of Advection method used to advect the CPO properties.
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.
void set_deformation_type(const unsigned int cpo_data_position, const ArrayView< double > &data, const unsigned int mineral_i, const double deformation_type) const
Sets the value in the data array representing the deformation type.
CPODerivativeAlgorithm cpo_derivative_algorithm
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