Some working examples

This commit is contained in:
jess 2026-05-13 12:48:33 -07:00
parent 520188a82a
commit b1b730c675
11 changed files with 1997 additions and 19 deletions

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="187.197 187.197 125.607 125.607">
<rect x="187.197" y="187.197" width="125.607" height="125.607" style="fill: rgb(104, 130, 123); stroke-width: 2px; stroke: rgb(120, 243, 170);" rx="33.33" ry="33.33"/>
<path style="fill: none; stroke-width: 3px; stroke: rgb(76, 247, 163);" d="M 267.414 191.748 C 287.978 217.88 234.233 213.185 229.814 214.986 C 201.101 226.692 238.888 240.451 281.606 229.868 C 287.794 228.335 284.504 222.336 281.048 217.762 C 272.02 205.818 191.632 237.63 226.51 250.339 C 245.307 257.188 296.968 248.288 282.949 244.063 C 274.365 241.475 251.953 238.682 241.404 242.412 C 219.932 250.003 210.62 260.79 225.934 272.681 C 235.524 280.127 274.512 278.646 281.927 270.619 C 284.9 267.401 283.617 264.742 276.191 262.884 C 270.879 261.554 245.625 262.668 238.742 264.343 C 213.302 270.53 208.195 295.643 225.613 291.339 C 291.43 275.075 295.727 299.849 257.003 301.554"/>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="183.197 183.154 133.607 133.693">
<rect x="187.197" y="187.197" width="125.607" height="125.607" style="stroke: rgb(0, 0, 0); fill: rgb(209, 255, 243); stroke-width: 5px;" rx="33.33" ry="33.33"/>
<path style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 5px;" d="M 269.418 187.154 C 292.826 217.066 231.649 211.692 226.619 213.754 C 193.936 227.154 236.948 242.903 285.572 230.789 C 292.616 229.033 288.871 222.168 284.937 216.932 C 274.661 203.259 183.158 239.674 222.858 254.222 C 244.254 262.062 303.058 251.873 287.101 247.038 C 277.33 244.076 251.819 240.879 239.812 245.149 C 215.371 253.837 204.771 266.185 222.203 279.797 C 233.119 288.319 277.497 286.624 285.938 277.437 C 289.322 273.753 287.862 270.709 279.408 268.582 C 273.363 267.059 244.617 268.335 236.782 270.251 C 207.824 277.334 202.011 306.08 221.837 301.153 C 296.755 282.536 301.646 310.895 257.568 312.847"/>
</svg>

Before

Width:  |  Height:  |  Size: 986 B

After

Width:  |  Height:  |  Size: 983 B

View File

@ -0,0 +1,423 @@
[Format] = 4.0
[Frequency] = 0
[Precision] = 1e-008
[MinAngle] = 30
[Depth] = 1.6000000000000001
[LengthUnits] = inches
[ProblemType] = planar
[Coordinates] = cartesian
[Comment] = "Add comments here."
[PointProps] = 0
[BdryProps] = 1
<BeginBdry>
<BdryName> = "A=0"
<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
<EndBdry>
[BlockProps] = 6
<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> = "J+"
<Mu_x> = 1
<Mu_y> = 1
<H_c> = 0
<H_cAngle> = 0
<J_re> = 4.2199999999999998
<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> = "J-"
<Mu_x> = 1
<Mu_y> = 1
<H_c> = 0
<H_cAngle> = 0
<J_re> = -4.2199999999999998
<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> = "Iron"
<Mu_x> = 2500
<Mu_y> = 2500
<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> = "M-19 Steel"
<Mu_x> = 4416
<Mu_y> = 4416
<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> = 13
0 0
0.29999999999999999 39.78875
0.80000000000000004 79.577500000000001
1.1200000000000001 159.155
1.3200000000000001 318.31
1.46 795.77499999999998
1.54 1591.55
1.6187499999999999 3376.6669999999999
1.74 7957.75
1.8700000000000001 15915.5
1.99 31831
2.0459640000000001 55102.040000000001
2.0800000000000001 79577.5
<EndBlock>
<BeginBlock>
<BlockName> = "18 AWG"
<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> = 3
<LamFill> = 1
<NStrands> = 1
<WireD> = 1.0239652968433499
<BHPoints> = 0
<EndBlock>
[CircuitProps] = 4
<BeginCircuit>
<CircuitName> = "i1"
<TotalAmps_re> = 6
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
<BeginCircuit>
<CircuitName> = "i2"
<TotalAmps_re> = 12
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
<BeginCircuit>
<CircuitName> = "i3"
<TotalAmps_re> = 6
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
<BeginCircuit>
<CircuitName> = "i4"
<TotalAmps_re> = 0
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
[NumPoints] = 102
0.92388000000000003 -0.382683 0 0
-0.92388000000000003 0.382683 0 0
1.020017 -0.20289399999999999 0 0
0.86472899999999997 -0.577793 0 0
0.86472800000000005 0.577793 0 0
1.020016 0.20289399999999999 0 0
0.20289399999999999 1.020017 0 0
0.577793 0.86472899999999997 0 0
-0.577793 0.86472800000000005 0 0
-0.20289399999999999 1.020016 0 0
-0.20289399999999999 -1.020017 0 0
-0.577793 -0.86472899999999997 0 0
0.577793 -0.86472800000000005 0 0
0.20289399999999999 -1.020016 0 0
-0.86472800000000005 -0.577793 0 0
-1.020016 -0.20289399999999999 0 0
-1.020017 0.20289399999999999 0 0
-0.86472899999999997 0.577793 0 0
1.9158710000000001 -0.57396899999999995 0 0
1.7605820000000001 -0.94886800000000004 0 0
1.7605820000000001 0.94886800000000004 0 0
1.91587 0.57396899999999995 0 0
0.57396899999999995 1.9158710000000001 0 0
0.94886800000000004 1.7605820000000001 0 0
-0.94886800000000004 1.7605820000000001 0 0
-0.57396899999999995 1.91587 0 0
-1.9158710000000001 0.57396899999999995 0 0
-1.7605820000000001 0.94886800000000004 0 0
-1.7605820000000001 -0.94886800000000004 0 0
-1.91587 -0.57396899999999995 0 0
-0.57396899999999995 -1.9158710000000001 0 0
-0.94886800000000004 -1.7605820000000001 0 0
0.94886800000000004 -1.7605820000000001 0 0
0.57396899999999995 -1.91587 0 0
2.217311 -0.91844000000000003 0 0
-2.217311 0.91844000000000003 0 0
0.55432800000000004 -0.22961000000000001 0 0
-0.55432800000000004 0.22961000000000001 0 0
1.3461909999999999 -0.016414999999999999 0 0
0.96350800000000003 -0.94029399999999996 0 0
1.9005190000000001 -0.24602499999999999 0 0
1.517835 -1.1699040000000001 0 0
1.232494 -0.29090500000000002 0 0
1.077205 -0.66580399999999995 0 0
1.786821 -0.52051499999999995 0 0
1.6315329999999999 -0.89541400000000004 0 0
0.96350800000000003 0.94029399999999996 0 0
1.517835 1.1699040000000001 0 0
1.3461909999999999 0.016414000000000002 0 0
1.9005190000000001 0.24602399999999999 0 0
1.077205 0.66580399999999995 0 0
1.2324930000000001 0.29090500000000002 0 0
1.6315329999999999 0.89541400000000004 0 0
1.786821 0.52051499999999995 0 0
0.016414999999999999 1.3461909999999999 0 0
0.24602499999999999 1.9005190000000001 0 0
0.94029399999999996 0.96350800000000003 0 0
1.1699040000000001 1.517835 0 0
0.29090500000000002 1.232494 0 0
0.66580399999999995 1.077205 0 0
0.52051499999999995 1.786821 0 0
0.89541400000000004 1.6315329999999999 0 0
-0.94029399999999996 0.96350800000000003 0 0
-1.1699040000000001 1.517835 0 0
-0.016414000000000002 1.3461909999999999 0 0
-0.24602399999999999 1.9005190000000001 0 0
-0.66580399999999995 1.077205 0 0
-0.29090500000000002 1.2324930000000001 0 0
-0.89541400000000004 1.6315329999999999 0 0
-0.52051499999999995 1.786821 0 0
-1.3461909999999999 0.016414999999999999 0 0
-1.9005190000000001 0.24602499999999999 0 0
-0.96350800000000003 0.94029399999999996 0 0
-1.517835 1.1699040000000001 0 0
-1.232494 0.29090500000000002 0 0
-1.077205 0.66580399999999995 0 0
-1.786821 0.52051499999999995 0 0
-1.6315329999999999 0.89541400000000004 0 0
-0.96350800000000003 -0.94029399999999996 0 0
-1.517835 -1.1699040000000001 0 0
-1.3461909999999999 -0.016414000000000002 0 0
-1.9005190000000001 -0.24602399999999999 0 0
-1.077205 -0.66580399999999995 0 0
-1.2324930000000001 -0.29090500000000002 0 0
-1.6315329999999999 -0.89541400000000004 0 0
-1.786821 -0.52051499999999995 0 0
-0.016414999999999999 -1.3461909999999999 0 0
-0.24602499999999999 -1.9005190000000001 0 0
-0.94029399999999996 -0.96350800000000003 0 0
-1.1699040000000001 -1.517835 0 0
-0.29090500000000002 -1.232494 0 0
-0.66580399999999995 -1.077205 0 0
-0.52051499999999995 -1.786821 0 0
-0.89541400000000004 -1.6315329999999999 0 0
0.94029399999999996 -0.96350800000000003 0 0
1.1699040000000001 -1.517835 0 0
0.016414000000000002 -1.3461909999999999 0 0
0.24602399999999999 -1.9005190000000001 0 0
0.66580399999999995 -1.077205 0 0
0.29090500000000002 -1.2324930000000001 0 0
0.89541400000000004 -1.6315329999999999 0 0
0.52051499999999995 -1.786821 0 0
[NumSegments] = 96
4 50 -1 0 0 0
50 52 -1 0 0 0
52 20 -1 0 0 0
5 51 -1 0 0 0
51 53 -1 0 0 0
53 21 -1 0 0 0
6 58 -1 0 0 0
58 60 -1 0 0 0
60 22 -1 0 0 0
7 59 -1 0 0 0
59 61 -1 0 0 0
61 23 -1 0 0 0
8 66 -1 0 0 0
66 68 -1 0 0 0
68 24 -1 0 0 0
9 67 -1 0 0 0
67 69 -1 0 0 0
69 25 -1 0 0 0
16 74 -1 0 0 0
74 76 -1 0 0 0
76 26 -1 0 0 0
17 75 -1 0 0 0
75 77 -1 0 0 0
77 27 -1 0 0 0
14 82 -1 0 0 0
82 84 -1 0 0 0
84 28 -1 0 0 0
15 83 -1 0 0 0
83 85 -1 0 0 0
85 29 -1 0 0 0
10 90 -1 0 0 0
90 92 -1 0 0 0
92 30 -1 0 0 0
11 91 -1 0 0 0
91 93 -1 0 0 0
93 31 -1 0 0 0
12 98 -1 0 0 0
98 100 -1 0 0 0
100 32 -1 0 0 0
13 99 -1 0 0 0
99 101 -1 0 0 0
101 33 -1 0 0 0
2 42 -1 0 0 0
3 43 -1 0 0 0
38 40 -1 0 0 0
39 41 -1 0 0 0
42 44 -1 0 0 0
43 45 -1 0 0 0
38 42 -1 0 0 0
43 39 -1 0 0 0
44 18 -1 0 0 0
45 19 -1 0 0 0
40 44 -1 0 0 0
45 41 -1 0 0 0
46 47 -1 0 0 0
48 49 -1 0 0 0
46 50 -1 0 0 0
51 48 -1 0 0 0
47 52 -1 0 0 0
53 49 -1 0 0 0
54 55 -1 0 0 0
56 57 -1 0 0 0
54 58 -1 0 0 0
59 56 -1 0 0 0
55 60 -1 0 0 0
61 57 -1 0 0 0
62 63 -1 0 0 0
64 65 -1 0 0 0
62 66 -1 0 0 0
67 64 -1 0 0 0
63 68 -1 0 0 0
69 65 -1 0 0 0
70 71 -1 0 0 0
72 73 -1 0 0 0
70 74 -1 0 0 0
75 72 -1 0 0 0
71 76 -1 0 0 0
77 73 -1 0 0 0
78 79 -1 0 0 0
80 81 -1 0 0 0
78 82 -1 0 0 0
83 80 -1 0 0 0
79 84 -1 0 0 0
85 81 -1 0 0 0
86 87 -1 0 0 0
88 89 -1 0 0 0
86 90 -1 0 0 0
91 88 -1 0 0 0
87 92 -1 0 0 0
93 89 -1 0 0 0
94 95 -1 0 0 0
96 97 -1 0 0 0
94 98 -1 0 0 0
99 96 -1 0 0 0
95 100 -1 0 0 0
101 97 -1 0 0 0
[NumArcSegments] = 22
0 1 180 2.5 0 0 0
1 0 180 2.5 0 0 0
5 4 22.5 2.5 0 0 0
7 6 22.5 2.5 0 0 0
9 8 22.5 2.5 0 0 0
15 14 22.5 2.5 0 0 0
11 10 22.5 2.5 0 0 0
13 12 22.5 2.5 0 0 0
3 2 22.5 2.5 0 0 0
17 16 22.5 2.5 0 0 0
26 29 33.355001000000001 2.5 0 0 0
28 31 33.355001000000001 2.5 0 0 0
30 33 33.355001000000001 2.5 0 0 0
20 23 33.355001000000001 2.5 0 0 0
22 25 33.355001000000001 2.5 0 0 0
24 27 33.355001000000001 2.5 0 0 0
34 35 180 2.5 1 0 0
35 34 180 2.5 1 0 0
36 37 180 2.5 0 0 0
37 36 180 2.5 0 0 0
32 19 33.355001000000001 2.5 0 0 0
18 21 33.355001000000001 2.5 0 0 0
[NumHoles] = 0
[NumBlockLabels] = 20
1.588257 -0.26821600000000001 6 0.050000000000000003 1 0 0 80 0
1.557868 0.28556700000000002 6 0.050000000000000003 1 0 0 80 0
0.29210599999999998 1.5675380000000001 6 0.050000000000000003 2 0 0 80 0
-0.28939399999999998 1.548629 6 0.050000000000000003 2 0 0 80 0
-1.5528869999999999 0.27521299999999999 6 0.050000000000000003 3 0 0 80 0
-1.5078469999999999 -0.29546299999999998 6 0.050000000000000003 3 0 0 80 0
-0.227434 -1.594325 6 0.050000000000000003 4 0 0 80 0
0.32859100000000002 -1.5323929999999999 6 0.050000000000000003 4 0 0 80 0
0.91271800000000003 -1.2980929999999999 6 0.050000000000000003 4 0 0 -80 0
1.2764260000000001 -0.864255 6 0.050000000000000003 1 0 0 -80 0
1.314986 0.92736799999999997 6 0.050000000000000003 1 0 0 -80 0
0.88563099999999995 1.354163 6 0.050000000000000003 2 0 0 -80 0
-0.89806699999999995 1.281201 6 0.050000000000000003 2 0 0 -80 0
-1.296489 0.89421300000000004 6 0.050000000000000003 3 0 0 -80 0
-1.2703770000000001 -0.92419799999999996 6 0.050000000000000003 3 0 0 -80 0
-0.83719500000000002 -1.3417539999999999 6 0.050000000000000003 4 0 0 -80 0
0.76536700000000002 1.8477589999999999 5 0.049999990000000001 0 0 0 1 0
0.28701300000000002 0.69291000000000003 5 0.049999990000000001 0 0 0 1 0
0 0 1 0.049999990000000001 0 0 0 1 0
1.362606 1.329777 1 0.050000000000000003 0 0 0 1 0

View File

@ -1,6 +1,7 @@
//! draws a FemmDoc on an iced canvas: nodes, segments, arcs, block labels, with pan/zoom and click-to-add.
use femm_doc_mag::FemmDoc;
use femm_doc_mag::ans::MagSolution;
use femm_doc_mag::mesh::Mesh;
use iced::widget::canvas::{
self, Action, Canvas, Event, Frame, Geometry, Path, Stroke, Text, path::Builder,
@ -23,6 +24,20 @@ const SELECT_COLOR: Color = Color::from_rgb(0.95, 0.20, 0.20);
const SELECT_STROKE: f32 = 2.4;
const MESH_COLOR: Color = Color::from_rgba(0.55, 0.55, 0.55, 0.55);
const MESH_STROKE: f32 = 0.5;
const FLUX_LINE_COLOR: Color = Color::from_rgba(0.0, 0.0, 0.0, 0.85);
const FLUX_LINE_STROKE: f32 = 0.6;
const BAND_COUNT: usize = 20;
const FLUX_LINE_COUNT: usize = 19;
/// field-plot mode applied on top of the FE solution.
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum RenderMode {
/// smooth |B| jet fill across every element.
Density,
/// 20-band |B| jet fill plus 19 iso-A flux lines.
#[default]
Contour,
}
/// active editing mode on the canvas.
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
@ -59,13 +74,15 @@ pub struct ViewState {
cursor_world: Option<(f64, f64)>,
}
/// constructs the canvas widget for a doc reference and an optional mesh overlay.
/// constructs the canvas widget for a doc reference, optional mesh overlay, and optional solution.
pub fn view<'a>(
doc: &'a FemmDoc,
tool: Tool,
mesh: Option<&'a Mesh>,
solution: Option<&'a MagSolution>,
render_mode: RenderMode,
) -> Element<'a, CanvasMessage> {
Canvas::new(DocCanvas { doc, tool, mesh })
Canvas::new(DocCanvas { doc, tool, mesh, solution, render_mode })
.width(Length::Fill)
.height(Length::Fill)
.into()
@ -75,6 +92,8 @@ struct DocCanvas<'a> {
doc: &'a FemmDoc,
tool: Tool,
mesh: Option<&'a Mesh>,
solution: Option<&'a MagSolution>,
render_mode: RenderMode,
}
impl<'a> canvas::Program<CanvasMessage> for DocCanvas<'a> {
@ -222,7 +241,55 @@ impl<'a> canvas::Program<CanvasMessage> for DocCanvas<'a> {
let view = ViewTransform::fit(self.doc, bounds, state);
if let Some(mesh) = self.mesh {
if let Some(sol) = self.solution {
let (lo, hi) = sol.b_magnitude_range();
let span = if hi > lo { hi - lo } else { 1.0 };
let banded = matches!(self.render_mode, RenderMode::Contour);
for i in 0..sol.mesh_elements.len() {
let el = &sol.mesh_elements[i];
let (Some(a), Some(b), Some(c)) = (
sol.mesh_nodes.get(el.n[0] as usize),
sol.mesh_nodes.get(el.n[1] as usize),
sol.mesh_nodes.get(el.n[2] as usize),
) else { continue };
let pa = view.map(a.x, a.y);
let pb = view.map(b.x, b.y);
let pc = view.map(c.x, c.y);
let t = ((sol.b_magnitude(i) - lo) / span).clamp(0.0, 1.0);
let t_mapped = if banded {
let band = (t * BAND_COUNT as f64).floor().min(BAND_COUNT as f64 - 1.0);
(band + 0.5) / BAND_COUNT as f64
} else {
t
};
let color = jet(t_mapped as f32);
let tri = Path::new(|p| {
p.move_to(pa);
p.line_to(pb);
p.line_to(pc);
p.close();
});
frame.fill(&tri, color);
}
if matches!(self.render_mode, RenderMode::Contour) {
let (a_lo, a_hi) = sol.a_real_range();
if a_hi > a_lo {
let mut levels = Vec::with_capacity(FLUX_LINE_COUNT);
let denom = (FLUX_LINE_COUNT + 1) as f64;
for k in 1..=FLUX_LINE_COUNT {
levels.push(a_lo + (a_hi - a_lo) * (k as f64) / denom);
}
let stroke = Stroke::default()
.with_width(FLUX_LINE_STROKE)
.with_color(FLUX_LINE_COLOR);
for (p0, p1) in sol.flux_lines(&levels) {
let a = view.map(p0.0, p0.1);
let b = view.map(p1.0, p1.1);
frame.stroke(&Path::line(a, b), stroke.clone());
}
}
}
} else if let Some(mesh) = self.mesh {
for el in &mesh.elements {
let (Some(a), Some(b), Some(c)) = (
mesh.nodes.get(el.v0 as usize),
@ -430,6 +497,25 @@ fn doc_bounds(doc: &FemmDoc) -> (f64, f64, f64, f64) {
(xmin, xmax, ymin, ymax)
}
/// maps a normalized t in [0, 1] onto the jet colormap (blue, cyan, green, yellow, red).
fn jet(t: f32) -> Color {
let t = t.clamp(0.0, 1.0);
let (r, g, b) = if t < 0.25 {
let s = t * 4.0;
(0.0, s, 1.0)
} else if t < 0.5 {
let s = (t - 0.25) * 4.0;
(0.0, 1.0, 1.0 - s)
} else if t < 0.75 {
let s = (t - 0.5) * 4.0;
(s, 1.0, 0.0)
} else {
let s = (t - 0.75) * 4.0;
(1.0, 1.0 - s, 0.0)
};
Color::from_rgb(r, g, b)
}
/// derives center, radius, and angular extent of an arc segment from its endpoints
/// and degree sweep. returns None when endpoints coincide.
fn arc_geometry(

View File

@ -2,7 +2,7 @@
mod doc_canvas;
use doc_canvas::{CanvasMessage, Tool};
use doc_canvas::{CanvasMessage, RenderMode, Tool};
use femm_doc_mag::FemmDoc;
use femm_doc_mag::ans::MagSolution;
use femm_doc_mag::mesh::Mesh;
@ -11,7 +11,7 @@ use iced::{Element, Length, Task};
use std::ffi::CString;
use std::path::Path;
const DEMO_FEM: &str = include_str!("../assets/demo.fem");
const DEMO_FEM: &str = include_str!("../assets/brgmodel.fem");
const ADD_TOLERANCE: f64 = 0.5;
const MIN_ANGLE_DEG: f64 = 30.0;
@ -22,6 +22,7 @@ enum Message {
Canvas(CanvasMessage),
RunMesh,
RunAnalyze,
SetRenderMode(RenderMode),
}
struct App {
@ -31,6 +32,7 @@ struct App {
source_label: String,
status: String,
tool: Tool,
render_mode: RenderMode,
}
impl App {
@ -40,9 +42,10 @@ impl App {
doc,
mesh: None,
solution: None,
source_label: String::from("demo.fem (embedded)"),
source_label: String::from("brgmodel.fem (embedded)"),
status: String::new(),
tool: Tool::Select,
render_mode: RenderMode::default(),
};
(app, Task::none())
}
@ -158,6 +161,9 @@ impl App {
toggle_closest(&mut self.doc, world.0, world.1);
self.status = String::from("toggled selection at right-click");
}
Message::SetRenderMode(mode) => {
self.render_mode = mode;
}
Message::Canvas(CanvasMessage::DeleteSelected) => {
let n = self.doc.delete_selected_nodes();
let s = self.doc.delete_selected_segments();
@ -193,13 +199,16 @@ impl App {
tool_button("Add Label", Tool::AddBlockLabel, self.tool),
button("Mesh").on_press(Message::RunMesh),
button("Analyze").on_press(Message::RunAnalyze),
render_mode_button("Density", RenderMode::Density, self.render_mode),
render_mode_button("Contour", RenderMode::Contour, self.render_mode),
text(&self.source_label).size(13),
stats,
]
.spacing(8);
let canvas = doc_canvas::view(&self.doc, self.tool, self.mesh.as_ref())
.map(Message::Canvas);
let canvas = doc_canvas::view(
&self.doc, self.tool, self.mesh.as_ref(), self.solution.as_ref(), self.render_mode,
).map(Message::Canvas);
let mut body = column![toolbar].spacing(8).padding(12);
body = body.push(canvas);
@ -229,6 +238,8 @@ fn run_mesh(doc: &FemmDoc) -> Result<Mesh, String> {
doc.save(&fem_path).map_err(|e| format!("save .fem: {e}"))?;
doc.save_poly(&poly_path).map_err(|e| format!("save .poly: {e}"))?;
let pbc_path = stem.with_extension("pbc");
std::fs::write(&pbc_path, "0\n0\n").map_err(|e| format!("save .pbc: {e}"))?;
let triangle = locate_triangle()
.ok_or_else(|| String::from("triangle binary not found at build/triangle/triangle - run scripts/macos/build_triangle.sh"))?;
@ -358,6 +369,16 @@ fn tool_button(label: &str, this_tool: Tool, active: Tool) -> Element<'_, Messag
}
}
/// builds a primary/secondary-styled button that switches the post-processor render mode.
fn render_mode_button(label: &str, this_mode: RenderMode, active: RenderMode) -> Element<'_, Message> {
let btn = button(text(label).size(13)).on_press(Message::SetRenderMode(this_mode));
if this_mode == active {
btn.style(button::primary).into()
} else {
btn.style(button::secondary).into()
}
}
fn main() -> iced::Result {
iced::application(App::new, App::update, App::view)
.title(App::title)

View File

@ -124,7 +124,7 @@ impl MagSolution {
block_circuits.push(parse_block_circuit_row(row, ac)?);
}
Ok(MagSolution {
let mut sol = MagSolution {
header,
points: doc.points,
boundaries: doc.boundaries,
@ -133,7 +133,9 @@ impl MagSolution {
mesh_nodes,
mesh_elements,
block_circuits,
})
};
sol.compute_b();
Ok(sol)
}
/// loads a .ans file from disk.
@ -141,6 +143,98 @@ impl MagSolution {
let text = std::fs::read_to_string(path)?;
Self::parse(&text)
}
/// fills b1/b2 on every element from the nodal vector-potential A via B = curl A.
/// linear triangle, constant B inside, signed by the doc's winding order.
pub fn compute_b(&mut self) {
for el in &mut self.mesh_elements {
let (Some(n0), Some(n1), Some(n2)) = (
self.mesh_nodes.get(el.n[0] as usize),
self.mesh_nodes.get(el.n[1] as usize),
self.mesh_nodes.get(el.n[2] as usize),
) else { continue };
let det = (n1.x - n0.x) * (n2.y - n0.y) - (n2.x - n0.x) * (n1.y - n0.y);
if det.abs() < 1e-18 { continue; }
let inv = 1.0 / det;
let a0 = n0.a; let a1 = n1.a; let a2 = n2.a;
// bx = dA/dy = (a0*(x2-x1) + a1*(x0-x2) + a2*(x1-x0)) / det
// by = -dA/dx = -(a0*(y1-y2) + a1*(y2-y0) + a2*(y0-y1)) / det
let bx_re = (a0.re * (n2.x - n1.x) + a1.re * (n0.x - n2.x) + a2.re * (n1.x - n0.x)) * inv;
let bx_im = (a0.im * (n2.x - n1.x) + a1.im * (n0.x - n2.x) + a2.im * (n1.x - n0.x)) * inv;
let by_re = -(a0.re * (n1.y - n2.y) + a1.re * (n2.y - n0.y) + a2.re * (n0.y - n1.y)) * inv;
let by_im = -(a0.im * (n1.y - n2.y) + a1.im * (n2.y - n0.y) + a2.im * (n0.y - n1.y)) * inv;
el.b1 = Complex::new(bx_re, bx_im);
el.b2 = Complex::new(by_re, by_im);
}
}
/// peak magnitude of B for one element, blending real and imag components.
pub fn b_magnitude(&self, idx: usize) -> f64 {
let el = &self.mesh_elements[idx];
(el.b1.re * el.b1.re + el.b1.im * el.b1.im
+ el.b2.re * el.b2.re + el.b2.im * el.b2.im).sqrt()
}
/// (min, max) of |B| across every element, skipping NaN.
pub fn b_magnitude_range(&self) -> (f64, f64) {
let mut lo = f64::INFINITY;
let mut hi = f64::NEG_INFINITY;
for i in 0..self.mesh_elements.len() {
let m = self.b_magnitude(i);
if !m.is_finite() { continue; }
if m < lo { lo = m; }
if m > hi { hi = m; }
}
if !lo.is_finite() || !hi.is_finite() { (0.0, 0.0) } else { (lo, hi) }
}
/// (min, max) of the real part of A across every node, skipping NaN.
pub fn a_real_range(&self) -> (f64, f64) {
let mut lo = f64::INFINITY;
let mut hi = f64::NEG_INFINITY;
for n in &self.mesh_nodes {
let a = n.a.re;
if !a.is_finite() { continue; }
if a < lo { lo = a; }
if a > hi { hi = a; }
}
if !lo.is_finite() || !hi.is_finite() { (0.0, 0.0) } else { (lo, hi) }
}
/// extracts iso-A line segments by marching across every triangle at each requested level.
pub fn flux_lines(&self, levels: &[f64]) -> Vec<((f64, f64), (f64, f64))> {
let mut out = Vec::with_capacity(levels.len() * self.mesh_elements.len() / 4);
for el in &self.mesh_elements {
let (Some(n0), Some(n1), Some(n2)) = (
self.mesh_nodes.get(el.n[0] as usize),
self.mesh_nodes.get(el.n[1] as usize),
self.mesh_nodes.get(el.n[2] as usize),
) else { continue };
let pts = [(n0.x, n0.y), (n1.x, n1.y), (n2.x, n2.y)];
let vals = [n0.a.re, n1.a.re, n2.a.re];
for &c in levels {
let mut hits: [(f64, f64); 2] = [(0.0, 0.0); 2];
let mut count = 0usize;
for (i, j) in [(0, 1), (1, 2), (2, 0)] {
let vi = vals[i] - c;
let vj = vals[j] - c;
if vi == 0.0 && vj == 0.0 { continue; }
if (vi > 0.0) == (vj > 0.0) { continue; }
let t = vi / (vi - vj);
let px = pts[i].0 + t * (pts[j].0 - pts[i].0);
let py = pts[i].1 + t * (pts[j].1 - pts[i].1);
if count < 2 {
hits[count] = (px, py);
}
count += 1;
}
if count == 2 {
out.push((hits[0], hits[1]));
}
}
}
out
}
}
/// splits the raw text on the `[Solution]` marker into a header chunk and a body chunk.
@ -389,13 +483,17 @@ mod tests {
}
#[test]
fn parses_element_indices_and_label_with_zero_b_field() {
fn parses_element_indices_and_label_with_computed_b_field() {
// first element spans nodes (0,0)/A=0, (1,0)/A=0.125, (0,1)/A=0.25.
// B = curl A on a linear triangle: bx = dA/dy = 0.25, by = -dA/dx = -0.125.
let sol = MagSolution::parse(DC_FIXTURE).unwrap();
let e0 = &sol.mesh_elements[0];
assert_eq!(e0.n, [0, 1, 2]);
assert_eq!(e0.lab, 0);
assert_eq!(e0.b1, Complex::new(0.0, 0.0));
assert_eq!(e0.b2, Complex::new(0.0, 0.0));
assert!((e0.b1.re - 0.25).abs() < 1e-12, "b1.re = {}", e0.b1.re);
assert!((e0.b2.re + 0.125).abs() < 1e-12, "b2.re = {}", e0.b2.re);
assert!(e0.b1.im.abs() < 1e-18);
assert!(e0.b2.im.abs() < 1e-18);
assert_eq!(e0.mu1, Complex::new(0.0, 0.0));
assert_eq!(e0.mu2, Complex::new(0.0, 0.0));
}

View File

@ -1,8 +1,16 @@
//! .poly emitter consumed by the Triangle mesher.
use crate::FemmDoc;
use crate::{FemmDoc, geom_math::circle_from_arc};
use std::fmt::Write;
/// rounds an arc's chord-angle ceiling, defaulting to a single segment when max_side_length is non-positive.
fn arc_subdivisions(arc_length_deg: f64, max_side_length_deg: f64) -> usize {
if max_side_length_deg <= 0.0 || arc_length_deg <= 0.0 {
return 1;
}
(arc_length_deg / max_side_length_deg).ceil().max(1.0) as usize
}
impl FemmDoc {
/// renders the doc geometry to the Triangle .poly text format, returning the file contents.
pub fn write_poly(&self) -> String {
@ -10,17 +18,64 @@ impl FemmDoc {
let bbox_diag = self.bbox_diagonal();
let default_area = if bbox_diag > 0.0 { bbox_diag } else { -1.0 };
writeln!(out, "{}\t2\t0\t1", self.nodes.len()).unwrap();
let mut extra_nodes: Vec<(f64, f64)> = Vec::new();
let mut arc_segments: Vec<(i32, i32, i32)> = Vec::new();
let base_node_count = self.nodes.len() as i32;
for a in &self.arcs {
let p0 = (self.nodes[a.n0 as usize].x, self.nodes[a.n0 as usize].y);
let p1 = (self.nodes[a.n1 as usize].x, self.nodes[a.n1 as usize].y);
let k = arc_subdivisions(a.arc_length, a.max_side_length);
let marker = -boundary_marker_index(self, &a.boundary_marker);
if k <= 1 {
arc_segments.push((a.n0, a.n1, marker));
continue;
}
let (cx, cy, _r) = circle_from_arc(p0, p1, a.arc_length);
let step_rad = a.arc_length.to_radians() / (k as f64);
let (cos_s, sin_s) = (step_rad.cos(), step_rad.sin());
let mut px = p0.0;
let mut py = p0.1;
let mut prev_idx = a.n0;
for j in 0..k {
let dx = px - cx;
let dy = py - cy;
let rx = dx * cos_s - dy * sin_s;
let ry = dx * sin_s + dy * cos_s;
px = cx + rx;
py = cy + ry;
let next_idx = if j == k - 1 {
a.n1
} else {
let idx = base_node_count + extra_nodes.len() as i32;
extra_nodes.push((px, py));
idx
};
arc_segments.push((prev_idx, next_idx, marker));
prev_idx = next_idx;
}
}
let total_nodes = self.nodes.len() + extra_nodes.len();
writeln!(out, "{}\t2\t0\t1", total_nodes).unwrap();
for (i, n) in self.nodes.iter().enumerate() {
let marker = point_marker_index(self, &n.boundary_marker);
writeln!(out, "{i}\t{:.17e}\t{:.17e}\t{marker}", n.x, n.y).unwrap();
}
for (j, (x, y)) in extra_nodes.iter().enumerate() {
let i = self.nodes.len() + j;
writeln!(out, "{i}\t{:.17e}\t{:.17e}\t0", x, y).unwrap();
}
writeln!(out, "{}\t1", self.segments.len()).unwrap();
let total_segments = self.segments.len() + arc_segments.len();
writeln!(out, "{}\t1", total_segments).unwrap();
for (i, s) in self.segments.iter().enumerate() {
let marker = -boundary_marker_index(self, &s.boundary_marker);
writeln!(out, "{i}\t{}\t{}\t{marker}", s.n0, s.n1).unwrap();
}
for (j, (n0, n1, marker)) in arc_segments.iter().enumerate() {
let i = self.segments.len() + j;
writeln!(out, "{i}\t{}\t{}\t{marker}", n0, n1).unwrap();
}
let holes: Vec<&_> = self.block_labels.iter().filter(|b| b.block_type == "<No Mesh>").collect();
writeln!(out, "{}", holes.len()).unwrap();

View File

@ -0,0 +1,343 @@
[Format] = 4.0
[Frequency] = 0
[Precision] = 1e-008
[MinAngle] = 30
[Depth] = 45
[LengthUnits] = millimeters
[ProblemType] = planar
[Coordinates] = cartesian
[ACSolver] = 0
[Comment] = "Add comments here."
[PointProps] = 0
[BdryProps] = 1
<BeginBdry>
<BdryName> = "A=0"
<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
<EndBdry>
[BlockProps] = 6
<BeginBlock>
<BlockName> = "NdFeB 40 MGOe"
<Mu_x> = 1.0489999999999999
<Mu_y> = 1.0489999999999999
<H_c> = 979000
<H_cAngle> = 0
<J_re> = 0
<J_im> = 0
<Sigma> = 0.66700000000000004
<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> = "NdFeB 32 MGOe"
<Mu_x> = 1.0449999999999999
<Mu_y> = 1.0449999999999999
<H_c> = 883310
<H_cAngle> = 0
<J_re> = 0
<J_im> = 0
<Sigma> = 0.69399999999999995
<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> = "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> = "M-19 Steel"
<Mu_x> = 4416
<Mu_y> = 4416
<H_c> = 0
<H_cAngle> = 0
<J_re> = 0
<J_im> = 0
<Sigma> = 1.8999999999999999
<d_lam> = 0.63500000000000001
<Phi_h> = 0
<Phi_hx> = 0
<Phi_hy> = 0
<LamType> = 0
<LamFill> = 0.97999999999999998
<NStrands> = 0
<WireD> = 0
<BHPoints> = 47
0 0
0.050000000000000003 15.120714
0.10000000000000001 22.718292000000002
0.14999999999999999 27.842732999999999
0.20000000000000001 31.871434000000001
0.25 35.365043999999997
0.29999999999999999 38.600588000000002
0.34999999999999998 41.736201999999999
0.40000000000000002 44.873978999999999
0.45000000000000001 48.087806999999998
0.5 51.437235999999999
0.55000000000000004 54.975220999999998
0.59999999999999998 58.752992999999996
0.65000000000000002 62.823644000000002
0.69999999999999996 67.245284999999996
0.75 72.084406000000001
0.80000000000000004 77.420100000000005
0.84999999999999998 83.350020999999998
0.90000000000000002 89.999611999999999
0.94999999999999996 97.537352999999996
1 106.20140600000001
1.05 116.34846400000001
1.1000000000000001 128.54732899999999
1.1499999999999999 143.76543100000001
1.2 163.75416899999999
1.25 191.86815799999999
1.3 234.833507
1.3500000000000001 306.50976900000001
1.3999999999999999 435.255202
1.45 674.911968
1.5 1108.3255690000001
1.55 1813.085468
1.6000000000000001 2801.2174209999998
1.6499999999999999 4053.6531169999998
1.7 5591.10689
1.75 7448.318413
1.8 9708.81567
1.8500000000000001 12486.931615
1.8999999999999999 16041.483644
1.95 21249.420623999998
2 31313.495878000002
2.0499999999999998 53589.446877000002
2.1000000000000001 88477.484601000004
2.1499999999999999 124329.41054
2.2000000000000002 159968.5693
2.25 197751.604272
2.2999999999999998 234024.75134700001
<EndBlock>
<BeginBlock>
<BlockName> = "Winding"
<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> = 4
<LamFill> = 1
<NStrands> = 10
<WireD> = 0.51056327271548796
<BHPoints> = 0
<EndBlock>
<BeginBlock>
<BlockName> = "LinearIron"
<Mu_x> = 5000
<Mu_y> = 5000
<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>
[CircuitProps] = 1
<BeginCircuit>
<CircuitName> = "icoil"
<TotalAmps_re> = 0
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
[NumPoints] = 66
18.015650883970093 7.4623269311192511 0 0
13.788582233137674 13.788582233137678 0 0
13.788582233137678 -13.788582233137674 0 0
18.015650883970093 -7.4623269311192475 0 0
-18.015650883970093 -7.4623269311192493 0 0
-13.788582233137676 -13.788582233137676 0 0
-13.788582233137676 13.788582233137676 0 0
-18.015650883970093 7.4623269311192493 0 0
10 2.5 0 0
-10 2.5 0 0
10 -2.5 0 0
-10 -2.5 0 0
-10.589003802626873 2.5 0 0
10.589003802626873 2.5 0 0
10.589003802626875 -2.5 0 0
-10.589003802626877 -2.5 0 0
-4.3770538240280175 7.5 0 0
4.377053824028013 7.5 0 0
4.3770538240280219 -7.5 0 0
-4.377053824028021 -7.5 0 0
19.615705608064609 -3.9018064403225647 0 0
19.615705608064609 3.9018064403225656 0 0
16.629392246050905 11.111404660392044 0 0
11.111404660392044 16.629392246050905 0 0
3.9018064403225661 19.615705608064609 0 0
-3.9018064403225647 19.615705608064609 0 0
-11.111404660392044 16.629392246050905 0 0
-16.629392246050905 11.111404660392044 0 0
-19.615705608064609 3.901806440322567 0 0
-19.615705608064609 -3.901806440322563 0 0
-16.629392246050909 -11.111404660392042 0 0
-11.111404660392047 -16.629392246050905 0 0
-3.9018064403225683 -19.615705608064609 0 0
3.9018064403225621 -19.615705608064609 0 0
11.11140466039204 -16.629392246050909 0 0
16.629392246050905 -11.111404660392049 0 0
30 0 0 0
-30 0 0 0
24.693641013472625 3.9018064403225656 0 0
24.693641013472625 -3.9018064403225647 0 0
14.702047219983314 20.220034805642172 0 0
20.220034805642172 14.702047219983314 0 0
-3.9018064403225643 24.693641013472625 0 0
3.9018064403225661 24.693641013472625 0 0
-20.220034805642172 14.702047219983314 0 0
-14.702047219983314 20.220034805642172 0 0
-24.693641013472625 -3.9018064403225625 0 0
-24.693641013472625 3.9018064403225678 0 0
-14.702047219983317 -20.220034805642172 0 0
-20.220034805642175 -14.702047219983312 0 0
3.9018064403225612 -24.693641013472625 0 0
-3.9018064403225692 -24.693641013472625 0 0
20.220034805642172 -14.702047219983317 0 0
14.702047219983308 -20.220034805642175 0 0
-10 11.257132516954488 0 0
10 11.257132516954492 0 0
-10 -11.257132516954488 0 0
10 -11.257132516954492 0 0
-10 12 0 0
-6 16 0 0
6 16 0 0
10 12 0 0
-6 -16 0 0
-10 -12 0 0
10 -12 0 0
6 -16 0 0
[NumSegments] = 44
7 12 -1 0 0 0
4 15 -1 0 0 0
13 0 -1 0 0 0
12 9 -1 0 0 0
9 8 -1 0 0 0
8 13 -1 0 0 0
14 3 -1 0 0 0
15 11 -1 0 0 0
11 10 -1 0 0 0
10 14 -1 0 0 0
9 11 -1 0 0 0
8 10 -1 0 0 0
16 17 -1 0 0 0
19 18 -1 0 0 0
21 38 -1 0 0 1
20 39 -1 0 0 1
23 40 -1 0 0 1
22 41 -1 0 0 1
25 42 -1 0 0 1
24 43 -1 0 0 1
27 44 -1 0 0 1
26 45 -1 0 0 1
29 46 -1 0 0 1
28 47 -1 0 0 1
31 48 -1 0 0 1
30 49 -1 0 0 1
33 50 -1 0 0 1
32 51 -1 0 0 1
35 52 -1 0 0 1
34 53 -1 0 0 1
6 54 -1 0 0 0
17 55 -1 0 0 0
5 56 -1 0 0 0
56 19 -1 0 0 0
18 57 -1 0 0 0
57 2 -1 0 0 0
54 16 -1 0 0 0
55 1 -1 0 0 0
58 54 -1 0 0 0
59 60 -1 0 0 0
61 55 -1 0 0 0
62 65 -1 0 0 0
63 56 -1 0 0 0
64 57 -1 0 0 0
[NumArcSegments] = 26
0 1 22.5 1 0 0 0
2 3 22.5 1 0 0 0
4 5 22.5 1 0 0 0
6 7 22.5 1 0 0 0
20 21 22.5 1 0 0 1
22 23 22.5 1 0 0 1
24 25 22.5 1 0 0 1
26 27 22.5 1 0 0 1
28 29 22.5 1 0 0 1
30 31 22.5 1 0 0 1
32 33 22.5 1 0 0 1
34 35 22.5 1 0 0 1
36 37 180 1 1 0 1
37 36 180 1 1 0 1
46 49 27.042022070815477 1 0 0 1
48 51 27.042022070815467 1 0 0 1
50 53 27.042022070815449 1 0 0 1
52 39 27.04202207081547 1 0 0 1
38 41 27.042022070815477 1 0 0 1
40 43 27.04202207081547 1 0 0 1
42 45 27.042022070815456 1 0 0 1
44 47 27.042022070815452 1 0 0 1
59 58 90 10 0 0 0
61 60 90 10 0 0 0
63 62 90 10 0 0 0
65 64 90 10 0 0 0
[NumHoles] = 0
[NumBlockLabels] = 7
10.699999999999999 -6.5999999999999996 6 2 0 0 0 1 0
10.699999999999999 6.9000000000000004 6 2 0 0 0 1 0
17.199999999999999 18 6 2 0 0 1 1 0
-0.40000000000000002 -0.10000000000000001 1 2 0 90 0 1 0
15.1 0.90000000000000002 3 2 0 0 0 1 0
-1.1000000000000001 10.800000000000001 5 -1 1 0 0 40 0
-1 -11.300000000000001 5 -1 1 0 0 -40 0

View File

@ -0,0 +1,41 @@
open("LinearNew.fem");
mi_analyze();
mi_loadsolution();
-- Turn off smoothing so that mo_getpointvalues will return the
-- "raw" piece-wise constant values for flux density and field intensity
mo_smooth("off");
-- Grab the total number of elements in the problem;
numelm = mo_numelements();
-- Call mo_getprobleminfo to grab the depth of the problem in th
-- into-the-page direction, which we need for computing volume integrals.
-- Note that the problem depth is always returned in units of meters.
problemtype,freq,depth=mo_getprobleminfo()
-- Loop through all elements to evaluate the stored energy in all regions
-- denoted as being part of Group 1.
nrg = 0;
for k=1,numelm do
p1,p2,p3,x,y,a,g=mo_getelement(k);
if (g == 1) then
-- Compute element volume.
dv = depth*a*mm^2;
-- Evaluate properties at element centroid
a,bx,by,Sig,E,hx,hy = mo_getpointvalues(x,y);
-- Compute the contribution of this element to the integral
nrg = nrg + (1/2)*(bx*hx+by*hy)*dv;
end
end
-- For comparison, directly select Group 1 and perform the integral using
-- the built-in function
mo_groupselectblock(1);
altnrg = mo_blockintegral(2);
-- Print out results
print("Energy in group 1 computed by manual integral ",nrg);
print("Energy in group 1 computed by canned integral ",altnrg);

258
examples/PMExample.fem Normal file
View File

@ -0,0 +1,258 @@
[Format] = 4.0
[Frequency] = 0
[Precision] = 1e-008
[MinAngle] = 30
[DoSmartMesh] = 1
[Depth] = 2
[LengthUnits] = inches
[ProblemType] = planar
[Coordinates] = cartesian
[ACSolver] = 0
[PrevType] = 0
[PrevSoln] = ""
[Comment] = "Add comments here."
[PointProps] = 0
[BdryProps] = 1
<BeginBdry>
<BdryName> = "A=0"
<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] = 9
<BeginBlock>
<BlockName> = "u1"
<Mu_x> = 2.6498996896116669
<Mu_y> = 2.6498996896116669
<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> = "u2"
<Mu_x> = 0.12953316809300527
<Mu_y> = 0.12953316809300527
<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> = "u3"
<Mu_x> = 14.398967120915913
<Mu_y> = 14.398967120915913
<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> = "u4"
<Mu_x> = 0.042882574356338271
<Mu_y> = 0.042882574356338271
<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> = "u5"
<Mu_x> = 37.197476986533054
<Mu_y> = 37.197476986533054
<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> = "u6"
<Mu_x> = 0.015664246064106369
<Mu_y> = 0.015664246064106369
<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> = "u7"
<Mu_x> = 142.03015659052124
<Mu_y> = 142.03015659052124
<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> = "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> = "N42"
<Mu_x> = 1.05
<Mu_y> = 1.05
<H_c> = 1006582.16453601
<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>
[CircuitProps] = 0
[NumPoints] = 20
0.23999999999999999 0.125 0 0
-0.23999999999999999 0.125 0 0
0.23999999999999999 -0.125 0 0
-0.23999999999999999 -0.125 0 0
0 1 0 0
0 -1 0 0
0 -1.0142857142857142 0 0
0 1.0142857142857142 0 0
0 -1.0285714285714285 0 0
0 1.0285714285714285 0 0
0 -1.0428571428571429 0 0
0 1.0428571428571429 0 0
0 -1.0571428571428572 0 0
0 1.0571428571428572 0 0
0 -1.0714285714285714 0 0
0 1.0714285714285714 0 0
0 -1.0857142857142856 0 0
0 1.0857142857142856 0 0
0 -1.1000000000000001 0 0
0 1.1000000000000001 0 0
[NumSegments] = 4
1 3 -1 0 0 0
3 2 -1 0 0 0
2 0 -1 0 0 0
0 1 -1 0 0 0
[NumArcSegments] = 16
4 5 180 1 0 0 0 1
5 4 180 1 0 0 0 1
6 7 180 1 0 0 0 1
7 6 180 1 0 0 0 1
8 9 180 1 0 0 0 1
9 8 180 1 0 0 0 1
10 11 180 1 0 0 0 1
11 10 180 1 0 0 0 1
12 13 180 1 0 0 0 1
13 12 180 1 0 0 0 1
14 15 180 1 0 0 0 1
15 14 180 1 0 0 0 1
16 17 180 1 0 0 0 1
17 16 180 1 0 0 0 1
18 19 180 1 1 0 0 1
19 18 180 1 1 0 0 1
[NumHoles] = 0
[NumBlockLabels] = 9
-0.040000000000000001 -0.02 9 -1 0 90 0 1 0
0 0.5 8 -1 0 0 0 1 0
0.98779088954896777 0.19648382431624345 1 -1 0 0 0 1 0
0.94367695106509997 0.39088379163005599 2 -1 0 0 0 1 0
0.86116495559906481 0.57541202705601657 3 -1 0 0 0 1 0
0.74246212024587499 0.74246212024587488 4 -1 0 0 0 1 0
0.59128546228514811 0.88492123023628033 5 -1 0 0 0 1 0
0.41275141633663259 0.99647006720860209 6 -1 0 0 0 1 0
0.21320585191762575 1.0718581992978162 7 -1 0 0 0 1 0

423
examples/brgmodel.fem Normal file
View File

@ -0,0 +1,423 @@
[Format] = 4.0
[Frequency] = 0
[Precision] = 1e-008
[MinAngle] = 30
[Depth] = 1.6000000000000001
[LengthUnits] = inches
[ProblemType] = planar
[Coordinates] = cartesian
[Comment] = "Add comments here."
[PointProps] = 0
[BdryProps] = 1
<BeginBdry>
<BdryName> = "A=0"
<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
<EndBdry>
[BlockProps] = 6
<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> = "J+"
<Mu_x> = 1
<Mu_y> = 1
<H_c> = 0
<H_cAngle> = 0
<J_re> = 4.2199999999999998
<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> = "J-"
<Mu_x> = 1
<Mu_y> = 1
<H_c> = 0
<H_cAngle> = 0
<J_re> = -4.2199999999999998
<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> = "Iron"
<Mu_x> = 2500
<Mu_y> = 2500
<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> = "M-19 Steel"
<Mu_x> = 4416
<Mu_y> = 4416
<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> = 13
0 0
0.29999999999999999 39.78875
0.80000000000000004 79.577500000000001
1.1200000000000001 159.155
1.3200000000000001 318.31
1.46 795.77499999999998
1.54 1591.55
1.6187499999999999 3376.6669999999999
1.74 7957.75
1.8700000000000001 15915.5
1.99 31831
2.0459640000000001 55102.040000000001
2.0800000000000001 79577.5
<EndBlock>
<BeginBlock>
<BlockName> = "18 AWG"
<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> = 3
<LamFill> = 1
<NStrands> = 1
<WireD> = 1.0239652968433499
<BHPoints> = 0
<EndBlock>
[CircuitProps] = 4
<BeginCircuit>
<CircuitName> = "i1"
<TotalAmps_re> = 6
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
<BeginCircuit>
<CircuitName> = "i2"
<TotalAmps_re> = 12
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
<BeginCircuit>
<CircuitName> = "i3"
<TotalAmps_re> = 6
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
<BeginCircuit>
<CircuitName> = "i4"
<TotalAmps_re> = 0
<TotalAmps_im> = 0
<CircuitType> = 1
<EndCircuit>
[NumPoints] = 102
0.92388000000000003 -0.382683 0 0
-0.92388000000000003 0.382683 0 0
1.020017 -0.20289399999999999 0 0
0.86472899999999997 -0.577793 0 0
0.86472800000000005 0.577793 0 0
1.020016 0.20289399999999999 0 0
0.20289399999999999 1.020017 0 0
0.577793 0.86472899999999997 0 0
-0.577793 0.86472800000000005 0 0
-0.20289399999999999 1.020016 0 0
-0.20289399999999999 -1.020017 0 0
-0.577793 -0.86472899999999997 0 0
0.577793 -0.86472800000000005 0 0
0.20289399999999999 -1.020016 0 0
-0.86472800000000005 -0.577793 0 0
-1.020016 -0.20289399999999999 0 0
-1.020017 0.20289399999999999 0 0
-0.86472899999999997 0.577793 0 0
1.9158710000000001 -0.57396899999999995 0 0
1.7605820000000001 -0.94886800000000004 0 0
1.7605820000000001 0.94886800000000004 0 0
1.91587 0.57396899999999995 0 0
0.57396899999999995 1.9158710000000001 0 0
0.94886800000000004 1.7605820000000001 0 0
-0.94886800000000004 1.7605820000000001 0 0
-0.57396899999999995 1.91587 0 0
-1.9158710000000001 0.57396899999999995 0 0
-1.7605820000000001 0.94886800000000004 0 0
-1.7605820000000001 -0.94886800000000004 0 0
-1.91587 -0.57396899999999995 0 0
-0.57396899999999995 -1.9158710000000001 0 0
-0.94886800000000004 -1.7605820000000001 0 0
0.94886800000000004 -1.7605820000000001 0 0
0.57396899999999995 -1.91587 0 0
2.217311 -0.91844000000000003 0 0
-2.217311 0.91844000000000003 0 0
0.55432800000000004 -0.22961000000000001 0 0
-0.55432800000000004 0.22961000000000001 0 0
1.3461909999999999 -0.016414999999999999 0 0
0.96350800000000003 -0.94029399999999996 0 0
1.9005190000000001 -0.24602499999999999 0 0
1.517835 -1.1699040000000001 0 0
1.232494 -0.29090500000000002 0 0
1.077205 -0.66580399999999995 0 0
1.786821 -0.52051499999999995 0 0
1.6315329999999999 -0.89541400000000004 0 0
0.96350800000000003 0.94029399999999996 0 0
1.517835 1.1699040000000001 0 0
1.3461909999999999 0.016414000000000002 0 0
1.9005190000000001 0.24602399999999999 0 0
1.077205 0.66580399999999995 0 0
1.2324930000000001 0.29090500000000002 0 0
1.6315329999999999 0.89541400000000004 0 0
1.786821 0.52051499999999995 0 0
0.016414999999999999 1.3461909999999999 0 0
0.24602499999999999 1.9005190000000001 0 0
0.94029399999999996 0.96350800000000003 0 0
1.1699040000000001 1.517835 0 0
0.29090500000000002 1.232494 0 0
0.66580399999999995 1.077205 0 0
0.52051499999999995 1.786821 0 0
0.89541400000000004 1.6315329999999999 0 0
-0.94029399999999996 0.96350800000000003 0 0
-1.1699040000000001 1.517835 0 0
-0.016414000000000002 1.3461909999999999 0 0
-0.24602399999999999 1.9005190000000001 0 0
-0.66580399999999995 1.077205 0 0
-0.29090500000000002 1.2324930000000001 0 0
-0.89541400000000004 1.6315329999999999 0 0
-0.52051499999999995 1.786821 0 0
-1.3461909999999999 0.016414999999999999 0 0
-1.9005190000000001 0.24602499999999999 0 0
-0.96350800000000003 0.94029399999999996 0 0
-1.517835 1.1699040000000001 0 0
-1.232494 0.29090500000000002 0 0
-1.077205 0.66580399999999995 0 0
-1.786821 0.52051499999999995 0 0
-1.6315329999999999 0.89541400000000004 0 0
-0.96350800000000003 -0.94029399999999996 0 0
-1.517835 -1.1699040000000001 0 0
-1.3461909999999999 -0.016414000000000002 0 0
-1.9005190000000001 -0.24602399999999999 0 0
-1.077205 -0.66580399999999995 0 0
-1.2324930000000001 -0.29090500000000002 0 0
-1.6315329999999999 -0.89541400000000004 0 0
-1.786821 -0.52051499999999995 0 0
-0.016414999999999999 -1.3461909999999999 0 0
-0.24602499999999999 -1.9005190000000001 0 0
-0.94029399999999996 -0.96350800000000003 0 0
-1.1699040000000001 -1.517835 0 0
-0.29090500000000002 -1.232494 0 0
-0.66580399999999995 -1.077205 0 0
-0.52051499999999995 -1.786821 0 0
-0.89541400000000004 -1.6315329999999999 0 0
0.94029399999999996 -0.96350800000000003 0 0
1.1699040000000001 -1.517835 0 0
0.016414000000000002 -1.3461909999999999 0 0
0.24602399999999999 -1.9005190000000001 0 0
0.66580399999999995 -1.077205 0 0
0.29090500000000002 -1.2324930000000001 0 0
0.89541400000000004 -1.6315329999999999 0 0
0.52051499999999995 -1.786821 0 0
[NumSegments] = 96
4 50 -1 0 0 0
50 52 -1 0 0 0
52 20 -1 0 0 0
5 51 -1 0 0 0
51 53 -1 0 0 0
53 21 -1 0 0 0
6 58 -1 0 0 0
58 60 -1 0 0 0
60 22 -1 0 0 0
7 59 -1 0 0 0
59 61 -1 0 0 0
61 23 -1 0 0 0
8 66 -1 0 0 0
66 68 -1 0 0 0
68 24 -1 0 0 0
9 67 -1 0 0 0
67 69 -1 0 0 0
69 25 -1 0 0 0
16 74 -1 0 0 0
74 76 -1 0 0 0
76 26 -1 0 0 0
17 75 -1 0 0 0
75 77 -1 0 0 0
77 27 -1 0 0 0
14 82 -1 0 0 0
82 84 -1 0 0 0
84 28 -1 0 0 0
15 83 -1 0 0 0
83 85 -1 0 0 0
85 29 -1 0 0 0
10 90 -1 0 0 0
90 92 -1 0 0 0
92 30 -1 0 0 0
11 91 -1 0 0 0
91 93 -1 0 0 0
93 31 -1 0 0 0
12 98 -1 0 0 0
98 100 -1 0 0 0
100 32 -1 0 0 0
13 99 -1 0 0 0
99 101 -1 0 0 0
101 33 -1 0 0 0
2 42 -1 0 0 0
3 43 -1 0 0 0
38 40 -1 0 0 0
39 41 -1 0 0 0
42 44 -1 0 0 0
43 45 -1 0 0 0
38 42 -1 0 0 0
43 39 -1 0 0 0
44 18 -1 0 0 0
45 19 -1 0 0 0
40 44 -1 0 0 0
45 41 -1 0 0 0
46 47 -1 0 0 0
48 49 -1 0 0 0
46 50 -1 0 0 0
51 48 -1 0 0 0
47 52 -1 0 0 0
53 49 -1 0 0 0
54 55 -1 0 0 0
56 57 -1 0 0 0
54 58 -1 0 0 0
59 56 -1 0 0 0
55 60 -1 0 0 0
61 57 -1 0 0 0
62 63 -1 0 0 0
64 65 -1 0 0 0
62 66 -1 0 0 0
67 64 -1 0 0 0
63 68 -1 0 0 0
69 65 -1 0 0 0
70 71 -1 0 0 0
72 73 -1 0 0 0
70 74 -1 0 0 0
75 72 -1 0 0 0
71 76 -1 0 0 0
77 73 -1 0 0 0
78 79 -1 0 0 0
80 81 -1 0 0 0
78 82 -1 0 0 0
83 80 -1 0 0 0
79 84 -1 0 0 0
85 81 -1 0 0 0
86 87 -1 0 0 0
88 89 -1 0 0 0
86 90 -1 0 0 0
91 88 -1 0 0 0
87 92 -1 0 0 0
93 89 -1 0 0 0
94 95 -1 0 0 0
96 97 -1 0 0 0
94 98 -1 0 0 0
99 96 -1 0 0 0
95 100 -1 0 0 0
101 97 -1 0 0 0
[NumArcSegments] = 22
0 1 180 2.5 0 0 0
1 0 180 2.5 0 0 0
5 4 22.5 2.5 0 0 0
7 6 22.5 2.5 0 0 0
9 8 22.5 2.5 0 0 0
15 14 22.5 2.5 0 0 0
11 10 22.5 2.5 0 0 0
13 12 22.5 2.5 0 0 0
3 2 22.5 2.5 0 0 0
17 16 22.5 2.5 0 0 0
26 29 33.355001000000001 2.5 0 0 0
28 31 33.355001000000001 2.5 0 0 0
30 33 33.355001000000001 2.5 0 0 0
20 23 33.355001000000001 2.5 0 0 0
22 25 33.355001000000001 2.5 0 0 0
24 27 33.355001000000001 2.5 0 0 0
34 35 180 2.5 1 0 0
35 34 180 2.5 1 0 0
36 37 180 2.5 0 0 0
37 36 180 2.5 0 0 0
32 19 33.355001000000001 2.5 0 0 0
18 21 33.355001000000001 2.5 0 0 0
[NumHoles] = 0
[NumBlockLabels] = 20
1.588257 -0.26821600000000001 6 0.050000000000000003 1 0 0 80 0
1.557868 0.28556700000000002 6 0.050000000000000003 1 0 0 80 0
0.29210599999999998 1.5675380000000001 6 0.050000000000000003 2 0 0 80 0
-0.28939399999999998 1.548629 6 0.050000000000000003 2 0 0 80 0
-1.5528869999999999 0.27521299999999999 6 0.050000000000000003 3 0 0 80 0
-1.5078469999999999 -0.29546299999999998 6 0.050000000000000003 3 0 0 80 0
-0.227434 -1.594325 6 0.050000000000000003 4 0 0 80 0
0.32859100000000002 -1.5323929999999999 6 0.050000000000000003 4 0 0 80 0
0.91271800000000003 -1.2980929999999999 6 0.050000000000000003 4 0 0 -80 0
1.2764260000000001 -0.864255 6 0.050000000000000003 1 0 0 -80 0
1.314986 0.92736799999999997 6 0.050000000000000003 1 0 0 -80 0
0.88563099999999995 1.354163 6 0.050000000000000003 2 0 0 -80 0
-0.89806699999999995 1.281201 6 0.050000000000000003 2 0 0 -80 0
-1.296489 0.89421300000000004 6 0.050000000000000003 3 0 0 -80 0
-1.2703770000000001 -0.92419799999999996 6 0.050000000000000003 3 0 0 -80 0
-0.83719500000000002 -1.3417539999999999 6 0.050000000000000003 4 0 0 -80 0
0.76536700000000002 1.8477589999999999 5 0.049999990000000001 0 0 0 1 0
0.28701300000000002 0.69291000000000003 5 0.049999990000000001 0 0 0 1 0
0 0 1 0.049999990000000001 0 0 0 1 0
1.362606 1.329777 1 0.050000000000000003 0 0 0 1 0

View File

@ -0,0 +1,230 @@
[Format] = 4.0
[Frequency] = 0
[Precision] = 1e-008
[MinAngle] = 30
[DoSmartMesh] = 1
[Depth] = 1
[LengthUnits] = inches
[ProblemType] = planar
[Coordinates] = cartesian
[ACSolver] = 0
[PrevType] = 0
[PrevSoln] = ""
[Comment] = "Add comments here."
[PointProps] = 0
[BdryProps] = 1
<BeginBdry>
<BdryName> = "A=0"
<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] = 8
<BeginBlock>
<BlockName> = "u1"
<Mu_x> = 2.64989968961167
<Mu_y> = 2.64989968961167
<H_c> = 795774.71545947704
<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> = "u2"
<Mu_x> = 0.129533168093005
<Mu_y> = 0.129533168093005
<H_c> = 795774.71545947704
<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> = "u3"
<Mu_x> = 14.3989671209159
<Mu_y> = 14.3989671209159
<H_c> = 795774.71545947704
<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> = "u4"
<Mu_x> = 0.042882574356338299
<Mu_y> = 0.042882574356338299
<H_c> = 795774.71545947704
<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> = "u5"
<Mu_x> = 37.197476986533097
<Mu_y> = 37.197476986533097
<H_c> = 795774.71545947704
<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> = "u6"
<Mu_x> = 0.0156642460641064
<Mu_y> = 0.0156642460641064
<H_c> = 795774.71545947704
<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> = "u7"
<Mu_x> = 142.03015659052099
<Mu_y> = 142.03015659052099
<H_c> = 795774.71545947704
<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> = "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>
[CircuitProps] = 0
[NumPoints] = 16
4.625 5.7101000000000006 0 0
4.625 3.4399000000000002 0 0
4.625 3.4236842857142857 0 0
4.625 5.7263157142857146 0 0
4.625 3.4074685714285717 0 0
4.625 5.7425314285714286 0 0
4.625 3.3912528571428573 0 0
4.625 5.7587471428571426 0 0
4.625 3.3750371428571428 0 0
4.625 5.7749628571428575 0 0
4.625 3.3588214285714288 0 0
4.625 5.7911785714285715 0 0
4.625 3.3426057142857148 0 0
4.625 5.8073942857142855 0 0
4.625 3.32639 0 0
4.625 5.8236100000000004 0 0
[NumSegments] = 0
[NumArcSegments] = 16
0 1 180 1 0 0 0 1
1 0 180 1 0 0 0 1
2 3 180 1 0 0 0 1
3 2 180 1 0 0 0 1
4 5 180 1 0 0 0 1
5 4 180 1 0 0 0 1
6 7 180 1 0 0 0 1
7 6 180 1 0 0 0 1
8 9 180 1 0 0 0 1
9 8 180 1 0 0 0 1
10 11 180 1 0 0 0 1
11 10 180 1 0 0 0 1
12 13 180 1 0 0 0 1
13 12 180 1 0 0 0 1
14 15 180 1 1 0 0 1
15 14 180 1 1 0 0 1
[NumHoles] = 0
[NumBlockLabels] = 8
5.7462414387270337 4.7980287889813678 1 -1 0 0 0 1 0
5.6961677071539949 5.0186921918792766 2 -1 0 0 0 1 0
5.6025083411004983 5.2281501919112845 3 -1 0 0 0 1 0
5.467768752691093 5.4177687526910931 4 -1 0 0 0 1 0
5.2961681282398718 5.5794740884412022 5 -1 0 0 0 1 0
5.0935141326837119 5.706093173288485 6 -1 0 0 0 1 0
4.8670099625116974 5.7916662420229512 7 -1 0 0 0 1 0
4.6239999999999997 4.6230000000000002 8 -1 0 0 0 1 0