#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.001, "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; }