You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/ML/Training/Training/SceneIO.cpp

226 lines
6.4 KiB
C++

#include "SceneIO.h"
#include <iostream>
#include <stdint.h>
bool SceneIO::readInt(std::ifstream& fs, int& value)
{
fs.read(reinterpret_cast<char*>(&value), sizeof(int));
return fs.good();
}
bool SceneIO::readDouble(std::ifstream& fs, double& value)
{
fs.read(reinterpret_cast<char*>(&value), sizeof(double));
return fs.good();
}
bool SceneIO::readSafeSize(std::ifstream& fs, size_t& size)
{
uint32_t sz = 0;
fs.read(reinterpret_cast<char*>(&sz), sizeof(uint32_t));
if (!fs.good()) return false;
const uint32_t MAX_SIZE = 100000000;
if (sz > MAX_SIZE) return false;
size = static_cast<size_t>(sz);
return true;
}
bool SceneIO::readString(std::ifstream& fs, std::string& value)
{
uint32_t byteLen = 0;
fs.read(reinterpret_cast<char*>(&byteLen), sizeof(uint32_t));
if (!fs.good()) return false;
// 0xFFFFFFFF 表示 null 字符串
if (byteLen == 0xFFFFFFFF) {
value.clear();
return true;
}
// UTF-16 字节数 -> 字符数
size_t charCount = (size_t)(byteLen / 2);
std::vector<uint16_t> utf16(charCount);
if (charCount > 0) {
fs.read(reinterpret_cast<char*>(&utf16[0]), byteLen);
if (!fs.good()) return false;
}
// 简化转换:只取低字节(你的数据目前可用)
value.clear();
value.reserve(charCount);
for (size_t i = 0; i < charCount; ++i) {
value += static_cast<char>(utf16[i] & 0xFF);
}
return true;
}
bool SceneIO::readVector1D(std::ifstream& fs, std::vector<double>& vec)
{
size_t sz = 0;
if (!readSafeSize(fs, sz)) return false;
vec.resize(sz);
if (sz > 0) {
fs.read(reinterpret_cast<char*>(&vec[0]), sz * sizeof(double));
if (!fs.good()) return false;
}
return true;
}
bool SceneIO::readVector2D(std::ifstream& fs, std::vector<std::vector<double> >& vec)
{
size_t rows = 0;
if (!readSafeSize(fs, rows)) return false;
vec.resize(rows);
for (size_t i = 0; i < rows; ++i) {
if (!readVector1D(fs, vec[i])) return false;
}
return true;
}
bool SceneIO::readVector3D(std::ifstream& fs, std::vector<std::vector<std::vector<double> > >& vec)
{
size_t depth = 0;
if (!readSafeSize(fs, depth)) return false;
vec.resize(depth);
for (size_t i = 0; i < depth; ++i) {
if (!readVector2D(fs, vec[i])) return false;
}
return true;
}
bool SceneIO::readStdVecI(std::ifstream& fs, std::vector<int>& vec)
{
size_t sz = 0;
if (!readSafeSize(fs, sz)) return false;
vec.resize(sz);
if (sz > 0) {
for (size_t i = 0; i < sz; ++i) {
if (!readInt(fs, vec[i])) return false;
}
}
return true;
}
bool SceneIO::loadScene(const std::string& filename, PebiScene& scene)
{
std::ifstream fs(filename.c_str(), std::ios::binary);
if (!fs) {
std::cerr << "无法打开 scene 文件: " << filename << std::endl;
return false;
}
// magic
uint32_t magic = 0;
fs.read(reinterpret_cast<char*>(&magic), sizeof(uint32_t));
if (!fs.good() || magic != 0x4E4D5343) { // 'CSMN'
std::cerr << "scene.bin magic 错误" << std::endl;
return false;
}
if (!readInt(fs, scene.version)) return false;
// 网格基础
if (!readInt(fs, scene.D)) return false;
if (!readDouble(fs, scene.GridControl)) return false;
// 几何
if (!readVector2D(fs, scene.Boundary)) return false;
if (!readVector2D(fs, scene.VerticalWell)) return false;
if (!readVector2D(fs, scene.HorizontalWell)) return false;
if (!readVector2D(fs, scene.FractureVerticalWell)) return false;
if (!readVector3D(fs, scene.MultistageFracturedHorizontalWell)) return false;
if (!readVector2D(fs, scene.InclinedWell)) return false;
if (!readVector2D(fs, scene.Fault)) return false;
// wellType
size_t nType = 0;
if (!readSafeSize(fs, nType)) return false;
scene.wellType.resize(nType);
for (size_t i = 0; i < nType; ++i) {
if (!readInt(fs, scene.wellType[i])) return false;
}
// wellName
size_t nName = 0;
if (!readSafeSize(fs, nName)) return false;
scene.wellName.resize(nName);
for (size_t i = 0; i < nName; ++i) {
if (!readString(fs, scene.wellName[i])) return false;
}
// solverType
if (!readInt(fs, scene.solverType)) return false;
// Rate
if (!readVector2D(fs, scene.Rate.t)) return false;
if (!readVector2D(fs, scene.Rate.qo)) return false;
if (!readVector2D(fs, scene.Rate.qg)) return false;
if (!readVector2D(fs, scene.Rate.qw)) return false;
// CS
if (!readVector1D(fs, scene.CS.C)) return false;
if (!readVector1D(fs, scene.CS.S)) return false;
// WellFlowSectionIndex
if (!readStdVecI(fs, scene.wellFlowSectionIndex)) return false;
// PVT
if (!readVector1D(fs, scene.PVT.p)) return false;
if (!readDouble(fs, scene.PVT.pb)) return false;
if (!readVector1D(fs, scene.PVT.Rso)) return false;
if (!readVector1D(fs, scene.PVT.Bo)) return false;
if (!readVector1D(fs, scene.PVT.Co)) return false;
if (!readVector1D(fs, scene.PVT.miuo)) return false;
if (!readVector1D(fs, scene.PVT.rouo)) return false;
if (!readVector1D(fs, scene.PVT.Rv)) return false;
if (!readVector1D(fs, scene.PVT.Bg)) return false;
if (!readVector1D(fs, scene.PVT.Cg)) return false;
if (!readVector1D(fs, scene.PVT.miug)) return false;
if (!readVector1D(fs, scene.PVT.roug)) return false;
if (!readVector1D(fs, scene.PVT.Z)) return false;
if (!readVector1D(fs, scene.PVT.Rsw)) return false;
if (!readVector1D(fs, scene.PVT.Bw)) return false;
if (!readVector1D(fs, scene.PVT.Cw)) return false;
if (!readVector1D(fs, scene.PVT.miuw)) return false;
if (!readVector1D(fs, scene.PVT.rouw)) return false;
if (!readVector1D(fs, scene.PVT.V)) return false;
if (!readVector1D(fs, scene.PVT.k_kinitial)) return false;
if (!readVector1D(fs, scene.PVT.Cf_Cfinitial)) return false;
if (!readVector1D(fs, scene.PVT.So)) return false;
if (!readVector1D(fs, scene.PVT.Kro)) return false;
if (!readVector1D(fs, scene.PVT.Sg)) return false;
if (!readVector1D(fs, scene.PVT.Krg)) return false;
if (!readVector1D(fs, scene.PVT.Sw)) return false;
if (!readVector1D(fs, scene.PVT.Krw)) return false;
// Base
if (!readDouble(fs, scene.Base.Pi)) return false;
if (!readDouble(fs, scene.Base.Cti)) return false;
if (!readDouble(fs, scene.Base.Cf)) return false;
if (!readDouble(fs, scene.Base.Soi)) return false;
if (!readDouble(fs, scene.Base.Sgi)) return false;
if (!readDouble(fs, scene.Base.Swi)) return false;
if (!readDouble(fs, scene.Base.d)) return false;
if (!readDouble(fs, scene.Base.dt_Min)) return false;
if (!readDouble(fs, scene.Base.dt_Max)) return false;
if (!readDouble(fs, scene.Base.k_ref)) return false;
if (!readDouble(fs, scene.Base.phi_ref)) return false;
if (!readDouble(fs, scene.Base.h_ref)) return false;
return true;
}