use crate::BasicComponent;
use crate::Circuit;
use crate::ComponentRef;
use crate::ConnectionRef;
use crate::EquationRef;
use crate::NetRef;
use crate::TransientMatrix;
use crate::TransientVector;
pub struct Capacitor {
nets: Vec<NetRef>,
connections: Vec<ConnectionRef>,
equations: Vec<EquationRef>,
value: f64,
}
impl BasicComponent for Capacitor {
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.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_term(self.equations[3], self.connections[0]) = 1.0 / self.value;
}
fn updateTransient(
&mut self,
matrix: &mut TransientMatrix,
vector: &TransientVector,
t: f64,
step: f64,
) {
let dV1_dt = vector.voltage_derivative(self.nets[0]);
let dV2_dt = vector.voltage_derivative(self.nets[1]);
let dV_dt = dV1_dt - dV2_dt;
*matrix.constant_term(self.equations[2]) += step * dV_dt;
}
}
impl Capacitor {
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])
}
}