From 11833dc5a1acd8d02491d7d420e05288ad37a71a Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Wed, 1 Jul 2026 16:35:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=94=9F=E6=88=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E4=BB=A5=E5=8F=8A=E5=8F=82=E6=95=B0=E6=A0=87?= =?UTF-8?q?=E5=87=86=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ML/Training/Runner/RunnerIO.cpp | 9 ++++++++- ML/Training/Runner/RunnerIO.h | 6 ++++-- ML/Training/Runner/runner_main.cpp | 3 ++- ML/nmWTAI-ML/configs/data_gen.yaml | 7 ++++--- .../configs/data_gen_case_neighborhood.yaml | 7 ++++--- .../configs/data_gen_family_random.yaml | 7 ++++--- .../configs/data_gen_family_random_hard.yaml | 7 ++++--- .../configs/data_gen_family_random_v2_q.yaml | 7 ++++--- .../flatten_autofit_neighborhood_dataset.py | 3 +++ .../generate_autofit_neighborhood_dataset.py | 7 +++++-- ML/nmWTAI-ML/src/data/dataset_generation.py | 10 ++++++++-- ML/nmWTAI-ML/src/data/param_features.py | 4 ++-- ML/nmWTAI-ML/src/data/params.py | 15 ++++++++------- ML/nmWTAI-ML/src/data/preprocess.py | 7 ++++++- .../nmCalculation/nmCalculationAutoFitPSO.cpp | 17 ++++++++++++----- Src/nmNum/nmData/nmDataAutomaticFitting.cpp | 2 +- 16 files changed, 79 insertions(+), 39 deletions(-) diff --git a/ML/Training/Runner/RunnerIO.cpp b/ML/Training/Runner/RunnerIO.cpp index 268b24d..2c9477c 100644 --- a/ML/Training/Runner/RunnerIO.cpp +++ b/ML/Training/Runner/RunnerIO.cpp @@ -59,6 +59,7 @@ namespace RunnerIO << ", C=" << p.wellboreC << ", phi=" << p.phi << ", h=" << p.h + << ", Ct=" << p.Ct << ", Cf=" << p.Cf; if (!p.timeQ.empty() && !p.q.empty() && p.timeQ.size() == p.q.size()) { @@ -86,7 +87,7 @@ namespace RunnerIO std::cerr << "RunnerIO::readParamsBin: header read failed\n"; return false; } - if (magic != MAGIC || ver != 1) + if (magic != MAGIC || (ver != 1 && ver != 2)) { std::cerr << "RunnerIO::readParamsBin: magic/version mismatch\n"; return false; @@ -97,6 +98,12 @@ namespace RunnerIO if (!readDouble(fs, out.wellboreC)) return false; if (!readDouble(fs, out.phi)) return false; if (!readDouble(fs, out.h)) return false; + out.hasCt = false; + out.Ct = 0.0; + if (ver >= 2) { + if (!readDouble(fs, out.Ct)) return false; + out.hasCt = true; + } if (!readDouble(fs, out.Cf)) return false; out.sectionIndex = 0; diff --git a/ML/Training/Runner/RunnerIO.h b/ML/Training/Runner/RunnerIO.h index 8c84bdb..d6cbab2 100644 --- a/ML/Training/Runner/RunnerIO.h +++ b/ML/Training/Runner/RunnerIO.h @@ -5,13 +5,15 @@ struct RunnerParams { - // 6 params + // 7 params double k; double skin; double wellboreC; double phi; double h; + double Ct; double Cf; + bool hasCt; // optional schedule extension uint32_t sectionIndex; // wellFlowSectionIndex @@ -19,7 +21,7 @@ struct RunnerParams std::vector q; // m^3/d RunnerParams() - : k(0), skin(0), wellboreC(0), phi(0), h(0), Cf(0), sectionIndex(0) + : k(0), skin(0), wellboreC(0), phi(0), h(0), Ct(0), Cf(0), hasCt(false), sectionIndex(0) {} }; diff --git a/ML/Training/Runner/runner_main.cpp b/ML/Training/Runner/runner_main.cpp index a8202c1..d3fd401 100644 --- a/ML/Training/Runner/runner_main.cpp +++ b/ML/Training/Runner/runner_main.cpp @@ -122,7 +122,7 @@ static void applySampledParamsAndMaybeOverrideRate(HX_NWTM_MODEL_INPUT& in, cons std::fill(in.CS.S.begin(), in.CS.S.end(), p.skin); std::fill(in.CS.C.begin(), in.CS.C.end(), p.wellboreC); - // 覆盖 k/phi/h/Cf(resize + fill,复用 capacity) + // 覆盖 k/phi/h/Ct/Cf(resize + fill,复用 capacity) const size_t nCells = in.GRID.Trinodexy.size(); in.Base.k.resize(nCells); in.Base.phi.resize(nCells); @@ -130,6 +130,7 @@ static void applySampledParamsAndMaybeOverrideRate(HX_NWTM_MODEL_INPUT& in, cons std::fill(in.Base.k.begin(), in.Base.k.end(), p.k); std::fill(in.Base.phi.begin(), in.Base.phi.end(), p.phi); std::fill(in.Base.h.begin(), in.Base.h.end(), p.h); + if (p.hasCt) in.Base.Cti = p.Ct; in.Base.Cf = p.Cf; // 制度覆盖:params.bin 带 schedule 才覆盖 diff --git a/ML/nmWTAI-ML/configs/data_gen.yaml b/ML/nmWTAI-ML/configs/data_gen.yaml index e51520b..bed2d7c 100644 --- a/ML/nmWTAI-ML/configs/data_gen.yaml +++ b/ML/nmWTAI-ML/configs/data_gen.yaml @@ -39,15 +39,16 @@ generation: # 数据集生成规模与随机性设置 max_fail_examples_per_reason: 50 # 每类失败原因最多保存的示例数量 params: # 储层与井筒物理参数采样设置 - all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Cf"] # 写入数据集的完整物理参数列表 - active_param_names: ["k", "skin", "wellboreC", "phi", "h"] # 参与采样变化的物理参数列表 - log_params: ["k", "wellboreC", "h"] # 采样时采用对数尺度的物理参数 + all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] # 写入数据集的完整物理参数列表 + active_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct"] # 参与采样变化的物理参数列表 + log_params: ["k", "wellboreC", "h", "Ct"] # 采样时采用对数尺度的物理参数 ranges: # 各物理参数采样范围 k: [1.0e-4, 100.0] # 渗透率采样范围 skin: [-10.0, 10.0] # 表皮系数采样范围 wellboreC: [1.0e-4, 2.0] # 井筒储集系数采样范围 phi: [1.0e-2, 0.50] # 孔隙度采样范围 h: [2.0, 100.0] # 储层厚度采样范围 + Ct: [1.0e-4, 1.0] # 综合压缩系数采样范围 Cf: [1.0e-6, 5.0e-3] # 岩石压缩系数采样范围 fixed_params: # 固定不参与采样的物理参数 Cf: diff --git a/ML/nmWTAI-ML/configs/data_gen_case_neighborhood.yaml b/ML/nmWTAI-ML/configs/data_gen_case_neighborhood.yaml index 22363c2..4b5d971 100644 --- a/ML/nmWTAI-ML/configs/data_gen_case_neighborhood.yaml +++ b/ML/nmWTAI-ML/configs/data_gen_case_neighborhood.yaml @@ -39,15 +39,16 @@ generation: # 数据集生成规模与随机性设置 max_fail_examples_per_reason: 50 # 每类失败原因最多保存的示例数量 params: # 储层与井筒物理参数采样设置 - all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Cf"] # 写入数据集的完整物理参数列表 - active_param_names: ["k", "skin", "wellboreC", "phi", "h"] # 参与采样变化的物理参数列表 - log_params: ["k", "wellboreC", "h"] # 采样时采用对数尺度的物理参数 + all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] # 写入数据集的完整物理参数列表 + active_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct"] # 参与采样变化的物理参数列表 + log_params: ["k", "wellboreC", "h", "Ct"] # 采样时采用对数尺度的物理参数 ranges: # 各物理参数采样范围 k: [1.0e-4, 100.0] # 渗透率采样范围 skin: [-10.0, 10.0] # 表皮系数采样范围 wellboreC: [1.0e-4, 2.0] # 井筒储集系数采样范围 phi: [1.0e-2, 0.50] # 孔隙度采样范围 h: [2.0, 100.0] # 储层厚度采样范围 + Ct: [1.0e-4, 1.0] # 综合压缩系数采样范围 Cf: [1.0e-6, 5.0e-3] # 岩石压缩系数采样范围 fixed_params: # 固定不参与采样的物理参数 Cf: diff --git a/ML/nmWTAI-ML/configs/data_gen_family_random.yaml b/ML/nmWTAI-ML/configs/data_gen_family_random.yaml index d4bb75b..b74a171 100644 --- a/ML/nmWTAI-ML/configs/data_gen_family_random.yaml +++ b/ML/nmWTAI-ML/configs/data_gen_family_random.yaml @@ -39,15 +39,16 @@ generation: # 数据集生成规模与随机性设置 max_fail_examples_per_reason: 50 # 每类失败原因最多保存的示例数量 params: # 储层与井筒物理参数采样设置 - all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Cf"] # 写入数据集的完整物理参数列表 - active_param_names: ["k", "skin", "wellboreC", "phi", "h"] # 参与采样变化的物理参数列表 - log_params: ["k", "wellboreC", "h"] # 采样时采用对数尺度的物理参数 + all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] # 写入数据集的完整物理参数列表 + active_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct"] # 参与采样变化的物理参数列表 + log_params: ["k", "wellboreC", "h", "Ct"] # 采样时采用对数尺度的物理参数 ranges: # 各物理参数采样范围 k: [1.0e-4, 100.0] # 渗透率采样范围 skin: [-10.0, 10.0] # 表皮系数采样范围 wellboreC: [1.0e-4, 2.0] # 井筒储集系数采样范围 phi: [1.0e-2, 0.50] # 孔隙度采样范围 h: [2.0, 100.0] # 储层厚度采样范围 + Ct: [1.0e-4, 1.0] # 综合压缩系数采样范围 Cf: [1.0e-6, 5.0e-3] # 岩石压缩系数采样范围 fixed_params: # 固定不参与采样的物理参数 Cf: diff --git a/ML/nmWTAI-ML/configs/data_gen_family_random_hard.yaml b/ML/nmWTAI-ML/configs/data_gen_family_random_hard.yaml index 9fd308c..7636f16 100644 --- a/ML/nmWTAI-ML/configs/data_gen_family_random_hard.yaml +++ b/ML/nmWTAI-ML/configs/data_gen_family_random_hard.yaml @@ -39,15 +39,16 @@ generation: # 数据集生成规模与随机性设置 max_fail_examples_per_reason: 50 # 每类失败原因最多保存的示例数量 params: # 储层与井筒物理参数采样设置 - all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Cf"] # 写入数据集的完整物理参数列表 - active_param_names: ["k", "skin", "wellboreC", "phi", "h"] # 参与采样变化的物理参数列表 - log_params: ["k", "wellboreC", "h"] # 采样时采用对数尺度的物理参数 + all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] # 写入数据集的完整物理参数列表 + active_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct"] # 参与采样变化的物理参数列表 + log_params: ["k", "wellboreC", "h", "Ct"] # 采样时采用对数尺度的物理参数 ranges: # 各物理参数采样范围 k: [1.0e-4, 100.0] # 渗透率采样范围 skin: [-10.0, 10.0] # 表皮系数采样范围 wellboreC: [1.0e-4, 2.0] # 井筒储集系数采样范围 phi: [1.0e-2, 0.50] # 孔隙度采样范围 h: [2.0, 100.0] # 储层厚度采样范围 + Ct: [1.0e-4, 1.0] # 综合压缩系数采样范围 Cf: [1.0e-6, 5.0e-3] # 岩石压缩系数采样范围 fixed_params: # 固定不参与采样的物理参数 Cf: diff --git a/ML/nmWTAI-ML/configs/data_gen_family_random_v2_q.yaml b/ML/nmWTAI-ML/configs/data_gen_family_random_v2_q.yaml index fce4748..1a960e5 100644 --- a/ML/nmWTAI-ML/configs/data_gen_family_random_v2_q.yaml +++ b/ML/nmWTAI-ML/configs/data_gen_family_random_v2_q.yaml @@ -39,15 +39,16 @@ generation: # 数据集生成规模与随机性设置 max_fail_examples_per_reason: 50 # 每类失败原因最多保存的示例数量 params: # 储层与井筒物理参数采样设置 - all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Cf"] # 写入数据集的完整物理参数列表 - active_param_names: ["k", "skin", "wellboreC", "phi", "h"] # 参与采样变化的物理参数列表 - log_params: ["k", "wellboreC", "h"] # 采样时采用对数尺度的物理参数 + all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] # 写入数据集的完整物理参数列表 + active_param_names: ["k", "skin", "wellboreC", "phi", "h", "Ct"] # 参与采样变化的物理参数列表 + log_params: ["k", "wellboreC", "h", "Ct"] # 采样时采用对数尺度的物理参数 ranges: # 各物理参数采样范围 k: [1.0e-3, 10.0] # 渗透率采样范围 skin: [-10.0, 10.0] # 表皮系数采样范围 wellboreC: [1.0e-4, 2.0] # 井筒储集系数采样范围 phi: [1.0e-2, 0.50] # 孔隙度采样范围 h: [2.0, 50.0] # 储层厚度采样范围 + Ct: [1.0e-4, 1.0] # 综合压缩系数采样范围 Cf: [1.0e-6, 5.0e-3] # 岩石压缩系数采样范围 fixed_params: # 固定不参与采样的物理参数 Cf: diff --git a/ML/nmWTAI-ML/scripts/flatten_autofit_neighborhood_dataset.py b/ML/nmWTAI-ML/scripts/flatten_autofit_neighborhood_dataset.py index 40a4cc3..5db05e7 100644 --- a/ML/nmWTAI-ML/scripts/flatten_autofit_neighborhood_dataset.py +++ b/ML/nmWTAI-ML/scripts/flatten_autofit_neighborhood_dataset.py @@ -89,6 +89,7 @@ def main() -> None: else np.full((len(neighbor_anchor_id),), np.nan, dtype=np.float32) ) + param_names = _decode_attr_list(src.attrs.get("param_names")) schedule_meta_names = _decode_attr_list(src.attrs.get("schedule_meta_names")) span_fracs = ( np.asarray( @@ -114,6 +115,8 @@ def main() -> None: output_path.parent.mkdir(parents=True, exist_ok=True) with h5py.File(output_path, "w") as dst: + if param_names is not None: + dst.attrs["param_names"] = np.asarray(param_names, dtype="S") if schedule_meta_names is not None: dst.attrs["schedule_meta_names"] = np.asarray(schedule_meta_names, dtype="S") if span_fracs: diff --git a/ML/nmWTAI-ML/scripts/generate_autofit_neighborhood_dataset.py b/ML/nmWTAI-ML/scripts/generate_autofit_neighborhood_dataset.py index 8b91f9c..c48e901 100644 --- a/ML/nmWTAI-ML/scripts/generate_autofit_neighborhood_dataset.py +++ b/ML/nmWTAI-ML/scripts/generate_autofit_neighborhood_dataset.py @@ -411,7 +411,7 @@ def run_solver_and_extract_curve( def params_to_array(params: Params) -> np.ndarray: """按固定参数顺序把 Params 对象转换成数值数组。""" return np.asarray( - [params.k, params.skin, params.wellboreC, params.phi, params.h, params.Cf], + [params.k, params.skin, params.wellboreC, params.phi, params.h, params.Ct, params.Cf], dtype=np.float32, ) @@ -493,6 +493,7 @@ def sample_neighbor_params( "wellboreC": float(base.wellboreC), "phi": float(base.phi), "h": float(base.h), + "Ct": float(base.Ct), "Cf": float(base.Cf), } @@ -505,6 +506,7 @@ def sample_neighbor_params( "wellboreC": 0.75, "phi": 0.60, "h": 0.75, + "Ct": 0.75, "Cf": 0.40, } cand = dict(base_dict) @@ -550,6 +552,7 @@ def sample_neighbor_params( wellboreC=cand["wellboreC"], phi=cand["phi"], h=cand["h"], + Ct=cand["Ct"], Cf=cand["Cf"], schedule=base.schedule, ) @@ -664,7 +667,7 @@ def create_output_file( """创建邻域 HDF5 文件,并初始化锚点、候选、曲线和元数据数据集。""" output_path.parent.mkdir(parents=True, exist_ok=True) f = h5py.File(output_path, "w") - f.attrs["param_names"] = np.asarray(["k", "skin", "wellboreC", "phi", "h", "Cf"], dtype="S") + f.attrs["param_names"] = np.asarray(["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"], dtype="S") f.attrs["schedule_meta_names"] = np.asarray(SCHEDULE_META_NAMES, dtype="S") f.attrs["span_fracs"] = np.asarray(span_fracs, dtype=np.float32) f.attrs["search_param_names"] = np.asarray(search_names, dtype="S") diff --git a/ML/nmWTAI-ML/src/data/dataset_generation.py b/ML/nmWTAI-ML/src/data/dataset_generation.py index b5d922e..aecd7c6 100644 --- a/ML/nmWTAI-ML/src/data/dataset_generation.py +++ b/ML/nmWTAI-ML/src/data/dataset_generation.py @@ -415,6 +415,7 @@ def _worker_simulate_parallel(args): wellboreC=float(params_dict["wellboreC"]), phi=float(params_dict["phi"]), h=float(params_dict["h"]), + Ct=float(params_dict.get("Ct", 1.0e-3)), Cf=float(params_dict["Cf"]), schedule=None, ) @@ -486,7 +487,7 @@ def _worker_simulate_parallel(args): ) params_vec = np.asarray( - [p.k, p.skin, p.wellboreC, p.phi, p.h, p.Cf], + [float(getattr(p, name)) for name in cfg.raw["params"]["all_physical_param_names"]], dtype=np.float32, ) @@ -537,6 +538,7 @@ class HDF5Appender: self, filepath: Path, param_dim: int, + param_names: list[str], schedule_dim: int, curve_dim: int, compression=None, @@ -547,12 +549,14 @@ class HDF5Appender: self.filepath.parent.mkdir(parents=True, exist_ok=True) self.param_dim = int(param_dim) + self.param_names = list(param_names) self.schedule_dim = int(schedule_dim) self.curve_dim = int(curve_dim) self.time_dim = int(curve_dim) // 2 self.f = h5py.File(self.filepath, "w") self._n = 0 + self.f.attrs["param_names"] = np.asarray(self.param_names, dtype="S") self.f.attrs["schedule_meta_names"] = np.asarray(SCHEDULE_META_NAMES, dtype="S") def ds(name, shape_tail, dtype, fillvalue=None): @@ -714,7 +718,8 @@ class ParallelDatasetGenerator: sched_dim = n_u_points * n_channels + cfg.sec_feat_dim if bool(cfg.raw.get("schedule", {}).get("use_metadata_features_for_model", False)): sched_dim += len(cfg.raw.get("schedule", {}).get("metadata_features_for_model", []) or []) - param_dim = 6 + param_names = list(cfg.raw["params"]["all_physical_param_names"]) + param_dim = len(param_names) # HDF5 布局与正演模型输入输出一致: # params/schedule 是输入,curve 是数值求解器生成的监督目标。 @@ -725,6 +730,7 @@ class ParallelDatasetGenerator: app = HDF5Appender( filepath=filepath, param_dim=param_dim, + param_names=param_names, schedule_dim=sched_dim, curve_dim=curve_dim, compression=compression, diff --git a/ML/nmWTAI-ML/src/data/param_features.py b/ML/nmWTAI-ML/src/data/param_features.py index b448918..8eb8391 100644 --- a/ML/nmWTAI-ML/src/data/param_features.py +++ b/ML/nmWTAI-ML/src/data/param_features.py @@ -20,8 +20,8 @@ import numpy as np # 部分物理参数跨越多个数量级,因此先做特征变换,再交给模型学习。 -DEFAULT_PARAM_NAMES = ["k", "skin", "wellboreC", "phi", "h", "Cf"] -DEFAULT_LOG_PARAM_NAMES = {"k", "wellboreC", "h"} +DEFAULT_PARAM_NAMES = ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] +DEFAULT_LOG_PARAM_NAMES = {"k", "wellboreC", "h", "Ct"} DEFAULT_ASINH_PARAM_NAMES = {"skin"} DEFAULT_COMPOSITE_FEATURES = [ "log10_kh", diff --git a/ML/nmWTAI-ML/src/data/params.py b/ML/nmWTAI-ML/src/data/params.py index 8507c9d..ca24162 100644 --- a/ML/nmWTAI-ML/src/data/params.py +++ b/ML/nmWTAI-ML/src/data/params.py @@ -73,7 +73,8 @@ class Params: wellboreC: float phi: float h: float - Cf: float + Ct: float = 1.0e-3 + Cf: float = 4.315e-4 schedule: Optional[Schedule] = None def to_dict(self) -> Dict[str, float]: @@ -83,8 +84,8 @@ class Params: def to_bin_bytes(self, cfg: Config, include_schedule: Optional[bool] = None) -> bytes: """按 C++ 求解器约定把参数和可选流量制度编码为 params.bin 内容。 - 二进制头部固定为 PRM1 magic + version,随后写入 6 个 double 物理参数: - k、skin、wellboreC、phi、h、Cf。若 include_schedule=True,则继续写入 + 二进制头部固定为 PRM1 magic + version,随后写入 7 个 double 物理参数: + k、skin、wellboreC、phi、h、Ct、Cf。若 include_schedule=True,则继续写入 sectionIndex、分段数量 nQ、timeQ 数组和 q 数组。 这里的字段顺序、字节序和数据类型必须与 C++ runner 完全一致,否则求解器会 @@ -94,12 +95,12 @@ class Params: include_schedule = bool(cfg.get("schedule", "write_schedule_to_params_bin", default=False)) magic = ord("P") | (ord("R") << 8) | (ord("M") << 16) | (ord("1") << 24) - version = 1 + version = 2 b = struct.pack( - "_gen.csv。 // 字段顺序必须与 ML 脚本 score_pso_candidates*.py 保持一致: - // particle_id,k,skin,wellboreC,phi,h,Cf + // particle_id,k,skin,wellboreC,phi,h,Ct,Cf // // 这里写的是“完整参数体系”中的关键字段,不是粒子内部紧凑向量。 // 例如用户没有勾选 Cf 时,Cf 会从当前 DataManager 取值写入 CSV。 @@ -1285,7 +1291,7 @@ bool nmCalculationAutoFitPSO::writeSurrogateCandidateCsv(const QString& candidat QTextStream out(&file); // 代理模型只需要这些输入字段;其它参数当前不在训练输入集中。 - out << "particle_id,k,skin,wellboreC,phi,h,Cf\n"; + out << "particle_id,k,skin,wellboreC,phi,h,Ct,Cf\n"; for(int i = 0; i < m_swarm.size(); ++i) { QVector params = buildTraceParameterVector(m_swarm[i].position); @@ -1296,6 +1302,7 @@ bool nmCalculationAutoFitPSO::writeSurrogateCandidateCsv(const QString& candidat << traceParamAt(params, 2) << traceParamAt(params, 3) << traceParamAt(params, 5) + << traceParamAt(params, 6) << traceParamAt(params, 7); out << cols.join(",") << "\n"; } @@ -1893,10 +1900,10 @@ bool nmCalculationAutoFitPSO::isSurrogateRunContextSupported(QString* reason) co return false; } - // 参数 gate:代理输入目前只覆盖 k/skin/wellboreC/phi/h。 + // 参数 gate:代理输入目前只覆盖 k/skin/wellboreC/phi/h/Ct。 // 用户勾选其它参数时,代理无法可靠反映这些参数变化,直接禁用代理筛选。 QVector allowedParamIndices; - allowedParamIndices << 0 << 1 << 2 << 3 << 5; + allowedParamIndices << 0 << 1 << 2 << 3 << 5 << 6; for(int i = 0; i < m_enabledParamIndices.size(); ++i) { if(!allowedParamIndices.contains(m_enabledParamIndices[i])) { diff --git a/Src/nmNum/nmData/nmDataAutomaticFitting.cpp b/Src/nmNum/nmData/nmDataAutomaticFitting.cpp index e04c76b..11cbb05 100644 --- a/Src/nmNum/nmData/nmDataAutomaticFitting.cpp +++ b/Src/nmNum/nmData/nmDataAutomaticFitting.cpp @@ -9,7 +9,7 @@ nmDataAutomaticFitting::nmDataAutomaticFitting() m_porositySelected = true; // 默认选中 m_initialPressureSelected = false; // 默认不选中 m_thicknessSelected = true; // 默认选中 - m_ctSelected = false; // 默认不选中 + m_ctSelected = true; // 默认选中 m_cfSelected = false; // 默认不选中 m_swiSelected = false; // 默认不选中