Skip to main content

cmtool_core/ensight_gold/
scalar.rs

1// SPDX-License-Identifier: GPL-3.0-or-later
2
3use crate::ensight_gold::{
4    reader::EnsightGoldReader,
5    variable::{PerElementVariable, VarTypeReader},
6};
7
8pub(crate) struct ScalarReader;
9
10impl VarTypeReader for ScalarReader {
11    type VarType = Vec<f32>;
12    fn read_elements(
13        reader: &mut EnsightGoldReader,
14        element: &super::geo::MeshElementType,
15    ) -> std::io::Result<Self::VarType> {
16        reader.read_buffer_f32(element.n_elements)
17    }
18}
19pub(crate) type ScalarField = PerElementVariable<ScalarReader>;
20
21impl ScalarField {
22    #[inline]
23    pub fn get_value(&self, i_part: usize, i_mesh_element_type: usize, mesh_cell: usize) -> f32 {
24        self.data[i_part][i_mesh_element_type][mesh_cell]
25    }
26}
27
28// impl RawField for ScalarField
29// {
30//     fn init(geometry: Arc<Geometry>, path: impl AsRef<Path>) -> std::io::Result<Self> {
31//         let mut reader = Reader::new(path)?;
32//         Self::read(&geometry, &mut reader)
33//     }
34// }
35
36// impl ScalarField {
37//     fn new() -> Self {
38//         let data = Vec::new();
39//         let part_id = Vec::new();
40//         ScalarField { data, part_id,name:String::new() }
41//     }
42
43//     pub fn get_value(&self, i_part: usize, i_mesh_element_type: usize, mesh_cell: usize) -> f32 {
44//         self.data[i_part][i_mesh_element_type][mesh_cell]
45//     }
46
47//     fn per_node_read(geometry: &Geometry, reader: &mut EnsightGoldReader) -> std::io::Result<Self> {
48//         reader.ignore_line()?; //description
49
50//         let mut scalar = ScalarField::new();
51//         scalar.data.resize(geometry.number_of_part(), Vec::new());
52
53//         for data_in_part in &mut scalar.data {
54//             reader.check_lines_contains("part")?;
55
56//             let id = reader.read_i32()?;
57//             scalar.part_id.push(id as u32);
58//             println!("id {:?}", id);
59
60//             if let Some(part) = geometry.get_part_by_id(id as u32) {
61//                 let n_elements = part.elements.len();
62//                 println!("{}", n_elements);
63//                 data_in_part.push(vec![0.; n_elements]);
64
65//                 let element_type_name = reader.get_line_string()?;
66//                 println!("{}", element_type_name);
67//                 for (i_element, element) in data_in_part.iter_mut().enumerate() {
68//                     println!("{}", i_element);
69//                     element.resize(part.elements[i_element].n_elements, 0.);
70//                     for element_value in element {
71//                         println!("{}", element_value);
72//                         *element_value = reader.read_f32()?;
73//                     }
74//                 }
75//             }
76//             reader.ignore_line()?; //description
77//         }
78//         if reader.check_eof()? {
79//             Ok(scalar)
80//         } else {
81//             Err(std::io::Error::new(
82//                 ErrorKind::Unsupported,
83//                 "Reader should have been reached EOF".to_string(),
84//             ))
85//         }
86//     }
87
88//     fn per_element_read(
89//         geometry: &Geometry,
90//         reader: &mut EnsightGoldReader,
91//     ) -> std::io::Result<Self> {
92//         // reader.ignore_line()?; //description
93//         let mut scalar = ScalarField::new();
94//         scalar.name =reader.get_line_string()?;
95
96//         scalar.data.resize(geometry.number_of_part(), Vec::new());
97//         for data_in_part in &mut scalar.data {
98//             reader.check_lines_contains("part")?;
99
100//             let id = reader.read_i32()?;
101//             scalar.part_id.push(id as u32);
102
103//             if let Some(part) = geometry.get_part_by_id(id as u32) {
104//                 let n_elements = part.elements.len();
105//                 // println!("{}", n_elements);
106//                 data_in_part.reserve(n_elements);
107
108//                 for element in &part.elements {
109//                     let element_type_name = reader.get_line_string()?;
110//                     if element_type_name.contains("undef")
111//                     {
112//                         unimplemented!("Undef varaible per element");
113//                     }
114//                     // let _ = reader.read_f32()?; //undef
115//                     // println!("{}", element_type_name);
116//                     if ElementsType::from_str(&element_type_name) == Ok(element.etype) {
117//                         data_in_part.push(reader.read_buffer_f32(element.n_elements)?);
118//                     } else {
119//                         return Err(std::io::Error::new(
120//                             ErrorKind::Unsupported,
121//                             format!(
122//                                 "Scalar and geometry part are not the same: {} vs {:?}",
123//                                 element_type_name, element.etype
124//                             ),
125//                         ));
126//                     }
127//                 }
128//             }
129//         }
130//         if reader.check_eof()? {
131//             Ok(scalar)
132//         } else {
133//             Err(std::io::Error::new(
134//                 ErrorKind::Unsupported,
135//                 "Reader should have been reached EOF".to_string(),
136//             ))
137//         }
138//     }
139
140//     fn read(geometry: &Geometry, reader: &mut EnsightGoldReader) -> std::io::Result<Self> {
141//         // Self::per_node_read(geometry, reader)
142
143//         Self::per_element_read(geometry, reader)
144//     }
145// }