Skip to content

Does not converge optimal gas flow with complementarity constraints #5

Description

@Robbybp

I'm opening this issue per @amontoison's request.

Here's the matgas file:

gaslib40.m
function mgc = gaslib40

%% required global data
mgc.gas_specific_gravity         = 0.6     ; % dimensionless
mgc.specific_heat_capacity_ratio = 1.4     ; % dimensionless
mgc.temperature                  = 288.706 ; % K
mgc.compressibility_factor       = 1       ; % dimensionless
mgc.units                        = 'si'    ;
%% optional global data
mgc.is_per_unit        = 0     ;
mgc.base_length        = 1000  ; % m
mgc.base_pressure      = 1.0e6 ; % Pa
mgc.base_flow          = 100   ; % kg/s
mgc.economic_weighting = 0.1   ; % dimensionless

%% junction data
% id p_min p_max p_nominal junction_type status pipeline_name edi_id lat lon
mgc.junction = [
32 101325.0 8.101325e6 4.101325e6 0 1 '32.0' '32.0' 7.151456801 47.70262448
29 101325.0 8.101325e6 4.101325e6 0 1 '29.0' '29.0' 6.405925721 48.87915021
1  101325.0 8.101325e6 4.101325e6 0 1 '1.0'  '1.0'  8.462165532 48.68116719
24 101325.0 8.101325e6 4.101325e6 0 1 '24.0' '24.0' 6.985401049 48.99650392
12 101325.0 8.101325e6 4.101325e6 0 1 '12.0' '12.0' 7.444375531 46.93619913
20 101325.0 8.101325e6 4.101325e6 0 1 '20.0' '20.0' 6.732481162 48.45970144
4  101325.0 8.101325e6 4.101325e6 0 1 '4.0'  '4.0'  8.941170283 49.7403095 
2  101325.0 8.101325e6 4.101325e6 0 1 '2.0'  '2.0'  8.583339554 49.33348585
25 101325.0 8.101325e6 4.101325e6 0 1 '25.0' '25.0' 7.375377697 47.06334966
6  101325.0 8.101325e6 4.101325e6 0 1 '6.0'  '6.0'  7.175358607 48.44886966
23 101325.0 8.101325e6 4.101325e6 0 1 '23.0' '23.0' 6.704129879 47.04609847
22 101325.0 8.101325e6 4.101325e6 0 1 '22.0' '22.0' 7.391411724 47.03802643
11 101325.0 8.101325e6 4.101325e6 0 1 '11.0' '11.0' 8.421237101 48.69715728
35 101325.0 8.101325e6 4.101325e6 0 1 '35.0' '35.0' 7.060507549 47.33697273
13 101325.0 8.101325e6 4.101325e6 0 1 '13.0' '13.0' 7.445707841 48.52155545
27 101325.0 8.101325e6 4.101325e6 0 1 '27.0' '27.0' 6.682728687 47.71858108
31 101325.0 8.101325e6 4.101325e6 0 1 '31.0' '31.0' 6.970774678 48.88544272
5  101325.0 8.101325e6 4.101325e6 0 1 '5.0'  '5.0'  8.901176918 49.75682733
15 101325.0 8.101325e6 4.101325e6 0 1 '15.0' '15.0' 6.890115373 48.50659413
33 101325.0 8.101325e6 4.101325e6 0 1 '33.0' '33.0' 7.160019633 47.44368652
28 101325.0 8.101325e6 4.101325e6 0 1 '28.0' '28.0' 8.522974689 49.59906651
16 101325.0 8.101325e6 4.101325e6 0 1 '16.0' '16.0' 9.434658491 48.43337494
14 101325.0 8.101325e6 4.101325e6 0 1 '14.0' '14.0' 7.531026915 48.54893883
39 101325.0 8.101325e6 4.101325e6 0 1 '39.0' '39.0' 6.037965632 48.81954737
40 101325.0 8.101325e6 4.101325e6 0 1 '40.0' '40.0' 8.972793056 49.76190172
38 101325.0 8.101325e6 5.0e6      1 1 '38.0' '38.0' 6.837566076 48.9636071 
21 101325.0 8.101325e6 4.101325e6 0 1 '21.0' '21.0' 7.297282518 47.85672269
7  101325.0 8.101325e6 4.101325e6 0 1 '7.0'  '7.0'  6.076634313 48.81046104
34 101325.0 8.101325e6 4.101325e6 0 1 '34.0' '34.0' 7.012162287 47.32750791
8  101325.0 8.101325e6 4.101325e6 0 1 '8.0'  '8.0'  6.991006806 48.85701639
36 101325.0 8.101325e6 4.101325e6 0 1 '36.0' '36.0' 7.334321825 47.68491579
26 101325.0 8.101325e6 4.101325e6 0 1 '26.0' '26.0' 7.125950441 48.43944074
17 101325.0 8.101325e6 4.101325e6 0 1 '17.0' '17.0' 7.229303087 47.62325261
10 101325.0 8.101325e6 4.101325e6 0 1 '10.0' '10.0' 8.226777359 48.79746338
19 101325.0 8.101325e6 4.101325e6 0 1 '19.0' '19.0' 8.568217723 49.36328555
37 101325.0 8.101325e6 4.101325e6 0 1 '37.0' '37.0' 6.617232238 47.57618394
9  101325.0 8.101325e6 4.101325e6 0 1 '9.0'  '9.0'  6.556714558 46.91925127
18 101325.0 8.101325e6 4.101325e6 0 1 '18.0' '18.0' 6.646695907 47.48827194
30 101325.0 8.101325e6 4.101325e6 0 1 '30.0' '30.0' 6.482711455 48.68585213
3  101325.0 8.101325e6 4.101325e6 0 1 '3.0'  '3.0'  8.5225982   49.35375393
];

%% pipe data
% id fr_junction to_junction diameter length friction_factor p_min p_max status
mgc.pipe = [
32 10 2  0.8 65057.17427 0.002070376 0 1.0e8 1
29 28 5  1.0 32449.37205 0.001988785 0 1.0e8 1
1  38 31 1.0 13071.08523 0.001988785 0 1.0e8 1
24 20 15 1.0 12766.70341 0.001988785 0 1.0e8 1
12 1  16 0.8 76893.55076 0.002070376 0 1.0e8 1
20 15 30 0.8 36061.00987 0.002070376 0 1.0e8 1
4  26 8  0.8 47488.28385 0.002070376 0 1.0e8 1
2  32 21 0.6 20322.20543 0.002183191 0 1.0e8 1
25 30 7  0.8 32921.25982 0.002070376 0 1.0e8 1
6  34 23 0.8 39036.04181 0.002070376 0 1.0e8 1
23 6  13 1.0 21557.56619 0.001988785 0 1.0e8 1
22 30 20 0.8 31179.6191  0.002070376 0 1.0e8 1
11 35 33 0.4 14043.11354 0.002358537 0 1.0e8 1
35 14 10 0.8 58218.96955 0.002070376 0 1.0e8 1
13 33 17 0.6 20634.69827 0.002183191 0 1.0e8 1
27 19 3  0.8 3479.454666 0.001621777 0 1.0e8 1
5  34 35 0.6 3802.586677 0.002183191 0 1.0e8 1
31 10 11 1.0 18136.59729 0.001988785 0 1.0e8 1
15 17 36 0.6 10452.03118 0.002183191 0 1.0e8 1
33 10 3  0.8 65532.21271 0.002070376 0 1.0e8 1
28 4  5  1.0 3418.008251 0.001565017 0 1.0e8 1
16 31 24 0.8 12397.35216 0.002070376 0 1.0e8 1
14 17 32 0.6 10586.12947 0.002183191 0 1.0e8 1
39 27 32 0.6 35218.83909 0.002183191 0 1.0e8 1
21 30 29 0.8 22224.15325 0.002070376 0 1.0e8 1
38 37 18 0.6 10022.78298 0.002183191 0 1.0e8 1
7  35 25 0.4 38659.82436 0.002358537 0 1.0e8 1
34 13 14 1.0 6998.053779 0.001988785 0 1.0e8 1
8  23 9  0.6 18017.8496  0.002183191 0 1.0e8 1
36 26 27 0.8 86690.26557 0.002070376 0 1.0e8 1
26 4  19 0.8 49866.14839 0.002070376 0 1.0e8 1
17 36 21 0.6 19303.19202 0.002183191 0 1.0e8 1
10 22 12 0.4 12015.87483 0.002358537 0 1.0e8 1
19 26 15 1.0 18969.41271 0.001988785 0 1.0e8 1
37 27 37 0.6 16579.326   0.002183191 0 1.0e8 1
9  25 22 0.6 3067.54744  0.002183191 0 1.0e8 1
18 26 21 0.6 66036.59463 0.002183191 0 1.0e8 1
30 28 19 0.8 26427.48165 0.002070376 0 1.0e8 1
3  18 34 0.8 32868.20253 0.002070376 0 1.0e8 1
];

%% compressor data
% id fr_junction to_junction c_ratio_min c_ratio_max power_max flow_min flow_max inlet_p_min inlet_p_max outlet_p_min outlet_p_max status operating_cost
mgc.compressor = [
4 40 4  1 1.5 100000 0 1500 0 1.0e8 0 1.0e8 1 1
1 6  26 1 1.5 100000 0 1500 0 1.0e8 0 1.0e8 1 1
5 39 7  1 1.5 100000 0 1500 0 1.0e8 0 1.0e8 1 1
2 11 1  1 1.5 100000 0 1500 0 1.0e8 0 1.0e8 1 1
6 31 8  1 1.5 100000 0 1500 0 1.0e8 0 1.0e8 1 1
3 19 2  1 1.5 100000 0 1500 0 1.0e8 0 1.0e8 1 1
];

%% receipt data
% id junction_id injection_min injection_max injection_nominal is_dispatchable status offer_price
mgc.receipt = [
1  32 0 0           0 1 1 1   
2  29 0 0           0 1 1 1   
3  24 0 0           0 1 1 1   
4  12 0 0           0 1 1 1   
5  20 0 0           0 1 1 1   
6  25 0 0           0 1 1 1   
7  23 0 0           0 1 1 1   
8  22 0 0           0 1 1 1   
9  11 0 0           0 1 1 1   
10 35 0 0           0 1 1 1   
11 13 0 0           0 1 1 1   
12 27 0 0           0 1 1 1   
13 31 0 0           0 1 1 1   
14 15 0 0           0 1 1 1   
15 33 0 0           0 1 1 1   
16 28 0 0           0 1 1 1   
17 16 0 0           0 1 1 1   
18 14 0 0           0 1 1 1   
19 39 0 8.0902778   0 1 1 1   
20 40 0 158.0902778 0 1 1 1   
21 21 0 0           0 1 1 1   
22 34 0 0           0 1 1 1   
23 36 0 0           0 1 1 1   
24 26 0 0           0 1 1 1   
25 17 0 0           0 1 1 1   
26 10 0 0           0 1 1 1   
27 19 0 0           0 1 1 1   
28 37 0 0           0 1 1 1   
29 9  0 0           0 1 1 1   
30 18 0 0           0 1 1 1   
31 30 0 0           0 1 1 1   
32 38 0 1300        0 1 1 0.75
];

%% delivery data
% id junction_id withdrawal_min withdrawal_max withdrawal_nominal is_dispatchable status bid_price
mgc.delivery = [
1  32 0 16.35416667 0 1 1 3   
2  29 0 16.35416667 0 1 1 3   
3  24 0 16.35416667 0 1 1 3   
4  12 0 16.35416667 0 1 1 3   
5  20 0 36.35416667 0 1 1 3   
6  25 0 1.35416667  0 1 1 3   
7  23 0 16.35416667 0 1 1 3   
8  22 0 1.35416667  0 1 1 3   
9  11 0 16.35416667 0 1 1 3   
10 35 0 16.35416667 0 1 1 3   
11 13 0 16.35416667 0 1 1 3   
12 27 0 46.35416667 0 1 1 3   
13 31 0 16.35416667 0 1 1 3   
14 15 0 16.35416667 0 1 1 3   
15 33 0 36.35416667 0 1 1 3   
16 28 0 16.35416667 0 1 1 3   
17 16 0 36.35416667 0 1 1 3   
18 14 0 16.35416667 0 1 1 3   
19 39 0 0           0 1 1 3   
20 40 0 0           0 1 1 3   
21 21 0 24.35416667 0 1 1 3   
22 34 0 16.35416667 0 1 1 3   
23 36 0 16.35416667 0 1 1 3   
24 26 0 22.35416667 0 1 1 3   
25 17 0 16.35416667 0 1 1 3   
26 10 0 0           0 1 1 3   
27 19 0 45.35416667 0 1 1 3   
28 37 0 16.35416667 0 1 1 3   
29 9  0 43.35416667 0 1 1 3   
30 18 0 16.35416667 0 1 1 3   
31 30 0 105.3541667 0 1 1 3   
32 38 0 0           0 1 1 2.75
];

end

Here's the code:

import GasModels
import NLPModelsJuMP
import MadNCL
import MadNLPHSL
fpath = "gaslib40.m"
data = GasModels.parse_file(fpath)
gm = GasModels.instantiate_model(data, GasModels.CWPGasModel, GasModels.build_ogf)
nlp = NLPModelsJuMP.MathOptNLPModel(gm.model)
res = MadNCL.madncl(nlp; linear_solver = MadNLPHSL.Ma57Solver)

FWIW, I can solve this problem with a non-differentiable formulation (GasModels.WPGasModel) using SLP. I have not yet verified that this solution is also a solution for the complementarity formulation (although they should be equivalent).

Metadata

Metadata

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions