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.
350 lines
12 KiB
C++
350 lines
12 KiB
C++
#include "nmDataReservoir.h"
|
|
#include "ZxSerializer.h"
|
|
|
|
nmDataReservoir::nmDataReservoir() {
|
|
m_initialPressure = nmDataAttribute("Initial Pressure",40.0, "MPa", UNIT_TYPE_PRESSURE, QStringList(), QStringList() << "psia" << "Pa" << "kPa" << "atm" << "bara" << "kg/cm^2" << "m" << "psig" << "bar" << "MPa" << "kPag");
|
|
m_reservoirType = nmDataAttribute("Reservoir type", "Homogeneous", "", UNIT_TYPE_DIMENSIONLESS, QStringList() << "Homogeneous" << "Dual porosity pseudo steady state", QStringList());
|
|
m_Bo = nmDataAttribute("Bo", 1.2, "");
|
|
m_permeability = nmDataAttribute("Permeability", 0.025, "Darcy", UNIT_TYPE_PERMEABILITY, QStringList(), QStringList() << "md" << "Darcy" << "m^2" << "cm^2" << "um^2");
|
|
m_thickness = nmDataAttribute("Thickness", 10.0, "m", UNIT_TYPE_LENGTH, QStringList(), QStringList() << "ft" << "m" << "cm" << "mm" << "in" << "0.1 in" << "mile" << "km");
|
|
m_porosity = nmDataAttribute("Porosity", 0.1, "", UNIT_TYPE_DIMENSIONLESS, QStringList(), QStringList());
|
|
m_Ct = nmDataAttribute("Ct", 0.001, "", UNIT_TYPE_DIMENSIONLESS, QStringList(), QStringList());
|
|
m_kxKy = nmDataAttribute("Kx/Ky", 1.0, "", UNIT_TYPE_DIMENSIONLESS, QStringList(), QStringList());
|
|
m_Cf = nmDataAttribute("Cf", 0.0001, "", UNIT_TYPE_DIMENSIONLESS, QStringList(), QStringList());
|
|
m_Miuo = nmDataAttribute("Miuo", 0.5, "", UNIT_TYPE_DIMENSIONLESS, QStringList(), QStringList());
|
|
|
|
// 初始饱和度
|
|
m_Soi = nmDataAttribute("Soi", 0.8, "", UNIT_TYPE_DIMENSIONLESS, QStringList(), QStringList());
|
|
m_Sgi = nmDataAttribute("Sgi", 0.0, "", UNIT_TYPE_DIMENSIONLESS, QStringList(), QStringList());
|
|
m_Swi= nmDataAttribute("Swi", 0.2, "", UNIT_TYPE_DIMENSIONLESS, QStringList(), QStringList());
|
|
|
|
m_dTempGasRe = 100;
|
|
m_ePhaseType = PHASE_Oil;
|
|
m_transmissibility = nmDataAttribute("Transmissibility", 1000.0, "md.m", UNIT_TYPE_CONDUCTIVITY, QStringList(), QStringList()<< "md.ft" << "md.m" << "m^3");
|
|
}
|
|
|
|
void nmDataReservoir::resetToDefaults()
|
|
{
|
|
m_permeability.setValue(0.025);
|
|
m_transmissibility.setValue(1000.0);
|
|
}
|
|
|
|
// 修改拷贝构造函数实现
|
|
nmDataReservoir::nmDataReservoir(const nmDataReservoir& other) {
|
|
*this = other;
|
|
}
|
|
|
|
// 修改赋值运算符实现
|
|
nmDataReservoir& nmDataReservoir::operator=(const nmDataReservoir& other) {
|
|
if (this != &other) {
|
|
// 调用基类赋值运算符
|
|
//ZxDataObjectDbl::operator=(other);
|
|
|
|
// 复制所有成员变量
|
|
m_initialPressure = other.m_initialPressure;
|
|
m_reservoirType = other.m_reservoirType;
|
|
m_Bo = other.m_Bo;
|
|
m_permeability = other.m_permeability;
|
|
m_thickness = other.m_thickness;
|
|
m_porosity = other.m_porosity;
|
|
m_Ct = other.m_Ct;
|
|
m_kxKy = other.m_kxKy;
|
|
m_Cf = other.m_Cf;
|
|
m_Miuo = other.m_Miuo;
|
|
m_Soi = other.m_Soi;
|
|
m_Sgi = other.m_Sgi;
|
|
m_Swi = other.m_Swi;
|
|
m_dTempGasRe = other.m_dTempGasRe;
|
|
m_transmissibility = other.m_transmissibility;
|
|
m_ePhaseType = other.m_ePhaseType;
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
nmDataReservoir::~nmDataReservoir() {
|
|
}
|
|
|
|
// 序列化 nmDataRegion 为 RapidJSON Value
|
|
rapidjson::Value nmDataReservoir::ToJsonValue(rapidjson::Document::AllocatorType& allocator) const
|
|
{
|
|
// 创建一个 RapidJSON 对象类型的值
|
|
rapidjson::Value reservoirObject(rapidjson::kObjectType);
|
|
|
|
// 序列化 nmDataAttribute 类型的成员
|
|
// 调用 nmDataAttribute 自身的 ToJsonValue 方法进行递归序列化
|
|
reservoirObject.AddMember("InitialPressure", m_initialPressure.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("ReservoirType", m_reservoirType.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Bo", m_Bo.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Permeability", m_permeability.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Thickness", m_thickness.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Porosity", m_porosity.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Ct", m_Ct.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Kx/Ky", m_kxKy.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Cf", m_Cf.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Miuo", m_Miuo.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Soi", m_Soi.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Sgi", m_Sgi.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Swi", m_Swi.ToJsonValue(allocator), allocator);
|
|
reservoirObject.AddMember("Transmissibility", m_transmissibility.ToJsonValue(allocator), allocator);
|
|
|
|
return reservoirObject; // 返回序列化后的 RapidJSON Value
|
|
}
|
|
|
|
// 从 RapidJSON Value 反序列化数据到 nmDataFault
|
|
void nmDataReservoir::FromJsonValue(const rapidjson::Value& jsonValue)
|
|
{
|
|
// 反序列化 nmDataAttribute 类型的成员
|
|
// 调用 nmDataAttribute 自身的 FromJsonValue 方法进行递归反序列化
|
|
if (jsonValue.HasMember("InitialPressure") && jsonValue["InitialPressure"].IsObject()) {
|
|
m_initialPressure.FromJsonValue(jsonValue["InitialPressure"]);
|
|
}
|
|
if (jsonValue.HasMember("ReservoirType") && jsonValue["ReservoirType"].IsObject()) {
|
|
m_reservoirType.FromJsonValue(jsonValue["ReservoirType"]);
|
|
}
|
|
if (jsonValue.HasMember("Bo") && jsonValue["Bo"].IsObject()) {
|
|
m_Bo.FromJsonValue(jsonValue["Bo"]);
|
|
}
|
|
if (jsonValue.HasMember("Permeability") && jsonValue["Permeability"].IsObject()) {
|
|
m_permeability.FromJsonValue(jsonValue["Permeability"]);
|
|
}
|
|
if (jsonValue.HasMember("Thickness") && jsonValue["Thickness"].IsObject()) {
|
|
m_thickness.FromJsonValue(jsonValue["Thickness"]);
|
|
}
|
|
if (jsonValue.HasMember("Porosity") && jsonValue["Porosity"].IsObject()) {
|
|
m_porosity.FromJsonValue(jsonValue["Porosity"]);
|
|
}
|
|
if (jsonValue.HasMember("Ct") && jsonValue["Ct"].IsObject()) {
|
|
m_Ct.FromJsonValue(jsonValue["Ct"]);
|
|
}
|
|
if (jsonValue.HasMember("Kx/Ky") && jsonValue["Kx/Ky"].IsObject()) {
|
|
m_kxKy.FromJsonValue(jsonValue["Kx/Ky"]);
|
|
}
|
|
if (jsonValue.HasMember("Cf") && jsonValue["Cf"].IsObject()) {
|
|
m_Cf.FromJsonValue(jsonValue["Cf"]);
|
|
}
|
|
if (jsonValue.HasMember("Miuo") && jsonValue["Miuo"].IsObject()) {
|
|
m_Miuo.FromJsonValue(jsonValue["Miuo"]);
|
|
}
|
|
if (jsonValue.HasMember("Soi") && jsonValue["Soi"].IsObject()) {
|
|
m_Soi.FromJsonValue(jsonValue["Soi"]);
|
|
}
|
|
if (jsonValue.HasMember("Sgi") && jsonValue["Sgi"].IsObject()) {
|
|
m_Sgi.FromJsonValue(jsonValue["Sgi"]);
|
|
}
|
|
if (jsonValue.HasMember("Swi") && jsonValue["Swi"].IsObject()) {
|
|
m_Swi.FromJsonValue(jsonValue["Swi"]);
|
|
}
|
|
if (jsonValue.HasMember("Transmissibility") && jsonValue["Transmissibility"].IsObject()) {
|
|
m_transmissibility.FromJsonValue(jsonValue["Transmissibility"]);
|
|
}
|
|
}
|
|
|
|
|
|
nmDataReservoir* nmDataReservoir::s_instance = nullptr;
|
|
|
|
nmDataReservoir* nmDataReservoir::getInstance() {
|
|
if (s_instance == nullptr) {
|
|
s_instance = new nmDataReservoir();
|
|
}
|
|
return s_instance;
|
|
}
|
|
|
|
QString nmDataReservoir::getTableName() {
|
|
return "nmDataReservoir";
|
|
}
|
|
|
|
//ZxDataObject* nmDataReservoir::clone() {
|
|
// return new nmDataReservoir(*this);
|
|
//}
|
|
|
|
QString nmDataReservoir::type() const {
|
|
return "nmDataReservoir";
|
|
}
|
|
|
|
bool nmDataReservoir::_parseData(VecVariant vec, int& n) {
|
|
m_initialPressure = nmDataAttribute("Initial Pressure", vec[n++].toString(), "MPa");
|
|
m_reservoirType = nmDataAttribute("Reservoir Type", vec[n++].toString(), "");
|
|
m_Bo = nmDataAttribute("Bo", vec[n++].toString(), "");
|
|
m_Miuo = nmDataAttribute("Miuo", vec[n++].toString(), "mPa.s(cp)");
|
|
m_permeability = nmDataAttribute("Permeability", vec[n++].toString(), "mD");
|
|
m_thickness = nmDataAttribute("Thickness", vec[n++].toString(), "m");
|
|
m_porosity = nmDataAttribute("Porosity", vec[n++].toString(), "");
|
|
m_Ct = nmDataAttribute("Ct", vec[n++].toString(), "");
|
|
m_kxKy = nmDataAttribute("Kx/Ky", vec[n++].toString(), "");
|
|
return true;
|
|
}
|
|
|
|
bool nmDataReservoir::_sumUpData(VecVariant& vec) {
|
|
vec.append(m_initialPressure.getValue());
|
|
vec.append(m_reservoirType.getValue());
|
|
vec.append(m_Bo.getValue());
|
|
vec.append(m_Miuo.getValue());
|
|
vec.append(m_permeability.getValue());
|
|
vec.append(m_thickness.getValue());
|
|
vec.append(m_porosity.getValue());
|
|
vec.append(m_Ct.getValue());
|
|
vec.append(m_kxKy.getValue());
|
|
return true;
|
|
}
|
|
|
|
void nmDataReservoir::onSerialize(ZxSerializer* ser) {
|
|
ser->write("InitialPressure", m_initialPressure.getValue());
|
|
ser->write("ReservoirType", m_reservoirType.getValue());
|
|
ser->write("Bo", m_Bo.getValue());
|
|
ser->write("Miuo", m_Miuo.getValue());
|
|
ser->write("Permeability", m_permeability.getValue());
|
|
ser->write("Thickness", m_thickness.getValue());
|
|
ser->write("Porosity", m_porosity.getValue());
|
|
ser->write("Ct", m_Ct.getValue());
|
|
ser->write("KxKy", m_kxKy.getValue());
|
|
}
|
|
|
|
void nmDataReservoir::onDeserialize(ZxSerializer* ser) {
|
|
QString tempValue;
|
|
|
|
ser->read("InitialPressure", tempValue); m_initialPressure = nmDataAttribute("Initial Pressure", tempValue, "MPa");
|
|
ser->read("ReservoirType", tempValue); m_reservoirType = nmDataAttribute("Reservoir Type", tempValue, "");
|
|
ser->read("Bo", tempValue); m_Bo = nmDataAttribute("Bo", tempValue, "");
|
|
ser->read("Miuo", tempValue); m_Miuo = nmDataAttribute("Miuo", tempValue, "mPa.s(cp)");
|
|
ser->read("Permeability", tempValue); m_permeability = nmDataAttribute("Permeability", tempValue, "mD");
|
|
ser->read("Thickness", tempValue); m_thickness = nmDataAttribute("Thickness", tempValue, "m");
|
|
ser->read("Porosity", tempValue); m_porosity = nmDataAttribute("Porosity", tempValue, "");
|
|
ser->read("NetToGross", tempValue); m_Ct = nmDataAttribute("Ct", tempValue, "");
|
|
ser->read("KxKy", tempValue); m_kxKy = nmDataAttribute("Kx/Ky", tempValue, "");
|
|
}
|
|
|
|
QIcon nmDataReservoir::getIcon(bool expanded) const {
|
|
return zxLoadIcon("Reservoir");
|
|
}
|
|
|
|
// Getters and Setters
|
|
void nmDataReservoir::setInitialPressure(const nmDataAttribute& attr) {
|
|
m_initialPressure = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getInitialPressure() {
|
|
return m_initialPressure;
|
|
}
|
|
|
|
void nmDataReservoir::setReservoirType(const nmDataAttribute& attr) {
|
|
m_reservoirType = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getReservoirType() {
|
|
return m_reservoirType;
|
|
}
|
|
|
|
void nmDataReservoir::setBo(const nmDataAttribute& attr) {
|
|
m_Bo = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getBo() {
|
|
return m_Bo;
|
|
}
|
|
|
|
void nmDataReservoir::setPermeability(const nmDataAttribute& attr) {
|
|
m_permeability = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getPermeability() {
|
|
return m_permeability;
|
|
}
|
|
|
|
void nmDataReservoir::setThickness(const nmDataAttribute& attr) {
|
|
m_thickness = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getThickness() {
|
|
return m_thickness;
|
|
}
|
|
|
|
void nmDataReservoir::setPorosity(const nmDataAttribute& attr) {
|
|
m_porosity = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getPorosity() {
|
|
return m_porosity;
|
|
}
|
|
|
|
void nmDataReservoir::setCt(const nmDataAttribute& attr) {
|
|
m_Ct = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getCt() {
|
|
return m_Ct;
|
|
}
|
|
|
|
void nmDataReservoir::setKxKy(const nmDataAttribute& attr) {
|
|
m_kxKy = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getKxKy() {
|
|
return m_kxKy;
|
|
}
|
|
|
|
void nmDataReservoir::setCf(const nmDataAttribute& attr) {
|
|
m_Cf = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getCf() {
|
|
return m_Cf;
|
|
}
|
|
|
|
void nmDataReservoir::setMiuo(const nmDataAttribute& attr) {
|
|
m_Miuo = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getMiuo() {
|
|
return m_Miuo;
|
|
}
|
|
|
|
// 气藏温度的 getter 和 setter
|
|
void nmDataReservoir::setTempGasRe(double temp) {
|
|
m_dTempGasRe = temp;
|
|
}
|
|
|
|
double nmDataReservoir::getTempGasRe() const {
|
|
return m_dTempGasRe;
|
|
}
|
|
|
|
// 多相流类型的 getter 和 setter
|
|
void nmDataReservoir::setPhaseType(NM_PHASE_TYPE phaseType) {
|
|
m_ePhaseType = phaseType;
|
|
}
|
|
|
|
NM_PHASE_TYPE nmDataReservoir::getPhaseType() const {
|
|
return m_ePhaseType;
|
|
}
|
|
|
|
void nmDataReservoir::setTransmissibility(const nmDataAttribute &attr) {
|
|
m_transmissibility = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getTransmissibility() {
|
|
return m_transmissibility;
|
|
}
|
|
|
|
void nmDataReservoir::setSoi(const nmDataAttribute &attr) {
|
|
m_Soi = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getSoi() {
|
|
return m_Soi;
|
|
}
|
|
|
|
void nmDataReservoir::setSgi(const nmDataAttribute &attr) {
|
|
m_Sgi = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getSgi() {
|
|
return m_Sgi;
|
|
}
|
|
|
|
void nmDataReservoir::setSwi(const nmDataAttribute &attr) {
|
|
m_Swi = attr;
|
|
}
|
|
|
|
nmDataAttribute& nmDataReservoir::getSwi() {
|
|
return m_Swi;
|
|
}
|