NEML2 1.4.0
Loading...
Searching...
No Matches
Quaternion.cxx
1// Copyright 2023, UChicago Argonne, LLC
2// All Rights Reserved
3// Software Name: NEML2 -- the New Engineering material Model Library, version 2
4// By: Argonne National Laboratory
5// OPEN SOURCE LICENSE (MIT)
6//
7// Permission is hereby granted, free of charge, to any person obtaining a copy
8// of this software and associated documentation files (the "Software"), to deal
9// in the Software without restriction, including without limitation the rights
10// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11// copies of the Software, and to permit persons to whom the Software is
12// furnished to do so, subject to the following conditions:
13//
14// The above copyright notice and this permission notice shall be included in
15// all copies or substantial portions of the Software.
16//
17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23// THE SOFTWARE.
24
25#include "neml2/tensors/Quaternion.h"
26
27#include "neml2/tensors/R2.h"
28#include "neml2/tensors/Scalar.h"
29
30namespace neml2
31{
32
33Quaternion
35 const Real & q1,
36 const Real & q2,
37 const Real & q3,
38 const torch::TensorOptions & options)
39{
40 return Quaternion::fill(
41 Scalar(s, options), Scalar(q1, options), Scalar(q2, options), Scalar(q3, options));
42}
43
45Quaternion::fill(const Scalar & s, const Scalar & q1, const Scalar & q2, const Scalar & q3)
46{
47 return Quaternion(torch::stack({s, q1, q2, q3}, -1), s.batch_dim());
48}
49
55
56R2
58{
59 const Quaternion & q = *this;
60
61 Scalar v1s = q(1) * q(1);
62 Scalar v2s = q(2) * q(2);
63 Scalar v3s = q(3) * q(3);
64
65 return R2::fill(1 - 2 * v2s - 2 * v3s,
66 2 * (q(1) * q(2) - q(3) * q(0)),
67 2 * (q(1) * q(3) + q(2) * q(0)),
68 2 * (q(1) * q(2) + q(3) * q(0)),
69 1 - 2 * v1s - 2 * v3s,
70 2 * (q(2) * q(3) - q(1) * q(0)),
71 2 * (q(1) * q(3) - q(2) * q(0)),
72 2 * (q(2) * q(3) + q(1) * q(0)),
73 1 - 2 * v1s - 2 * v2s);
74}
75} // namespace neml2
BatchTensor base_index(const TorchSlice &indices) const
Return an index sliced on the base dimensions.
Definition BatchTensorBase.cxx:193
The wrapper (decorator) for cross-referencing unresolved values at parse time.
Definition CrossRef.h:52
A batched quaternion.
Definition Quaternion.h:44
Scalar operator()(TorchSize i) const
Accessor.
Definition Quaternion.cxx:51
static Quaternion fill(const Scalar &s, const Scalar &q1, const Scalar &q2, const Scalar &q3)
fill with four scalars
Definition Quaternion.cxx:45
R2 to_R2() const
Convert to R2.
Definition Quaternion.cxx:57
static R2 fill(const Real &a, const torch::TensorOptions &options=default_tensor_options())
Fill the diagonals with a11 = a22 = a33 = a.
Definition R2Base.cxx:40
A basic R2.
Definition R2.h:42
The (logical) scalar.
Definition Scalar.h:38
Definition CrossRef.cxx:32
int64_t TorchSize
Definition types.h:35
double Real
Definition types.h:33