1use dune_raw::VarType;
5
6use crate::circuit::{Circuit, VarKind};
7use crate::engine::Engine;
8use crate::error::Error;
9use crate::options::Options;
10use crate::solution::Solution;
11
12#[derive(Clone, Debug)]
14pub struct Op {
15 pub solution: Solution,
16 pub notes: Vec<String>,
19}
20
21impl Circuit {
22 pub fn op(&self, opts: &Options) -> Result<Op, Error> {
24 let built = self.build(opts)?;
25 let notes = built.notes.clone();
26 let mut engine = Engine::new(built);
27 engine.op(opts)?;
28
29 let mut variables = Vec::new();
34 let mut columns = Vec::new();
35 for i in 1..engine.vars.len() {
36 let name = &engine.vars.names[i];
37 match engine.vars.kinds[i] {
38 VarKind::Node if crate::circuit::saved_node(name) => {
39 variables.push((format!("v({name})"), VarType::Voltage));
40 columns.push(vec![engine.sol[i]]);
41 }
42 VarKind::Branch => {
43 variables.push((format!("i({name})"), VarType::Current));
44 columns.push(vec![engine.sol[i]]);
45 }
46 _ => {}
47 }
48 }
49 Ok(Op {
50 solution: Solution {
51 plotname: "Operating Point".to_string(),
52 variables,
53 data: dune_raw::Data::Real(columns),
54 scale: None,
55 },
56 notes,
57 })
58 }
59}