use std::path::Path;
use csx::OpenEmsDocument;
use super::Simulation;
use crate::Result;
use crate::compile::CompileOptions;
use crate::fdtd::Fdtd;
impl Fdtd {
pub fn from_document(doc: &OpenEmsDocument) -> Result<(Fdtd, Vec<String>)> {
match doc.fdtd_settings()? {
Some(s) => Fdtd::from_csx(&s),
None => {
let (f, mut w) = Fdtd::from_csx(&Default::default())?;
w.insert(
0,
"the document has no <FDTD> settings; openEMS defaults are used".into(),
);
Ok((f, w))
}
}
}
}
impl Simulation {
pub fn from_xml(path: impl AsRef<Path>) -> Result<Self> {
let doc = OpenEmsDocument::read_file(path)?;
Self::from_document(&doc)
}
pub fn from_xml_str(xml: &str) -> Result<Self> {
let doc = OpenEmsDocument::from_xml_str(xml)?;
Self::from_document(&doc)
}
pub fn from_document(doc: &OpenEmsDocument) -> Result<Self> {
Self::from_document_with(doc, &CompileOptions::default(), |f| f)
}
pub fn from_document_with(
doc: &OpenEmsDocument,
opts: &CompileOptions,
adjust: impl FnOnce(Fdtd) -> Fdtd,
) -> Result<Self> {
let (fdtd, mut warnings) = Fdtd::from_document(doc)?;
let fdtd = adjust(fdtd);
fdtd.validate()?;
let mut sim = Self::with_options(&doc.structure, &fdtd, opts)?;
warnings.append(&mut sim.warnings);
sim.warnings = warnings;
Ok(sim)
}
}