16#ifndef dealii_differentiation_sd_symengine_tensor_operations_h
17#define dealii_differentiation_sd_symengine_tensor_operations_h
21#ifdef DEAL_II_WITH_SYMENGINE
85 template <
int rank,
int dim>
108 template <
int rank,
int dim>
156 template <
int rank,
int dim>
181 template <
int rank,
int dim>
184 const std::string &
symbol,
203 template <
int rank,
int dim>
216 template <
int rank,
int dim>
230 template <
int rank,
int dim>
244 template <
int rank,
int dim>
258 template <
int rank,
int dim>
272 template <
int rank,
int dim>
287 template <
int rank,
int dim>
303 template <
int rank,
int dim>
318 template <
int rank_1,
int rank_2,
int dim>
335 template <
int rank_1,
int rank_2,
int dim>
350 template <
int rank_1,
int rank_2,
int dim>
365 template <
int rank_1,
int rank_2,
int dim>
402 typename ValueType = double,
435 typename ValueType = double,
464 template <
int rank,
int dim,
typename SymbolicType,
typename ValueType>
491 template <
int rank,
int dim,
typename SymbolicType,
typename ValueType>
526 template <
int rank,
int dim,
typename ExpressionType,
typename ValueType>
553 template <
int rank,
int dim,
typename ExpressionType,
typename ValueType>
665 template <
int rank,
int dim>
689 template <
int rank,
int dim>
720 template <
typename ValueType,
int rank,
int dim>
752 template <
typename ValueType,
int rank,
int dim>
781 const unsigned int idx_j)
794 template <
int rank_1,
int rank_2>
800 for (
unsigned int i = 0; i <
rank_1; ++i)
802 for (
unsigned int j = 0;
j <
rank_2; ++
j)
824 template <
int rank,
int dim,
typename ValueType>
833 template <
int rank,
int dim,
typename ValueType>
839 rank == 0 || rank == 2,
840 "Querying symmetric component for non rank-2 symmetric tensor index is not allowed.");
845 template <
int dim,
typename ValueType>
855 typename ValueType = Expression,
856 template <
int,
int,
typename>
868 typename ValueType = Expression,
869 template <
int,
int,
typename>
876 for (
unsigned int i = 0; i < out.n_independent_components; ++i)
879 out.unrolled_to_component_indices(i));
892 typename ValueType = Expression,
893 template <
int,
int,
typename>
900 for (
unsigned int i = 0; i < out.n_independent_components; ++i)
903 out.unrolled_to_component_indices(i));
915 typename ValueType = Expression,
916 template <
int,
int,
typename>
920 const ValueType & op)
923 for (
unsigned int i = 0; i < out.n_independent_components; ++i)
926 out.unrolled_to_component_indices(i));
936 typename ValueType = Expression,
937 template <
int,
int,
typename>
944 for (
unsigned int i = 0; i < out.n_independent_components; ++i)
947 out.unrolled_to_component_indices(i));
958 typename ValueType = Expression,
959 template <
int,
int,
typename>
966 for (
unsigned int i = 0; i <
funcs.n_independent_components; ++i)
969 funcs.unrolled_to_component_indices(i));
970 for (
unsigned int j = 0;
j < op.n_independent_components; ++
j)
973 op.unrolled_to_component_indices(
j));
995 typename ValueType = Expression,
996 template <
int,
int,
typename>
998 template <
int,
int,
typename>
1005 for (
unsigned int i = 0; i <
funcs.n_independent_components; ++i)
1008 funcs.unrolled_to_component_indices(i));
1009 for (
unsigned int j = 0;
j < op.n_independent_components; ++
j)
1012 op.unrolled_to_component_indices(
j));
1046 "Expect mixed tensor differentiation to have at least "
1047 "one component stemming from a symmetric tensor."));
1057 template <
int rank,
int dim>
1062 return internal::scalar_diff_tensor(
func, op);
1066 template <
int rank,
int dim>
1071 return internal::scalar_diff_tensor(
func, op);
1075 template <
int rank,
int dim>
1080 return internal::scalar_diff_tensor(
func, op);
1084 template <
int rank,
int dim>
1091 const Expression tmp =
func;
1092 return internal::scalar_diff_tensor(tmp, op);
1096 template <
int rank,
int dim>
1099 const Expression & op)
1105 template <
int rank,
int dim>
1114 template <
int rank,
int dim>
1117 const Expression & op)
1123 template <
int rank,
int dim>
1132 template <
int rank_1,
int rank_2,
int dim>
1141 template <
int rank_1,
int rank_2,
int dim>
1150 template <
int rank_1,
int rank_2,
int dim>
1159 template <
int rank_1,
int rank_2,
int dim>
1177 template <
int,
int,
typename>
1186 for (
unsigned int i = 0; i < out.n_independent_components; ++i)
1189 out.unrolled_to_component_indices(i));
1197 template <
typename SymbolicType,
typename ValueType,
int dim>
1205 for (
unsigned int i = 0;
1208 for (
unsigned int j = 0;
1253 template <
int rank,
int dim,
typename SymbolicType,
typename ValueType>
1260 internal::set_tensor_value_in_symbol_map(substitution_map,
1266 template <
int rank,
int dim,
typename SymbolicType,
typename ValueType>
1273 internal::set_tensor_value_in_symbol_map(substitution_map,
1282 template <
int rank,
int dim,
typename ExpressionType,
typename ValueType>
1294 template <
int rank,
int dim,
typename ExpressionType,
typename ValueType>
1315 template <
int,
int,
typename>
1317 std::vector<std::pair<ExpressionType, ValueType>>
1322 std::vector<std::pair<ExpressionType, ValueType>>
symbol_values;
1323 for (
unsigned int i = 0; i <
symbol_tensor.n_independent_components;
1335 template <
int dim,
typename ExpressionType,
typename ValueType>
1336 std::vector<std::pair<ExpressionType, ValueType>>
1343 return {std::make_pair(expression, value)};
1347 template <
int dim,
typename ExpressionType,
typename ValueType>
1348 std::vector<std::pair<ExpressionType, ValueType>>
1353 std::vector<std::pair<ExpressionType, ValueType>>
symbol_values;
1354 for (
unsigned int i = 0;
1357 for (
unsigned int j = 0;
1384 internal::make_tensor_entries_for_substitution_map(
symbol_tensor,
1402 internal::make_tensor_entries_for_substitution_map(
symbol_tensor,
1414 template <
int,
int,
typename>
1422 for (
unsigned int i = 0; i < out.n_independent_components; ++i)
1425 out.unrolled_to_component_indices(i));
1439 return substitute(expression, substitution_map);
1450 for (
unsigned int i = 0;
1453 for (
unsigned int j = 0;
1466 template <
typename ValueType,
1469 template <
int,
int,
typename>
1477 for (
unsigned int i = 0; i < out.n_independent_components; ++i)
1480 out.unrolled_to_component_indices(i));
1489 template <
typename ValueType,
int dim>
1500 template <
typename ValueType,
int dim>
1507 for (
unsigned int i = 0;
1510 for (
unsigned int j = 0;
1525 template <
int rank,
int dim>
1534 template <
int rank,
int dim>
1543 template <
typename ValueType,
int rank,
int dim>
1549 return internal::substitute_and_evaluate_tensor<ValueType>(
1554 template <
typename ValueType,
int rank,
int dim>
1560 return internal::substitute_and_evaluate_tensor<ValueType>(
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcMessage(std::string arg1)
void set_value_in_symbol_map(types::substitution_map &substitution_map, const SymEngine::RCP< const SymEngine::Basic > &symbol, const SymEngine::RCP< const SymEngine::Basic > &value)
std::map< SD::Expression, SD::Expression, internal::ExpressionKeyLess > substitution_map
Tensor< rank, dim, Expression > make_tensor_of_symbols(const std::string &symbol)
Expression differentiate(const Expression &f, const Expression &x)
ValueType substitute_and_evaluate(const Expression &expression, const types::substitution_map &substitution_map)
SymmetricTensor< rank, dim, Expression > make_symmetric_tensor_of_symbols(const std::string &symbol)
Tensor< 1, dim, Expression > make_vector_of_symbolic_functions(const std::string &symbol, const types::substitution_map &arguments)
void set_value_in_symbol_map(types::substitution_map &substitution_map, const Expression &symbol, const Expression &value)
SymmetricTensor< rank, dim, Expression > make_symmetric_tensor_of_symbolic_functions(const std::string &symbol, const types::substitution_map &arguments)
void add_to_symbol_map(types::substitution_map &symbol_map, const Expression &symbol)
Tensor< 1, dim, Expression > make_vector_of_symbols(const std::string &symbol)
void add_to_substitution_map(types::substitution_map &substitution_map, const Expression &symbol, const Expression &value)
Expression substitute(const Expression &expression, const types::substitution_map &substitution_map)
Tensor< rank, dim, Expression > make_tensor_of_symbolic_functions(const std::string &symbol, const types::substitution_map &arguments)
types::substitution_map make_substitution_map(const Expression &symbol, const Expression &value)