use crate::BasicComponent;
use crate::Circuit;
use crate::ComponentRef;
use crate::ConnectionRef;
use crate::EquationRef;
use crate::NetRef;
use crate::TransientMatrix;
pub struct Resistor {
nets: Vec<NetRef>,
connections: Vec<ConnectionRef>,
equations: Vec<EquationRef>,
value: f64,
}
impl BasicComponent for Resistor {
fn initCircuit(
&mut self,
nets: Vec<NetRef>,
connections: Vec<ConnectionRef>,
equations: Vec<EquationRef>,
) {
self.nets = nets;
self.connections = connections;
self.equations = equations;
}
fn initTransient(&mut self, matrix: &mut TransientMatrix) {
matrix.clear_equation(self.equations[0]);
*matrix.current_term(self.equations[0], self.connections[0]) = 1.0;
*matrix.current_term(self.equations[0], self.connections[1]) = 1.0;
matrix.clear_equation(self.equations[1]);
*matrix.current_derivative_term(self.equations[1], self.connections[0]) = 1.0;
*matrix.current_derivative_term(self.equations[1], self.connections[1]) = 1.0;
matrix.clear_equation(self.equations[2]);
*matrix.voltage_term(self.equations[2], self.nets[0]) = 1.0;
*matrix.voltage_term(self.equations[2], self.nets[1]) = -1.0;
*matrix.current_term(self.equations[2], self.connections[0]) = self.value;
matrix.clear_equation(self.equations[3]);
*matrix.voltage_derivative_term(self.equations[3], self.nets[0]) = 1.0;
*matrix.voltage_derivative_term(self.equations[3], self.nets[1]) = -1.0;
*matrix.current_derivative_term(self.equations[3], self.connections[0]) = self.value;
}
}
impl Resistor {
pub fn create(circuit: &mut Circuit, net1: NetRef, net2: NetRef, value: f64) -> ComponentRef {
let component = Self {
nets: Vec::new(),
connections: Vec::new(),
equations: Vec::new(),
value: value,
};
circuit.createBasicComponent(Box::new(component), vec![net1, net2])
}
}