1#[cfg(test)]
4pub mod test;
5
6pub mod special;
8
9pub mod integrate;
11
12pub mod interpolate;
14
15pub mod optimize;
17
18mod matrix;
19mod tensor;
20
21pub use matrix::{
22 Matrix,
23 square::{Banded, SquareMatrix},
24 vector::Vector,
25};
26pub use tensor::{
27 Hessian, Jacobian, Rank2, Scalar, Solution, Tensor, TensorArray, TensorVec,
28 rank_0::{
29 TensorRank0,
30 list::{TensorRank0List, tensor_rank_0_list},
31 },
32 rank_1::{
33 TensorRank1,
34 list::{TensorRank1List, tensor_rank_1_list},
35 list_2d::{TensorRank1List2D, tensor_rank_1_list_2d},
36 tensor_rank_1,
37 vec::TensorRank1Vec,
38 vec_2d::TensorRank1Vec2D,
39 zero as tensor_rank_1_zero,
40 },
41 rank_2::{
42 IDENTITY, IDENTITY_00, IDENTITY_10, TensorRank2, ZERO, ZERO_10,
43 list::{TensorRank2List, tensor_rank_2_list},
44 list_2d::TensorRank2List2D,
45 tensor_rank_2,
46 vec::TensorRank2Vec,
47 vec_2d::TensorRank2Vec2D,
48 },
49 rank_3::{
50 LEVI_CIVITA, TensorRank3, levi_civita, list::TensorRank3List, list_2d::TensorRank3List2D,
51 list_3d::TensorRank3List3D,
52 },
53 rank_4::{
54 ContractAllIndicesWithFirstIndicesOf, ContractFirstSecondIndicesWithSecondIndicesOf,
55 ContractFirstThirdFourthIndicesWithFirstIndicesOf,
56 ContractSecondFourthIndicesWithFirstIndicesOf, ContractSecondIndexWithFirstIndexOf,
57 ContractThirdFourthIndicesWithFirstSecondIndicesOf, IDENTITY_1010, TensorRank4,
58 list::TensorRank4List,
59 },
60 test::{TestError, assert_eq, assert_eq_within, assert_eq_within_tols},
61};
62
63use std::fmt;
64
65fn write_tensor_rank_0(f: &mut fmt::Formatter, tensor_rank_0: &TensorRank0) -> fmt::Result {
66 let num = if tensor_rank_0.abs() > 1e-1 {
67 (tensor_rank_0 * 1e6).round() / 1e6
68 } else {
69 *tensor_rank_0
70 };
71 let num_abs = num.abs();
72 if num.is_nan() {
73 write!(f, "{num:>11}, ")
74 } else if num == 0.0 || num_abs == 1.0 {
75 let temp_1 = format!("{num:>11.6e}, ").to_string();
76 let mut temp_2 = temp_1.split("e");
77 let a = temp_2.next().unwrap();
78 let b = temp_2.next().unwrap();
79 write!(f, "{a}e+00{b}")
80 } else if num_abs <= 1e-100 {
81 write!(f, "{num:>14.6e}, ")
82 } else if num_abs >= 1e100 {
83 let temp_1 = format!("{num:>13.6e}, ").to_string();
84 let mut temp_2 = temp_1.split("e");
85 let a = temp_2.next().unwrap();
86 let b = temp_2.next().unwrap();
87 write!(f, "{a}e+{b}")
88 } else if num_abs < 1e-9 {
89 let temp_1 = format!("{num:>13.6e}, ").to_string();
90 let mut temp_2 = temp_1.split("e");
91 let a = temp_2.next().unwrap();
92 let b = temp_2.next().unwrap();
93 let mut c = b.split("-");
94 c.next();
95 let e = c.next().unwrap();
96 write!(f, "{a}e-0{e}")
97 } else if num_abs >= 1e10 {
98 let temp_1 = format!("{num:>12.6e}, ").to_string();
99 let mut temp_2 = temp_1.split("e");
100 let a = temp_2.next().unwrap();
101 let b = temp_2.next().unwrap();
102 write!(f, "{a}e+0{b}")
103 } else if num_abs <= 1e0 {
104 let temp_1 = format!("{num:>12.6e}, ").to_string();
105 let mut temp_2 = temp_1.split("e");
106 let a = temp_2.next().unwrap();
107 let b = temp_2.next().unwrap();
108 let mut c = b.split("-");
109 c.next();
110 let e = c.next().unwrap();
111 write!(f, "{a}e-00{e}")
112 } else {
113 let temp_1 = format!("{num:>11.6e}, ").to_string();
114 let mut temp_2 = temp_1.split("e");
115 let a = temp_2.next().unwrap();
116 let b = temp_2.next().unwrap();
117 write!(f, "{a}e+00{b}")
118 }
119}