@@ -1092,3 +1092,70 @@ def wellfield_cost(result_cap_costs):
1092
1092
# Note this is not necessarily true for all cases, but generally would be expected,
1093
1093
# and is true for Fervo_Project_Cape-4 specifically.
1094
1094
)
1095
+
1096
+ def test_contingency (self ):
1097
+ def _get_result (
1098
+ contingency_percentage : Optional [int ] = None ,
1099
+ input_file_path : str = 'geophires_x_tests/generic-egs-case.txt' ,
1100
+ ) -> float :
1101
+ p = {}
1102
+
1103
+ if contingency_percentage is not None :
1104
+ p ['Contingency Percentage' ] = contingency_percentage
1105
+
1106
+ return (
1107
+ GeophiresXClient ()
1108
+ .get_geophires_result (
1109
+ ImmutableGeophiresInputParameters (
1110
+ from_file_path = self ._get_test_file_path (input_file_path ),
1111
+ params = p ,
1112
+ )
1113
+ )
1114
+ .result ['CAPITAL COSTS (M$)' ]
1115
+ )
1116
+
1117
+ def capex (result_cap_costs ):
1118
+ if result_cap_costs .get ('Total CAPEX' ) is not None :
1119
+ return result_cap_costs ['Total CAPEX' ]['value' ]
1120
+
1121
+ return result_cap_costs ['Total capital costs' ]['value' ]
1122
+
1123
+ default_contingency_percent = 15
1124
+ result_default = _get_result ()
1125
+
1126
+ self .assertEqual (
1127
+ # Test assumption check, update default_contingency_percent if GEOPHIRES default value is changed
1128
+ capex (result_default ),
1129
+ capex (_get_result (contingency_percentage = default_contingency_percent )),
1130
+ )
1131
+
1132
+ for higher_contingency in range (20 , 30 , 5 ):
1133
+ assert higher_contingency > default_contingency_percent # test assumption check
1134
+ result_higher_contingency = _get_result (contingency_percentage = higher_contingency )
1135
+
1136
+ self .assertGreater (
1137
+ capex (result_higher_contingency ),
1138
+ capex (result_default ),
1139
+ )
1140
+ self .assertEqual (
1141
+ # Contingency is not applied to drilling costs
1142
+ result_default ['Drilling and completion costs' ]['value' ],
1143
+ result_higher_contingency ['Drilling and completion costs' ]['value' ],
1144
+ )
1145
+
1146
+ default_contingency_factor = 1.0 - (default_contingency_percent / 100.0 )
1147
+ higher_contingency_factor = 1 + (higher_contingency / 100.0 )
1148
+ for cost_category in [
1149
+ 'Stimulation costs' ,
1150
+ 'Surface power plant costs' ,
1151
+ 'Field gathering system costs' ,
1152
+ 'Total surface equipment costs' ,
1153
+ 'Exploration costs' ,
1154
+ ]:
1155
+ self .assertAlmostEqualWithinPercentage (
1156
+ result_default [cost_category ]['value' ] * default_contingency_factor * higher_contingency_factor ,
1157
+ result_higher_contingency [cost_category ]['value' ],
1158
+ percent = min ( # Rounding throws off by a few percent
1159
+ 2.5 , (higher_contingency - default_contingency_percent ) / 2.0
1160
+ ),
1161
+ )
0 commit comments