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.
nmWATI/Src/nmNum/nmCalculation/nmCalculationSolver.cpp

206 lines
5.9 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "nmCalculationSolver.h"
#include <windows.h>
#include <fstream>
#include <sstream>
#include <QLibrary>
#include <QDebug>
nmCalculationSolver::nmCalculationSolver()
{
}
bool nmCalculationSolver::execSolve(QString vtkFilePath, QString reservoirParamFilePath, QString wellsParamFilePath, QString dllDir, QString outputFile)
{
// 读取点、cell信息
std::vector<Point> points;
std::vector<Cell> cells;
this->readMesh(vtkFilePath.toStdString(), points, cells);
// 读取油藏信息
double *pBaseData;
pBaseData = new double[8];
this->readReservoirParamters(reservoirParamFilePath.toStdString(), pBaseData);
// 读取井的属性信息
int nWellNum;
CWell* wWell = NULL;
this->readWells(wellsParamFilePath.toStdString(), nWellNum, wWell);
QString dllPath = dllDir + "singlePhaseSolverDll.dll";
//LPCWSTR name;
//wchar_t* str2 = new wchar_t[dllPath.size() + 1];
//int len1 = dllPath.toWCharArray(str2);
//str2[len1] = '\0';//不添加这个,会有乱码
//name = str2;
// HMODULE hMod = LoadLibrary(name);
//HMODULE hMod = LoadLibrary(L"E:\01-Projects\16-CNPC\16-nmWTAI-gitea\Bin\Temp\Nm\Solver\singlePhaseSolverDll.dll");
//int err = GetLastError();
// if (NULL == hMod) {
// std::cout << "singlePhaseSolver.dll加载失败\n";
// delete[] pBaseData;
// delete[] wWell;
// return false;
// }
// typedef int(*Solver)(double*, std::vector<Point>, std::vector<Cell>, int, CWell*,
// std::vector<std::vector<Point >> &, std::vector<std::pair<double, std::vector<double >>> &);
// // Get the address of the trinomial function
// Solver solverFun = (Solver)GetProcAddress(hMod, "singlePhaseSolver");
// if (NULL == solverFun) {
// FreeLibrary(hMod);
// std::cout << "singlePhaseSolver文件加载函数地址获取失败\n";
// delete[] pBaseData;
// delete[] wWell;
// return false;
// }
QLibrary library(dllPath);
// 加载动态库:
if (library.load()) {
qDebug() << "Library loaded successfully.";
} else {
qDebug() << "Failed to load library:" << library.errorString();
}
// 获取函数指针并调用函数:
typedef int(*Solver)(double*, std::vector<Point>, std::vector<Cell>, int, CWell*,
std::vector<std::vector<Point >> &, std::vector<std::pair<double, std::vector<double >>> &);
Solver solverFun = (Solver)library.resolve("singlePhaseSolver");
if (solverFun) {
qDebug() << "Success to resolve function";
} else {
qDebug() << "Failed to resolve function:" << library.errorString();
}
std::vector<std::vector<Point >> vecBP;
std::vector<std::pair<double, std::vector<double >>> vecFieldPre;
// 调用求解器求解
solverFun(pBaseData, points, cells, nWellNum, wWell, vecBP, vecFieldPre);
// FreeLibrary(hMod);
delete[] pBaseData;
delete[] wWell;
return true;
}
bool nmCalculationSolver::readMesh(std::string fname, std::vector<Point> &points, std::vector<Cell> &cells)
{
std::ifstream file(fname);
if (!file.is_open()) {
return false;
}
// Skip header
std::string line;
for (int i = 0; i < 4; ++i) {
std::getline(file, line);
}
// Read points
std::getline(file, line);
std::istringstream iss(line);
std::string keyword;
int pointCount;
iss >> keyword >> pointCount;
points.resize(pointCount);
for (int i = 0; i < points.size(); i++) {
Point& point = points[i];
file >> point.x >> point.y >> point.z;
}
// Read cells
std::getline(file, line); // Skip empty line
std::getline(file, line);
std::getline(file, line);
iss = std::istringstream(line);
int cellCount, totalListSize;
iss >> keyword >> cellCount >> totalListSize;
cells.resize(cellCount);
// for (Cell& cell : cells) {
for (int i = 0; i < cells.size(); i++) {
Cell& cell = cells[i];
int cellPointSize;
file >> cellPointSize;
cell.pointIndices.resize(cellPointSize);
// for (int& index : cell.pointIndices) {
std::cout << cellPointSize;
for (int j = 0; j < cell.pointIndices.size(); j++) {
int& index = cell.pointIndices[j];
file >> index;
}
}
// Read cell types
std::getline(file, line); // Skip empty line
std::getline(file, line);
std::getline(file, line);
iss = std::istringstream(line);
iss >> keyword >> cellCount;
// for (Cell& cell : cells) {
for (int i = 0; i < cells.size(); i++) {
Cell& cell = cells[i];
file >> cell.type;
}
// Read point data
std::getline(file, line); // Skip empty line
std::getline(file, line);
std::getline(file, line);
iss = std::istringstream(line);
int dataCount;
iss >> keyword >> dataCount;
std::getline(file, line);
std::getline(file, line);
// for (Point& point : points) {
for (int i = 0; i < points.size(); i++) {
Point& point = points[i];
point.pointData.resize(1);
file >> point.pointData[0];
}
return 1;
}
bool nmCalculationSolver::readReservoirParamters(std::string fname, double* pBaseData)
{
std::ifstream file(fname);
if (!file.is_open()) {
return false;
}
for (int i = 0; i < 8; ++i) {
file >> pBaseData[i];
}
return true;
}
bool nmCalculationSolver::readWells(std::string fname, int& numWell, CWell* well)
{
std::fstream f(fname);
if (!f.is_open()) {
return false;
}
f >> numWell;
well = new CWell[numWell];
for (int i = 0; i < numWell; ++i) {
f >> well[i].dRc >> well[i].dSkin >> well[i].dC >> well[i].nTimeNumQ;
if (well[i].nTimeNumQ > 1) {
well[i].bisMultFlow = true;
}
for (int j = 0; j < well[i].nTimeNumQ; ++j) {
f >> well[i].pdTimeQ[j] >> well[i].pdQ[j];
}
}
return true;
}