1use crate::ode::*;
5
6use std::fmt;
7
8#[derive(Debug)]
10pub struct ODEMat<'a> {
11 nr: usize,
12 nc: usize,
13 mat: &'a [dReal]
14}
15
16impl ODEMat<'_> {
18 pub fn from_slice(nr: usize, nc: usize, mat: &[dReal]) -> ODEMat {
20 ODEMat{nr: nr, nc: nc, mat: mat}
21 }
22
23 pub fn as_vec(mat: &[dReal]) -> ODEMat {
25 ODEMat::from_slice(1, 4, mat)
26 }
27
28 pub fn as_mat(nr: usize, mat: &[dReal]) -> ODEMat {
30 ODEMat::from_slice(nr, 4, mat)
31 }
32
33 pub fn from_Q(q: *const dReal) -> ODEMat<'static> {
35unsafe {
36 ODEMat::as_vec(std::slice::from_raw_parts(q, 4))
37}
38 }
39
40 pub fn from_Mat3(m: *const dReal) -> ODEMat<'static> {
42unsafe {
43 ODEMat::as_mat(3, std::slice::from_raw_parts(m, 12))
44}
45 }
46
47 pub fn from_Mat4(m: *const dReal) -> ODEMat<'static> {
49unsafe {
50 ODEMat::as_mat(4, std::slice::from_raw_parts(m, 16))
51}
52 }
53}
54
55impl fmt::Display for ODEMat<'_> {
57 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59 match self.nr {
60 1 => {
61 write!(f, "[");
62 for (j, col) in self.mat.iter().enumerate() {
63 if j != 0 { write!(f, ","); }
64 write!(f, "{:17.7}", col);
65 }
66 write!(f, "]")
67 },
68 _ => {
69 writeln!(f, "[");
70 for (i, row) in self.mat.chunks_exact(self.nc).enumerate() {
71 write!(f, " {}", ODEMat::as_vec(row));
72 if i < self.nr - 1 { writeln!(f, ""); };
73 }
74 write!(f, "]")
75 }
76 }
77 }
78}
79
80pub fn v2a<T, const N: usize>(v: Vec<T>) -> [T; N] {
83 v.try_into().unwrap_or_else(|v: Vec<T>|
84 panic!("Expected a Vec of length {} but it was {}", N, v.len()))
85}