FEMM/crates/femm-doc-mag/tests/roundtrip.rs

158 lines
3.8 KiB
Rust

use femm_doc_mag::FemmDoc;
const FIXTURE: &str = r#"[Format] = 4.0
[Frequency] = 60
[Precision] = 1e-08
[MinAngle] = 30
[DoSmartMesh] = 1
[Depth] = 1
[LengthUnits] = millimeters
[ProblemType] = planar
[Coordinates] = cartesian
[ACSolver] = 0
[PrevType] = 0
[PrevSoln] = ""
[Comment] = "two-coil planar magnetics"
[PointProps] = 1
<BeginPoint>
<PointName> = "A=0"
<I_re> = 0
<I_im> = 0
<A_re> = 0
<A_im> = 0
<EndPoint>
[BdryProps] = 1
<BeginBdry>
<BdryName> = "outer"
<BdryType> = 0
<A_0> = 0
<A_1> = 0
<A_2> = 0
<Phi> = 0
<c0> = 0
<c0i> = 0
<c1> = 0
<c1i> = 0
<Mu_ssd> = 0
<Sigma_ssd> = 0
<innerangle> = 0
<outerangle> = 0
<EndBdry>
[BlockProps] = 2
<BeginBlock>
<BlockName> = "Air"
<Mu_x> = 1
<Mu_y> = 1
<H_c> = 0
<H_cAngle> = 0
<J_re> = 0
<J_im> = 0
<Sigma> = 0
<d_lam> = 0
<Phi_h> = 0
<Phi_hx> = 0
<Phi_hy> = 0
<LamType> = 0
<LamFill> = 1
<NStrands> = 0
<WireD> = 0
<BHPoints> = 0
<EndBlock>
<BeginBlock>
<BlockName> = "Copper"
<Mu_x> = 1
<Mu_y> = 1
<H_c> = 0
<H_cAngle> = 0
<J_re> = 0
<J_im> = 0
<Sigma> = 58
<d_lam> = 0
<Phi_h> = 0
<Phi_hx> = 0
<Phi_hy> = 0
<LamType> = 0
<LamFill> = 1
<NStrands> = 0
<WireD> = 0
<BHPoints> = 0
<EndBlock>
[CircuitProps] = 1
<BeginCircuit>
<CircuitName> = "Coil"
<TotalAmps_re> = 100
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
[NumPoints] = 4
0 0 1 0
10 0 0 0
10 10 0 0
0 10 0 0
[NumSegments] = 4
0 1 -1 1 0 0
1 2 -1 1 0 0
2 3 -1 1 0 0
3 0 -1 1 0 0
[NumArcSegments] = 0
[NumHoles] = 0
[NumBlockLabels] = 1
5 5 2 0.1 1 0 0 100 0
"#;
#[test]
fn parses_fixture_geometry() {
let doc = FemmDoc::parse(FIXTURE).expect("parse");
assert_eq!(doc.frequency, 60.0);
assert_eq!(doc.nodes.len(), 4);
assert_eq!(doc.segments.len(), 4);
assert_eq!(doc.arcs.len(), 0);
assert_eq!(doc.block_labels.len(), 1);
assert_eq!(doc.materials.len(), 2);
assert_eq!(doc.boundaries.len(), 1);
assert_eq!(doc.points.len(), 1);
assert_eq!(doc.circuits.len(), 1);
assert_eq!(doc.nodes[0].boundary_marker, "A=0");
assert_eq!(doc.segments[0].boundary_marker, "outer");
assert_eq!(doc.block_labels[0].block_type, "Copper");
assert_eq!(doc.block_labels[0].in_circuit, "Coil");
}
#[test]
fn round_trips_parse_write_parse() {
let a = FemmDoc::parse(FIXTURE).expect("parse a");
let text = a.write();
let b = FemmDoc::parse(&text).expect("parse b");
assert_eq!(a.frequency, b.frequency);
assert_eq!(a.precision, b.precision);
assert_eq!(a.depth, b.depth);
assert_eq!(a.nodes.len(), b.nodes.len());
assert_eq!(a.segments.len(), b.segments.len());
assert_eq!(a.materials.len(), b.materials.len());
for (x, y) in a.nodes.iter().zip(b.nodes.iter()) {
assert!((x.x - y.x).abs() < 1e-12);
assert!((x.y - y.y).abs() < 1e-12);
assert_eq!(x.boundary_marker, y.boundary_marker);
}
for (x, y) in a.segments.iter().zip(b.segments.iter()) {
assert_eq!(x.n0, y.n0);
assert_eq!(x.n1, y.n1);
assert_eq!(x.boundary_marker, y.boundary_marker);
}
for (x, y) in a.materials.iter().zip(b.materials.iter()) {
assert_eq!(x.name, y.name);
assert!((x.mu_x - y.mu_x).abs() < 1e-12);
assert!((x.cduct - y.cduct).abs() < 1e-12);
}
assert_eq!(a.block_labels.len(), b.block_labels.len());
let la = &a.block_labels[0];
let lb = &b.block_labels[0];
assert!((la.x - lb.x).abs() < 1e-12);
assert_eq!(la.block_type, lb.block_type);
assert_eq!(la.in_circuit, lb.in_circuit);
assert_eq!(la.turns, lb.turns);
assert!((la.max_area - lb.max_area).abs() < 1e-10);
}