feat(nmNum): 集成PEBI CPU加速求解器配置

- 新增求解器库、OpenMP线程数和ILU复用步数设置
- 支持求解器配置的工程保存与恢复
- 计算前将加速参数传递给PEBI求解器DLL
- 记录PEBI网格数量并在计算完成后显示求解耗时
- 更新CPU加速运行库和中文翻译资源
feature/PebiSolver-Integration-20260818
lh 3 weeks ago
parent 7bbc44b7d5
commit d0ab4cd518

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1 @@
7d534fb716ed6121f939

@ -0,0 +1,22 @@
So,Krw,Kro
0,1,0
0.05,1,0
0.1,1,0
0.15,0.864105595,0.020840082
0.2,0.744179203,0.044454989
0.25,0.638344534,0.071214184
0.3,0.544945766,0.101536324
0.35,0.462521643,0.135895811
0.4,0.389782609,0.17483021
0.45,0.325590638,0.218948664
0.5,0.268941421,0.268941421
0.55,0.218948664,0.325590638
0.6,0.17483021,0.389782609
0.65,0.135895811,0.462521643
0.7,0.101536324,0.544945766
0.75,0.071214184,0.638344534
0.8,0.044454989,0.744179203
0.85,0.020840082,0.864105595
0.9,0,1
0.95,0,1
1,0,1
1 So Krw Kro
2 0 1 0
3 0.05 1 0
4 0.1 1 0
5 0.15 0.864105595 0.020840082
6 0.2 0.744179203 0.044454989
7 0.25 0.638344534 0.071214184
8 0.3 0.544945766 0.101536324
9 0.35 0.462521643 0.135895811
10 0.4 0.389782609 0.17483021
11 0.45 0.325590638 0.218948664
12 0.5 0.268941421 0.268941421
13 0.55 0.218948664 0.325590638
14 0.6 0.17483021 0.389782609
15 0.65 0.135895811 0.462521643
16 0.7 0.101536324 0.544945766
17 0.75 0.071214184 0.638344534
18 0.8 0.044454989 0.744179203
19 0.85 0.020840082 0.864105595
20 0.9 0 1
21 0.95 0 1
22 1 0 1

@ -0,0 +1,202 @@
p,Bw,miuw,,Bo,miuo
0.101325,1.04263,0.294823,0,1.17376,0.653595
0.446063,1.04246,0.294823,0,1.13543,0.653595
0.790801,1.04228,0.294823,0,1.12095,0.653595
1.13554,1.04211,0.294823,0,1.1119,0.653595
1.48028,1.04194,0.294823,0,1.10532,0.653595
1.82501,1.04177,0.294823,0,1.10015,0.653595
2.16975,1.0416,0.294823,0,1.09589,0.653595
2.51449,1.04143,0.294823,0,1.09228,0.653595
2.85923,1.04126,0.294823,0,1.08914,0.653595
3.20397,1.04109,0.294823,0,1.08636,0.653595
3.5487,1.04092,0.294823,0,1.08388,0.653595
3.89344,1.04075,0.294823,0,1.08163,0.653595
4.23818,1.04058,0.294823,0,1.07958,0.653595
4.58292,1.04041,0.294823,0,1.07769,0.653595
4.92765,1.04024,0.294823,0,1.07594,0.653595
5.27239,1.04008,0.294823,0,1.07431,0.653595
5.61713,1.03991,0.294823,0,1.07278,0.653595
5.96187,1.03974,0.294823,0,1.07135,0.653595
6.30661,1.03957,0.294823,0,1.07001,0.653595
6.65134,1.0394,0.294823,0,1.06873,0.653595
6.99608,1.03924,0.294823,0,1.06752,0.653595
7.34082,1.03907,0.294823,0,1.06637,0.653595
7.68556,1.0389,0.294823,0,1.06528,0.653595
8.0303,1.03873,0.294823,0,1.06423,0.653595
8.37503,1.03857,0.294823,0,1.06323,0.653595
8.71977,1.0384,0.294823,0,1.06227,0.653595
9.06451,1.03823,0.294823,0,1.06134,0.653595
9.40925,1.03807,0.294823,0,1.06046,0.653595
9.75398,1.0379,0.294823,0,1.0596,0.653595
10.0987,1.03774,0.294823,0,1.05878,0.653595
10.4435,1.03757,0.294823,0,1.05798,0.653595
10.7882,1.0374,0.294823,0,1.05721,0.653595
11.1329,1.03724,0.294823,0,1.05647,0.653595
11.4777,1.03707,0.294823,0,1.05575,0.653595
11.8224,1.03691,0.294823,0,1.05505,0.653595
12.1671,1.03674,0.294823,0,1.05437,0.653595
12.5119,1.03658,0.294823,0,1.05371,0.653595
12.8566,1.03642,0.294823,0,1.05307,0.653595
13.2014,1.03625,0.294823,0,1.05244,0.653595
13.5461,1.03609,0.294823,0,1.05183,0.653595
13.8908,1.03592,0.294823,0,1.05124,0.653595
14.2356,1.03576,0.294823,0,1.05067,0.653595
14.5803,1.0356,0.294823,0,1.0501,0.653595
14.9251,1.03543,0.294823,0,1.04955,0.653595
15.2698,1.03527,0.294823,0,1.04902,0.653595
15.6145,1.03511,0.294823,0,1.04849,0.653595
15.9593,1.03495,0.294823,0,1.04798,0.653595
16.304,1.03478,0.294823,0,1.04748,0.653595
16.6487,1.03462,0.294823,0,1.04699,0.653595
16.9935,1.03446,0.294823,0,1.04651,0.653595
17.3382,1.0343,0.294823,0,1.04603,0.653595
17.683,1.03414,0.294823,0,1.04557,0.653595
18.0277,1.03397,0.294823,0,1.04512,0.653595
18.3724,1.03381,0.294823,0,1.04468,0.653595
18.7172,1.03365,0.294823,0,1.04424,0.653595
19.0619,1.03349,0.294823,0,1.04382,0.653595
19.4066,1.03333,0.294823,0,1.0434,0.653595
19.7514,1.03317,0.294823,0,1.04299,0.653595
20.0961,1.03301,0.294823,0,1.04258,0.653595
20.4409,1.03285,0.294823,0,1.04218,0.653595
20.7856,1.03269,0.294823,0,1.04179,0.653595
21.1303,1.03253,0.294823,0,1.04141,0.653595
21.4751,1.03237,0.294823,0,1.04103,0.653595
21.8198,1.03221,0.294823,0,1.04066,0.653595
22.1645,1.03205,0.294823,0,1.0403,0.653595
22.5093,1.03189,0.294823,0,1.03994,0.653595
22.854,1.03173,0.294823,0,1.03958,0.653595
23.1988,1.03158,0.294823,0,1.03923,0.653595
23.5435,1.03142,0.294823,0,1.03889,0.653595
23.8882,1.03126,0.294823,0,1.03855,0.653595
24.233,1.0311,0.294823,0,1.03822,0.653595
24.5777,1.03094,0.294823,0,1.03789,0.653595
24.9225,1.03079,0.294823,0,1.03757,0.653595
25.2672,1.03063,0.294823,0,1.03725,0.653595
25.6119,1.03047,0.294823,0,1.03693,0.653595
25.9567,1.03031,0.294823,0,1.03662,0.653595
26.3014,1.03016,0.294823,0,1.03631,0.653595
26.6461,1.03,0.294823,0,1.03601,0.653595
26.9909,1.02984,0.294823,0,1.03571,0.653595
27.3356,1.02969,0.294823,0,1.03542,0.653595
27.6804,1.02953,0.294823,0,1.03513,0.653595
28.0251,1.02937,0.294823,0,1.03484,0.653595
28.3698,1.02922,0.294823,0,1.03456,0.653595
28.7146,1.02906,0.294823,0,1.03428,0.653595
29.0593,1.02891,0.294823,0,1.034,0.653595
29.404,1.02875,0.294823,0,1.03373,0.653595
29.7488,1.0286,0.294823,0,1.03346,0.653595
30.0935,1.02844,0.294823,0,1.03319,0.653595
30.4383,1.02829,0.294823,0,1.03293,0.653595
30.783,1.02813,0.294823,0,1.03267,0.653595
31.1277,1.02798,0.294823,0,1.03241,0.653595
31.4725,1.02782,0.294823,0,1.03216,0.653595
31.8172,1.02767,0.294823,0,1.0319,0.653595
32.1619,1.02751,0.294823,0,1.03166,0.653595
32.5067,1.02736,0.294823,0,1.03141,0.653595
32.8514,1.02721,0.294823,0,1.03116,0.653595
33.1962,1.02705,0.294823,0,1.03092,0.653595
33.5409,1.0269,0.294823,0,1.03069,0.653595
33.8856,1.02675,0.294823,0,1.03045,0.653595
34.2304,1.02659,0.294823,0,1.03022,0.653595
34.5751,1.02644,0.294823,0,1.02998,0.653595
34.9198,1.02629,0.294823,0,1.02976,0.653595
35.2646,1.02614,0.294823,0,1.02953,0.653595
35.6093,1.02598,0.294823,0,1.0293,0.653595
35.9541,1.02583,0.294823,0,1.02908,0.653595
36.2988,1.02568,0.294823,0,1.02886,0.653595
36.6435,1.02553,0.294823,0,1.02864,0.653595
36.9883,1.02538,0.294823,0,1.02843,0.653595
37.333,1.02522,0.294823,0,1.02821,0.653595
37.6778,1.02507,0.294823,0,1.028,0.653595
38.0225,1.02492,0.294823,0,1.02779,0.653595
38.3672,1.02477,0.294823,0,1.02759,0.653595
38.712,1.02462,0.294823,0,1.02738,0.653595
39.0567,1.02447,0.294823,0,1.02718,0.653595
39.4014,1.02432,0.294823,0,1.02697,0.653595
39.7462,1.02417,0.294823,0,1.02677,0.653595
40.0909,1.02402,0.294823,0,1.02657,0.653595
40.4357,1.02387,0.294823,0,1.02638,0.653595
40.7804,1.02372,0.294823,0,1.02618,0.653595
41.1251,1.02357,0.294823,0,1.02599,0.653595
41.4699,1.02342,0.294823,0,1.0258,0.653595
41.8146,1.02327,0.294823,0,1.02561,0.653595
42.1593,1.02312,0.294823,0,1.02542,0.653595
42.5041,1.02297,0.294823,0,1.02523,0.653595
42.8488,1.02282,0.294823,0,1.02505,0.653595
43.1936,1.02267,0.294823,0,1.02486,0.653595
43.5383,1.02253,0.294823,0,1.02468,0.653595
43.883,1.02238,0.294823,0,1.0245,0.653595
44.2278,1.02223,0.294823,0,1.02432,0.653595
44.5725,1.02208,0.294823,0,1.02414,0.653595
44.9172,1.02193,0.294823,0,1.02396,0.653595
45.262,1.02179,0.294823,0,1.02379,0.653595
45.6067,1.02164,0.294823,0,1.02361,0.653595
45.9515,1.02149,0.294823,0,1.02344,0.653595
46.2962,1.02134,0.294823,0,1.02327,0.653595
46.6409,1.0212,0.294823,0,1.0231,0.653595
46.9857,1.02105,0.294823,0,1.02293,0.653595
47.3304,1.0209,0.294823,0,1.02276,0.653595
47.6751,1.02076,0.294823,0,1.0226,0.653595
48.0199,1.02061,0.294823,0,1.02243,0.653595
48.3646,1.02046,0.294823,0,1.02227,0.653595
48.7094,1.02032,0.294823,0,1.02211,0.653595
49.0541,1.02017,0.294823,0,1.02194,0.653595
49.3988,1.02003,0.294823,0,1.02178,0.653595
49.7436,1.01988,0.294823,0,1.02162,0.653595
50.0883,1.01974,0.294823,0,1.02147,0.653595
50.4331,1.01959,0.294823,0,1.02131,0.653595
50.7778,1.01944,0.294823,0,1.02115,0.653595
51.1225,1.0193,0.294823,0,1.021,0.653595
51.4673,1.01915,0.294823,0,1.02085,0.653595
51.812,1.01901,0.294823,0,1.02069,0.653595
52.1567,1.01887,0.294823,0,1.02054,0.653595
52.5015,1.01872,0.294823,0,1.02039,0.653595
52.8462,1.01858,0.294823,0,1.02024,0.653595
53.191,1.01843,0.294823,0,1.02009,0.653595
53.5357,1.01829,0.294823,0,1.01994,0.653595
53.8804,1.01814,0.294823,0,1.0198,0.653595
54.2252,1.018,0.294823,0,1.01965,0.653595
54.5699,1.01786,0.294823,0,1.01951,0.653595
54.9146,1.01771,0.294823,0,1.01936,0.653595
55.2594,1.01757,0.294823,0,1.01922,0.653595
55.6041,1.01743,0.294823,0,1.01908,0.653595
55.9489,1.01729,0.294823,0,1.01894,0.653595
56.2936,1.01714,0.294823,0,1.0188,0.653595
56.6383,1.017,0.294823,0,1.01866,0.653595
56.9831,1.01686,0.294823,0,1.01852,0.653595
57.3278,1.01672,0.294823,0,1.01838,0.653595
57.6725,1.01657,0.294823,0,1.01825,0.653595
58.0173,1.01643,0.294823,0,1.01811,0.653595
58.362,1.01629,0.294823,0,1.01797,0.653595
58.7068,1.01615,0.294823,0,1.01784,0.653595
59.0515,1.01601,0.294823,0,1.01771,0.653595
59.3962,1.01586,0.294823,0,1.01757,0.653595
59.741,1.01572,0.294823,0,1.01744,0.653595
60.0857,1.01558,0.294823,0,1.01731,0.653595
60.4304,1.01544,0.294823,0,1.01718,0.653595
60.7752,1.0153,0.294823,0,1.01705,0.653595
61.1199,1.01516,0.294823,0,1.01692,0.653595
61.4647,1.01502,0.294823,0,1.01679,0.653595
61.8094,1.01488,0.294823,0,1.01667,0.653595
62.1541,1.01474,0.294823,0,1.01654,0.653595
62.4989,1.0146,0.294823,0,1.01641,0.653595
62.8436,1.01446,0.294823,0,1.01629,0.653595
63.1884,1.01432,0.294823,0,1.01616,0.653595
63.5331,1.01418,0.294823,0,1.01604,0.653595
63.8778,1.01404,0.294823,0,1.01592,0.653595
64.2226,1.0139,0.294823,0,1.01579,0.653595
64.5673,1.01376,0.294823,0,1.01567,0.653595
64.912,1.01362,0.294823,0,1.01555,0.653595
65.2568,1.01348,0.294823,0,1.01543,0.653595
65.6015,1.01334,0.294823,0,1.01531,0.653595
65.9463,1.01321,0.294823,0,1.01519,0.653595
66.291,1.01307,0.294823,0,1.01507,0.653595
66.6357,1.01293,0.294823,0,1.01496,0.653595
66.9805,1.01279,0.294823,0,1.01484,0.653595
67.3252,1.01265,0.294823,0,1.01472,0.653595
67.6699,1.01251,0.294823,0,1.01461,0.653595
68.0147,1.01238,0.294823,0,1.01449,0.653595
68.3594,1.01224,0.294823,0,1.01437,0.653595
68.7042,1.0121,0.294823,0,1.01426,0.653595
69.0489,1.01196,0.294823,0,1.01415,0.653595
1 p Bw miuw Bo miuo
2 0.101325 1.04263 0.294823 0 1.17376 0.653595
3 0.446063 1.04246 0.294823 0 1.13543 0.653595
4 0.790801 1.04228 0.294823 0 1.12095 0.653595
5 1.13554 1.04211 0.294823 0 1.1119 0.653595
6 1.48028 1.04194 0.294823 0 1.10532 0.653595
7 1.82501 1.04177 0.294823 0 1.10015 0.653595
8 2.16975 1.0416 0.294823 0 1.09589 0.653595
9 2.51449 1.04143 0.294823 0 1.09228 0.653595
10 2.85923 1.04126 0.294823 0 1.08914 0.653595
11 3.20397 1.04109 0.294823 0 1.08636 0.653595
12 3.5487 1.04092 0.294823 0 1.08388 0.653595
13 3.89344 1.04075 0.294823 0 1.08163 0.653595
14 4.23818 1.04058 0.294823 0 1.07958 0.653595
15 4.58292 1.04041 0.294823 0 1.07769 0.653595
16 4.92765 1.04024 0.294823 0 1.07594 0.653595
17 5.27239 1.04008 0.294823 0 1.07431 0.653595
18 5.61713 1.03991 0.294823 0 1.07278 0.653595
19 5.96187 1.03974 0.294823 0 1.07135 0.653595
20 6.30661 1.03957 0.294823 0 1.07001 0.653595
21 6.65134 1.0394 0.294823 0 1.06873 0.653595
22 6.99608 1.03924 0.294823 0 1.06752 0.653595
23 7.34082 1.03907 0.294823 0 1.06637 0.653595
24 7.68556 1.0389 0.294823 0 1.06528 0.653595
25 8.0303 1.03873 0.294823 0 1.06423 0.653595
26 8.37503 1.03857 0.294823 0 1.06323 0.653595
27 8.71977 1.0384 0.294823 0 1.06227 0.653595
28 9.06451 1.03823 0.294823 0 1.06134 0.653595
29 9.40925 1.03807 0.294823 0 1.06046 0.653595
30 9.75398 1.0379 0.294823 0 1.0596 0.653595
31 10.0987 1.03774 0.294823 0 1.05878 0.653595
32 10.4435 1.03757 0.294823 0 1.05798 0.653595
33 10.7882 1.0374 0.294823 0 1.05721 0.653595
34 11.1329 1.03724 0.294823 0 1.05647 0.653595
35 11.4777 1.03707 0.294823 0 1.05575 0.653595
36 11.8224 1.03691 0.294823 0 1.05505 0.653595
37 12.1671 1.03674 0.294823 0 1.05437 0.653595
38 12.5119 1.03658 0.294823 0 1.05371 0.653595
39 12.8566 1.03642 0.294823 0 1.05307 0.653595
40 13.2014 1.03625 0.294823 0 1.05244 0.653595
41 13.5461 1.03609 0.294823 0 1.05183 0.653595
42 13.8908 1.03592 0.294823 0 1.05124 0.653595
43 14.2356 1.03576 0.294823 0 1.05067 0.653595
44 14.5803 1.0356 0.294823 0 1.0501 0.653595
45 14.9251 1.03543 0.294823 0 1.04955 0.653595
46 15.2698 1.03527 0.294823 0 1.04902 0.653595
47 15.6145 1.03511 0.294823 0 1.04849 0.653595
48 15.9593 1.03495 0.294823 0 1.04798 0.653595
49 16.304 1.03478 0.294823 0 1.04748 0.653595
50 16.6487 1.03462 0.294823 0 1.04699 0.653595
51 16.9935 1.03446 0.294823 0 1.04651 0.653595
52 17.3382 1.0343 0.294823 0 1.04603 0.653595
53 17.683 1.03414 0.294823 0 1.04557 0.653595
54 18.0277 1.03397 0.294823 0 1.04512 0.653595
55 18.3724 1.03381 0.294823 0 1.04468 0.653595
56 18.7172 1.03365 0.294823 0 1.04424 0.653595
57 19.0619 1.03349 0.294823 0 1.04382 0.653595
58 19.4066 1.03333 0.294823 0 1.0434 0.653595
59 19.7514 1.03317 0.294823 0 1.04299 0.653595
60 20.0961 1.03301 0.294823 0 1.04258 0.653595
61 20.4409 1.03285 0.294823 0 1.04218 0.653595
62 20.7856 1.03269 0.294823 0 1.04179 0.653595
63 21.1303 1.03253 0.294823 0 1.04141 0.653595
64 21.4751 1.03237 0.294823 0 1.04103 0.653595
65 21.8198 1.03221 0.294823 0 1.04066 0.653595
66 22.1645 1.03205 0.294823 0 1.0403 0.653595
67 22.5093 1.03189 0.294823 0 1.03994 0.653595
68 22.854 1.03173 0.294823 0 1.03958 0.653595
69 23.1988 1.03158 0.294823 0 1.03923 0.653595
70 23.5435 1.03142 0.294823 0 1.03889 0.653595
71 23.8882 1.03126 0.294823 0 1.03855 0.653595
72 24.233 1.0311 0.294823 0 1.03822 0.653595
73 24.5777 1.03094 0.294823 0 1.03789 0.653595
74 24.9225 1.03079 0.294823 0 1.03757 0.653595
75 25.2672 1.03063 0.294823 0 1.03725 0.653595
76 25.6119 1.03047 0.294823 0 1.03693 0.653595
77 25.9567 1.03031 0.294823 0 1.03662 0.653595
78 26.3014 1.03016 0.294823 0 1.03631 0.653595
79 26.6461 1.03 0.294823 0 1.03601 0.653595
80 26.9909 1.02984 0.294823 0 1.03571 0.653595
81 27.3356 1.02969 0.294823 0 1.03542 0.653595
82 27.6804 1.02953 0.294823 0 1.03513 0.653595
83 28.0251 1.02937 0.294823 0 1.03484 0.653595
84 28.3698 1.02922 0.294823 0 1.03456 0.653595
85 28.7146 1.02906 0.294823 0 1.03428 0.653595
86 29.0593 1.02891 0.294823 0 1.034 0.653595
87 29.404 1.02875 0.294823 0 1.03373 0.653595
88 29.7488 1.0286 0.294823 0 1.03346 0.653595
89 30.0935 1.02844 0.294823 0 1.03319 0.653595
90 30.4383 1.02829 0.294823 0 1.03293 0.653595
91 30.783 1.02813 0.294823 0 1.03267 0.653595
92 31.1277 1.02798 0.294823 0 1.03241 0.653595
93 31.4725 1.02782 0.294823 0 1.03216 0.653595
94 31.8172 1.02767 0.294823 0 1.0319 0.653595
95 32.1619 1.02751 0.294823 0 1.03166 0.653595
96 32.5067 1.02736 0.294823 0 1.03141 0.653595
97 32.8514 1.02721 0.294823 0 1.03116 0.653595
98 33.1962 1.02705 0.294823 0 1.03092 0.653595
99 33.5409 1.0269 0.294823 0 1.03069 0.653595
100 33.8856 1.02675 0.294823 0 1.03045 0.653595
101 34.2304 1.02659 0.294823 0 1.03022 0.653595
102 34.5751 1.02644 0.294823 0 1.02998 0.653595
103 34.9198 1.02629 0.294823 0 1.02976 0.653595
104 35.2646 1.02614 0.294823 0 1.02953 0.653595
105 35.6093 1.02598 0.294823 0 1.0293 0.653595
106 35.9541 1.02583 0.294823 0 1.02908 0.653595
107 36.2988 1.02568 0.294823 0 1.02886 0.653595
108 36.6435 1.02553 0.294823 0 1.02864 0.653595
109 36.9883 1.02538 0.294823 0 1.02843 0.653595
110 37.333 1.02522 0.294823 0 1.02821 0.653595
111 37.6778 1.02507 0.294823 0 1.028 0.653595
112 38.0225 1.02492 0.294823 0 1.02779 0.653595
113 38.3672 1.02477 0.294823 0 1.02759 0.653595
114 38.712 1.02462 0.294823 0 1.02738 0.653595
115 39.0567 1.02447 0.294823 0 1.02718 0.653595
116 39.4014 1.02432 0.294823 0 1.02697 0.653595
117 39.7462 1.02417 0.294823 0 1.02677 0.653595
118 40.0909 1.02402 0.294823 0 1.02657 0.653595
119 40.4357 1.02387 0.294823 0 1.02638 0.653595
120 40.7804 1.02372 0.294823 0 1.02618 0.653595
121 41.1251 1.02357 0.294823 0 1.02599 0.653595
122 41.4699 1.02342 0.294823 0 1.0258 0.653595
123 41.8146 1.02327 0.294823 0 1.02561 0.653595
124 42.1593 1.02312 0.294823 0 1.02542 0.653595
125 42.5041 1.02297 0.294823 0 1.02523 0.653595
126 42.8488 1.02282 0.294823 0 1.02505 0.653595
127 43.1936 1.02267 0.294823 0 1.02486 0.653595
128 43.5383 1.02253 0.294823 0 1.02468 0.653595
129 43.883 1.02238 0.294823 0 1.0245 0.653595
130 44.2278 1.02223 0.294823 0 1.02432 0.653595
131 44.5725 1.02208 0.294823 0 1.02414 0.653595
132 44.9172 1.02193 0.294823 0 1.02396 0.653595
133 45.262 1.02179 0.294823 0 1.02379 0.653595
134 45.6067 1.02164 0.294823 0 1.02361 0.653595
135 45.9515 1.02149 0.294823 0 1.02344 0.653595
136 46.2962 1.02134 0.294823 0 1.02327 0.653595
137 46.6409 1.0212 0.294823 0 1.0231 0.653595
138 46.9857 1.02105 0.294823 0 1.02293 0.653595
139 47.3304 1.0209 0.294823 0 1.02276 0.653595
140 47.6751 1.02076 0.294823 0 1.0226 0.653595
141 48.0199 1.02061 0.294823 0 1.02243 0.653595
142 48.3646 1.02046 0.294823 0 1.02227 0.653595
143 48.7094 1.02032 0.294823 0 1.02211 0.653595
144 49.0541 1.02017 0.294823 0 1.02194 0.653595
145 49.3988 1.02003 0.294823 0 1.02178 0.653595
146 49.7436 1.01988 0.294823 0 1.02162 0.653595
147 50.0883 1.01974 0.294823 0 1.02147 0.653595
148 50.4331 1.01959 0.294823 0 1.02131 0.653595
149 50.7778 1.01944 0.294823 0 1.02115 0.653595
150 51.1225 1.0193 0.294823 0 1.021 0.653595
151 51.4673 1.01915 0.294823 0 1.02085 0.653595
152 51.812 1.01901 0.294823 0 1.02069 0.653595
153 52.1567 1.01887 0.294823 0 1.02054 0.653595
154 52.5015 1.01872 0.294823 0 1.02039 0.653595
155 52.8462 1.01858 0.294823 0 1.02024 0.653595
156 53.191 1.01843 0.294823 0 1.02009 0.653595
157 53.5357 1.01829 0.294823 0 1.01994 0.653595
158 53.8804 1.01814 0.294823 0 1.0198 0.653595
159 54.2252 1.018 0.294823 0 1.01965 0.653595
160 54.5699 1.01786 0.294823 0 1.01951 0.653595
161 54.9146 1.01771 0.294823 0 1.01936 0.653595
162 55.2594 1.01757 0.294823 0 1.01922 0.653595
163 55.6041 1.01743 0.294823 0 1.01908 0.653595
164 55.9489 1.01729 0.294823 0 1.01894 0.653595
165 56.2936 1.01714 0.294823 0 1.0188 0.653595
166 56.6383 1.017 0.294823 0 1.01866 0.653595
167 56.9831 1.01686 0.294823 0 1.01852 0.653595
168 57.3278 1.01672 0.294823 0 1.01838 0.653595
169 57.6725 1.01657 0.294823 0 1.01825 0.653595
170 58.0173 1.01643 0.294823 0 1.01811 0.653595
171 58.362 1.01629 0.294823 0 1.01797 0.653595
172 58.7068 1.01615 0.294823 0 1.01784 0.653595
173 59.0515 1.01601 0.294823 0 1.01771 0.653595
174 59.3962 1.01586 0.294823 0 1.01757 0.653595
175 59.741 1.01572 0.294823 0 1.01744 0.653595
176 60.0857 1.01558 0.294823 0 1.01731 0.653595
177 60.4304 1.01544 0.294823 0 1.01718 0.653595
178 60.7752 1.0153 0.294823 0 1.01705 0.653595
179 61.1199 1.01516 0.294823 0 1.01692 0.653595
180 61.4647 1.01502 0.294823 0 1.01679 0.653595
181 61.8094 1.01488 0.294823 0 1.01667 0.653595
182 62.1541 1.01474 0.294823 0 1.01654 0.653595
183 62.4989 1.0146 0.294823 0 1.01641 0.653595
184 62.8436 1.01446 0.294823 0 1.01629 0.653595
185 63.1884 1.01432 0.294823 0 1.01616 0.653595
186 63.5331 1.01418 0.294823 0 1.01604 0.653595
187 63.8778 1.01404 0.294823 0 1.01592 0.653595
188 64.2226 1.0139 0.294823 0 1.01579 0.653595
189 64.5673 1.01376 0.294823 0 1.01567 0.653595
190 64.912 1.01362 0.294823 0 1.01555 0.653595
191 65.2568 1.01348 0.294823 0 1.01543 0.653595
192 65.6015 1.01334 0.294823 0 1.01531 0.653595
193 65.9463 1.01321 0.294823 0 1.01519 0.653595
194 66.291 1.01307 0.294823 0 1.01507 0.653595
195 66.6357 1.01293 0.294823 0 1.01496 0.653595
196 66.9805 1.01279 0.294823 0 1.01484 0.653595
197 67.3252 1.01265 0.294823 0 1.01472 0.653595
198 67.6699 1.01251 0.294823 0 1.01461 0.653595
199 68.0147 1.01238 0.294823 0 1.01449 0.653595
200 68.3594 1.01224 0.294823 0 1.01437 0.653595
201 68.7042 1.0121 0.294823 0 1.01426 0.653595
202 69.0489 1.01196 0.294823 0 1.01415 0.653595

@ -0,0 +1,223 @@
#ifndef ACCELWT_CPU_H
#define ACCELWT_CPU_H
#if defined(_WIN32) || defined(__CYGWIN__)
# if defined(ACCELWT_CPU_STATIC_DEFINE)
# define ACCELWT_CPU_API
# elif defined(ACCELWT_CPU_BUILDING_LIBRARY)
# define ACCELWT_CPU_API __declspec(dllexport)
# else
# define ACCELWT_CPU_API __declspec(dllimport)
# endif
#elif defined(__GNUC__) && __GNUC__ >= 4
# define ACCELWT_CPU_API __attribute__((visibility("default")))
#else
# define ACCELWT_CPU_API
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define ACCELWT_CPU_VERSION_MAJOR 3
#define ACCELWT_CPU_VERSION_MINOR 2
#define ACCELWT_CPU_VERSION_PATCH 0
/*
* Persistent simulation session. Create one context for a fixed CSR sparsity
* pattern, reuse it across accepted physical time steps, and destroy it when
* the simulation ends. Keeping this object alive enables temporal history,
* workspace reuse and lagged preconditioner refreshes.
*/
typedef struct AccelWTCPUContext AccelWTCPUContext;
typedef AccelWTCPUContext AccelWTCPUSession;
typedef enum AccelWTCPUStatus
{
ACCELWT_CPU_SUCCESS = 0,
ACCELWT_CPU_INVALID_ARGUMENT = 1,
ACCELWT_CPU_INVALID_MATRIX = 2,
ACCELWT_CPU_ALLOCATION_FAILED = 3,
ACCELWT_CPU_SETUP_FAILED = 4,
ACCELWT_CPU_NOT_READY = 5,
ACCELWT_CPU_SOLVE_FAILED = 6,
ACCELWT_CPU_NOT_CONVERGED = 7
} AccelWTCPUStatus;
typedef struct AccelWTCPUOptions
{
int max_iterations;
double relative_tolerance;
double absolute_tolerance;
int ilu_jacobi_iterations;
int omp_threads;
int use_initial_guess;
/* Default: 1. Set to 0 to opt into experimental LU-split Jacobi. */
int use_exact_triangular_solve;
/*
* Experimental four-thread block triangular application.
* 0 keeps the mode selected above, 1 performs one block sweep and
* 2 performs one cross-subdomain correction sweep. Requires omp_threads=4.
*/
int block_triangular_sweeps;
} AccelWTCPUOptions;
typedef struct AccelWTCPUInfo
{
int iterations;
double final_rel_residual;
double final_abs_residual;
double setup_seconds;
double solve_seconds;
int status;
} AccelWTCPUInfo;
typedef struct AccelWTCPUPhaseInfo
{
double initialization_seconds;
double direction_update_seconds;
double preconditioner_seconds;
double spmv_reduction_seconds;
double solution_update_seconds;
double true_residual_seconds;
} AccelWTCPUPhaseInfo;
typedef enum AccelWTCPUTemporalGuess
{
ACCELWT_CPU_TEMPORAL_GUESS_NONE = 0,
ACCELWT_CPU_TEMPORAL_GUESS_PREVIOUS = 1,
ACCELWT_CPU_TEMPORAL_GUESS_MR2 = 2
} AccelWTCPUTemporalGuess;
typedef struct AccelWTCPUTemporalOptions
{
int initial_guess_policy;
int enable_early_exit;
int ilu_refresh_interval;
int ilu_refresh_iteration_threshold;
} AccelWTCPUTemporalOptions;
typedef struct AccelWTCPUStepInfo
{
AccelWTCPUInfo solve;
int used_mr2;
int history_depth;
int early_exit;
int refreshed_preconditioner;
double predicted_relative_residual;
double prediction_seconds;
double update_seconds;
double solve_seconds;
} AccelWTCPUStepInfo;
/*
* Simple session configuration for time-dependent applications.
* Zero values select library defaults. One ILU factor is used for
* ilu_reuse_steps consecutive time steps; 1 rebuilds it every step.
*/
typedef struct AccelWTCPUSessionOptions
{
int omp_threads;
int ilu_reuse_steps;
} AccelWTCPUSessionOptions;
#define ACCELWT_CPU_SESSION_OPTIONS_DEFAULT {0, 5}
/*
* Simple three-function interface. Passing NULL options uses the defaults,
* including an ILU reuse window of five time steps.
*/
ACCELWT_CPU_API int accelwt_cpu_session_create(
int n,
int nnz,
const int *row_ptr,
const int *col_ind,
const AccelWTCPUSessionOptions *options,
AccelWTCPUSession **session);
ACCELWT_CPU_API int accelwt_cpu_session_solve(
AccelWTCPUSession *session,
const double *values,
const double *rhs,
double *x,
AccelWTCPUStepInfo *info);
/* Accepts NULL. */
ACCELWT_CPU_API void accelwt_cpu_session_destroy(AccelWTCPUSession *session);
/* Returns the default options without allocating a solver context. */
ACCELWT_CPU_API void accelwt_cpu_default_options(AccelWTCPUOptions *options);
ACCELWT_CPU_API void accelwt_cpu_default_temporal_options(
AccelWTCPUTemporalOptions *options);
ACCELWT_CPU_API const char *accelwt_cpu_backend_name(void);
ACCELWT_CPU_API const char *accelwt_cpu_status_string(int status);
/*
* Creates a persistent solver for a zero-based, square CSR matrix pattern.
* The row and column arrays are copied and may be released after this call.
* Column indices must be strictly increasing within each row, and every row
* must contain its diagonal entry.
*/
ACCELWT_CPU_API int accelwt_cpu_create(int n,
int nnz,
const int *row_ptr,
const int *col_ind,
const AccelWTCPUOptions *options,
AccelWTCPUContext **context);
/*
* Copies new CSR values into the context. A nonzero refresh_preconditioner
* rebuilds ILU0. The first update always builds ILU0, regardless of the flag.
*/
ACCELWT_CPU_API int accelwt_cpu_update_matrix(AccelWTCPUContext *context,
const double *values,
int refresh_preconditioner,
AccelWTCPUInfo *info);
/* Solves A*x=rhs. The context is not safe for concurrent solve calls. */
ACCELWT_CPU_API int accelwt_cpu_solve(AccelWTCPUContext *context,
const double *rhs,
double *x,
AccelWTCPUInfo *info);
/*
* Returns phase timings from the latest solve. Values are zero unless the
* library was built with ACCELWT_CPU_PHASE_TIMING=ON.
*/
ACCELWT_CPU_API int accelwt_cpu_get_last_phase_info(
const AccelWTCPUContext *context,
AccelWTCPUPhaseInfo *info);
/*
* Configures the library-owned temporal policy. The default is MR2 with
* verified early exit and a five-step lagged-ILU interval.
*/
ACCELWT_CPU_API int accelwt_cpu_set_temporal_options(
AccelWTCPUContext *context,
const AccelWTCPUTemporalOptions *options);
/*
* Updates A and solves one accepted physical time step while managing MR2
* history, verified early exit and lagged-ILU refreshes inside the session.
* This interface assumes one linear solve per accepted physical time step.
* Do not call it for intermediate or rejected nonlinear iterations because a
* successful call immediately commits x to the temporal history.
*/
ACCELWT_CPU_API int accelwt_cpu_solve_step(AccelWTCPUContext *context,
const double *values,
const double *rhs,
double *x,
AccelWTCPUStepInfo *info);
ACCELWT_CPU_API int accelwt_cpu_reset_temporal_history(
AccelWTCPUContext *context);
/* Accepts NULL. */
ACCELWT_CPU_API void accelwt_cpu_destroy(AccelWTCPUContext *context);
#ifdef __cplusplus
}
#endif
#endif

Binary file not shown.

@ -0,0 +1,652 @@
#include"pch.h"
#include <sstream>
#include <string>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
static int g_orgStdout = -1;
static FILE* g_nulPipe = nullptr;
void EnterSilentDllMode()
{
// 备份原始标准输出句柄
g_orgStdout = _dup(_fileno(stdout));
// fopen_s 替代 fopen打开空设备 NUL
errno_t err;
err = fopen_s(&g_nulPipe, "NUL", "w");
if (err == 0 && g_nulPipe != nullptr)
{
_dup2(_fileno(g_nulPipe), _fileno(stdout));
_dup2(_fileno(g_nulPipe), _fileno(stderr));
}
}
void LeaveSilentDllMode()
{
// 恢复原始控制台输出
if (g_orgStdout != -1)
{
_dup2(g_orgStdout, _fileno(stdout));
_dup2(g_orgStdout, _fileno(stderr));
_close(g_orgStdout);
g_orgStdout = -1;
}
// 关闭空文件流
if (g_nulPipe != nullptr)
{
fclose(g_nulPipe);
g_nulPipe = nullptr;
}
}
void Write2DVectorToCSV(const std::vector<std::vector<double>>& data, const std::string& filename) {
std::ofstream file(filename.c_str()); // VS2010需使用.c_str()
if (file.is_open()) {
for (size_t row = 0; row < data.size(); ++row) {
for (size_t col = 0; col < data[row].size(); ++col) {
// 设置固定小数格式和精度
file << std::fixed << std::setprecision(15) << data[row][col];
// 非最后一列时添加逗号
if (col != data[row].size() - 1) {
file << ",";
}
}
file << "\n"; // 换行符
}
file.close();
}
}
void Write1DVectorToCSV(const std::vector<double>& data, const std::string& filename, int precision = 15) {
std::ofstream file(filename.c_str());
if (file.is_open()) {
file << std::fixed << std::setprecision(precision);
for (size_t i = 0; i < data.size(); ++i) {
file << data[i] << "\n"; // 每个元素单独一行
}
file.close();
}
}
bool readCSVColumn(const std::string& filename, int columnIndex, std::vector<double>& data) {
std::ifstream file(filename);
if (!file.is_open()) {
std::cerr << "无法打开文件: " << filename << std::endl;
return false;
}
std::string line;
// 跳过标题行(如果有)
if (file.good()) {
std::getline(file, line);
}
data.resize(0);
// 逐行处理数据
while (std::getline(file, line)) {
std::istringstream ss(line);
std::string cell;
int currentColumn = 0;
bool columnFound = false;
// 处理当前行的每个单元格
while (std::getline(ss, cell, ',')) {
if (currentColumn == columnIndex) {
try {
// 转换为double并添加到vector
data.push_back(std::stod(cell));
}
catch (const std::invalid_argument& e) {
std::cerr << "转换错误: " << cell << " 不是有效的数字" << std::endl;
return false;
}
columnFound = true;
break;
}
currentColumn++;
}
// 如果指定列不存在,给出警告
if (!columnFound) {
std::cerr << "警告: 行 " << data.size() + 1 << " 不包含列 " << columnIndex << std::endl;
}
}
file.close();
return true;
}
int main()
{
set_ilu_reuse_steps(5);
int solvetype[] = { 1,2 };
std::string solvetypename[] = {"新库","原库"};
int omp_threads[] = { 1, 2, 4, 8, 16 };
//不同井型算例
int welltype;//1为一口直井2为一口压裂直井3为一口多段压裂水平井4为五口井(含直井,压裂直井,多段压裂水平井,断层)5为50口直井
welltype = 1;
//模型算例
int flowtype;//1为油单相常数pvt一口井2为油单相常数pvt五口井3为油单相常数pvt五十口井4为油单相变化pvt一口井5为水单相常数pvt一口井6为水单相变化pvt一口井7为气单相变化pvt一口井8为气单相拟压力一口井9为油水两相一口井
flowtype = 1;
const int WT[] = { 1,1,2,2,3,3,4,5 };
const int FT[] = { 1,9,1,9,1,9,2,3 };
std::string name[] =
{
"1-1油单相常数pvt(1口直井)",
"1-9油水两相 (1口直井)",
"2-1油单相常数pvt(1口压裂直井)",
"2-9油水两相 (1口压裂直井)",
"3-1油单相常数pvt(1口多段压裂水平井)",
"3-9油水两相 (1口多段压裂水平井)",
"4-2油单相常数pvt(5口井)",
"5-3油单相常数pvt(50口直井)"
};
for (int type = 0; type < 2; ++type){
set_solvetype(solvetype[type]);
std::cout << solvetypename[type] << "\n";
int threads ;
if (solvetype[type] == 1) {
threads = 5;
}
else if (solvetype[type] == 2) {
threads = 1;
}
for (int thr = 0; thr < threads; ++thr)
{
set_omp_threads(omp_threads[thr]);
std::cout << omp_threads[thr] << "线程测试\n";
for (int iiii = 0; iiii < 8; ++iiii)
{
welltype = WT[iiii];
flowtype = FT[iiii];
//非均质性
int feijunzhi = 0;//0为不考虑储层非均质1为考虑储层非均质
HX_NWTM_GRID_INPUT p0;
HX_NWTM_GRID_OUTPUT1 p1;
HX_NWTM_GRID_OUTPUT2 p2;
//不同井型设置
dVec1 a(3), b(4), c(5), d(6);
if (welltype == 1) {
//一口直井
p0.Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; p0.Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(1);
a[0] = 0; a[1] = 0; a[2] = 0.1; p0.VerticalWell[0] = a;
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(0);
p0.MultistageFracturedHorizontalWell.resize(0);
p0.InclinedWell.resize(0);
p0.Fault.resize(0);
}
else if (welltype == 2) {
//一口压裂直井
p0.Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; p0.Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(0);
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(1);
d[0] = -200; d[1] = 0; d[2] = 200; d[3] = 0; d[4] = 0.05; d[5] = 100.0; p0.FractureVerticalWell[0] = d;
p0.MultistageFracturedHorizontalWell.resize(0);
p0.InclinedWell.resize(0);
p0.Fault.resize(0);
}
else if (welltype == 3) {
//一口多段压裂水平井
p0.Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; p0.Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(0);
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(0);
p0.MultistageFracturedHorizontalWell.resize(1);
p0.MultistageFracturedHorizontalWell[0].resize(5, dVec1(6));
d[0] = -400; d[1] = -200; d[2] = -400; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][0] = d;
d[0] = -200; d[1] = -200; d[2] = -200; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][1] = d;
d[0] = 0; d[1] = -200; d[2] = 0; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][2] = d;
d[0] = 200; d[1] = -200; d[2] = 200; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][3] = d;
d[0] = 400; d[1] = -200; d[2] = 400; d[3] = 200; d[4] = 0.05; d[5] = 100; p0.MultistageFracturedHorizontalWell[0][4] = d;
p0.InclinedWell.resize(0);
p0.Fault.resize(0);
}
else if (welltype == 4) {
//五口井(含直井,压裂直井,多段压裂水平井,断层)
p0.Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; p0.Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; p0.Boundary[1] = b;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; p0.Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(3);
a[0] = 0; a[1] = 0; a[2] = 0.1; p0.VerticalWell[0] = a;
a[0] = 1000; a[1] = 1000; a[2] = 0.1; p0.VerticalWell[1] = a;
a[0] = -1000; a[1] = -1000; a[2] = 0.1; p0.VerticalWell[2] = a;
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(1);
d[0] = -200; d[1] = -200; d[2] = 200; d[3] = -200; d[4] = 0.05; d[5] = 0; p0.FractureVerticalWell[0] = d;
p0.MultistageFracturedHorizontalWell.resize(1);
p0.MultistageFracturedHorizontalWell[0].resize(3, dVec1(6));
d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][0] = d;
d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][1] = d;
d[0] = -600; d[1] = 200; d[2] = -400; d[3] = 200; d[4] = 0.1; d[5] = 0; p0.MultistageFracturedHorizontalWell[0][2] = d;
p0.InclinedWell.resize(0);
p0.Fault.resize(1);
b[0] = -500; b[1] = 1000; b[2] = 500; b[3] = 500; p0.Fault[0] = b;
}
else if (welltype == 5) {
//50口直井
p0.Boundary.resize(4);
b[0] = -1000.0; b[1] = -1000.0; b[2] = -1000.0; b[3] = 1000.0; p0.Boundary[0] = b;
b[0] = -1000.0; b[1] = 1000.0; b[2] = 1000.0; b[3] = 1000.0; p0.Boundary[1] = b;
b[0] = 1000.0; b[1] = 1000.0; b[2] = 1000.0; b[3] = -1000.0; p0.Boundary[2] = b;
b[0] = 1000.0; b[1] = -1000.0; b[2] = -1000.0; b[3] = -1000.0; p0.Boundary[3] = b;
p0.VerticalWell.resize(50);
a[0] = 766.32207856101854; a[1] = -408.4253100821785; a[2] = 0.108; p0.VerticalWell[0] = a;
a[0] = -359.11086885711029; a[1] = -242.17185988435722; a[2] = 0.108; p0.VerticalWell[1] = a;
a[0] = -396.28113134064483; a[1] = 618.18974488936828; a[2] = 0.108; p0.VerticalWell[2] = a;
a[0] = -844.38929572547772; a[1] = 859.25724767620932; a[2] = 0.108; p0.VerticalWell[3] = a;
a[0] = -631.69279373636357; a[1] = 620.26791301684102; a[2] = 0.108; p0.VerticalWell[4] = a;
a[0] = -858.84439780240791; a[1] = 333.48071142559911; a[2] = 0.108; p0.VerticalWell[5] = a;
a[0] = -844.38929572547772; a[1] = 609.87707237947734; a[2] = 0.108; p0.VerticalWell[6] = a;
a[0] = -639.95285206603785; a[1] = 867.56992018610026; a[2] = 0.108; p0.VerticalWell[7] = a;
a[0] = 764.25706397860017; a[1] = -190.2176566975379; a[2] = 0.108; p0.VerticalWell[8] = a;
a[0] = -410.73623341757479; a[1] = 867.56992018610026; a[2] = 0.108; p0.VerticalWell[9] = a;
a[0] = -121.63419187897284; a[1] = 98.647713021176514; a[2] = 0.108; p0.VerticalWell[10] = a;
a[0] = -152.6094106152517; a[1] = 364.65323333769061; a[2] = 0.108; p0.VerticalWell[11] = a;
a[0] = -152.6094106152517; a[1] = 620.26791301684102; a[2] = 0.108; p0.VerticalWell[12] = a;
a[0] = -361.17588343952877; a[1] = 102.80404927612199; a[2] = 0.108; p0.VerticalWell[13] = a;
a[0] = -844.38929572547772; a[1] = -231.78101924699342; a[2] = 0.108; p0.VerticalWell[14] = a;
a[0] = -156.73943978008879; a[1] = 875.88259269599121; a[2] = 0.108; p0.VerticalWell[15] = a;
a[0] = 138.55764550576896; a[1] = 890.42976958830059; a[2] = 0.108; p0.VerticalWell[16] = a;
a[0] = 446.24481828613784; a[1] = -439.59783199426988; a[2] = 0.108; p0.VerticalWell[17] = a;
a[0] = -846.45431030789632; a[1] = 61.240686726666581; a[2] = 0.108; p0.VerticalWell[18] = a;
a[0] = -142.28433770315883; a[1] = -223.46834673710214; a[2] = 0.108; p0.VerticalWell[19] = a;
a[0] = -375.63098551645885; a[1] = -472.84852203383423; a[2] = 0.108; p0.VerticalWell[20] = a;
a[0] = -602.78258958250342; a[1] = 354.2623927003267; a[2] = 0.108; p0.VerticalWell[21] = a;
a[0] = 431.78971620920788; a[1] = 624.42424927178672; a[2] = 0.108; p0.VerticalWell[22] = a;
a[0] = -834.06422281338484; a[1] = -474.92669016130685; a[2] = 0.108; p0.VerticalWell[23] = a;
a[0] = -836.12923739580344; a[1] = -747.16671486023938; a[2] = 0.108; p0.VerticalWell[24] = a;
a[0] = 813.81741395664631; a[1] = -693.13434354594744; a[2] = 0.108; p0.VerticalWell[25] = a;
a[0] = 458.63490578064966; a[1] = -718.07236107562062; a[2] = 0.108; p0.VerticalWell[26] = a;
a[0] = 409.07455580260353; a[1] = 873.80442456851847; a[2] = 0.108; p0.VerticalWell[27] = a;
a[0] = 124.10254342883854; a[1] = -454.14500888657915; a[2] = 0.108; p0.VerticalWell[28] = a;
a[0] = 138.55764550576896; a[1] = 96.569544893703778; a[2] = 0.108; p0.VerticalWell[29] = a;
a[0] = 101.38738302223419; a[1] = 611.95524050694985; a[2] = 0.108; p0.VerticalWell[30] = a;
a[0] = -373.56597093404037; a[1] = 360.49689708274514; a[2] = 0.108; p0.VerticalWell[31] = a;
a[0] = -604.8476041649219; a[1] = 79.944199873921661; a[2] = 0.108; p0.VerticalWell[32] = a;
a[0] = -611.0426479121777; a[1] = -219.31201048215667; a[2] = 0.108; p0.VerticalWell[33] = a;
a[0] = 448.30983286855667; a[1] = -202.68666546237455; a[2] = 0.108; p0.VerticalWell[34] = a;
a[0] = 735.34685982474002; a[1] = 880.03892895093713; a[2] = 0.108; p0.VerticalWell[35] = a;
a[0] = 107.58242676948976; a[1] = -724.30686545803894; a[2] = 0.108; p0.VerticalWell[36] = a;
a[0] = 150.94773300028032; a[1] = -196.45216107995623; a[2] = 0.108; p0.VerticalWell[37] = a;
a[0] = 762.19204939618135; a[1] = 113.19488991348589; a[2] = 0.108; p0.VerticalWell[38] = a;
a[0] = -125.76422104381015; a[1] = -470.77035390636138; a[2] = 0.108; p0.VerticalWell[39] = a;
a[0] = 452.43986203339387; a[1] = 366.73140146516357; a[2] = 0.108; p0.VerticalWell[40] = a;
a[0] = -350.85081052743578; a[1] = -751.32305111518485; a[2] = 0.108; p0.VerticalWell[41] = a;
a[0] = 122.03752884641995; a[1] = 354.2623927003267; a[2] = 0.108; p0.VerticalWell[42] = a;
a[0] = -608.9776333297591; a[1] = -447.91050450416094; a[2] = 0.108; p0.VerticalWell[43] = a;
a[0] = 407.0095412201847; a[1] = 113.19488991348589; a[2] = 0.108; p0.VerticalWell[44] = a;
a[0] = 731.21683065990283; a[1] = 636.89325803662314; a[2] = 0.108; p0.VerticalWell[45] = a;
a[0] = -121.63419187897284; a[1] = -724.30686545803894; a[2] = 0.108; p0.VerticalWell[46] = a;
a[0] = 289.3037100223255; a[1] = -925.88917382289742; a[2] = 0.108; p0.VerticalWell[47] = a;
a[0] = 737.41187440715862; a[1] = 366.73140146516357; a[2] = 0.108; p0.VerticalWell[48] = a;
a[0] = -611.0426479121777; a[1] = -730.54136984045726; a[2] = 0.108; p0.VerticalWell[49] = a;
p0.HorizontalWell.resize(0);
p0.FractureVerticalWell.resize(0);
p0.MultistageFracturedHorizontalWell.resize(0);
p0.InclinedWell.resize(0);
p0.Fault.resize(0);
}
p0.GridControl = 150.0;
p0.D = 2;
EnterSilentDllMode();
//网格计算
HX_NWTM_GRID(p1, p2, p0, "HX_license.dat");
HX_NWTM_MODEL_INPUT p3(p2);
HX_NWTM_MODEL_OUTPUT p4;
//模型设置
if (flowtype == 1) {
//油单相常数pvt一口井
p3.T = 1;
p3.Rate.t.resize(1);
p3.Rate.qo.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 20; p3.Rate.qo[0][1] = 0;
p3.CS.C.resize(1);
p3.CS.C[0] = 0;
p3.CS.S.resize(1);
p3.CS.S[0] = 0;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.2);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值
p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 2) {
//油单相常数pvt五口井
p3.T = 1;
p3.Rate.t.resize(5);
p3.Rate.qo.resize(5);
p3.Rate.qw.resize(5);
p3.Rate.qg.resize(5);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 10; p3.Rate.qo[0][1] = 0;
p3.Rate.t[1].resize(0);
p3.Rate.qo[1].resize(0);
p3.Rate.t[2].resize(3); p3.Rate.t[2][0] = 1000; p3.Rate.t[2][1] = 1000; p3.Rate.t[2][2] = 500;
p3.Rate.qo[2].resize(3); p3.Rate.qo[2][0] = 30; p3.Rate.qo[2][1] = 40; p3.Rate.qo[2][2] = 20;
p3.Rate.t[3].resize(2); p3.Rate.t[3][0] = 1500; p3.Rate.t[3][1] = 1000;
p3.Rate.qo[3].resize(2); p3.Rate.qo[3][0] = 30; p3.Rate.qo[3][1] = 20;
p3.Rate.t[4].resize(2); p3.Rate.t[4][0] = 1000; p3.Rate.t[4][1] = 1500;
p3.Rate.qo[4].resize(2); p3.Rate.qo[4][0] = -50; p3.Rate.qo[4][1] = -60;
p3.Pressure.t.resize(0);
p3.Pressure.p.resize(0);
p3.CS.C.resize(5);
p3.CS.C[0] = 0.1; p3.CS.C[1] = 0.1; p3.CS.C[2] = 0.1; p3.CS.C[3] = 0.1; p3.CS.C[4] = 0.1;
p3.CS.S.resize(5);
p3.CS.S[0] = 0.1; p3.CS.S[1] = 0.1; p3.CS.S[2] = 0.1; p3.CS.S[3] = 0.1; p3.CS.S[4] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.2);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.5);//所有数为一个值
p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 3) {
//油单相常数pvt五十口井
p3.T = 1;
dVec1 t;
t.push_back(12);
t.push_back(12);
t.push_back(12);
t.push_back(48);
t.push_back(72);
p3.Rate.t.assign(50, t);
dVec1 q;
q.push_back(158.98699999999999);
q.push_back(190.785);
q.push_back(222.58199999999999);
q.push_back(238.48099999999999);
q.push_back(0.0);
p3.Rate.qo.assign(50, q);
p3.CS.C = dVec1(50, 0.01);
p3.CS.S = dVec1(50, 0);
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.07);//所有数为一个值
p3.PVT.miuo = dVec1(200, 0.79);//所有数为一个值
p3.Base.Pi = 40;
p3.Base.Cti = 0.43e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.025);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 4) {
//油单相变化pvt一口井
p3.T = 2;
p3.Rate.t.resize(1);
p3.Rate.qo.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 10; p3.Rate.qo[0][1] = 0;
p3.CS.C.resize(1);
p3.CS.C[0] = 0.1;
p3.CS.S.resize(1);
p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bo = dVec1(200, 1.2);//数值随压力变化
p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化
p3.PVT.Co = dVec1(200, 0.001);//数值随压力变化
p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 5) {
//水单相常数pvt一口井
p3.T = 3;
p3.Rate.t.resize(1);
p3.Rate.qw.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = -10; p3.Rate.qw[0][1] = 0;
p3.CS.C.resize(1);
p3.CS.C[0] = 0.1;
p3.CS.S.resize(1);
p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bw = dVec1(200, 1.05);//所有数为一个值
p3.PVT.miuw = dVec1(200, 0.8);//所有数为一个值
p3.Base.Pi = 40.0;
p3.Base.Cti = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 6) {
//水单相变化pvt一口井
p3.T = 4;
p3.Rate.t.resize(1);
p3.Rate.qw.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = -10; p3.Rate.qw[0][1] = 0;
p3.CS.C.resize(1);
p3.CS.C[0] = 0.1;
p3.CS.S.resize(1);
p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化
p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化
p3.PVT.Cw = dVec1(200, 0.0001);//数值随压力变化
p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 7) {
//气单相变化pvt一口井
p3.T = 5;
p3.Rate.t.resize(1);
p3.Rate.qg.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qg[0].resize(2); p3.Rate.qg[0][0] = 50000; p3.Rate.qg[0][1] = 0;
p3.CS.C.resize(1);
p3.CS.C[0] = 0.1;
p3.CS.S.resize(1);
p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bg = dVec1(200, 5e-3);//数值随压力变化
p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化
p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化
p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 8) {
//气单相拟压力(一口井)
p3.T = 6;
p3.Rate.t.resize(1);
p3.Rate.qg.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
p3.Rate.qg[0].resize(2); p3.Rate.qg[0][0] = 50000; p3.Rate.qg[0][1] = 0;
p3.CS.C.resize(1);
p3.CS.C[0] = 0.1;
p3.CS.S.resize(1);
p3.CS.S[0] = 0.1;
p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
p3.PVT.Bg = dVec1(200, 5e-3);//数值随压力变化
p3.PVT.miug = dVec1(200, 2e-2);//数值随压力变化
p3.PVT.Cg = dVec1(200, 2e-2);//数值随压力变化
p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-3;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
else if (flowtype == 9) {
//油水两相(一口井)
p3.T = 8;
p3.Rate.t.resize(1);
p3.Rate.qg.resize(1);
p3.Rate.t[0].resize(2); p3.Rate.t[0][0] = 2000; p3.Rate.t[0][1] = 500;
//定产油量
p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 20; p3.Rate.qo[0][1] = 0;
p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = 0; p3.Rate.qw[0][1] = 0;
////定产液量
//p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 15; p3.Rate.qo[0][1] = 0;
//p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = 5; p3.Rate.qw[0][1] = 0;
////定注水量
//p3.Rate.qo[0].resize(2); p3.Rate.qo[0][0] = 0; p3.Rate.qo[0][1] = 0;
//p3.Rate.qw[0].resize(2); p3.Rate.qw[0][0] = -20; p3.Rate.qw[0][1] = 0;
p3.CS.C.resize(1);
p3.CS.C[0] = 0.1;
p3.CS.S.resize(1);
p3.CS.S[0] = 0.1;
//p3.PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { p3.PVT.p[i] = (i + 1.0); }
//p3.PVT.Bo = dVec1(200, 1.2);//数值随压力变化
//p3.PVT.miuo = dVec1(200, 0.5);//数值随压力变化
//p3.PVT.Bw = dVec1(200, 1.05);//数值随压力变化
//p3.PVT.miuw = dVec1(200, 0.8);//数值随压力变化
//p3.PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.So[i] = (0.1 + i * 0.01); }
//p3.PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.Kro[i] = (i*0.0125); }
//p3.PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { p3.PVT.Krw[i] = (1 - i * 0.0125); }
readCSVColumn("PVT_ow.csv", 5, p3.PVT.miuo);
readCSVColumn("PVT_ow.csv", 4, p3.PVT.Bo);
readCSVColumn("PVT_ow.csv", 2, p3.PVT.miuw);
readCSVColumn("PVT_ow.csv", 1, p3.PVT.Bw);
readCSVColumn("PVT_ow.csv", 0, p3.PVT.p);
readCSVColumn("Krow.csv", 0, p3.PVT.So);
readCSVColumn("Krow.csv", 2, p3.PVT.Kro);
readCSVColumn("Krow.csv", 1, p3.PVT.Krw);
p3.Base.Pi = 40.0;
p3.Base.Cf = 1e-4;
p3.Base.Swi = 0.2;
p3.Base.k = dVec1(p2.Trinodexy.size(), 0.001);
p3.Base.phi = dVec1(p2.Trinodexy.size(), 0.1);
p3.Base.h = dVec1(p2.Trinodexy.size(), 10);
p3.Base.d = 1.05;
p3.Base.dt_Min = 0.0025;
p3.Base.dt_Max = 12.5;
}
//非均质性设置
if (feijunzhi == 1) {
dVec2 k;
a[0] = -1000; a[1] = -800; a[2] = 0.001; k.push_back(a);
a[0] = -800; a[1] = 1000; a[2] = 0.01; k.push_back(a);
a[0] = 0; a[1] = 100; a[2] = 0.005; k.push_back(a);
a[0] = 500; a[1] = -1000; a[2] = 0.008; k.push_back(a);
a[0] = 1000; a[1] = 800; a[2] = 0.02; k.push_back(a);
HX_KRING_INPUT k0(0.01, 100, 1000, 0, p2.Trinodexy, k);
HX_KRING_OUTPUT k1;
HX_NWTM_KRINGING(k1, k0, "HX_license.dat");
p3.Base.k = k1.v;
dVec2 phi;
a[0] = -600; a[1] = 0; a[2] = 0.1; phi.push_back(a);
a[0] = 0; a[1] = 100; a[2] = 0.2; phi.push_back(a);
a[0] = 1000; a[1] = -200; a[2] = 0.05; phi.push_back(a);
HX_KRING_INPUT phi0(0.01, 100, 1000, 0, p2.Trinodexy, phi);
HX_KRING_OUTPUT phi1;
HX_NWTM_KRINGING(phi1, phi0, "HX_license.dat");
p3.Base.phi = phi1.v;
dVec2 h;
a[0] = -1000; a[1] = 100; a[2] = 10; h.push_back(a);
a[0] = 0; a[1] = 0; a[2] = 5; h.push_back(a);
a[0] = 1000; a[1] = 300; a[2] = 12; h.push_back(a);
HX_KRING_INPUT h0(0.01, 100, 1000, 0, p2.Trinodexy, h);
HX_KRING_OUTPUT h1;
HX_NWTM_KRINGING(h1, h0, "HX_license.dat");
p3.Base.h = h1.v;
/* std::ofstream file("k_phi_h.csv");
file << std::fixed << std::setprecision(15);
for (int i = 0; i < p2.Trinodexy.size(); ++i)
{
file << p2.Trinodexy[i][0] << "," << p2.Trinodexy[i][1] << "," << p3.Base.k[i] << "," << p3.Base.phi[i] << "," << p3.Base.h[i] <<"\n";
}
file.close();*/
}
//模型计算
HX_NWTM_MODEL(p4, p3, "HX_license.dat");
LeaveSilentDllMode();
std::cout << " " << name[iiii] << ":" << getPEBInum() << "," << getsolvetime() << "ms\n";
//数据导出
/*dVec2 pwf;
for (int i = 0; i < p4.t.size(); ++i) {
dVec1 a;
a.resize(p4.pw.size() + 1);
a[0] = p4.t[i];
for (int j = 1; j < a.size(); ++j) {
a[j] = p4.pw[j - 1][i];
}
pwf.push_back(a);
}
std::string filename = solvetypename[type] + name[iiii] + "pwf.csv";
Write2DVectorToCSV(pwf, filename);*/
/* Write1DVectorToCSV(p4.t, "t.csv");
Write2DVectorToCSV(p4.pw, "pw.csv");
Write2DVectorToCSV(p4.p, "C2.csv");
if (p3.T == 8) {
Write2DVectorToCSV(p4.So, "So.csv");
}*/
}
}
}
return 0;
}

@ -0,0 +1,482 @@
#pragma once
#ifndef PCH_H
#define PCH_H
#include "framework.h"
#endif //PCH_H
#define HX_API extern "C" _declspec(dllexport)
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <fstream>
#include <ctime>
#include <iomanip>
#include <unordered_set>
#include <Windows.h>
#include "accelwt_solver_api.h"
#include "accelwt_cpu.h"
#include <cstdio>
const double M_PI = acos(-1.0);
typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double
typedef std::vector<std::vector<double>>dVec2; //二维数组:double
typedef std::vector<std::vector<int>>iVec2; //二维数组:int
typedef std::vector<double>dVec1; //一维数组:double
typedef std::vector<int>iVec1; //一维数组:int
template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, const std::vector<std::vector<std::vector<T>>>& p0)
{
int m = p0.size(); p1.resize(m);
for (int i = 0; i < m; ++i)
{
int n = p0[i].size(); p1[i].resize(n);
for (int j = 0; j < n; ++j)
{
int l = p0[i][j].size(); p1[i][j].resize(l);
for (int k = 0; k < l; ++k)
{
p1[i][j][k] = p0[i][j][k];
}
}
}
}
template<class T> void HX_copy(std::vector<std::vector<T>>& p1, const std::vector<std::vector<T>>& p0)
{
int m = p0.size(); p1.resize(m);
for (int i = 0; i < m; ++i)
{
int n = p0[i].size(); p1[i].resize(n);
for (int j = 0; j < n; ++j)
{
p1[i][j] = p0[i][j];
}
}
}
template<class T> void HX_copy(std::vector<T>& p1, const std::vector<T>& p0)
{
int m = p0.size(); p1.resize(m);
for (int i = 0; i < m; ++i)
{
p1[i] = p0[i];
}
}
template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, T*** p0, int m, int* n, int l)
{
p1.resize(m);
for (int i = 0; i < m; ++i)
{
p1[i].resize(n[i]);
for (int j = 0; j < n[i]; ++j)
{
p1[i][j].resize(l);
for (int k = 0; k < l; ++k)
{
p1[i][j][k] = p0[i][j][k];
}
}
}
}
template<class T> void HX_copy(std::vector<std::vector<T>>& p1, T** p0, int m, int n)
{
p1.resize(m);
for (int i = 0; i < m; ++i)
{
p1[i].resize(n);
for (int j = 0; j < n; ++j)
{
p1[i][j] = p0[i][j];
}
}
}
template<class T> void HX_copy(std::vector<T>& p1, T* p0, int m)
{
p1.resize(m);
for (int i = 0; i < m; ++i)
{
p1[i] = p0[i];
}
}
//点结构体
struct point
{
//点结构体
double x; double y; //点坐标
point() { x = 0; y = 0; }
~point() {}
void set(const double& x_ = 0, const double& y_ = 0) { x = x_; y = y_; }
void set(const point& p) { x = p.x; y = p.y; }
};
struct point3
{
double x;
double y;
double z;
point3() { x = 0; y = 0; z = 0; }
~point3() {}
point3(const dVec1&p) { x = p[0]; y = p[1]; z = p[2]; }
point3(const double& x_ = 0, const double& y_ = 0, const double&z_ = 0) { x = x_; y = y_; z = z_;}
void set(const double& x_ = 0, const double& y_ = 0, const double& z_ = 0) { x = x_; y = y_; z = z_; }
void set(const point3&p) { x = p.x; y = p.y; z = p.z; }
};
//网格结构体
struct cell
{
//网格单元结构体
std::vector<point> p;
iVec2 pindex;
iVec1 isplot;
cell() {}
~cell() {}
};
//网格算法输入参数结构体
struct HX_NWTM_GRID_INPUT
{
// 网格划分算法输入参数结构体
dVec2 Boundary; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 边界数据
dVec2 VerticalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} //2D:{x0, y0, x1, y1, rw} 直井数据
dVec2 HorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 水平井数据
dVec2 FractureVerticalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 压裂直井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流大于0时为有限导流))
dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 多级压裂水平井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流大于0时为有限导流))
dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据
dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据
double GridControl; // 网格大小控制参数
int D; // 维数
//默认初始化
HX_NWTM_GRID_INPUT()
{
dVec1 a(3), b(4), c(5), d(6);
Boundary.resize(4);
b[0] = -1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = 1500.0; Boundary[0] = b;
b[0] = -1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = 1500.0; Boundary[1] = b;
b[0] = 1500.0; b[1] = 1500.0; b[2] = 1500.0; b[3] = -1500.0; Boundary[2] = b;
b[0] = 1500.0; b[1] = -1500.0; b[2] = -1500.0; b[3] = -1500.0; Boundary[3] = b;
VerticalWell.resize(3);
a[0] = 0; a[1] = 0; a[2] = 0.1; VerticalWell[0] = a;
a[0] = 1000; a[1] = 1000; a[2] = 0.1; VerticalWell[1] = a;
a[0] = -1000; a[1] = -1000; a[2] = 0.1; VerticalWell[2] = a;
HorizontalWell.resize(0);
FractureVerticalWell.resize(1);
d[0] = -200; d[1] = -200; d[2] = 200; d[3] = -200; d[4] = 0.05; d[5] = 0; FractureVerticalWell[0] = d;
MultistageFracturedHorizontalWell.resize(1);
MultistageFracturedHorizontalWell[0].resize(3, dVec1(5));
d[0] = -600; d[1] = 600; d[2] = -400; d[3] = 600; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][0] = d;
d[0] = -600; d[1] = 400; d[2] = -400; d[3] = 400; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][1] = d;
d[0] = -600; d[1] = 200; d[2] = -400; d[3] = 200; d[4] = 0.1; d[5] = 0; MultistageFracturedHorizontalWell[0][2] = d;
InclinedWell.resize(0);
Fault.resize(1);
b[0] = -500; b[1] = 1000; b[2] = 500; b[3] = 500; Fault[0] = b;
GridControl = 150.0;
D = 2;
}
~HX_NWTM_GRID_INPUT() {}
};
//网格算法输出参数结构体(绘图用)
struct HX_NWTM_GRID_OUTPUT1
{
cell TRI_cell; //三角形网格
cell PEBI_cell; //PEBI网格
HX_NWTM_GRID_OUTPUT1() {}
~HX_NWTM_GRID_OUTPUT1() {}
};
//网格算法输出参数结构体(模型用)
struct HX_NWTM_GRID_OUTPUT2
{
dVec2 Trinodexy;
dVec1 Area;
dVec2 D;
struct {
int n;
dVec2 XiLinw;
dVec2 lw;
dVec2 dw;
dVec1 rw;
iVec2 inwell;
dVec1 dwell;
} ZhiJingNeiBianJie;
struct {
int n;
dVec2 XiLinf;
dVec2 lf;
dVec2 df;
dVec1 xf;
iVec2 infra;
iVec1 nf;
iVec1 jjf;
iVec1 jjfl;
dVec1 lfcd;
iVec2 infra1;
dVec2 lf1;
dVec2 df1;
} LieFengJingNeiBianJie;
struct {
int n;
dVec2 XiLinh;
dVec2 lh;
dVec2 dh;
dVec2 dsxf;
iVec2 inhor;
iVec1 nhor;
dVec2 areah;
iVec2 inhor1;
iVec2 nh;
iVec2 jjh;
dVec2 hfcd;
iVec2 jjhl;
iVec2 jjh2;
iVec2 inhor2;
dVec2 lh1;
dVec2 dh1;
} DuoJiYaLieShuiPingJingNeiBianJie;
struct {
int n;
dVec2 WaiBianh;
dVec2 WaiBianl;
dVec2 WaiBiand;
} WaiBianJie;
struct {
int n;
dVec2 faultb1;
dVec2 faultb2;
dVec2 faultl1;
dVec2 faultd1;
} NeiBuDuanCeng;
struct {
iVec1 ia;
iVec1 ja;
iVec2 nzeros;
int numk;
} YuChuLiJuZhen;
HX_NWTM_GRID_OUTPUT2() {}
~HX_NWTM_GRID_OUTPUT2() {}
};
//KRINGING插值输入参数结构体
struct HX_KRING_INPUT
{
double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和
double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度
double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性
double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , }
//高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量
//指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量
//球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零
dVec2 p; //插值点
dVec2 v; //
~HX_KRING_INPUT() {}
HX_KRING_INPUT(double nugget0, double sill0, double range0, double model0 , const dVec2& p0, const dVec2& v0)
{
nugget = nugget0; sill = sill0; range = range0; model = model0;
p = p0;
v = v0;
}
};
//KRINGING插值输出参数结构体
struct HX_KRING_OUTPUT
{
dVec1 v;
HX_KRING_OUTPUT() {}
~HX_KRING_OUTPUT() {}
};
//数值试井模型求解器输入参数结构体
struct HX_NWTM_MODEL_INPUT
{
int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相
HX_NWTM_GRID_OUTPUT2 GRID;
struct Rate //流量数据
{
dVec2 t; //时间, h [一口井一组数]
dVec2 qo; //油流量,m^3/d [一口井一组数]
dVec2 qg; //气流量,m^3/d [一口井一组数]
dVec2 qw; //水流量,m^3/d [一口井一组数]
}Rate;
struct Pressure //压力数据
{
dVec2 t; //时间, h [一口井一组数]
dVec2 p; //压力, MPa [一口井一组数]
}Pressure;
struct CS //井储表皮数据
{
dVec1 C; //井储, m^3/MPa [一口井一个数]
dVec1 S; //表皮, [一口井一个数]
}CS;
struct PVT //流体性质数据
{
dVec1 p; //压力, MPa
double pb; //饱和压力, MPa
dVec1 Rso; //溶解气油比, m^3/m^3
dVec1 Bo; //油体积系数, m^3/m^3
dVec1 Co; //油压缩系数, 1/MPa
dVec1 miuo; //油粘度, mPa·s
dVec1 rouo; //油密度, kg/m^3
dVec1 Rv; //凝析油气比, m^3/m^3
dVec1 Bg; //气体积系数, m^3/m^3
dVec1 Cg; //气压缩系数, 1/MPa
dVec1 miug; //气粘度, mPa·s
dVec1 roug; //气密度, kg/m^3
dVec1 Z; //气偏差因子, 1
dVec1 Rsw; //溶解气水比, m^3/m^3
dVec1 Bw; //水体积系数, m^3/m^3
dVec1 Cw; //水压缩系数, 1/MPa
dVec1 miuw; //水粘度, mPa·s
dVec1 rouw; //水密度, kg/m^3
dVec1 V; //吸附气量, m^3/kg
dVec1 k_kinitial; //渗透率比, 1
dVec1 Cf_Cfinitial; //岩石压缩系数比, 1
dVec1 So; //油饱和度
dVec1 Kro; //油相对渗透率
dVec1 Sg; //气饱和度
dVec1 Krg; //气相对渗透率
dVec1 Sw; //水饱和度
dVec1 Krw; //水相对渗透率
}PVT;
struct Base //基础数据
{
double Pi; //初始压力, MPa
double Cti; //综合压缩系数, 1/MPa
double Cf; //岩石压缩系数, 1/MPa
double Soi; //初始含油饱和度
double Sgi; //初始含气饱和度
double Swi; //初始含水饱和度
dVec1 k; //渗透率, D [一个网格单元一个值]
dVec1 phi; //孔隙度, 1 [一个网格单元一个值]
dVec1 h; //储层厚度, m [一个网格单元一个值]
double d; //时间增长指数
double dt_Min; //最小时间间隔, h
double dt_Max; //最大时间间隔, h
}Base;
//初始化
HX_NWTM_MODEL_INPUT() {}
~HX_NWTM_MODEL_INPUT() {}
HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0)
{
T =1;
GRID = p0;
Rate.t.resize(5);
Rate.qo.resize(5);
Rate.qw.resize(5);
Rate.qg.resize(5);
Rate.t[0].resize(2); Rate.t[0][0] = 2000; Rate.t[0][1] = 500;
Rate.qo[0].resize(2); Rate.qo[0][0] = 10; Rate.qo[0][1] = 0;
Rate.qw[0].resize(2); Rate.qw[0][0] = 2; Rate.qw[0][1] = 0;
Rate.qg[0].resize(2); Rate.qg[0][0] = 20000; Rate.qg[0][1] = 0;
Rate.t[1].resize(0);
Rate.qo[1].resize(0);
Rate.qw[1].resize(0);
Rate.qg[1].resize(0);
Rate.t[2].resize(3); Rate.t[2][0] = 1000; Rate.t[2][1] = 1000; Rate.t[2][2] = 500;
Rate.qo[2].resize(3); Rate.qo[2][0] = 30; Rate.qo[2][1] = 40; Rate.qo[2][2] = 20;
Rate.qw[2].resize(3); Rate.qw[2][0] = 3; Rate.qw[2][1] = 4; Rate.qw[2][2] = 2;
Rate.qg[2].resize(3); Rate.qg[2][0] = 30000; Rate.qg[2][1] = 40000; Rate.qg[2][2] = 20000;
Rate.t[3].resize(2); Rate.t[3][0] = 1500; Rate.t[3][1] = 1000;
Rate.qo[3].resize(2); Rate.qo[3][0] = 30; Rate.qo[3][1] = 20;
Rate.qw[3].resize(2); Rate.qw[3][0] = 5; Rate.qw[3][1] = 2;
Rate.qg[3].resize(2); Rate.qg[3][0] = 50000; Rate.qg[3][1] = 20000;
Rate.t[4].resize(2); Rate.t[4][0] = 1000; Rate.t[4][1] = 1500;
Rate.qo[4].resize(2); Rate.qo[4][0] = -50; Rate.qo[4][1] = -60;
Rate.qw[4].resize(2); Rate.qw[4][0] = -2; Rate.qw[4][1] = -5;
Rate.qg[4].resize(2); Rate.qg[4][0] = -20000; Rate.qg[4][1] = -50000;
Pressure.t.resize(0);
Pressure.p.resize(0);
CS.C.resize(5);
CS.C[0] = 0.1; CS.C[1] = 0.1; CS.C[2] = 0.1; CS.C[3] = 0.1; CS.C[4] = 0.1;
CS.S.resize(5);
CS.S[0] = 0.1; CS.S[1] = 0.1; CS.S[2] = 0.1; CS.S[3] = 0.1; CS.S[4] = 0.1;
PVT.p = dVec1(200, 0); for (int i = 0; i < 200; ++i) { PVT.p[i] = (i + 1.0); }
PVT.pb = 40.0;
PVT.Rso = dVec1(200, 0);
PVT.Bo = dVec1(200, 1.2);
PVT.Co = dVec1(200, 5e-4);
PVT.miuo = dVec1(200, 0.5);
PVT.rouo = dVec1(200, 800);
PVT.Rv = dVec1(200, 0);
PVT.Bg = dVec1(200, 5e-3);
PVT.Cg = dVec1(200, 2e-2);
PVT.miug = dVec1(200, 2e-2);
PVT.roug = dVec1(200, 200);
PVT.Z = dVec1(200, 1);
PVT.Rsw = dVec1(200, 0);
PVT.Bw = dVec1(200, 1.05);
PVT.Cw = dVec1(200, 1e-4);
PVT.miuw = dVec1(200, 0.8);
PVT.rouw = dVec1(200, 1000);
PVT.V = dVec1(200, 0);
PVT.k_kinitial = dVec1(200, 1);
PVT.Cf_Cfinitial = dVec1(200, 1);
PVT.So = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.So[i] = (0.1+i*0.01); }
PVT.Kro = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Kro[i] = (i*0.0125); }
PVT.Krw = dVec1(81, 0); for (int i = 0; i < 81; ++i) { PVT.Krw[i] = (1 - i * 0.0125); }
PVT.Sg = dVec1(100, 0);
PVT.Krg = dVec1(100, 0);
PVT.Sw = dVec1(100, 0);
Base.Pi = 40.0;
Base.Cti = 1e-3;
Base.Cf = 1e-4;
Base.Soi = 0.8;
Base.Sgi = 0.0;
Base.Swi = 0.2;
Base.k = dVec1(p0.Trinodexy.size(), 0.001);
Base.phi = dVec1(p0.Trinodexy.size(), 0.1);
Base.h = dVec1(p0.Trinodexy.size(), 10);
Base.d = 1.05;
Base.dt_Min = 0.0025;
Base.dt_Max = 12.5;
}
};
//数值试井模型求解器输出参数结构体
struct HX_NWTM_MODEL_OUTPUT
{
dVec1 t; //时间, h
dVec2 pw; //井底压力, MPa [一口井一组数]
dVec2 p; //压力分布, MPa [一个时间一组数]
dVec2 So; //油饱和度分布 [一个时间一组数]
dVec2 Sg; //气饱和度分布 [一个时间一组数]
dVec2 Sw; //水饱和度分布 [一个时间一组数]
dVec2 k; //渗透率分布,mD [一个时间一组数]
HX_NWTM_MODEL_OUTPUT() {}
~HX_NWTM_MODEL_OUTPUT() {}
};
HX_API void HX_NWTM_GRID(HX_NWTM_GRID_OUTPUT1& p1, HX_NWTM_GRID_OUTPUT2& p2, const HX_NWTM_GRID_INPUT& p0, std::string LIC); //数值试井网格接口
HX_API void HX_NWTM_KRINGING(HX_KRING_OUTPUT& p1, const HX_KRING_INPUT p0, std::string LIC); //数值试井非均质性计算接口
HX_API void HX_NWTM_MODEL(HX_NWTM_MODEL_OUTPUT& p1, const HX_NWTM_MODEL_INPUT& p0, std::string LIC); //数值试井模型求解器接口
HX_API void set_omp_threads(int n);
HX_API void set_ilu_reuse_steps(int n);
HX_API int getPEBInum();
HX_API int getsolvetime();
HX_API void set_solvetype(int n);

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,223 @@
#ifndef ACCELWT_CPU_H
#define ACCELWT_CPU_H
#if defined(_WIN32) || defined(__CYGWIN__)
# if defined(ACCELWT_CPU_STATIC_DEFINE)
# define ACCELWT_CPU_API
# elif defined(ACCELWT_CPU_BUILDING_LIBRARY)
# define ACCELWT_CPU_API __declspec(dllexport)
# else
# define ACCELWT_CPU_API __declspec(dllimport)
# endif
#elif defined(__GNUC__) && __GNUC__ >= 4
# define ACCELWT_CPU_API __attribute__((visibility("default")))
#else
# define ACCELWT_CPU_API
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define ACCELWT_CPU_VERSION_MAJOR 3
#define ACCELWT_CPU_VERSION_MINOR 2
#define ACCELWT_CPU_VERSION_PATCH 0
/*
* Persistent simulation session. Create one context for a fixed CSR sparsity
* pattern, reuse it across accepted physical time steps, and destroy it when
* the simulation ends. Keeping this object alive enables temporal history,
* workspace reuse and lagged preconditioner refreshes.
*/
typedef struct AccelWTCPUContext AccelWTCPUContext;
typedef AccelWTCPUContext AccelWTCPUSession;
typedef enum AccelWTCPUStatus
{
ACCELWT_CPU_SUCCESS = 0,
ACCELWT_CPU_INVALID_ARGUMENT = 1,
ACCELWT_CPU_INVALID_MATRIX = 2,
ACCELWT_CPU_ALLOCATION_FAILED = 3,
ACCELWT_CPU_SETUP_FAILED = 4,
ACCELWT_CPU_NOT_READY = 5,
ACCELWT_CPU_SOLVE_FAILED = 6,
ACCELWT_CPU_NOT_CONVERGED = 7
} AccelWTCPUStatus;
typedef struct AccelWTCPUOptions
{
int max_iterations;
double relative_tolerance;
double absolute_tolerance;
int ilu_jacobi_iterations;
int omp_threads;
int use_initial_guess;
/* Default: 1. Set to 0 to opt into experimental LU-split Jacobi. */
int use_exact_triangular_solve;
/*
* Experimental four-thread block triangular application.
* 0 keeps the mode selected above, 1 performs one block sweep and
* 2 performs one cross-subdomain correction sweep. Requires omp_threads=4.
*/
int block_triangular_sweeps;
} AccelWTCPUOptions;
typedef struct AccelWTCPUInfo
{
int iterations;
double final_rel_residual;
double final_abs_residual;
double setup_seconds;
double solve_seconds;
int status;
} AccelWTCPUInfo;
typedef struct AccelWTCPUPhaseInfo
{
double initialization_seconds;
double direction_update_seconds;
double preconditioner_seconds;
double spmv_reduction_seconds;
double solution_update_seconds;
double true_residual_seconds;
} AccelWTCPUPhaseInfo;
typedef enum AccelWTCPUTemporalGuess
{
ACCELWT_CPU_TEMPORAL_GUESS_NONE = 0,
ACCELWT_CPU_TEMPORAL_GUESS_PREVIOUS = 1,
ACCELWT_CPU_TEMPORAL_GUESS_MR2 = 2
} AccelWTCPUTemporalGuess;
typedef struct AccelWTCPUTemporalOptions
{
int initial_guess_policy;
int enable_early_exit;
int ilu_refresh_interval;
int ilu_refresh_iteration_threshold;
} AccelWTCPUTemporalOptions;
typedef struct AccelWTCPUStepInfo
{
AccelWTCPUInfo solve;
int used_mr2;
int history_depth;
int early_exit;
int refreshed_preconditioner;
double predicted_relative_residual;
double prediction_seconds;
double update_seconds;
double solve_seconds;
} AccelWTCPUStepInfo;
/*
* Simple session configuration for time-dependent applications.
* Zero values select library defaults. One ILU factor is used for
* ilu_reuse_steps consecutive time steps; 1 rebuilds it every step.
*/
typedef struct AccelWTCPUSessionOptions
{
int omp_threads;
int ilu_reuse_steps;
} AccelWTCPUSessionOptions;
#define ACCELWT_CPU_SESSION_OPTIONS_DEFAULT {0, 5}
/*
* Simple three-function interface. Passing NULL options uses the defaults,
* including an ILU reuse window of five time steps.
*/
ACCELWT_CPU_API int accelwt_cpu_session_create(
int n,
int nnz,
const int *row_ptr,
const int *col_ind,
const AccelWTCPUSessionOptions *options,
AccelWTCPUSession **session);
ACCELWT_CPU_API int accelwt_cpu_session_solve(
AccelWTCPUSession *session,
const double *values,
const double *rhs,
double *x,
AccelWTCPUStepInfo *info);
/* Accepts NULL. */
ACCELWT_CPU_API void accelwt_cpu_session_destroy(AccelWTCPUSession *session);
/* Returns the default options without allocating a solver context. */
ACCELWT_CPU_API void accelwt_cpu_default_options(AccelWTCPUOptions *options);
ACCELWT_CPU_API void accelwt_cpu_default_temporal_options(
AccelWTCPUTemporalOptions *options);
ACCELWT_CPU_API const char *accelwt_cpu_backend_name(void);
ACCELWT_CPU_API const char *accelwt_cpu_status_string(int status);
/*
* Creates a persistent solver for a zero-based, square CSR matrix pattern.
* The row and column arrays are copied and may be released after this call.
* Column indices must be strictly increasing within each row, and every row
* must contain its diagonal entry.
*/
ACCELWT_CPU_API int accelwt_cpu_create(int n,
int nnz,
const int *row_ptr,
const int *col_ind,
const AccelWTCPUOptions *options,
AccelWTCPUContext **context);
/*
* Copies new CSR values into the context. A nonzero refresh_preconditioner
* rebuilds ILU0. The first update always builds ILU0, regardless of the flag.
*/
ACCELWT_CPU_API int accelwt_cpu_update_matrix(AccelWTCPUContext *context,
const double *values,
int refresh_preconditioner,
AccelWTCPUInfo *info);
/* Solves A*x=rhs. The context is not safe for concurrent solve calls. */
ACCELWT_CPU_API int accelwt_cpu_solve(AccelWTCPUContext *context,
const double *rhs,
double *x,
AccelWTCPUInfo *info);
/*
* Returns phase timings from the latest solve. Values are zero unless the
* library was built with ACCELWT_CPU_PHASE_TIMING=ON.
*/
ACCELWT_CPU_API int accelwt_cpu_get_last_phase_info(
const AccelWTCPUContext *context,
AccelWTCPUPhaseInfo *info);
/*
* Configures the library-owned temporal policy. The default is MR2 with
* verified early exit and a five-step lagged-ILU interval.
*/
ACCELWT_CPU_API int accelwt_cpu_set_temporal_options(
AccelWTCPUContext *context,
const AccelWTCPUTemporalOptions *options);
/*
* Updates A and solves one accepted physical time step while managing MR2
* history, verified early exit and lagged-ILU refreshes inside the session.
* This interface assumes one linear solve per accepted physical time step.
* Do not call it for intermediate or rejected nonlinear iterations because a
* successful call immediately commits x to the temporal history.
*/
ACCELWT_CPU_API int accelwt_cpu_solve_step(AccelWTCPUContext *context,
const double *values,
const double *rhs,
double *x,
AccelWTCPUStepInfo *info);
ACCELWT_CPU_API int accelwt_cpu_reset_temporal_history(
AccelWTCPUContext *context);
/* Accepts NULL. */
ACCELWT_CPU_API void accelwt_cpu_destroy(AccelWTCPUContext *context);
#ifdef __cplusplus
}
#endif
#endif

@ -1,4 +1,4 @@
#pragma once
#pragma once
#ifndef PCH_H
#define PCH_H
#include "framework.h"
@ -14,15 +14,18 @@
#include <iomanip>
#include <unordered_set>
#include <Windows.h>
#include "accelwt_cpu.h"
#include <cstdio>
#ifndef M_PI
const double M_PI = acos(-1.0);
#endif
typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double
typedef std::vector<std::vector<double>>dVec2; //二维数组:double
typedef std::vector<std::vector<int>>iVec2; //二维数组:int
typedef std::vector<double>dVec1; //一维数组:double
typedef std::vector<int>iVec1; //一维数组:int
typedef std::vector<std::vector<std::vector<double>>>dVec3; //三维数组:double
typedef std::vector<std::vector<double>>dVec2; //二维数组:double
typedef std::vector<std::vector<int>>iVec2; //二维数组:int
typedef std::vector<double>dVec1; //一维数组:double
typedef std::vector<int>iVec1; //一维数组:int
template<class T> void HX_copy(std::vector<std::vector<std::vector<T>>>& p1, const std::vector<std::vector<std::vector<T>>>& p0)
{
@ -97,11 +100,11 @@ template<class T> void HX_copy(std::vector<T>& p1, T* p0, int m)
}
}
//点结构体
//点结构体
struct point
{
//点结构体
double x; double y; //点坐标
//点结构体
double x; double y; //点坐标
point() { x = 0; y = 0; }
~point() {}
void set(const double& x_ = 0, const double& y_ = 0) { x = x_; y = y_; }
@ -119,10 +122,10 @@ struct point3
void set(const double& x_ = 0, const double& y_ = 0, const double& z_ = 0) { x = x_; y = y_; z = z_; }
void set(const point3&p) { x = p.x; y = p.y; z = p.z; }
};
//网格结构体
//网格结构体
struct cell
{
//网格单元结构体
//网格单元结构体
std::vector<point> p;
iVec2 pindex;
iVec1 isplot;
@ -131,21 +134,21 @@ struct cell
};
//网格算法输入参数结构体
//网格算法输入参数结构体
struct HX_NWTM_GRID_INPUT
{
// 网格划分算法输入参数结构体
dVec2 Boundary; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 边界数据
dVec2 VerticalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} //2D:{x0, y0, x1, y1, rw} 直井数据
dVec2 HorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 水平井数据
dVec2 FractureVerticalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 压裂直井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流大于0时为有限导流))
dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 多级压裂水平井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流大于0时为有限导流))
dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据
dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据
double GridControl; // 网格大小控制参数
int D; // 维数
//默认初始化
// 网格划分算法输入参数结构体
dVec2 Boundary; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 边界数据
dVec2 VerticalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} //2D:{x0, y0, x1, y1, rw} 直井数据
dVec2 HorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 水平井数据
dVec2 FractureVerticalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 压裂直井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流大于0时为有限导流))
dVec3 MultistageFracturedHorizontalWell; //3D:{x0, y0, z0, x1, y1, z1, wf} //2D:{x0, y0, x1, y1, wf, FC} 多级压裂水平井数据(wf裂缝半宽,m,FC,裂缝导流能力,mD.m(FC为0时为无限导流大于0时为有限导流))
dVec2 InclinedWell; //3D:{x0, y0, z0, x1, y1, z1, rw} 斜井数据
dVec2 Fault; //3D:{x0, y0, z0, x1, y1, z1} //2D:{x0, y0, x1, y1} 断层数据
double GridControl; // 网格大小控制参数
int D; // 维数
//默认初始化
HX_NWTM_GRID_INPUT()
{
dVec1 a(3), b(4), c(5), d(6);
@ -183,17 +186,17 @@ struct HX_NWTM_GRID_INPUT
~HX_NWTM_GRID_INPUT() {}
};
//网格算法输出参数结构体(绘图用)
//网格算法输出参数结构体(绘图用)
struct HX_NWTM_GRID_OUTPUT1
{
cell TRI_cell; //三角形网格
cell PEBI_cell; //PEBI网格
cell TRI_cell; //三角形网格
cell PEBI_cell; //PEBI网格
HX_NWTM_GRID_OUTPUT1() {}
~HX_NWTM_GRID_OUTPUT1() {}
};
//网格算法输出参数结构体(模型用)
//网格算法输出参数结构体(模型用)
struct HX_NWTM_GRID_OUTPUT2
{
dVec2 Trinodexy;
@ -266,17 +269,17 @@ struct HX_NWTM_GRID_OUTPUT2
};
//KRINGING插值输入参数结构体
//KRINGING插值输入参数结构体
struct HX_KRING_INPUT
{
double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和
double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度
double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性
double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , }
//高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量
//指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量
//球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零
dVec2 p; //插值点
double nugget; //块金值:表示空间点在零距离处的变异程度,即测量误差和小于采样尺度的随机变异之和
double sill; //基台值:表示变差函数随距离增加而趋于稳定的极限值,反映区域化变量的总变异程度
double range; //变程:表示空间相关性的有效距离。当两点间距离超过 range 时,它们之间不再具有空间相关性
double model; //变差函数模型:指定变差函数的数学形式,描述空间相关性随距离的变化规律{, , }
//高斯模型SPHERICAL(0):相关性随距离增加呈指数衰减,适用于连续性较强的变量
//指数模型EXPONENTIAL(1):相关性快速衰减,适用于局部变异性较大的变量
//球状模型GAUSSIAN(2):在变程内呈抛物线变化,超过变程后相关性为零
dVec2 p; //插值点
dVec2 v; //
~HX_KRING_INPUT() {}
HX_KRING_INPUT(double nugget0, double sill0, double range0, double model0 , const dVec2& p0, const dVec2& v0)
@ -287,7 +290,7 @@ struct HX_KRING_INPUT
}
};
//KRINGING插值输出参数结构体
//KRINGING插值输出参数结构体
struct HX_KRING_OUTPUT
{
dVec1 v;
@ -295,75 +298,75 @@ struct HX_KRING_OUTPUT
~HX_KRING_OUTPUT() {}
};
//数值试井模型求解器输入参数结构体
//数值试井模型求解器输入参数结构体
struct HX_NWTM_MODEL_INPUT
{
int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相
int T; //1:油单相常数pvt; 2:油单相变化pvt; 3:水单相常数pvt; 4:水单相变化pvt; 5:气单相变化pvt; 6:气单相拟压力; 7:油气两相; 8:油水两相; 9:气水两相; 10:油气水三相
HX_NWTM_GRID_OUTPUT2 GRID;
struct Rate //流量数据
struct Rate //流量数据
{
dVec2 t; //时间, h [一口井一组数]
dVec2 qo; //油流量,m^3/d [一口井一组数]
dVec2 qg; //气流量,m^3/d [一口井一组数]
dVec2 qw; //水流量,m^3/d [一口井一组数]
dVec2 t; //时间, h [一口井一组数]
dVec2 qo; //油流量,m^3/d [一口井一组数]
dVec2 qg; //气流量,m^3/d [一口井一组数]
dVec2 qw; //水流量,m^3/d [一口井一组数]
}Rate;
struct Pressure //压力数据
struct Pressure //压力数据
{
dVec2 t; //时间, h [一口井一组数]
dVec2 p; //压力, MPa [一口井一组数]
dVec2 t; //时间, h [一口井一组数]
dVec2 p; //压力, MPa [一口井一组数]
}Pressure;
struct CS //井储表皮数据
struct CS //井储表皮数据
{
dVec1 C; //井储, m^3/MPa [一口井一个数]
dVec1 S; //表皮, [一口井一个数]
dVec1 C; //井储, m^3/MPa [一口井一个数]
dVec1 S; //表皮, [一口井一个数]
}CS;
struct PVT //流体性质数据
struct PVT //流体性质数据
{
dVec1 p; //压力, MPa
double pb; //饱和压力, MPa
dVec1 Rso; //溶解气油比, m^3/m^3
dVec1 Bo; //油体积系数, m^3/m^3
dVec1 Co; //油压缩系数, 1/MPa
dVec1 miuo; //油粘度, mPa·s
dVec1 rouo; //油密度, kg/m^3
dVec1 Rv; //凝析油气比, m^3/m^3
dVec1 Bg; //气体积系数, m^3/m^3
dVec1 Cg; //气压缩系数, 1/MPa
dVec1 miug; //气粘度, mPa·s
dVec1 roug; //气密度, kg/m^3
dVec1 Z; //气偏差因子, 1
dVec1 Rsw; //溶解气水比, m^3/m^3
dVec1 Bw; //水体积系数, m^3/m^3
dVec1 Cw; //水压缩系数, 1/MPa
dVec1 miuw; //水粘度, mPa·s
dVec1 rouw; //水密度, kg/m^3
dVec1 V; //吸附气量, m^3/kg
dVec1 k_kinitial; //渗透率比, 1
dVec1 Cf_Cfinitial; //岩石压缩系数比, 1
dVec1 So; //油饱和度
dVec1 Kro; //油相对渗透率
dVec1 Sg; //气饱和度
dVec1 Krg; //气相对渗透率
dVec1 Sw; //水饱和度
dVec1 Krw; //水相对渗透率
dVec1 p; //压力, MPa
double pb; //饱和压力, MPa
dVec1 Rso; //溶解气油比, m^3/m^3
dVec1 Bo; //油体积系数, m^3/m^3
dVec1 Co; //油压缩系数, 1/MPa
dVec1 miuo; //油粘度, mPa·s
dVec1 rouo; //油密度, kg/m^3
dVec1 Rv; //凝析油气比, m^3/m^3
dVec1 Bg; //气体积系数, m^3/m^3
dVec1 Cg; //气压缩系数, 1/MPa
dVec1 miug; //气粘度, mPa·s
dVec1 roug; //气密度, kg/m^3
dVec1 Z; //气偏差因子, 1
dVec1 Rsw; //溶解气水比, m^3/m^3
dVec1 Bw; //水体积系数, m^3/m^3
dVec1 Cw; //水压缩系数, 1/MPa
dVec1 miuw; //水粘度, mPa·s
dVec1 rouw; //水密度, kg/m^3
dVec1 V; //吸附气量, m^3/kg
dVec1 k_kinitial; //渗透率比, 1
dVec1 Cf_Cfinitial; //岩石压缩系数比, 1
dVec1 So; //油饱和度
dVec1 Kro; //油相对渗透率
dVec1 Sg; //气饱和度
dVec1 Krg; //气相对渗透率
dVec1 Sw; //水饱和度
dVec1 Krw; //水相对渗透率
}PVT;
struct Base //基础数据
struct Base //基础数据
{
double Pi; //初始压力, MPa
double Cti; //综合压缩系数, 1/MPa
double Cf; //岩石压缩系数, 1/MPa
double Soi; //初始含油饱和度
double Sgi; //初始含气饱和度
double Swi; //初始含水饱和度
dVec1 k; //渗透率, D [一个网格单元一个值]
dVec1 phi; //孔隙度, 1 [一个网格单元一个值]
dVec1 h; //储层厚度, m [一个网格单元一个值]
double d; //时间增长指数
double dt_Min; //最小时间间隔, h
double dt_Max; //最大时间间隔, h
double Pi; //初始压力, MPa
double Cti; //综合压缩系数, 1/MPa
double Cf; //岩石压缩系数, 1/MPa
double Soi; //初始含油饱和度
double Sgi; //初始含气饱和度
double Swi; //初始含水饱和度
dVec1 k; //渗透率, D [一个网格单元一个值]
dVec1 phi; //孔隙度, 1 [一个网格单元一个值]
dVec1 h; //储层厚度, m [一个网格单元一个值]
double d; //时间增长指数
double dt_Min; //最小时间间隔, h
double dt_Max; //最大时间间隔, h
}Base;
//初始化
//初始化
HX_NWTM_MODEL_INPUT() {}
~HX_NWTM_MODEL_INPUT() {}
HX_NWTM_MODEL_INPUT(const HX_NWTM_GRID_OUTPUT2& p0)
@ -456,23 +459,27 @@ struct HX_NWTM_MODEL_INPUT
}
};
//数值试井模型求解器输出参数结构体
//数值试井模型求解器输出参数结构体
struct HX_NWTM_MODEL_OUTPUT
{
dVec1 t; //时间, h
dVec2 pw; //井底压力, MPa [一口井一组数]
dVec2 p; //压力分布, MPa [一个时间一组数]
dVec2 So; //油饱和度分布 [一个时间一组数]
dVec2 Sg; //气饱和度分布 [一个时间一组数]
dVec2 Sw; //水饱和度分布 [一个时间一组数]
dVec2 k; //渗透率分布,mD [一个时间一组数]
dVec1 t; //时间, h
dVec2 pw; //井底压力, MPa [一口井一组数]
dVec2 p; //压力分布, MPa [一个时间一组数]
dVec2 So; //油饱和度分布 [一个时间一组数]
dVec2 Sg; //气饱和度分布 [一个时间一组数]
dVec2 Sw; //水饱和度分布 [一个时间一组数]
dVec2 k; //渗透率分布,mD [一个时间一组数]
HX_NWTM_MODEL_OUTPUT() {}
~HX_NWTM_MODEL_OUTPUT() {}
};
HX_API void HX_NWTM_GRID(HX_NWTM_GRID_OUTPUT1& p1, HX_NWTM_GRID_OUTPUT2& p2, const HX_NWTM_GRID_INPUT& p0, std::string LIC); //数值试井网格接口
HX_API void HX_NWTM_KRINGING(HX_KRING_OUTPUT& p1, const HX_KRING_INPUT p0, std::string LIC); //数值试井非均质性计算接口
HX_API void HX_NWTM_MODEL(HX_NWTM_MODEL_OUTPUT& p1, const HX_NWTM_MODEL_INPUT& p0, std::string LIC); //数值试井模型求解器接口
HX_API void HX_NWTM_GRID(HX_NWTM_GRID_OUTPUT1& p1, HX_NWTM_GRID_OUTPUT2& p2, const HX_NWTM_GRID_INPUT& p0, std::string LIC); //数值试井网格接口
HX_API void HX_NWTM_KRINGING(HX_KRING_OUTPUT& p1, const HX_KRING_INPUT p0, std::string LIC); //数值试井非均质性计算接口
HX_API void HX_NWTM_MODEL(HX_NWTM_MODEL_OUTPUT& p1, const HX_NWTM_MODEL_INPUT& p0, std::string LIC); //数值试井模型求解器接口
HX_API void set_omp_threads(int n);
HX_API void set_ilu_reuse_steps(int n);
HX_API int getPEBInum();
HX_API int getsolvetime();
HX_API void set_solvetype(int n);

@ -1 +1 @@
7d534fb716ec6521f938
7d534fb716ed6121f939

@ -0,0 +1,22 @@
So,Krw,Kro
0,1,0
0.05,1,0
0.1,1,0
0.15,0.864105595,0.020840082
0.2,0.744179203,0.044454989
0.25,0.638344534,0.071214184
0.3,0.544945766,0.101536324
0.35,0.462521643,0.135895811
0.4,0.389782609,0.17483021
0.45,0.325590638,0.218948664
0.5,0.268941421,0.268941421
0.55,0.218948664,0.325590638
0.6,0.17483021,0.389782609
0.65,0.135895811,0.462521643
0.7,0.101536324,0.544945766
0.75,0.071214184,0.638344534
0.8,0.044454989,0.744179203
0.85,0.020840082,0.864105595
0.9,0,1
0.95,0,1
1,0,1
1 So Krw Kro
2 0 1 0
3 0.05 1 0
4 0.1 1 0
5 0.15 0.864105595 0.020840082
6 0.2 0.744179203 0.044454989
7 0.25 0.638344534 0.071214184
8 0.3 0.544945766 0.101536324
9 0.35 0.462521643 0.135895811
10 0.4 0.389782609 0.17483021
11 0.45 0.325590638 0.218948664
12 0.5 0.268941421 0.268941421
13 0.55 0.218948664 0.325590638
14 0.6 0.17483021 0.389782609
15 0.65 0.135895811 0.462521643
16 0.7 0.101536324 0.544945766
17 0.75 0.071214184 0.638344534
18 0.8 0.044454989 0.744179203
19 0.85 0.020840082 0.864105595
20 0.9 0 1
21 0.95 0 1
22 1 0 1

@ -0,0 +1,202 @@
p,Bw,miuw,,Bo,miuo
0.101325,1.04263,0.294823,0,1.17376,0.653595
0.446063,1.04246,0.294823,0,1.13543,0.653595
0.790801,1.04228,0.294823,0,1.12095,0.653595
1.13554,1.04211,0.294823,0,1.1119,0.653595
1.48028,1.04194,0.294823,0,1.10532,0.653595
1.82501,1.04177,0.294823,0,1.10015,0.653595
2.16975,1.0416,0.294823,0,1.09589,0.653595
2.51449,1.04143,0.294823,0,1.09228,0.653595
2.85923,1.04126,0.294823,0,1.08914,0.653595
3.20397,1.04109,0.294823,0,1.08636,0.653595
3.5487,1.04092,0.294823,0,1.08388,0.653595
3.89344,1.04075,0.294823,0,1.08163,0.653595
4.23818,1.04058,0.294823,0,1.07958,0.653595
4.58292,1.04041,0.294823,0,1.07769,0.653595
4.92765,1.04024,0.294823,0,1.07594,0.653595
5.27239,1.04008,0.294823,0,1.07431,0.653595
5.61713,1.03991,0.294823,0,1.07278,0.653595
5.96187,1.03974,0.294823,0,1.07135,0.653595
6.30661,1.03957,0.294823,0,1.07001,0.653595
6.65134,1.0394,0.294823,0,1.06873,0.653595
6.99608,1.03924,0.294823,0,1.06752,0.653595
7.34082,1.03907,0.294823,0,1.06637,0.653595
7.68556,1.0389,0.294823,0,1.06528,0.653595
8.0303,1.03873,0.294823,0,1.06423,0.653595
8.37503,1.03857,0.294823,0,1.06323,0.653595
8.71977,1.0384,0.294823,0,1.06227,0.653595
9.06451,1.03823,0.294823,0,1.06134,0.653595
9.40925,1.03807,0.294823,0,1.06046,0.653595
9.75398,1.0379,0.294823,0,1.0596,0.653595
10.0987,1.03774,0.294823,0,1.05878,0.653595
10.4435,1.03757,0.294823,0,1.05798,0.653595
10.7882,1.0374,0.294823,0,1.05721,0.653595
11.1329,1.03724,0.294823,0,1.05647,0.653595
11.4777,1.03707,0.294823,0,1.05575,0.653595
11.8224,1.03691,0.294823,0,1.05505,0.653595
12.1671,1.03674,0.294823,0,1.05437,0.653595
12.5119,1.03658,0.294823,0,1.05371,0.653595
12.8566,1.03642,0.294823,0,1.05307,0.653595
13.2014,1.03625,0.294823,0,1.05244,0.653595
13.5461,1.03609,0.294823,0,1.05183,0.653595
13.8908,1.03592,0.294823,0,1.05124,0.653595
14.2356,1.03576,0.294823,0,1.05067,0.653595
14.5803,1.0356,0.294823,0,1.0501,0.653595
14.9251,1.03543,0.294823,0,1.04955,0.653595
15.2698,1.03527,0.294823,0,1.04902,0.653595
15.6145,1.03511,0.294823,0,1.04849,0.653595
15.9593,1.03495,0.294823,0,1.04798,0.653595
16.304,1.03478,0.294823,0,1.04748,0.653595
16.6487,1.03462,0.294823,0,1.04699,0.653595
16.9935,1.03446,0.294823,0,1.04651,0.653595
17.3382,1.0343,0.294823,0,1.04603,0.653595
17.683,1.03414,0.294823,0,1.04557,0.653595
18.0277,1.03397,0.294823,0,1.04512,0.653595
18.3724,1.03381,0.294823,0,1.04468,0.653595
18.7172,1.03365,0.294823,0,1.04424,0.653595
19.0619,1.03349,0.294823,0,1.04382,0.653595
19.4066,1.03333,0.294823,0,1.0434,0.653595
19.7514,1.03317,0.294823,0,1.04299,0.653595
20.0961,1.03301,0.294823,0,1.04258,0.653595
20.4409,1.03285,0.294823,0,1.04218,0.653595
20.7856,1.03269,0.294823,0,1.04179,0.653595
21.1303,1.03253,0.294823,0,1.04141,0.653595
21.4751,1.03237,0.294823,0,1.04103,0.653595
21.8198,1.03221,0.294823,0,1.04066,0.653595
22.1645,1.03205,0.294823,0,1.0403,0.653595
22.5093,1.03189,0.294823,0,1.03994,0.653595
22.854,1.03173,0.294823,0,1.03958,0.653595
23.1988,1.03158,0.294823,0,1.03923,0.653595
23.5435,1.03142,0.294823,0,1.03889,0.653595
23.8882,1.03126,0.294823,0,1.03855,0.653595
24.233,1.0311,0.294823,0,1.03822,0.653595
24.5777,1.03094,0.294823,0,1.03789,0.653595
24.9225,1.03079,0.294823,0,1.03757,0.653595
25.2672,1.03063,0.294823,0,1.03725,0.653595
25.6119,1.03047,0.294823,0,1.03693,0.653595
25.9567,1.03031,0.294823,0,1.03662,0.653595
26.3014,1.03016,0.294823,0,1.03631,0.653595
26.6461,1.03,0.294823,0,1.03601,0.653595
26.9909,1.02984,0.294823,0,1.03571,0.653595
27.3356,1.02969,0.294823,0,1.03542,0.653595
27.6804,1.02953,0.294823,0,1.03513,0.653595
28.0251,1.02937,0.294823,0,1.03484,0.653595
28.3698,1.02922,0.294823,0,1.03456,0.653595
28.7146,1.02906,0.294823,0,1.03428,0.653595
29.0593,1.02891,0.294823,0,1.034,0.653595
29.404,1.02875,0.294823,0,1.03373,0.653595
29.7488,1.0286,0.294823,0,1.03346,0.653595
30.0935,1.02844,0.294823,0,1.03319,0.653595
30.4383,1.02829,0.294823,0,1.03293,0.653595
30.783,1.02813,0.294823,0,1.03267,0.653595
31.1277,1.02798,0.294823,0,1.03241,0.653595
31.4725,1.02782,0.294823,0,1.03216,0.653595
31.8172,1.02767,0.294823,0,1.0319,0.653595
32.1619,1.02751,0.294823,0,1.03166,0.653595
32.5067,1.02736,0.294823,0,1.03141,0.653595
32.8514,1.02721,0.294823,0,1.03116,0.653595
33.1962,1.02705,0.294823,0,1.03092,0.653595
33.5409,1.0269,0.294823,0,1.03069,0.653595
33.8856,1.02675,0.294823,0,1.03045,0.653595
34.2304,1.02659,0.294823,0,1.03022,0.653595
34.5751,1.02644,0.294823,0,1.02998,0.653595
34.9198,1.02629,0.294823,0,1.02976,0.653595
35.2646,1.02614,0.294823,0,1.02953,0.653595
35.6093,1.02598,0.294823,0,1.0293,0.653595
35.9541,1.02583,0.294823,0,1.02908,0.653595
36.2988,1.02568,0.294823,0,1.02886,0.653595
36.6435,1.02553,0.294823,0,1.02864,0.653595
36.9883,1.02538,0.294823,0,1.02843,0.653595
37.333,1.02522,0.294823,0,1.02821,0.653595
37.6778,1.02507,0.294823,0,1.028,0.653595
38.0225,1.02492,0.294823,0,1.02779,0.653595
38.3672,1.02477,0.294823,0,1.02759,0.653595
38.712,1.02462,0.294823,0,1.02738,0.653595
39.0567,1.02447,0.294823,0,1.02718,0.653595
39.4014,1.02432,0.294823,0,1.02697,0.653595
39.7462,1.02417,0.294823,0,1.02677,0.653595
40.0909,1.02402,0.294823,0,1.02657,0.653595
40.4357,1.02387,0.294823,0,1.02638,0.653595
40.7804,1.02372,0.294823,0,1.02618,0.653595
41.1251,1.02357,0.294823,0,1.02599,0.653595
41.4699,1.02342,0.294823,0,1.0258,0.653595
41.8146,1.02327,0.294823,0,1.02561,0.653595
42.1593,1.02312,0.294823,0,1.02542,0.653595
42.5041,1.02297,0.294823,0,1.02523,0.653595
42.8488,1.02282,0.294823,0,1.02505,0.653595
43.1936,1.02267,0.294823,0,1.02486,0.653595
43.5383,1.02253,0.294823,0,1.02468,0.653595
43.883,1.02238,0.294823,0,1.0245,0.653595
44.2278,1.02223,0.294823,0,1.02432,0.653595
44.5725,1.02208,0.294823,0,1.02414,0.653595
44.9172,1.02193,0.294823,0,1.02396,0.653595
45.262,1.02179,0.294823,0,1.02379,0.653595
45.6067,1.02164,0.294823,0,1.02361,0.653595
45.9515,1.02149,0.294823,0,1.02344,0.653595
46.2962,1.02134,0.294823,0,1.02327,0.653595
46.6409,1.0212,0.294823,0,1.0231,0.653595
46.9857,1.02105,0.294823,0,1.02293,0.653595
47.3304,1.0209,0.294823,0,1.02276,0.653595
47.6751,1.02076,0.294823,0,1.0226,0.653595
48.0199,1.02061,0.294823,0,1.02243,0.653595
48.3646,1.02046,0.294823,0,1.02227,0.653595
48.7094,1.02032,0.294823,0,1.02211,0.653595
49.0541,1.02017,0.294823,0,1.02194,0.653595
49.3988,1.02003,0.294823,0,1.02178,0.653595
49.7436,1.01988,0.294823,0,1.02162,0.653595
50.0883,1.01974,0.294823,0,1.02147,0.653595
50.4331,1.01959,0.294823,0,1.02131,0.653595
50.7778,1.01944,0.294823,0,1.02115,0.653595
51.1225,1.0193,0.294823,0,1.021,0.653595
51.4673,1.01915,0.294823,0,1.02085,0.653595
51.812,1.01901,0.294823,0,1.02069,0.653595
52.1567,1.01887,0.294823,0,1.02054,0.653595
52.5015,1.01872,0.294823,0,1.02039,0.653595
52.8462,1.01858,0.294823,0,1.02024,0.653595
53.191,1.01843,0.294823,0,1.02009,0.653595
53.5357,1.01829,0.294823,0,1.01994,0.653595
53.8804,1.01814,0.294823,0,1.0198,0.653595
54.2252,1.018,0.294823,0,1.01965,0.653595
54.5699,1.01786,0.294823,0,1.01951,0.653595
54.9146,1.01771,0.294823,0,1.01936,0.653595
55.2594,1.01757,0.294823,0,1.01922,0.653595
55.6041,1.01743,0.294823,0,1.01908,0.653595
55.9489,1.01729,0.294823,0,1.01894,0.653595
56.2936,1.01714,0.294823,0,1.0188,0.653595
56.6383,1.017,0.294823,0,1.01866,0.653595
56.9831,1.01686,0.294823,0,1.01852,0.653595
57.3278,1.01672,0.294823,0,1.01838,0.653595
57.6725,1.01657,0.294823,0,1.01825,0.653595
58.0173,1.01643,0.294823,0,1.01811,0.653595
58.362,1.01629,0.294823,0,1.01797,0.653595
58.7068,1.01615,0.294823,0,1.01784,0.653595
59.0515,1.01601,0.294823,0,1.01771,0.653595
59.3962,1.01586,0.294823,0,1.01757,0.653595
59.741,1.01572,0.294823,0,1.01744,0.653595
60.0857,1.01558,0.294823,0,1.01731,0.653595
60.4304,1.01544,0.294823,0,1.01718,0.653595
60.7752,1.0153,0.294823,0,1.01705,0.653595
61.1199,1.01516,0.294823,0,1.01692,0.653595
61.4647,1.01502,0.294823,0,1.01679,0.653595
61.8094,1.01488,0.294823,0,1.01667,0.653595
62.1541,1.01474,0.294823,0,1.01654,0.653595
62.4989,1.0146,0.294823,0,1.01641,0.653595
62.8436,1.01446,0.294823,0,1.01629,0.653595
63.1884,1.01432,0.294823,0,1.01616,0.653595
63.5331,1.01418,0.294823,0,1.01604,0.653595
63.8778,1.01404,0.294823,0,1.01592,0.653595
64.2226,1.0139,0.294823,0,1.01579,0.653595
64.5673,1.01376,0.294823,0,1.01567,0.653595
64.912,1.01362,0.294823,0,1.01555,0.653595
65.2568,1.01348,0.294823,0,1.01543,0.653595
65.6015,1.01334,0.294823,0,1.01531,0.653595
65.9463,1.01321,0.294823,0,1.01519,0.653595
66.291,1.01307,0.294823,0,1.01507,0.653595
66.6357,1.01293,0.294823,0,1.01496,0.653595
66.9805,1.01279,0.294823,0,1.01484,0.653595
67.3252,1.01265,0.294823,0,1.01472,0.653595
67.6699,1.01251,0.294823,0,1.01461,0.653595
68.0147,1.01238,0.294823,0,1.01449,0.653595
68.3594,1.01224,0.294823,0,1.01437,0.653595
68.7042,1.0121,0.294823,0,1.01426,0.653595
69.0489,1.01196,0.294823,0,1.01415,0.653595
1 p Bw miuw Bo miuo
2 0.101325 1.04263 0.294823 0 1.17376 0.653595
3 0.446063 1.04246 0.294823 0 1.13543 0.653595
4 0.790801 1.04228 0.294823 0 1.12095 0.653595
5 1.13554 1.04211 0.294823 0 1.1119 0.653595
6 1.48028 1.04194 0.294823 0 1.10532 0.653595
7 1.82501 1.04177 0.294823 0 1.10015 0.653595
8 2.16975 1.0416 0.294823 0 1.09589 0.653595
9 2.51449 1.04143 0.294823 0 1.09228 0.653595
10 2.85923 1.04126 0.294823 0 1.08914 0.653595
11 3.20397 1.04109 0.294823 0 1.08636 0.653595
12 3.5487 1.04092 0.294823 0 1.08388 0.653595
13 3.89344 1.04075 0.294823 0 1.08163 0.653595
14 4.23818 1.04058 0.294823 0 1.07958 0.653595
15 4.58292 1.04041 0.294823 0 1.07769 0.653595
16 4.92765 1.04024 0.294823 0 1.07594 0.653595
17 5.27239 1.04008 0.294823 0 1.07431 0.653595
18 5.61713 1.03991 0.294823 0 1.07278 0.653595
19 5.96187 1.03974 0.294823 0 1.07135 0.653595
20 6.30661 1.03957 0.294823 0 1.07001 0.653595
21 6.65134 1.0394 0.294823 0 1.06873 0.653595
22 6.99608 1.03924 0.294823 0 1.06752 0.653595
23 7.34082 1.03907 0.294823 0 1.06637 0.653595
24 7.68556 1.0389 0.294823 0 1.06528 0.653595
25 8.0303 1.03873 0.294823 0 1.06423 0.653595
26 8.37503 1.03857 0.294823 0 1.06323 0.653595
27 8.71977 1.0384 0.294823 0 1.06227 0.653595
28 9.06451 1.03823 0.294823 0 1.06134 0.653595
29 9.40925 1.03807 0.294823 0 1.06046 0.653595
30 9.75398 1.0379 0.294823 0 1.0596 0.653595
31 10.0987 1.03774 0.294823 0 1.05878 0.653595
32 10.4435 1.03757 0.294823 0 1.05798 0.653595
33 10.7882 1.0374 0.294823 0 1.05721 0.653595
34 11.1329 1.03724 0.294823 0 1.05647 0.653595
35 11.4777 1.03707 0.294823 0 1.05575 0.653595
36 11.8224 1.03691 0.294823 0 1.05505 0.653595
37 12.1671 1.03674 0.294823 0 1.05437 0.653595
38 12.5119 1.03658 0.294823 0 1.05371 0.653595
39 12.8566 1.03642 0.294823 0 1.05307 0.653595
40 13.2014 1.03625 0.294823 0 1.05244 0.653595
41 13.5461 1.03609 0.294823 0 1.05183 0.653595
42 13.8908 1.03592 0.294823 0 1.05124 0.653595
43 14.2356 1.03576 0.294823 0 1.05067 0.653595
44 14.5803 1.0356 0.294823 0 1.0501 0.653595
45 14.9251 1.03543 0.294823 0 1.04955 0.653595
46 15.2698 1.03527 0.294823 0 1.04902 0.653595
47 15.6145 1.03511 0.294823 0 1.04849 0.653595
48 15.9593 1.03495 0.294823 0 1.04798 0.653595
49 16.304 1.03478 0.294823 0 1.04748 0.653595
50 16.6487 1.03462 0.294823 0 1.04699 0.653595
51 16.9935 1.03446 0.294823 0 1.04651 0.653595
52 17.3382 1.0343 0.294823 0 1.04603 0.653595
53 17.683 1.03414 0.294823 0 1.04557 0.653595
54 18.0277 1.03397 0.294823 0 1.04512 0.653595
55 18.3724 1.03381 0.294823 0 1.04468 0.653595
56 18.7172 1.03365 0.294823 0 1.04424 0.653595
57 19.0619 1.03349 0.294823 0 1.04382 0.653595
58 19.4066 1.03333 0.294823 0 1.0434 0.653595
59 19.7514 1.03317 0.294823 0 1.04299 0.653595
60 20.0961 1.03301 0.294823 0 1.04258 0.653595
61 20.4409 1.03285 0.294823 0 1.04218 0.653595
62 20.7856 1.03269 0.294823 0 1.04179 0.653595
63 21.1303 1.03253 0.294823 0 1.04141 0.653595
64 21.4751 1.03237 0.294823 0 1.04103 0.653595
65 21.8198 1.03221 0.294823 0 1.04066 0.653595
66 22.1645 1.03205 0.294823 0 1.0403 0.653595
67 22.5093 1.03189 0.294823 0 1.03994 0.653595
68 22.854 1.03173 0.294823 0 1.03958 0.653595
69 23.1988 1.03158 0.294823 0 1.03923 0.653595
70 23.5435 1.03142 0.294823 0 1.03889 0.653595
71 23.8882 1.03126 0.294823 0 1.03855 0.653595
72 24.233 1.0311 0.294823 0 1.03822 0.653595
73 24.5777 1.03094 0.294823 0 1.03789 0.653595
74 24.9225 1.03079 0.294823 0 1.03757 0.653595
75 25.2672 1.03063 0.294823 0 1.03725 0.653595
76 25.6119 1.03047 0.294823 0 1.03693 0.653595
77 25.9567 1.03031 0.294823 0 1.03662 0.653595
78 26.3014 1.03016 0.294823 0 1.03631 0.653595
79 26.6461 1.03 0.294823 0 1.03601 0.653595
80 26.9909 1.02984 0.294823 0 1.03571 0.653595
81 27.3356 1.02969 0.294823 0 1.03542 0.653595
82 27.6804 1.02953 0.294823 0 1.03513 0.653595
83 28.0251 1.02937 0.294823 0 1.03484 0.653595
84 28.3698 1.02922 0.294823 0 1.03456 0.653595
85 28.7146 1.02906 0.294823 0 1.03428 0.653595
86 29.0593 1.02891 0.294823 0 1.034 0.653595
87 29.404 1.02875 0.294823 0 1.03373 0.653595
88 29.7488 1.0286 0.294823 0 1.03346 0.653595
89 30.0935 1.02844 0.294823 0 1.03319 0.653595
90 30.4383 1.02829 0.294823 0 1.03293 0.653595
91 30.783 1.02813 0.294823 0 1.03267 0.653595
92 31.1277 1.02798 0.294823 0 1.03241 0.653595
93 31.4725 1.02782 0.294823 0 1.03216 0.653595
94 31.8172 1.02767 0.294823 0 1.0319 0.653595
95 32.1619 1.02751 0.294823 0 1.03166 0.653595
96 32.5067 1.02736 0.294823 0 1.03141 0.653595
97 32.8514 1.02721 0.294823 0 1.03116 0.653595
98 33.1962 1.02705 0.294823 0 1.03092 0.653595
99 33.5409 1.0269 0.294823 0 1.03069 0.653595
100 33.8856 1.02675 0.294823 0 1.03045 0.653595
101 34.2304 1.02659 0.294823 0 1.03022 0.653595
102 34.5751 1.02644 0.294823 0 1.02998 0.653595
103 34.9198 1.02629 0.294823 0 1.02976 0.653595
104 35.2646 1.02614 0.294823 0 1.02953 0.653595
105 35.6093 1.02598 0.294823 0 1.0293 0.653595
106 35.9541 1.02583 0.294823 0 1.02908 0.653595
107 36.2988 1.02568 0.294823 0 1.02886 0.653595
108 36.6435 1.02553 0.294823 0 1.02864 0.653595
109 36.9883 1.02538 0.294823 0 1.02843 0.653595
110 37.333 1.02522 0.294823 0 1.02821 0.653595
111 37.6778 1.02507 0.294823 0 1.028 0.653595
112 38.0225 1.02492 0.294823 0 1.02779 0.653595
113 38.3672 1.02477 0.294823 0 1.02759 0.653595
114 38.712 1.02462 0.294823 0 1.02738 0.653595
115 39.0567 1.02447 0.294823 0 1.02718 0.653595
116 39.4014 1.02432 0.294823 0 1.02697 0.653595
117 39.7462 1.02417 0.294823 0 1.02677 0.653595
118 40.0909 1.02402 0.294823 0 1.02657 0.653595
119 40.4357 1.02387 0.294823 0 1.02638 0.653595
120 40.7804 1.02372 0.294823 0 1.02618 0.653595
121 41.1251 1.02357 0.294823 0 1.02599 0.653595
122 41.4699 1.02342 0.294823 0 1.0258 0.653595
123 41.8146 1.02327 0.294823 0 1.02561 0.653595
124 42.1593 1.02312 0.294823 0 1.02542 0.653595
125 42.5041 1.02297 0.294823 0 1.02523 0.653595
126 42.8488 1.02282 0.294823 0 1.02505 0.653595
127 43.1936 1.02267 0.294823 0 1.02486 0.653595
128 43.5383 1.02253 0.294823 0 1.02468 0.653595
129 43.883 1.02238 0.294823 0 1.0245 0.653595
130 44.2278 1.02223 0.294823 0 1.02432 0.653595
131 44.5725 1.02208 0.294823 0 1.02414 0.653595
132 44.9172 1.02193 0.294823 0 1.02396 0.653595
133 45.262 1.02179 0.294823 0 1.02379 0.653595
134 45.6067 1.02164 0.294823 0 1.02361 0.653595
135 45.9515 1.02149 0.294823 0 1.02344 0.653595
136 46.2962 1.02134 0.294823 0 1.02327 0.653595
137 46.6409 1.0212 0.294823 0 1.0231 0.653595
138 46.9857 1.02105 0.294823 0 1.02293 0.653595
139 47.3304 1.0209 0.294823 0 1.02276 0.653595
140 47.6751 1.02076 0.294823 0 1.0226 0.653595
141 48.0199 1.02061 0.294823 0 1.02243 0.653595
142 48.3646 1.02046 0.294823 0 1.02227 0.653595
143 48.7094 1.02032 0.294823 0 1.02211 0.653595
144 49.0541 1.02017 0.294823 0 1.02194 0.653595
145 49.3988 1.02003 0.294823 0 1.02178 0.653595
146 49.7436 1.01988 0.294823 0 1.02162 0.653595
147 50.0883 1.01974 0.294823 0 1.02147 0.653595
148 50.4331 1.01959 0.294823 0 1.02131 0.653595
149 50.7778 1.01944 0.294823 0 1.02115 0.653595
150 51.1225 1.0193 0.294823 0 1.021 0.653595
151 51.4673 1.01915 0.294823 0 1.02085 0.653595
152 51.812 1.01901 0.294823 0 1.02069 0.653595
153 52.1567 1.01887 0.294823 0 1.02054 0.653595
154 52.5015 1.01872 0.294823 0 1.02039 0.653595
155 52.8462 1.01858 0.294823 0 1.02024 0.653595
156 53.191 1.01843 0.294823 0 1.02009 0.653595
157 53.5357 1.01829 0.294823 0 1.01994 0.653595
158 53.8804 1.01814 0.294823 0 1.0198 0.653595
159 54.2252 1.018 0.294823 0 1.01965 0.653595
160 54.5699 1.01786 0.294823 0 1.01951 0.653595
161 54.9146 1.01771 0.294823 0 1.01936 0.653595
162 55.2594 1.01757 0.294823 0 1.01922 0.653595
163 55.6041 1.01743 0.294823 0 1.01908 0.653595
164 55.9489 1.01729 0.294823 0 1.01894 0.653595
165 56.2936 1.01714 0.294823 0 1.0188 0.653595
166 56.6383 1.017 0.294823 0 1.01866 0.653595
167 56.9831 1.01686 0.294823 0 1.01852 0.653595
168 57.3278 1.01672 0.294823 0 1.01838 0.653595
169 57.6725 1.01657 0.294823 0 1.01825 0.653595
170 58.0173 1.01643 0.294823 0 1.01811 0.653595
171 58.362 1.01629 0.294823 0 1.01797 0.653595
172 58.7068 1.01615 0.294823 0 1.01784 0.653595
173 59.0515 1.01601 0.294823 0 1.01771 0.653595
174 59.3962 1.01586 0.294823 0 1.01757 0.653595
175 59.741 1.01572 0.294823 0 1.01744 0.653595
176 60.0857 1.01558 0.294823 0 1.01731 0.653595
177 60.4304 1.01544 0.294823 0 1.01718 0.653595
178 60.7752 1.0153 0.294823 0 1.01705 0.653595
179 61.1199 1.01516 0.294823 0 1.01692 0.653595
180 61.4647 1.01502 0.294823 0 1.01679 0.653595
181 61.8094 1.01488 0.294823 0 1.01667 0.653595
182 62.1541 1.01474 0.294823 0 1.01654 0.653595
183 62.4989 1.0146 0.294823 0 1.01641 0.653595
184 62.8436 1.01446 0.294823 0 1.01629 0.653595
185 63.1884 1.01432 0.294823 0 1.01616 0.653595
186 63.5331 1.01418 0.294823 0 1.01604 0.653595
187 63.8778 1.01404 0.294823 0 1.01592 0.653595
188 64.2226 1.0139 0.294823 0 1.01579 0.653595
189 64.5673 1.01376 0.294823 0 1.01567 0.653595
190 64.912 1.01362 0.294823 0 1.01555 0.653595
191 65.2568 1.01348 0.294823 0 1.01543 0.653595
192 65.6015 1.01334 0.294823 0 1.01531 0.653595
193 65.9463 1.01321 0.294823 0 1.01519 0.653595
194 66.291 1.01307 0.294823 0 1.01507 0.653595
195 66.6357 1.01293 0.294823 0 1.01496 0.653595
196 66.9805 1.01279 0.294823 0 1.01484 0.653595
197 67.3252 1.01265 0.294823 0 1.01472 0.653595
198 67.6699 1.01251 0.294823 0 1.01461 0.653595
199 68.0147 1.01238 0.294823 0 1.01449 0.653595
200 68.3594 1.01224 0.294823 0 1.01437 0.653595
201 68.7042 1.0121 0.294823 0 1.01426 0.653595
202 69.0489 1.01196 0.294823 0 1.01415 0.653595

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -2435,6 +2435,14 @@ Reason: %1</source>
<source>Solver Progress</source>
<translation></translation>
</message>
<message>
<source>Solver completed</source>
<translation></translation>
</message>
<message>
<source>Solve time: %1 ms</source>
<translation>%1 ms</translation>
</message>
</context>
<context>
<name>nmSubWndPostprocessing</name>
@ -4960,6 +4968,30 @@ Please check your input coordinates.</source>
<source>Numerical settings</source>
<translation></translation>
</message>
<message>
<source>Solver settings</source>
<translation></translation>
</message>
<message>
<source>Solver library:</source>
<translation></translation>
</message>
<message>
<source>CPU accelerated solver</source>
<translation>CPU</translation>
</message>
<message>
<source>Original solver</source>
<translation></translation>
</message>
<message>
<source>OpenMP threads:</source>
<translation>OpenMP线</translation>
</message>
<message>
<source>ILU reuse steps:</source>
<translation>ILU</translation>
</message>
<message>
<source>Use automatic settings</source>
<translation>使</translation>

@ -23,6 +23,10 @@ class NMCALCULATION_EXPORT nmCalculationDllPebiSolverTask : public QThread {
// PSO 等待线程结束后通过该接口判断本次结果是否可以继续参与误差计算.
// 返回 false 时调用方会丢弃本次结果, 防止复用上一粒子留下的旧曲线.
bool wasSuccessful() const;
/** @brief 获取本次DLL内部求解耗时单位为毫秒。 */
int getSolveTimeMs() const;
/** @brief 获取本次求解的PEBI网格数量。 */
int getPebiCount() const;
// 自动拟合粒子评价只提取目标井曲线,不写回共享数据和网格压力场。
// 井名为空时保持原有完整结果保存模式。
@ -46,6 +50,10 @@ class NMCALCULATION_EXPORT nmCalculationDllPebiSolverTask : public QThread {
QString m_sPostprocessingDir;
// run() 在线程内保存 execute() 结果, 等待线程结束的调用方只读取该状态.
bool m_lastRunSucceeded;
/** @brief 本次DLL内部求解耗时单位为毫秒。 */
int m_nSolveTimeMs;
/** @brief 本次求解的PEBI网格数量。 */
int m_nPebiCount;
QString m_autoFitTargetWellName;
QVector<QVector<double> > m_autoFitResultPressure;
QVector<QVector<double> > m_autoFitResultLogLog;

@ -1,4 +1,4 @@
#ifndef NMDATAANALYZEMANAGER_H
#ifndef NMDATAANALYZEMANAGER_H
#define NMDATAANALYZEMANAGER_H
#include <QObject>
@ -145,7 +145,14 @@ class NM_DATA_EXPORT nmDataAnalyzeManager : public ZxDataObjectBin
{
ZX_DECLARE_DYNAMIC
Q_OBJECT
public:
public:
/** @brief PEBI线性求解器类型稳定编码。 */
enum PebiSolverType
{
PebiSolverCpuAccelerated = 1,
PebiSolverOriginal = 2
};
nmDataAnalyzeManager();
// 释放当前流动段分析独占的数据对象
~nmDataAnalyzeManager();
@ -361,6 +368,19 @@ class NM_DATA_EXPORT nmDataAnalyzeManager : public ZxDataObjectBin
NM_SOLVER_MODEL_TYPE getSolverModelType() const;
void setSolverModelType(NM_SOLVER_MODEL_TYPE newSolverModelType);
/** @brief 获取PEBI求解器类型1为CPU加速求解器2为原求解器。 */
int getPebiSolverType() const;
/** @brief 设置PEBI求解器类型。 */
void setPebiSolverType(int nSolverType);
/** @brief 获取PEBI求解器的OpenMP线程数。 */
int getPebiOmpThreads() const;
/** @brief 设置PEBI求解器的OpenMP线程数。 */
void setPebiOmpThreads(int nOmpThreads);
/** @brief 获取PEBI求解器的ILU复用步数。 */
int getPebiIluReuseSteps() const;
/** @brief 设置PEBI求解器的ILU复用步数。 */
void setPebiIluReuseSteps(int nIluReuseSteps);
// 获取Pebi网格求解数据接口
// 获取压力历史数据
QVector<QVector<double >> getPebiSolverHistoryDataByName(const QString& wellName);
@ -681,6 +701,13 @@ class NM_DATA_EXPORT nmDataAnalyzeManager : public ZxDataObjectBin
// 求解模型类型
NM_SOLVER_MODEL_TYPE m_eSolverModelType;
/** @brief PEBI求解器类型1为CPU加速求解器2为原求解器。 */
int m_nPebiSolverType;
/** @brief PEBI求解器的OpenMP线程数。 */
int m_nPebiOmpThreads;
/** @brief PEBI求解器的ILU复用步数。 */
int m_nPebiIluReuseSteps;
// Pvt数据(Pebi)
nmDataPvtParaForPebi* m_pebiPvtPara;

@ -1,4 +1,4 @@
#ifndef NMWXANALYTICALDESIGN_H
#ifndef NMWXANALYTICALDESIGN_H
#define NMWXANALYTICALDESIGN_H
#include "nmSubWxs_global.h"
@ -15,6 +15,7 @@ class QHBoxLayout;
class QLabel;
class QRadioButton;
class QComboBox;
class QSpinBox;
class QDateTimeEdit;
class QStackedLayout;
@ -73,6 +74,10 @@ signals:
void onResultWellChanged(int index);
// 当前模型下拉框切换槽
void onCurrentModelChanged(int index);
/** @brief 求解器库选择发生变化。 */
void onPebiSolverTypeChanged(int index);
/** @brief 将求解器设置同步到当前数据管理器。 */
void onPebiSolverSettingsChanged();
// 处理时间参考系单选按钮切换
//void onTimeReferenceSystemToggled(bool checked);
@ -97,6 +102,12 @@ private:
void initAdvancedGroup(); // 初始化高级组 (新)
void initTimeSteppingGroup(); // 初始化时间步进组
void initNumericalSettingsGroup(); // 初始化数值设置组 (新)
/** @brief 初始化PEBI求解器设置组。 */
void initPebiSolverSettingsGroup();
/** @brief 根据求解器库更新加速参数控件状态。 */
void updatePebiSolverSettingEnabled();
/** @brief 将PEBI求解器设置保存到当前数据管理器。 */
void updatePebiSolverSettingsToData();
void setupConnections(); // 设置信号槽连接
void initButton(); // 初始化按钮
@ -177,6 +188,15 @@ private:
QRadioButton* m_pUseCustomSettingsRadio; // "使用自定义设置"单选按钮
QPushButton* m_pCustomSettingsIconButton; // "自定义设置"旁边的图标按钮
/** @brief PEBI求解器设置分组框。 */
QGroupBox* m_pPebiSolverSettingsGroup;
/** @brief 求解器库下拉框。 */
QComboBox* m_pPebiSolverTypeCombo;
/** @brief OpenMP线程数下拉框。 */
QComboBox* m_pPebiOmpThreadsCombo;
/** @brief ILU复用步数输入框。 */
QSpinBox* m_pPebiIluReuseStepsSpin;
// 按钮
QPushButton* m_pGenerateButton;
QPushButton* m_pAutomaticfittingBtn;

@ -313,7 +313,9 @@ nmCalculationDllPebiSolverTask::nmCalculationDllPebiSolverTask(
QObject *parent):
QThread(parent),
m_sPostprocessingDir(sPostprocessingDir),
m_lastRunSucceeded(false)
m_lastRunSucceeded(false),
m_nSolveTimeMs(-1),
m_nPebiCount(-1)
{
}
@ -327,6 +329,8 @@ nmCalculationDllPebiSolverTask::~nmCalculationDllPebiSolverTask()
void nmCalculationDllPebiSolverTask::run()
{
m_nSolveTimeMs = -1;
m_nPebiCount = -1;
m_lastRunSucceeded = this->execute();
emit sig_calculateDone(m_lastRunSucceeded);
}
@ -336,6 +340,16 @@ bool nmCalculationDllPebiSolverTask::wasSuccessful() const
return m_lastRunSucceeded;
}
int nmCalculationDllPebiSolverTask::getSolveTimeMs() const
{
return m_nSolveTimeMs;
}
int nmCalculationDllPebiSolverTask::getPebiCount() const
{
return m_nPebiCount;
}
void nmCalculationDllPebiSolverTask::setAutoFitTargetWell(const QString& wellName)
{
m_autoFitTargetWellName = wellName;
@ -377,9 +391,26 @@ bool nmCalculationDllPebiSolverTask::execPebiMode()
// 定义函数指针类型
typedef void (*HX_NWTM_GRID_Func)(HX_NWTM_GRID_OUTPUT1&, HX_NWTM_GRID_OUTPUT2&, const HX_NWTM_GRID_INPUT&, std::string);
typedef void (*HX_NWTM_MODEL_Fun)(HX_NWTM_MODEL_OUTPUT&, const HX_NWTM_MODEL_INPUT&, std::string);
typedef void (*SetIntValueFunc)(int);
typedef int (*GetIntValueFunc)();
// 获取函数地址
HX_NWTM_MODEL_Fun HX_NWTM_MODEL = (HX_NWTM_MODEL_Fun)GetProcAddress(dll, "HX_NWTM_MODEL");
SetIntValueFunc setSolverType = (SetIntValueFunc)GetProcAddress(dll, "set_solvetype");
SetIntValueFunc setOmpThreads = (SetIntValueFunc)GetProcAddress(dll, "set_omp_threads");
SetIntValueFunc setIluReuseSteps = (SetIntValueFunc)GetProcAddress(dll, "set_ilu_reuse_steps");
GetIntValueFunc getPebiCount = (GetIntValueFunc)GetProcAddress(dll, "getPEBInum");
GetIntValueFunc getSolveTime = (GetIntValueFunc)GetProcAddress(dll, "getsolvetime");
if(HX_NWTM_MODEL == nullptr || setSolverType == nullptr
|| setOmpThreads == nullptr || setIluReuseSteps == nullptr
|| getPebiCount == nullptr || getSolveTime == nullptr) {
QString sLogMessage = "Failed to resolve PEBI solver configuration interface.";
qWarning() << sLogMessage;
zxLogInstance::getInstance()->writeLogF(sLogMessage);
FreeLibrary(dll);
return false;
}
if(HX_NWTM_MODEL) {
if(pGridInstance->getGridOutput1().PEBI_cell.p.size() <= 0
@ -645,8 +676,22 @@ bool nmCalculationDllPebiSolverTask::execPebiMode()
nmDataAnalyzeManager* pDataManager = nmDataAnalyzeManager::getCurrentInstance();
QString licensePath = pDataManager->getLicensePath();
std::string licensePathStd = licensePath.toStdString();
int nSolverType = pDataManager->getPebiSolverType();
setSolverType(nSolverType);
if(nSolverType == nmDataAnalyzeManager::PebiSolverCpuAccelerated) {
setOmpThreads(pDataManager->getPebiOmpThreads());
setIluReuseSteps(pDataManager->getPebiIluReuseSteps());
}
HX_NWTM_MODEL(p1, p0, licensePathStd);
m_nPebiCount = getPebiCount();
m_nSolveTimeMs = getSolveTime();
if(m_autoFitTargetWellName.isEmpty()) {
QString sSolveLog = QString("PEBI count: %1, solve time: %2 ms")
.arg(m_nPebiCount).arg(m_nSolveTimeMs);
qDebug() << sSolveLog;
zxLogInstance::getInstance()->writeLogF(sSolveLog);
}
} catch(const std::exception& e) {
// 捕获 C++ 标准异常
qDebug() << QString("C++ Exception during HX_NWTM_MODEL call: %1").arg(e.what());

@ -1,4 +1,4 @@
#include "nmDataAnalyzeManager.h"
#include "nmDataAnalyzeManager.h"
#include "nmAttrRegistry.h"
@ -528,6 +528,9 @@ ZX_DEFINE_DYNAMIC(DataAnalyzeManager, nmDataAnalyzeManager)
m_pLayerData = new nmDataLayer;
m_eGridType = NM_Grid_Type::NM_Grid_PEBI; //默认网格类型为PEBI
m_eSolverModelType = NM_SOLVER_MODEL_TYPE::SMT_Oil_ConstPvt;
m_nPebiSolverType = PebiSolverCpuAccelerated;
m_nPebiOmpThreads = 4;
m_nPebiIluReuseSteps = 5;
this->initDefaultDisplaySettings();
// 初始化中英文翻译映射
nmTranslationManager::initTranslations();
@ -2732,6 +2735,43 @@ void nmDataAnalyzeManager::setSolverModelType(NM_SOLVER_MODEL_TYPE newSolverMode
m_eSolverModelType = newSolverModelType;
}
int nmDataAnalyzeManager::getPebiSolverType() const
{
return m_nPebiSolverType;
}
void nmDataAnalyzeManager::setPebiSolverType(int nSolverType)
{
if(nSolverType == PebiSolverCpuAccelerated || nSolverType == PebiSolverOriginal) {
m_nPebiSolverType = nSolverType;
}
}
int nmDataAnalyzeManager::getPebiOmpThreads() const
{
return m_nPebiOmpThreads;
}
void nmDataAnalyzeManager::setPebiOmpThreads(int nOmpThreads)
{
if(nOmpThreads == 1 || nOmpThreads == 2 || nOmpThreads == 4
|| nOmpThreads == 8 || nOmpThreads == 16) {
m_nPebiOmpThreads = nOmpThreads;
}
}
int nmDataAnalyzeManager::getPebiIluReuseSteps() const
{
return m_nPebiIluReuseSteps;
}
void nmDataAnalyzeManager::setPebiIluReuseSteps(int nIluReuseSteps)
{
if(nIluReuseSteps >= 1 && nIluReuseSteps <= 100) {
m_nPebiIluReuseSteps = nIluReuseSteps;
}
}
// 获取Pebi网格求解数据接口
// 获取压力历史数据
QVector<QVector<double>> nmDataAnalyzeManager::getPebiSolverHistoryDataByName(const QString & wellName)
@ -3767,6 +3807,15 @@ bool nmDataAnalyzeManager::ReadProjectData(const QString & filePath)
if(doc.HasMember("SolverModelType") && doc["SolverModelType"].IsInt()) {
m_eSolverModelType = static_cast<NM_SOLVER_MODEL_TYPE>(doc["SolverModelType"].GetInt());
}
if(doc.HasMember("PebiSolverType") && doc["PebiSolverType"].IsInt()) {
setPebiSolverType(doc["PebiSolverType"].GetInt());
}
if(doc.HasMember("PebiOmpThreads") && doc["PebiOmpThreads"].IsInt()) {
setPebiOmpThreads(doc["PebiOmpThreads"].GetInt());
}
if(doc.HasMember("PebiIluReuseSteps") && doc["PebiIluReuseSteps"].IsInt()) {
setPebiIluReuseSteps(doc["PebiIluReuseSteps"].GetInt());
}
return true;
}
@ -3993,6 +4042,9 @@ bool nmDataAnalyzeManager::WriteProjectData(const QString & filePath)
// 保存当前求解器模型类型
doc.AddMember("SolverModelType", static_cast<int>(m_eSolverModelType), allocator);
doc.AddMember("PebiSolverType", m_nPebiSolverType, allocator);
doc.AddMember("PebiOmpThreads", m_nPebiOmpThreads, allocator);
doc.AddMember("PebiIluReuseSteps", m_nPebiIluReuseSteps, allocator);
// 将最终构建好的 Document 写入文件
if(!nmDataJsonTools::WriteDomToFile(doc, filePath)) {

@ -2058,6 +2058,7 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed)
{
// 线程完成后清空两个持有点:当前窗口指针和全局运行中指针。
nmCalculationDllPebiSolverTask* pTask = qobject_cast<nmCalculationDllPebiSolverTask*>(sender());
int nSolveTimeMs = pTask != nullptr ? pTask->getSolveTimeMs() : -1;
if(pTask == m_pSolverTask) {
m_pSolverTask = nullptr;
}
@ -2068,6 +2069,11 @@ void nmSubWndMain::on_solverTaskFinished(bool isSuccessed)
// 保持旧流程不变bool结果转换为计算结果枚举再交给原来的统一后处理函数。
NM_Calculation_Result result = isSuccessed ? NM_Calculation_Result_Success : NM_Calculation_Result_Fail;
this->on_calculationFinished(result);
if(isSuccessed && nSolveTimeMs >= 0) {
QMessageBox::information(this, tr("Solver completed"),
tr("Solve time: %1 ms").arg(nSolveTimeMs));
}
}
void nmSubWndMain::deleteOneObj()

@ -1,10 +1,11 @@
#include "nmWxNumericalDesign.h"
#include "nmWxNumericalDesign.h"
#include <QScrollArea>
#include <QCoreApplication>
#include <QGroupBox>
#include <QCheckBox>
#include <QComboBox>
#include <QSpinBox>
#include <QRadioButton>
#include <QLineEdit>
#include <QVBoxLayout>
@ -99,6 +100,7 @@ nmWxNumericalDesign::nmWxNumericalDesign(QWidget *parent)
initAdvancedGroup(); // 初始化高级组 (新)
initTimeSteppingGroup(); // 初始化时间步进组
initNumericalSettingsGroup(); // 初始化数值设置组 (新)
initPebiSolverSettingsGroup(); // 初始化PEBI求解器设置组
initButton(); // 初始化生成按钮
// 将各个组添加到滚动区域的布局中
@ -109,6 +111,7 @@ nmWxNumericalDesign::nmWxNumericalDesign(QWidget *parent)
pScrollLayout->addWidget(m_pAdvancedGroup);
pScrollLayout->addWidget(m_pTimeSteppingGroup);
pScrollLayout->addWidget(m_pNumericalSettingsGroup); // 新的数值设置组
pScrollLayout->addWidget(m_pPebiSolverSettingsGroup);
pScrollLayout->addStretch(); // 添加拉伸器,使内容靠上
pScrollWidget->setLayout(pScrollLayout); // 设置滚动容器的布局
@ -688,6 +691,69 @@ void nmWxNumericalDesign::initNumericalSettingsGroup()
m_pNumericalSettingsGroup->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); // 设置尺寸策略
}
void nmWxNumericalDesign::initPebiSolverSettingsGroup()
{
m_pPebiSolverSettingsGroup = new QGroupBox(tr("Solver settings"), this);
QGridLayout* pGridLayout = new QGridLayout(m_pPebiSolverSettingsGroup);
QLabel* pSolverTypeLabel = new QLabel(tr("Solver library:"), this);
QLabel* pOmpThreadsLabel = new QLabel(tr("OpenMP threads:"), this);
QLabel* pIluReuseStepsLabel = new QLabel(tr("ILU reuse steps:"), this);
pSolverTypeLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
pOmpThreadsLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
pIluReuseStepsLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
m_pPebiSolverTypeCombo = new QComboBox(this);
m_pPebiSolverTypeCombo->addItem(tr("CPU accelerated solver"),
nmDataAnalyzeManager::PebiSolverCpuAccelerated);
m_pPebiSolverTypeCombo->addItem(tr("Original solver"),
nmDataAnalyzeManager::PebiSolverOriginal);
m_pPebiOmpThreadsCombo = new QComboBox(this);
m_pPebiOmpThreadsCombo->addItem("1", 1);
m_pPebiOmpThreadsCombo->addItem("2", 2);
m_pPebiOmpThreadsCombo->addItem("4", 4);
m_pPebiOmpThreadsCombo->addItem("8", 8);
m_pPebiOmpThreadsCombo->addItem("16", 16);
m_pPebiIluReuseStepsSpin = new QSpinBox(this);
m_pPebiIluReuseStepsSpin->setRange(1, 100);
pGridLayout->addWidget(pSolverTypeLabel, 0, 0);
pGridLayout->addWidget(m_pPebiSolverTypeCombo, 0, 1);
pGridLayout->addWidget(pOmpThreadsLabel, 1, 0);
pGridLayout->addWidget(m_pPebiOmpThreadsCombo, 1, 1);
pGridLayout->addWidget(pIluReuseStepsLabel, 2, 0);
pGridLayout->addWidget(m_pPebiIluReuseStepsSpin, 2, 1);
pGridLayout->setColumnStretch(0, 0);
pGridLayout->setColumnStretch(1, 1);
m_pPebiSolverSettingsGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
}
void nmWxNumericalDesign::updatePebiSolverSettingEnabled()
{
bool bAccelerationEnabled = m_pPebiSolverTypeCombo->itemData(
m_pPebiSolverTypeCombo->currentIndex()).toInt()
== nmDataAnalyzeManager::PebiSolverCpuAccelerated;
m_pPebiOmpThreadsCombo->setEnabled(bAccelerationEnabled);
m_pPebiIluReuseStepsSpin->setEnabled(bAccelerationEnabled);
}
void nmWxNumericalDesign::updatePebiSolverSettingsToData()
{
nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance();
if(pManager == nullptr) {
return;
}
pManager->setPebiSolverType(m_pPebiSolverTypeCombo->itemData(
m_pPebiSolverTypeCombo->currentIndex()).toInt());
pManager->setPebiOmpThreads(m_pPebiOmpThreadsCombo->itemData(
m_pPebiOmpThreadsCombo->currentIndex()).toInt());
pManager->setPebiIluReuseSteps(m_pPebiIluReuseStepsSpin->value());
}
void nmWxNumericalDesign::initButton()
{
@ -789,6 +855,29 @@ void nmWxNumericalDesign::setupConnections()
// "自定义设置"图标按钮的启用状态取决于"使用自定义设置"单选按钮
connect(m_pUseCustomSettingsRadio, SIGNAL(toggled(bool)), m_pCustomSettingsIconButton, SLOT(setEnabled(bool)));
connect(m_pCustomSettingsIconButton, SIGNAL(clicked()), this, SLOT(onCustomNumericalSettingsClicked())); // 图标按钮点击连接
// PEBI求解器设置组连接
connect(m_pPebiSolverTypeCombo, SIGNAL(currentIndexChanged(int)),
this, SLOT(onPebiSolverTypeChanged(int)));
connect(m_pPebiOmpThreadsCombo, SIGNAL(currentIndexChanged(int)),
this, SLOT(onPebiSolverSettingsChanged()));
connect(m_pPebiIluReuseStepsSpin, SIGNAL(valueChanged(int)),
this, SLOT(onPebiSolverSettingsChanged()));
}
void nmWxNumericalDesign::onPebiSolverTypeChanged(int index)
{
if(index < 0) {
return;
}
updatePebiSolverSettingEnabled();
updatePebiSolverSettingsToData();
}
void nmWxNumericalDesign::onPebiSolverSettingsChanged()
{
updatePebiSolverSettingsToData();
}
void nmWxNumericalDesign::onTimeDependentCheck(bool checked)
@ -1070,22 +1159,47 @@ void nmWxNumericalDesign::onOutputResultFieldsToggled(bool checked)
void nmWxNumericalDesign::updateUiFromData()
{
nmDataTimeStepSetting* pTimeStepSetting = nmDataAnalyzeManager::getCurrentInstance()->getTimeStep();
if(!pTimeStepSetting) {
nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance();
if(pManager == nullptr) {
return;
}
nmDataTimeStepSetting* pTimeStepSetting = pManager->getTimeStep();
// 使用组件的更新方法
if(m_pTimeGrowthExponentCom) {
if(pTimeStepSetting != nullptr && m_pTimeGrowthExponentCom) {
m_pTimeGrowthExponentCom->updateValueFromOrigin();
}
if(m_pDtMinCom) {
if(pTimeStepSetting != nullptr && m_pDtMinCom) {
m_pDtMinCom->updateValueFromOrigin();
}
if(m_pDtMaxCom) {
if(pTimeStepSetting != nullptr && m_pDtMaxCom) {
m_pDtMaxCom->updateValueFromOrigin();
}
m_pPebiSolverTypeCombo->blockSignals(true);
m_pPebiOmpThreadsCombo->blockSignals(true);
m_pPebiIluReuseStepsSpin->blockSignals(true);
int nSolverTypeIndex = m_pPebiSolverTypeCombo->findData(pManager->getPebiSolverType());
if(nSolverTypeIndex < 0) {
nSolverTypeIndex = m_pPebiSolverTypeCombo->findData(
nmDataAnalyzeManager::PebiSolverCpuAccelerated);
}
m_pPebiSolverTypeCombo->setCurrentIndex(nSolverTypeIndex);
int nOmpThreadsIndex = m_pPebiOmpThreadsCombo->findData(pManager->getPebiOmpThreads());
if(nOmpThreadsIndex < 0) {
nOmpThreadsIndex = m_pPebiOmpThreadsCombo->findData(4);
}
m_pPebiOmpThreadsCombo->setCurrentIndex(nOmpThreadsIndex);
m_pPebiIluReuseStepsSpin->setValue(pManager->getPebiIluReuseSteps());
m_pPebiSolverTypeCombo->blockSignals(false);
m_pPebiOmpThreadsCombo->blockSignals(false);
m_pPebiIluReuseStepsSpin->blockSignals(false);
updatePebiSolverSettingEnabled();
//// 阻塞信号
//m_pTimeGrowthExponentLineEdit->blockSignals(true);
//m_pDtMinLineEdit->blockSignals(true);
@ -1219,22 +1333,26 @@ void nmWxNumericalDesign::updateUiFromData()
void nmWxNumericalDesign::updateDataFromUi()
{
nmDataTimeStepSetting* pTimeStepSetting = nmDataAnalyzeManager::getCurrentInstance()->getTimeStep();
if(!pTimeStepSetting) {
nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance();
if(pManager == nullptr) {
return;
}
nmDataTimeStepSetting* pTimeStepSetting = pManager->getTimeStep();
// 使用组件的更新方法
if(m_pTimeGrowthExponentCom) {
if(pTimeStepSetting != nullptr && m_pTimeGrowthExponentCom) {
m_pTimeGrowthExponentCom->updateValueToOrigin();
}
if(m_pDtMinCom) {
if(pTimeStepSetting != nullptr && m_pDtMinCom) {
m_pDtMinCom->updateValueToOrigin();
}
if(m_pDtMaxCom) {
if(pTimeStepSetting != nullptr && m_pDtMaxCom) {
m_pDtMaxCom->updateValueToOrigin();
}
updatePebiSolverSettingsToData();
//// 更新数据模型
//pTimeStepSetting->getTimeGrowthExponent().setValue(m_pTimeGrowthExponentLineEdit->text().toDouble());
//pTimeStepSetting->getMinDeltaTAttribute().setValue(m_pDtMinLineEdit->text().toDouble());

Loading…
Cancel
Save