@@ -40,6 +40,7 @@ def __init__(self, problem_params, dtype_u=mesh, dtype_f=imex_mesh):
4040
4141 self .A = np .zeros ((2 , 2 ))
4242 self .t_switch = None
43+ self .count_switches = 0
4344
4445 def eval_f (self , u , t ):
4546 """
@@ -54,11 +55,21 @@ def eval_f(self, u, t):
5455 f = self .dtype_f (self .init , val = 0.0 )
5556 f .impl [:] = self .A .dot (u )
5657
57- if t >= self .t_switch if self .t_switch is not None else u [1 ] <= self .params .V_ref :
58- f .expl [0 ] = self .params .Vs / self .params .L
58+ if self .t_switch is not None :
59+ if t >= self .t_switch :
60+ f .expl [0 ] = self .params .Vs / self .params .L
61+ print ('Vs' )
62+ else :
63+ f .expl [0 ] = 0
64+ print ('C1' )
5965
6066 else :
61- f .expl [0 ] = 0
67+ if u [1 ] <= self .params .V_ref :
68+ f .expl [0 ] = self .params .Vs / self .params .L
69+ print ("Vs" )
70+ else :
71+ f .expl [0 ] = 0
72+ print ("C1" )
6273
6374 return f
6475
@@ -75,11 +86,17 @@ def solve_system(self, rhs, factor, u0, t):
7586 """
7687 self .A = np .zeros ((2 , 2 ))
7788
78- if t >= self .t_switch if self .t_switch is not None else rhs [1 ] <= self .params .V_ref :
79- self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
89+ if self .t_switch is not None :
90+ if t >= self .t_switch :
91+ self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
92+ else :
93+ self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
8094
8195 else :
82- self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
96+ if rhs [1 ] <= self .params .V_ref :
97+ self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
98+ else :
99+ self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
83100
84101 me = self .dtype_u (self .init )
85102 me [:] = np .linalg .solve (np .eye (self .params .nvars ) - factor * self .A , rhs )
@@ -102,6 +119,41 @@ def u_exact(self, t):
102119
103120 return me
104121
122+ def get_switching_info (self , u , t ):
123+ """
124+ Provides information about a discrete event for one subinterval.
125+ Args:
126+ u (dtype_u): current values
127+ t (float): current time
128+ Returns:
129+ switch_detected (bool): Indicates if a switch is found or not
130+ m_guess (np.int): Index of where the discrete event would found
131+ vC_switch (list): Contains function values of switching condition (for interpolation)
132+ """
133+
134+ switch_detected = False
135+ m_guess = - 100
136+
137+ for m in range (len (u )):
138+ if u [m ][1 ] - self .params .V_ref <= 0 :
139+ switch_detected = True
140+ m_guess = m - 1
141+ break
142+
143+ vC_switch = []
144+ if switch_detected :
145+ for m in range (1 , len (u )):
146+ vC_switch .append (u [m ][1 ] - self .params .V_ref )
147+
148+ return switch_detected , m_guess , vC_switch
149+
150+ def set_counter (self ):
151+ """
152+ Counts the number of switches found.
153+ """
154+
155+ self .count_switches += 1
156+
105157
106158class battery_implicit (ptype ):
107159 """
@@ -148,6 +200,7 @@ def __init__(self, problem_params, dtype_u=mesh, dtype_f=mesh):
148200
149201 self .A = np .zeros ((2 , 2 ))
150202 self .t_switch = None
203+ self .count_switches = 0
151204 self .newton_itercount = 0
152205 self .lin_itercount = 0
153206 self .newton_ncalls = 0
@@ -166,13 +219,21 @@ def eval_f(self, u, t):
166219 f = self .dtype_f (self .init , val = 0.0 )
167220 non_f = np .zeros (2 )
168221
169- if t >= self .t_switch if self .t_switch is not None else u [1 ] <= self .params .V_ref :
170- self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
171- non_f [0 ] = self .params .Vs / self .params .L
222+ if self .t_switch is not None :
223+ if t >= self .t_switch :
224+ self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
225+ non_f [0 ] = self .params .Vs / self .params .L
226+ else :
227+ self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
228+ non_f [0 ] = 0
172229
173230 else :
174- self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
175- non_f [0 ] = 0
231+ if u [1 ] <= self .params .V_ref :
232+ self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
233+ non_f [0 ] = self .params .Vs / self .params .L
234+ else :
235+ self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
236+ non_f [0 ] = 0
176237
177238 f [:] = self .A .dot (u ) + non_f
178239
@@ -194,13 +255,21 @@ def solve_system(self, rhs, factor, u0, t):
194255 non_f = np .zeros (2 )
195256 self .A = np .zeros ((2 , 2 ))
196257
197- if t >= self .t_switch if self .t_switch is not None else rhs [1 ] <= self .params .V_ref :
198- self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
199- non_f [0 ] = self .params .Vs / self .params .L
258+ if self .t_switch is not None :
259+ if t >= self .t_switch :
260+ self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
261+ non_f [0 ] = self .params .Vs / self .params .L
262+ else :
263+ self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
264+ non_f [0 ] = 0
200265
201266 else :
202- self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
203- non_f [0 ] = 0
267+ if rhs [1 ] <= self .params .V_ref :
268+ self .A [0 , 0 ] = - (self .params .Rs + self .params .R ) / self .params .L
269+ non_f [0 ] = self .params .Vs / self .params .L
270+ else :
271+ self .A [1 , 1 ] = - 1 / (self .params .C * self .params .R )
272+ non_f [0 ] = 0
204273
205274 # start newton iteration
206275 n = 0
@@ -256,3 +325,38 @@ def u_exact(self, t):
256325 me [1 ] = self .params .alpha * self .params .V_ref # vC
257326
258327 return me
328+
329+ def get_switching_info (self , u , t ):
330+ """
331+ Provides information about a discrete event for one subinterval.
332+ Args:
333+ u (dtype_u): current values
334+ t (float): current time
335+ Returns:
336+ switch_detected (bool): Indicates if a switch is found or not
337+ m_guess (np.int): Index of where the discrete event would found
338+ vC_switch (list): Contains function values of switching condition (for interpolation)
339+ """
340+
341+ switch_detected = False
342+ m_guess = - 100
343+
344+ for m in range (len (u )):
345+ if u [m ][1 ] - self .params .V_ref <= 0 :
346+ switch_detected = True
347+ m_guess = m - 1
348+ break
349+
350+ vC_switch = []
351+ if switch_detected :
352+ for m in range (1 , len (u )):
353+ vC_switch .append (u [m ][1 ] - self .params .V_ref )
354+
355+ return switch_detected , m_guess , vC_switch
356+
357+ def set_counter (self ):
358+ """
359+ Counts the number of switches found.
360+ """
361+
362+ self .count_switches += 1
0 commit comments