自己做的网站可以挂在哪里客户做网站要退款
- 作者: 五速梦信息网
- 时间: 2026年03月21日 04:59
当前位置: 首页 > news >正文
自己做的网站可以挂在哪里,客户做网站要退款,网站制作与网页设计课程设计,自己做装修图网站文章目录 读取OpenFOAM二进制polymesh格式的C/C程序1. 理解OpenFOAM二进制格式2. 基本读取步骤2.1 读取FoamFile头部2.2 读取二进制数据2.3 读取faces文件(面数据)2.4 读取owner/neighbour文件2.5 读取cellZones数据 3. 注意事项4. 完整示例5. 替代方案 OpenFOAM网格数据文本格… 文章目录 读取OpenFOAM二进制polymesh格式的C/C程序1. 理解OpenFOAM二进制格式2. 基本读取步骤2.1 读取FoamFile头部2.2 读取二进制数据2.3 读取faces文件(面数据)2.4 读取owner/neighbour文件2.5 读取cellZones数据 3. 注意事项4. 完整示例5. 替代方案 OpenFOAM网格数据文本格式和二进制格式比较1. 文件体积对比2. 读写性能3. 典型文件对比4. 何时使用哪种格式5. 转换方法总结 读取OpenFOAM二进制polymesh格式的C/C程序 OpenFOAM使用自定义的二进制格式存储网格数据(polymesh)主要包括points、faces、owner、neighbour等文件。以下是编写C/C程序读取这些二进制文件的方法
- 理解OpenFOAM二进制格式 OpenFOAM的二进制polymesh文件具有以下特点 文件开头有FoamFile头部信息(ASCII格式)实际数据部分采用二进制格式数据通常以列表形式存储前面有列表长度数值通常采用IEEE浮点格式或整型格式
- 基本读取步骤
2.1 读取FoamFile头部
首先需要跳过ASCII头部直到找到第一个左花括号{之后的数据。
void skipHeader(FILE* fp) {char line[256];while (fgets(line, sizeof(line), fp)) {if (strstr(line, FoamFile)) {// 跳过FoamFile块while (fgets(line, sizeof(line), fp) !strstr(line, }));}if (strchr(line, {)) {break; // 找到数据开始位置}}
}2.2 读取二进制数据
对于points文件(存储顶点坐标)
struct Point { float x, y, z; };std::vectorPoint readPoints(const char* filename) {FILE* fp fopen(filename, rb);if (!fp) throw std::runtime_error(Cannot open file);skipHeader(fp);// 读取点数int32_t nPoints;fread(nPoints, sizeof(int32_t), 1, fp);std::vectorPoint points(nPoints);fread(points.data(), sizeof(Point), nPoints, fp);fclose(fp);return points;
}2.3 读取faces文件(面数据)
struct Face {std::vectorint32_t vertices; // 面的顶点索引
};std::vectorFace readFaces(const char* filename) {FILE* fp fopen(filename, rb);if (!fp) throw std::runtime_error(Cannot open file);skipHeader(fp);// 读取面数int32_t nFaces;fread(nFaces, sizeof(int32_t), 1, fp);std::vectorFace faces(nFaces);for (auto face : faces) {int32_t nVertices;fread(nVertices, sizeof(int32_t), 1, fp);face.vertices.resize(nVertices);fread(face.vertices.data(), sizeof(int32_t), nVertices, fp);}fclose(fp);return faces;
}2.4 读取owner/neighbour文件
std::vectorint32_t readCellList(const char* filename) {FILE* fp fopen(filename, rb);if (!fp) throw std::runtime_error(Cannot open file);skipHeader(fp);// 读取单元数int32_t nCells;fread(nCells, sizeof(int32_t), 1, fp);std::vectorint32_t cells(nCells);fread(cells.data(), sizeof(int32_t), nCells, fp);fclose(fp);return cells;
}2.5 读取cellZones数据
cellZones文件存储了网格中特定区域的单元分组信息。以下是读取方法
#include string
#include vector
#include mapstruct ZoneInfo {std::string name;std::vectorint cells;
};std::vectorZoneInfo readCellZones(const std::string filename) {std::ifstream file(filename, std::ios::binary);if (!file) {throw std::runtime_error(Cannot open cellZones file);}// 跳过FoamFile头部int32_t numZones;file.read(reinterpret_castchar(numZones), sizeof(numZones));std::vectorZoneInfo zones(numZones);for (auto zone : zones) {// 读取区域名称长度和名称int32_t nameLength;file.read(reinterpret_castchar(nameLength), sizeof(nameLength));zone.name.resize(nameLength);file.read(zone.name[0], nameLength);// 读取单元数量int32_t numCells;file.read(reinterpret_castchar(numCells), sizeof(numCells));zone.cells.resize(numCells);file.read(reinterpret_castchar(zone.cells.data()), numCells * sizeof(int32_t));}return zones;
}3. 注意事项 字节序OpenFOAM二进制文件通常使用处理器原生字节序但如果你在不同架构的机器上读取可能需要处理字节序转换。 精度OpenFOAM可以使用单精度(float)或双精度(double)存储数据通常由writePrecision设置决定。 边界条件边界条件信息存储在boundary文件中需要额外解析。 并行计算对于并行计算案例网格被分割为多个处理器目录(processorN)每个都有自己的polyMesh。 调试可以使用foamFormatConvert工具将二进制格式转换为ASCII格式进行调试。
- 完整示例 #include iostream #include vector #include fstream #include stdexceptstruct Point { float x, y, z; }; struct Face { std::vectorint32_t vertices; };void skipHeader(std::ifstream is) {std::string line;while (std::getline(is, line)) {if (line.find(FoamFile) ! std::string::npos) {while (std::getline(is, line) line.find(}) std::string::npos);}if (line.find({) ! std::string::npos) break;} }std::vectorPoint readPoints(const std::string filename) {std::ifstream is(filename, std::ios::binary);if (!is) throw std::runtime_error(Cannot open file: filename);skipHeader(is);int32_t nPoints;is.read(reinterpret_castchar(nPoints), sizeof(int32_t));std::vectorPoint points(nPoints);is.read(reinterpret_castchar(points.data()), nPoints * sizeof(Point));return points; }int main() {try {auto points readPoints(constant/polyMesh/points);std::cout Read points.size() points std::endl;return 0;} catch (const std::exception e) {std::cerr Error: e.what() std::endl;return 1;} }5. 替代方案 如果不想手动解析二进制格式可以考虑 使用OpenFOAM自带的库函数需要链接OpenFOAM库先将二进制格式转换为ASCII格式再读取使用第三方库如CGNS或VTK的OpenFOAM读取器 以上代码提供了读取OpenFOAM二进制polymesh的基本框架实际应用中可能需要根据具体情况进行调整。 OpenFOAM网格数据文本格式和二进制格式比较 在OpenFOAM中网格数据可以以文本ASCII或二进制binary格式存储两种格式在文件大小和读写性能上有显著差异尤其对于大网格数据。以下是关键对比
- 文件体积对比 二进制格式 数据以紧凑的二进制形式存储通常比文本格式小 3-5倍。例如一个文本格式的 points 文件为100 MB二进制版本可能仅20-30 MB。文本格式 数据以人类可读的ASCII形式存储数值如浮点数以字符串形式保存占用更多空间。
- 读写性能
二进制格式 读取更快无需解析文本直接加载二进制数据。写入更快减少磁盘I/O操作。对大网格如百万级网格二进制格式的加载时间可缩短数倍。 文本格式 可手动查看/编辑但读写速度慢尤其在大数据量时。
- 典型文件对比 points节点坐标二进制体积约为文本的 1⁄4-1/5。faces面连接性二进制体积约为文本的 1⁄3-1/4因整数存储更高效。owner/neighbour二进制体积约为文本的 1/3。
- 何时使用哪种格式 二进制默认选择尤其适用于大规模仿真如CFD、DEM。文本仅需调试或手动修改网格时使用如 polyMesh/convertToASCII 转换。
- 转换方法 文本→二进制foamFormatConvert -constant -format binary二进制→文本foamFormatConvert -constant -format ascii总结 对于大网格数据二进制格式的文件体积通常为文本格式的1/3到1/5且读写效率更高。建议仅在调试时使用文本格式。
相关文章
-
自己做的网站地址手机怎么打不开品牌网站建设工作室
自己做的网站地址手机怎么打不开品牌网站建设工作室
- 技术栈
- 2026年03月21日
-
自己做的网站不备案不能访问吗网站建设费用选网络专业
自己做的网站不备案不能访问吗网站建设费用选网络专业
- 技术栈
- 2026年03月21日
-
自己做的网站被举报违反广告法wordpress点击慢
自己做的网站被举报违反广告法wordpress点击慢
- 技术栈
- 2026年03月21日
-
自己做的网站可以运营不网站备案幕布拍照是什么
自己做的网站可以运营不网站备案幕布拍照是什么
- 技术栈
- 2026年03月21日
-
自己做的网站某个网页打开很慢韩国风格网站模板
自己做的网站某个网页打开很慢韩国风格网站模板
- 技术栈
- 2026年03月21日
-
自己做的网站收费查询公司注册地址
自己做的网站收费查询公司注册地址
- 技术栈
- 2026年03月21日
