Branch data Line data Source code
1 : :
2 : : namespace ippl {
3 : : template <typename T>
4 : : KOKKOS_FUNCTION typename QuadrilateralElement<T>::vertex_points_t
5 : 6416 : QuadrilateralElement<T>::getLocalVertices() const {
6 : : // For the ordering of local vertices, see section 3.3.1:
7 : : // https://amas.web.psi.ch/people/aadelmann/ETH-Accel-Lecture-1/projectscompleted/phys/bachelor_thesis_buehlluk.pdf
8 [ + + ]: 32080 : QuadrilateralElement::vertex_points_t vertices = {
[ + + - - ]
9 : : {0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}, {0.0, 1.0}};
10 : :
11 : 12816 : return vertices;
12 [ + - - - : 12832 : }
- - ]
13 : :
14 : : template <typename T>
15 : : KOKKOS_FUNCTION typename QuadrilateralElement<T>::point_t
16 : 24 : QuadrilateralElement<T>::getTransformationJacobian(
17 : : const QuadrilateralElement<T>::vertex_points_t& global_vertices) const {
18 : 24 : QuadrilateralElement::point_t jacobian;
19 : :
20 : 24 : jacobian[0] = (global_vertices[1][0] - global_vertices[0][0]);
21 : 24 : jacobian[1] = (global_vertices[2][1] - global_vertices[0][1]);
22 : :
23 : 24 : return jacobian;
24 : : }
25 : :
26 : : template <typename T>
27 : : KOKKOS_FUNCTION typename QuadrilateralElement<T>::point_t
28 : 24 : QuadrilateralElement<T>::getInverseTransformationJacobian(
29 : : const QuadrilateralElement<T>::vertex_points_t& global_vertices) const {
30 : 24 : QuadrilateralElement::point_t inv_jacobian;
31 : :
32 : 24 : inv_jacobian[0] = 1.0 / (global_vertices[1][0] - global_vertices[0][0]);
33 : 24 : inv_jacobian[1] = 1.0 / (global_vertices[2][1] - global_vertices[0][1]);
34 : :
35 : 24 : return inv_jacobian;
36 : : }
37 : :
38 : : template <typename T>
39 : : KOKKOS_FUNCTION typename QuadrilateralElement<T>::point_t
40 : 24 : QuadrilateralElement<T>::globalToLocal(
41 : : const QuadrilateralElement<T>::vertex_points_t& global_vertices,
42 : : const QuadrilateralElement<T>::point_t& global_point) const {
43 : : // This is actually not a matrix, but an IPPL vector that represents a diagonal matrix
44 [ + - ]: 24 : const QuadrilateralElement<T>::point_t glob2loc_matrix =
45 : : getInverseTransformationJacobian(global_vertices);
46 : :
47 [ + - ]: 24 : QuadrilateralElement<T>::point_t local_point =
48 [ + - + - ]: 48 : glob2loc_matrix * (global_point - global_vertices[0]);
49 : :
50 : 24 : return local_point;
51 : 24 : }
52 : :
53 : : template <typename T>
54 : : KOKKOS_FUNCTION typename QuadrilateralElement<T>::point_t
55 : 24 : QuadrilateralElement<T>::localToGlobal(
56 : : const QuadrilateralElement<T>::vertex_points_t& global_vertices,
57 : : const QuadrilateralElement<T>::point_t& local_point) const {
58 : : // This is actually not a matrix but an IPPL vector that represents a diagonal matrix
59 [ + - ]: 24 : const QuadrilateralElement<T>::point_t loc2glob_matrix =
60 : : getTransformationJacobian(global_vertices);
61 : :
62 [ + - ]: 24 : QuadrilateralElement<T>::point_t global_point =
63 [ + - + - ]: 48 : (loc2glob_matrix * local_point) + global_vertices[0];
64 : :
65 : 24 : return global_point;
66 : 24 : }
67 : :
68 : : template <typename T>
69 : 0 : KOKKOS_FUNCTION T QuadrilateralElement<T>::getDeterminantOfTransformationJacobian(
70 : : const QuadrilateralElement<T>::vertex_points_t& global_vertices) const {
71 : 0 : T determinant = 1.0;
72 : :
73 : : // Since the jacobian is a diagonal matrix in our case the determinant is the product of the
74 : : // diagonal elements
75 [ # # # # ]: 0 : for (const T& jacobian_val : getTransformationJacobian(global_vertices)) {
[ # # ]
76 : 0 : determinant *= jacobian_val;
77 : : }
78 : :
79 : 0 : return determinant;
80 : : }
81 : :
82 : : template <typename T>
83 : : KOKKOS_FUNCTION typename QuadrilateralElement<T>::point_t
84 : 0 : QuadrilateralElement<T>::getInverseTransposeTransformationJacobian(
85 : : const QuadrilateralElement<T>::vertex_points_t& global_vertices) const {
86 : : // Simply return the inverse transformation jacobian since it is a diagonal matrix
87 : 0 : return getInverseTransformationJacobian(global_vertices);
88 : : }
89 : :
90 : : template <typename T>
91 : 6400 : KOKKOS_FUNCTION bool QuadrilateralElement<T>::isPointInRefElement(
92 : : const Vector<T, 2>& point) const {
93 : : // check if the local coordinates are inside the reference element
94 : :
95 [ + + ]: 19200 : for (size_t d = 0; d < 2; d++) {
96 [ + - - + : 12800 : if (point[d] > 1.0 || point[d] < 0.0) {
- + ]
97 : : // The global coordinates are outside of the support.
98 : 0 : return false;
99 : : }
100 : : }
101 : :
102 : 6400 : return true;
103 : : }
104 : :
105 : : } // namespace ippl
|