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;
271 save (std::map<std::string, std::string> &status_strings)
const override;
274 load (
const std::map<std::string, std::string> &status_strings)
override;
280 get_number_of_grains()
const;
286 get_number_of_minerals()
const;
299 const Point<dim> &position,
300 const typename DoFHandler<dim>::active_cell_iterator &cell,
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 static_cast<DeformationType>(data[cpo_data_position + 0 + mineral_i * (n_grains * 10 + 2)]);
355 const ArrayView<double> &data,
356 const unsigned int mineral_i,
359 data[cpo_data_position + 0 + mineral_i * (n_grains * 10 + 2)] = static_cast<double>(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)
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