WOMBAT - shut-down (i.e. 100% operation reduction) without replacement

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

Hi Heather,

Thanks for both identifying and inquiring about this behavior! It’s definitely not how it should operate. I was just digging into this in the code a bit more, and on first glance it seems that the servicing equipment may need a special case for handling when the operating level is 0, but not a replacement. This won’t be a quick or simple fix, but I’ll look into this a bit more over the next couple of weeks to see what I can do to patch this ASAP.

You’re more than welcome to open an issue on the GitHub: Issues · WISDEM/WOMBAT · GitHub, and I’ll be sure to keep you in the loop as I make progress.

Thanks very much! In the meantime, am I right in thinking that setting my operation_reduction to 0.9999 should give me essentially the right behaviour?

Yes, that will effectively give you the same result. The one note is that the failure and maintenance tasks for all the subassemblies will still be accruing time under the 99.999% operational reduction scenario, unlike in a 100% reduction scenario, so this may impact some of the results.