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, 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 zero as tensor_rank_1_zero,
39 },
40 rank_2::{
41 IDENTITY, IDENTITY_00, IDENTITY_10, TensorRank2, ZERO, ZERO_10,
42 list::{TensorRank2List, tensor_rank_2_list},
43 list_2d::TensorRank2List2D,
44 tensor_rank_2,
45 vec::TensorRank2Vec,
46 vec_2d::TensorRank2Vec2D,
47 },
48 rank_3::{
49 LEVI_CIVITA, TensorRank3, levi_civita, list::TensorRank3List, list_2d::TensorRank3List2D,
50 list_3d::TensorRank3List3D,
51 },
52 rank_4::{
53 ContractAllIndicesWithFirstIndicesOf, ContractFirstSecondIndicesWithSecondIndicesOf,
54 ContractFirstThirdFourthIndicesWithFirstIndicesOf,
55 ContractSecondFourthIndicesWithFirstIndicesOf, ContractSecondIndexWithFirstIndexOf,
56 ContractThirdFourthIndicesWithFirstSecondIndicesOf, IDENTITY_1010, TensorRank4,
57 list::TensorRank4List,
58 },
59 test::{TestError, assert_eq, assert_eq_within_tols},
60};
61
62use std::fmt;
63
64fn write_tensor_rank_0(f: &mut fmt::Formatter, tensor_rank_0: &TensorRank0) -> fmt::Result {
65 let num = if tensor_rank_0.abs() > 1e-1 {
66 (tensor_rank_0 * 1e6).round() / 1e6
67 } else {
68 *tensor_rank_0
69 };
70 let num_abs = num.abs();
71 if num.is_nan() {
72 write!(f, "{:>11}, ", num)
73 } else if num == 0.0 || num_abs == 1.0 {
74 let temp_1 = format!("{:>11.6e}, ", num).to_string();
75 let mut temp_2 = temp_1.split("e");
76 let a = temp_2.next().unwrap();
77 let b = temp_2.next().unwrap();
78 write!(f, "{}e+00{}", a, b)
79 } else if num_abs <= 1e-100 {
80 write!(f, "{:>14.6e}, ", num)
81 } else if num_abs >= 1e100 {
82 let temp_1 = format!("{:>13.6e}, ", num).to_string();
83 let mut temp_2 = temp_1.split("e");
84 let a = temp_2.next().unwrap();
85 let b = temp_2.next().unwrap();
86 write!(f, "{}e+{}", a, b)
87 } else if num_abs <= 1e-10 {
88 let temp_1 = format!("{:>13.6e}, ", num).to_string();
89 let mut temp_2 = temp_1.split("e");
90 let a = temp_2.next().unwrap();
91 let b = temp_2.next().unwrap();
92 let mut c = b.split("-");
93 c.next();
94 let e = c.next().unwrap();
95 write!(f, "{}e-0{}", a, e)
96 } else if num_abs >= 1e10 {
97 let temp_1 = format!("{:>12.6e}, ", num).to_string();
98 let mut temp_2 = temp_1.split("e");
99 let a = temp_2.next().unwrap();
100 let b = temp_2.next().unwrap();
101 write!(f, "{}e+0{}", a, b)
102 } else if num_abs <= 1e0 {
103 let temp_1 = format!("{:>12.6e}, ", num).to_string();
104 let mut temp_2 = temp_1.split("e");
105 let a = temp_2.next().unwrap();
106 let b = temp_2.next().unwrap();
107 let mut c = b.split("-");
108 c.next();
109 let e = c.next().unwrap();
110 write!(f, "{}e-00{}", a, e)
111 } else {
112 let temp_1 = format!("{:>11.6e}, ", num).to_string();
113 let mut temp_2 = temp_1.split("e");
114 let a = temp_2.next().unwrap();
115 let b = temp_2.next().unwrap();
116 write!(f, "{}e+00{}", a, b)
117 }
118}