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// }