@@ -14,8 +14,11 @@ class BaseTermination:
1414 The value at which the event is triggered
1515 """
1616
17- def __init__ (self , value ):
17+ def __init__ (self , value , operator = None ):
1818 self .value = value
19+ if operator not in ["<" , ">" , None ]:
20+ raise ValueError (f"Invalid operator: { operator } " )
21+ self .operator = operator
1922
2023 def get_event (self , variables , step ):
2124 """
@@ -67,9 +70,19 @@ def get_event(self, variables, step):
6770 """
6871 See :meth:`BaseTermination.get_event`
6972 """
73+ operator = self .operator
74+ if operator == ">" :
75+ expr = self .value - variables ["Current [A]" ]
76+ event_string = f"Current [A] > { self .value } [A] [experiment]"
77+ elif operator == "<" :
78+ expr = variables ["Current [A]" ] - self .value
79+ event_string = f"Current [A] < { self .value } [A] [experiment]"
80+ else :
81+ expr = abs (variables ["Current [A]" ]) - self .value
82+ event_string = f"abs(Current [A]) < { self .value } [A] [experiment]"
7083 event = pybamm .Event (
71- "Current cut-off [A] [experiment]" ,
72- abs ( variables [ "Current [A]" ]) - self . value ,
84+ event_string ,
85+ expr ,
7386 )
7487 return event
7588
@@ -89,24 +102,48 @@ def get_event(self, variables, step):
89102 # figure out whether the voltage event is greater than the starting
90103 # voltage (charge) or less (discharge) and set the sign of the
91104 # event accordingly
92- direction = step .direction .capitalize ()
93- if direction == "Charge" :
105+ operator = self .operator
106+ if operator is None :
107+ direction = step .direction
108+ if direction == "charge" :
109+ operator = ">"
110+ elif direction == "discharge" :
111+ operator = "<"
112+ else :
113+ # No event for rest steps
114+ return None
115+
116+ if operator == ">" :
94117 sign = - 1
95- elif direction == "Discharge" :
118+ else :
119+ # operator can only be "<" or ">"
96120 sign = 1
97- elif direction == "Rest" :
98- # No event for rest steps
99- return None
100121
101122 # Event should be positive at initial conditions for both
102123 # charge and discharge
103124 event = pybamm .Event (
104- f"{ direction } voltage cut-off [V] [experiment]" ,
125+ f"Voltage { operator } { self . value } [V] [experiment]" ,
105126 sign * (variables ["Battery voltage [V]" ] - self .value ),
106127 )
107128 return event
108129
109130
131+ class Voltage :
132+ def __gt__ (self , value ):
133+ return VoltageTermination (value , operator = ">" )
134+
135+ def __lt__ (self , value ):
136+ return VoltageTermination (value , operator = "<" )
137+
138+
139+ class Current :
140+ def __gt__ (self , value ):
141+ return CurrentTermination (value , operator = ">" )
142+
143+ def __lt__ (self , value ):
144+ return CurrentTermination (value , operator = "<" )
145+
146+
110147class CustomTermination (BaseTermination ):
111148 """
112149 Define a custom termination event using a function. This can be used to create an
0 commit comments