99import numpy as np
1010
1111from pathsim .blocks .dynsys import DynamicalSystem
12-
12+ from pathsim . utils . register import Register
1313
1414# BLOCKS ================================================================================
1515
@@ -50,30 +50,35 @@ class ResidenceTime(DynamicalSystem):
5050
5151 def __init__ (self , tau = 1 , betas = None , gammas = None , initial_value = 0 , source_term = 0 ):
5252
53- #input validation
53+ # input validation
5454 if np .isclose (tau , 0 ):
5555 raise ValueError (f"'tau' must be nonzero but is { tau } " )
5656
57- #time constant and input/output weights
57+ # time constant and input/output weights
5858 self .tau = tau
5959 self .betas = 1 if betas is None else np .array (betas )
6060 self .gammas = 1 if gammas is None else np .array (gammas )
6161 self .source_term = source_term
6262
63- #rhs of residence time ode
63+ # rhs of residence time ode
6464 def _fn_d (x , u , t ):
6565 return - x / self .tau + self .source_term + sum (self .betas * u )
6666
67- #jacobian of rhs wrt x
67+ # jacobian of rhs wrt x
6868 def _jc_d (x , u , t ):
6969 return - 1 / self .tau
7070
71- #output function of residence time ode
71+ # output function of residence time ode
7272 def _fn_a (x , u , t ):
7373 return self .gammas * x
7474
75- #initialization just like `DynamicalSystem` block
76- super ().__init__ (func_dyn = _fn_d , jac_dyn = _jc_d , func_alg = _fn_a , initial_value = initial_value )
75+ # initialization just like `DynamicalSystem` block
76+ super ().__init__ (
77+ func_dyn = _fn_d ,
78+ jac_dyn = _jc_d ,
79+ func_alg = _fn_a ,
80+ initial_value = initial_value ,
81+ )
7782
7883
7984class Process (ResidenceTime ):
@@ -112,11 +117,11 @@ class Process(ResidenceTime):
112117 constant source term / generation term of the process
113118 """
114119
115- #max number of ports
116- _n_out_max = 2
117-
118- #maps for input and output port labels
119- _port_map_out = {"x" : 0 , "x/tau" : 1 }
120-
121120 def __init__ (self , tau = 1 , initial_value = 0 , source_term = 0 ):
122121 super ().__init__ (tau , 1 , [1 , 1 / tau ], initial_value , source_term )
122+
123+ # define output port maps based on fractions
124+ self .outputs = Register (
125+ size = 2 ,
126+ mapping = {"x" : 0 , "x/tau" : 1 }
127+ )
0 commit comments