#mesh #open-foam #cfd #aerospace #data-file

polymesh_rw

一个基本的Rust crate,用于读取和写入由OpenFOAM使用的polymesh格式的网格和模拟数据。

1 个不稳定版本

0.1.0 2024年6月13日

#109 in 模拟

MIT 许可证

345KB
2K SLoC

polymesh_rw

一个基本的Rust crate,用于读取和写入由OpenFOAM使用的polymesh格式的网格和模拟数据。

功能

此crate仍在开发中。 解析器仅在少量网格上进行了测试。 如果您的网格解析不正确,请通过打开问题并上传您的网格来贡献。

目前,实现了以下功能

  • 读取网格
  • 写入网格
  • 读取结果
  • 写入结果
  • 解析更常见的OpenFoam数据类型(未识别的类型当前解析为字符串。)
  • 二进制文件格式
  • 数据一致性检查

贡献

请随时提出建议、测试用例和代码。


lib.rs:

polymesh_rw

polymesh_rw 是一个用于读取和写入 OpenFOAM polyMesh 文件格式的网格和模拟数据的库。可以将完整案例文件读取到 Case 结构中,该结构包含网格和所有时间目录。

use polymesh_rw::*;
  let case_file_path = std::path::Path::new("tests/test_cases/original/cylinder");
  let mut case = Case::parse_file(case_file_path)?;

案例结构中的数据在 polymesh 结构中分开,该结构存储网格,以及一个 time_directories 结构,该结构存储模拟数据。例如,位于 constant/polyMesh/boundary 文件中的边界条件将在 case.polymesh.boundary 中找到。

  let boundary = &mut case.polymesh.boundary;

数据文件存储在 FileContent 结构中,其中包含元数据(头)和数据。该结构还允许单独解析和写入文件。

   let boundary_file_path = &case_file_path.join("constant/polyMesh/boundary");
   let boundary_2 = FileContent::<BoundaryData>::parse_file(&boundary_file_path)?;
   assert_eq!(*boundary, boundary_2);

所有数据和元数据容器实现了 std::fmt::Debug,因此可以打印到控制台。

   println!("{}", boundary);

底层数据以两种不同的方式存储:要么作为HashMaps,要么作为Vectors。这些数据类型的包装器,提供了解析和写入功能,也实现了Deref和DerefMut,以便于操作。在 FoamStructures (HashMaps) 中,数据存储为 FoamValues,它们指示数据类型

  • 字符串
  • 浮点数
  • 整数
  • 列表
  • 结构
  let FoamValue::Structure(ref mut down_bc) = boundary
      .data
      .get_mut("down")
      .expect("\"down\" boundary condition not found.")
  else {
      panic!("\"down\" boundary condition is not a structure.");
  };
  println!("{}", down_bc);
  *down_bc.get_mut("type").unwrap() = FoamValue::String("fixedValue".to_string());
  println!("{}", down_bc);

文件可以使用write_file方法写入,该方法将数据写入提供的路径。以下示例中,完整案例被写入一个新的目录。

   let modified_case_file_path = std::path::Path::new("tests/test_cases/copy/cylinder");
   case.write_file(modified_case_file_path)?;

我们还可以选择只写入boundary文件,这是完整案例的一部分。

   let modified_case_file_path = std::path::Path::new("tests/test_cases/copy/cylinder");
    boundary.write_file(modified_case_file_path)?;

我们仍然提供案例目录的路径,但文件将被写入案例目录的正确位置。如果需要更改相对位置,可以通过将正确的相对路径赋值给boundary.meta.location字段(相对于案例目录)来实现。

依赖项

~2MB
~33K SLoC