include/meltpooldg/radiative_transport/utility_functions.hpp Source File

Developer Documentation: include/meltpooldg/radiative_transport/utility_functions.hpp Source File
Developer Documentation
utility_functions.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/exceptions.h>
4#include <deal.II/base/tensor.h>
5#include <deal.II/base/vectorization.h>
6
9
10
12{
13 template <int dim, typename number>
14 inline dealii::VectorizedArray<number>
16 const dealii::VectorizedArray<number> &H,
17 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &grad_H,
18 const dealii::Tensor<1, dim, number> &laser_direction,
19 const number avoid_div_zero_constant)
20 {
21 // 1. material constant mu
22 if (rte_data.absorptivity_type == AbsorptivityType::constant)
23 return (
27
28 // 2. gradient based mu : max(0, ∇H * laser_dir *1./(1.- H + ϵ))
29 else if (rte_data.absorptivity_type == AbsorptivityType::gradient_based)
30 {
31 dealii::VectorizedArray<number> dummy =
32 scalar_product(grad_H, laser_direction) * 1. / (1. - H + avoid_div_zero_constant);
33 return dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(dummy,
34 0.,
35 /*true*/ 0.,
36 /*false*/ dummy);
37 }
38
39 else
40 AssertThrow(false, dealii::ExcNotImplemented());
41 return dealii::VectorizedArray<number>(0);
42 }
43
44
56 template <int dim, typename number>
57 inline dealii::VectorizedArray<number>
58 compute_invalid_mask(const dealii::VectorizedArray<number> &I,
59 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &grad_I,
60 const dealii::VectorizedArray<number> &H,
61 const number pure_liquid_level_set)
62 {
63 // only invalid mask on pure liquid
64 dealii::VectorizedArray<number> liquid_checker =
65 dealii::compare_and_apply_mask<dealii::SIMDComparison::greater_than>(H,
66 pure_liquid_level_set,
67 1.,
68 0.);
69 if (liquid_checker.sum() > H.size() - 1)
70 return dealii::VectorizedArray<number>(1.);
71
72 dealii::VectorizedArray<number> intensity_grad_magnitude = 0.0;
73 for (unsigned int d = 0; d < dim; ++d)
74 intensity_grad_magnitude += std::abs(grad_I[d]);
75
76 // else, if cell is in the gas phase H=0, following conditions needs to be met:
77 // cell must experience no intensity
78 // gradient of intensity AND heaviside IN ANY DIRECTION must be zero
79 // this makes sure that invalid_mask avoids the intensity column entirely, even on sides
80 return dealii::compare_and_apply_mask<dealii::SIMDComparison::greater_than>(
81 dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
82 I, dealii::VectorizedArray<number>(1e-16), 1., 0.) +
83 dealii::compare_and_apply_mask<dealii::SIMDComparison::greater_than>(
84 intensity_grad_magnitude, dealii::VectorizedArray<number>(1e-16), 1., 0.),
85 2. - 1e-16,
86 1.,
87 0.);
88 }
89} // namespace MeltPoolDG::RadiativeTransport
value_type1 interpolate(const value_type1 &ls, const value_type2 &val1, const value_type3 &val2)
Definition level_set_tools.hpp:40
Definition pseudo_rte_data.hpp:9
dealii::VectorizedArray< number > compute_invalid_mask(const dealii::VectorizedArray< number > &I, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &grad_I, const dealii::VectorizedArray< number > &H, const number pure_liquid_level_set)
Definition utility_functions.hpp:58
dealii::VectorizedArray< number > compute_mu(const RadiativeTransportData< number > &rte_data, const dealii::VectorizedArray< number > &H, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &grad_H, const dealii::Tensor< 1, dim, number > &laser_direction, const number avoid_div_zero_constant)
Definition utility_functions.hpp:15
dealii::VectorizedArray< number, N > scalar_product(const dealii::VectorizedArray< number, N > &scalar, const dealii::Tensor< 1, 1, dealii::VectorizedArray< number, N > > &vec)
Definition dealii_tensor.hpp:60
number absorptivity_liquid
Definition radiative_transport_data.hpp:45
Definition radiative_transport_data.hpp:32
AbsorptivityType absorptivity_type
Definition radiative_transport_data.hpp:39
struct MeltPoolDG::RadiativeTransport::RadiativeTransportData::AbsorptivityConstantData absorptivity_constant_data