OGS
ParameterLib/CoordinateSystem.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <Eigen/Core>
7#include <array>
8#include <vector>
9
10namespace ParameterLib
11{
12template <typename T>
13struct Parameter;
14class SpatialPosition;
15} // namespace ParameterLib
16
17namespace ParameterLib
18{
41struct CoordinateSystem final
42{
49 explicit CoordinateSystem(Parameter<double> const& unit_direction);
50
52
54 Parameter<double> const& e1,
55 Parameter<double> const& e2);
56
57 template <int Dimension>
58 Eigen::Matrix<double, Dimension, Dimension> transformation(
59 SpatialPosition const& pos) const;
60
61 Eigen::Matrix<double, 3, 3> transformation_3d(
62 SpatialPosition const& pos) const;
63
64 template <int Dimension>
65 Eigen::Matrix<double, Dimension, Dimension> rotateTensor(
66 std::vector<double> const& values, SpatialPosition const& pos) const;
67
68 template <int Dimension, typename Derived>
69 Eigen::Matrix<double, Dimension, Dimension> rotateTensor(
70 Eigen::MatrixBase<Derived> const& tensor,
71 SpatialPosition const& pos) const;
72
73 template <int Dimension>
74 Eigen::Matrix<double, Dimension, Dimension> rotateDiagonalTensor(
75 std::vector<double> const& values, SpatialPosition const& pos) const;
76
77private:
78 std::array<Parameter<double> const*, 3> _base;
80
81 Eigen::Matrix<double, 3, 3> transformationFromSingleBase_3d(
82 SpatialPosition const& pos) const;
83};
84
85template <int Dimension, typename Derived>
86Eigen::Matrix<double, Dimension, Dimension> CoordinateSystem::rotateTensor(
87 Eigen::MatrixBase<Derived> const& tensor, SpatialPosition const& pos) const
88{
89 auto const R = transformation<Dimension>(pos);
90 return R * tensor * R.transpose();
91}
92
93extern template Eigen::Matrix<double, 2, 2> CoordinateSystem::rotateTensor<2>(
94 std::vector<double> const& values, SpatialPosition const& pos) const;
95extern template Eigen::Matrix<double, 3, 3> CoordinateSystem::rotateTensor<3>(
96 std::vector<double> const& values, SpatialPosition const& pos) const;
97extern template Eigen::Matrix<double, 2, 2>
98CoordinateSystem::rotateDiagonalTensor<2>(std::vector<double> const& values,
99 SpatialPosition const& pos) const;
100extern template Eigen::Matrix<double, 3, 3>
101CoordinateSystem::rotateDiagonalTensor<3>(std::vector<double> const& values,
102 SpatialPosition const& pos) const;
103} // namespace ParameterLib
std::array< Parameter< double > const *, 3 > _base
Eigen::Matrix< double, Dimension, Dimension > transformation(SpatialPosition const &pos) const
Eigen::Matrix< double, 3, 3 > transformationFromSingleBase_3d(SpatialPosition const &pos) const
Eigen::Matrix< double, 3, 3 > transformation_3d(SpatialPosition const &pos) const
Eigen::Matrix< double, Dimension, Dimension > rotateTensor(std::vector< double > const &values, SpatialPosition const &pos) const
Eigen::Matrix< double, Dimension, Dimension > rotateDiagonalTensor(std::vector< double > const &values, SpatialPosition const &pos) const
CoordinateSystem(Parameter< double > const &unit_direction)