Hello,
I am running WOMBAT v0.9.2, and I am trying to represent a case in which there is a 100% operation reduction in my turbine for a failure without the need for a replacement (for example, if a turbine is shut down until it can be inspected if a particular sensor reading is received). I tried to represent this by setting replacement: False and operation_reduction: 1.0 for that type of failure in my turbine’s yaml configuration file.
I was surprised by the result: in the ‘trigger_request’ function, the operating level of my subassembly dropped to zero when this type of failure was encountered, which is what I was expecting. However, when the repair was completed, the operating level stayed at zero. I was expecting it to return to 100%. Instead it stayed broken for the whole simulation. This appears to be the result of special logic in the ‘register_repair_with_subassembly’ function, which reverts to starting operating level if the operation reduction is equal to 1. In my case, the starting operating level at the time of the repair was zero, so zero it stayed. Note that no previous failures had occurred on this subassembly, so as far as I could trace it back the starting level was zero simply due to this failure having occurred and shutting down the subassembly. I have pasted the relevant code below.
I can see from a previous example that 100% reductions for all types of failures are allowed, even non-replacements (https://www.nrel.gov/docs/fy23osti/83712.pdf). So I expect that there is something that I am fundamentally misunderstanding here, and would greatly appreciate it if someone could explain how the setup and logic is supposed to work for 100% reductions without replacement. Thank you.
if repair.details.replacement:
subassembly.operating_level = 1.0
_ = self.manager.purge_subassembly_requests(
repair.system_id, repair.subassembly_id
)
subassembly.recreate_processes()
elif operation_reduction == 1:
subassembly.operating_level = starting_operating_level
subassembly.broken.succeed()
elif operation_reduction == 0:
subassembly.operating_level = starting_operating_level
else:
subassembly.operating_level /= 1 - operation_reduction