MagneticLoop tracks H as well
This commit is contained in:
52
src/meas.rs
52
src/meas.rs
@@ -95,16 +95,30 @@ impl std::iter::Sum for FieldSample {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct FieldSamplePair(FieldSample, FieldSample);
|
struct FieldSamples<T>(T);
|
||||||
|
|
||||||
impl std::iter::Sum for FieldSamplePair {
|
impl std::iter::Sum for FieldSamples<[FieldSample; 2]> {
|
||||||
fn sum<I>(iter: I) -> Self
|
fn sum<I>(iter: I) -> Self
|
||||||
where I: Iterator<Item = Self>
|
where I: Iterator<Item = Self>
|
||||||
{
|
{
|
||||||
let mut s = FieldSamplePair::default();
|
let mut s = Self::default();
|
||||||
for p in iter {
|
for p in iter {
|
||||||
s.0 = FieldSample(s.0.0 + p.0.0, s.0.1 + p.0.1, s.0.2 + p.0.2);
|
s.0[0] = FieldSample(s.0[0].0 + p.0[0].0, s.0[0].1 + p.0[0].1, s.0[0].2 + p.0[0].2);
|
||||||
s.1 = FieldSample(s.1.0 + p.1.0, s.1.1 + p.1.1, s.1.2 + p.1.2);
|
s.0[1] = FieldSample(s.0[1].0 + p.0[1].0, s.0[1].1 + p.0[1].1, s.0[1].2 + p.0[1].2);
|
||||||
|
}
|
||||||
|
s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::iter::Sum for FieldSamples<[FieldSample; 3]> {
|
||||||
|
fn sum<I>(iter: I) -> Self
|
||||||
|
where I: Iterator<Item = Self>
|
||||||
|
{
|
||||||
|
let mut s = Self::default();
|
||||||
|
for p in iter {
|
||||||
|
s.0[0] = FieldSample(s.0[0].0 + p.0[0].0, s.0[0].1 + p.0[0].1, s.0[0].2 + p.0[0].2);
|
||||||
|
s.0[1] = FieldSample(s.0[1].0 + p.0[1].0, s.0[1].1 + p.0[1].1, s.0[1].2 + p.0[1].2);
|
||||||
|
s.0[2] = FieldSample(s.0[2].0 + p.0[2].0, s.0[2].1 + p.0[2].1, s.0[2].2 + p.0[2].2);
|
||||||
}
|
}
|
||||||
s
|
s
|
||||||
}
|
}
|
||||||
@@ -182,26 +196,40 @@ impl MagneticLoop {
|
|||||||
#[typetag::serde]
|
#[typetag::serde]
|
||||||
impl AbstractMeasurement for MagneticLoop {
|
impl AbstractMeasurement for MagneticLoop {
|
||||||
fn eval(&self, state: &dyn GenericSim) -> String {
|
fn eval(&self, state: &dyn GenericSim) -> String {
|
||||||
let FieldSamplePair(FieldSample(volume, directed_m, _m_vec), FieldSample(_, directed_b, _b_vec)) =
|
let FieldSamples([
|
||||||
sum_over_region(state, &self.region, |coord, cell|
|
FieldSample(volume, directed_m, _m_vec),
|
||||||
|
FieldSample(_, directed_b, _b_vec),
|
||||||
|
FieldSample(_, directed_h, _h_vec),
|
||||||
|
]) = sum_over_region(state, &self.region, |coord, cell|
|
||||||
{
|
{
|
||||||
let normal = self.region.axis();
|
let normal = self.region.axis();
|
||||||
let to_coord = *coord - *self.region.center();
|
let to_coord = *coord - *self.region.center();
|
||||||
let tangent = normal.cross(to_coord).norm();
|
let tangent = normal.cross(to_coord).norm();
|
||||||
|
|
||||||
let m = cell.mat().m();
|
let m = cell.mat().m();
|
||||||
let directed_m = m.dot(tangent);
|
let directed_m = m.dot(tangent);
|
||||||
let b = cell.b();
|
let b = cell.b();
|
||||||
let directed_b = b.dot(tangent);
|
let directed_b = b.dot(tangent);
|
||||||
FieldSamplePair(FieldSample(1, directed_m, m), FieldSample(1, directed_b, b))
|
let h = cell.h();
|
||||||
|
let directed_h = h.dot(tangent);
|
||||||
|
FieldSamples([
|
||||||
|
FieldSample(1, directed_m, m),
|
||||||
|
FieldSample(1, directed_b, b),
|
||||||
|
FieldSample(1, directed_h, h),
|
||||||
|
])
|
||||||
});
|
});
|
||||||
let mean_directed_m = directed_m / (volume as Flt);
|
|
||||||
let mean_directed_b = directed_b / (volume as Flt);
|
|
||||||
let cross_section = self.region.cross_section() / (state.feature_size() * state.feature_size());
|
let cross_section = self.region.cross_section() / (state.feature_size() * state.feature_size());
|
||||||
|
let mean_directed_m = directed_m / (volume as Flt);
|
||||||
let cross_sectional_m = mean_directed_m * cross_section;
|
let cross_sectional_m = mean_directed_m * cross_section;
|
||||||
|
let mean_directed_b = directed_b / (volume as Flt);
|
||||||
let cross_sectional_b = mean_directed_b * cross_section;
|
let cross_sectional_b = mean_directed_b * cross_section;
|
||||||
|
let mean_directed_h = directed_h / (volume as Flt);
|
||||||
|
let cross_sectional_h = mean_directed_h * cross_section;
|
||||||
format!(
|
format!(
|
||||||
"M({}): {:.2e}; B({}): {:.2e}",
|
"M({}): {:.2e}; B({}): {:.2e}; H({}): {:.2e}",
|
||||||
self.name, cross_sectional_m, self.name, cross_sectional_b
|
self.name, cross_sectional_m,
|
||||||
|
self.name, cross_sectional_b,
|
||||||
|
self.name, cross_sectional_h,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user