use super::*;
use f2rust_std::*;
pub fn T_XFORM(
XFORM: &[f64],
RMINUS: &[f64],
RPLUS: &[f64],
DELTA: f64,
NRMERR: &mut f64,
DETERR: &mut f64,
DRVERR: &mut f64,
DRLERR: &mut f64,
DRDIFF: &mut [f64],
ctx: &mut Context,
) -> f2rust_std::Result<()> {
let XFORM = DummyArray2D::new(XFORM, 1..=6, 1..=6);
let RMINUS = DummyArray2D::new(RMINUS, 1..=3, 1..=3);
let RPLUS = DummyArray2D::new(RPLUS, 1..=3, 1..=3);
let mut DRDIFF = DummyArrayMut2D::new(DRDIFF, 1..=3, 1..=3);
let mut BLERR: f64 = 0.0;
let mut DRBLCK = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
let mut DSCRET = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
let mut DSCRTR = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
let mut DSHARP = StackArray::<f64, 6>::new(1..=6);
let mut LRBLCK = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
let mut RSTATE = StackArray::<f64, 6>::new(1..=6);
let mut ULBLCK = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
let mut URBLCK = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
let mut XPBLCK = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
let mut XPD = StackArray2D::<f64, 9>::new(1..=3, 1..=3);
if spicelib::RETURN(ctx) {
return Ok(());
}
spicelib::CHKIN(b"T_XFORM", ctx)?;
spicelib::MOVED(XFORM.subarray([1, 1]), 3, ULBLCK.subarray_mut([1, 1]));
spicelib::MOVED(XFORM.subarray([1, 2]), 3, ULBLCK.subarray_mut([1, 2]));
spicelib::MOVED(XFORM.subarray([1, 3]), 3, ULBLCK.subarray_mut([1, 3]));
spicelib::MOVED(XFORM.subarray([1, 4]), 3, URBLCK.subarray_mut([1, 1]));
spicelib::MOVED(XFORM.subarray([1, 5]), 3, URBLCK.subarray_mut([1, 2]));
spicelib::MOVED(XFORM.subarray([1, 6]), 3, URBLCK.subarray_mut([1, 3]));
spicelib::MOVED(XFORM.subarray([4, 1]), 3, DRBLCK.subarray_mut([1, 1]));
spicelib::MOVED(XFORM.subarray([4, 2]), 3, DRBLCK.subarray_mut([1, 2]));
spicelib::MOVED(XFORM.subarray([4, 3]), 3, DRBLCK.subarray_mut([1, 3]));
spicelib::MOVED(XFORM.subarray([4, 4]), 3, LRBLCK.subarray_mut([1, 1]));
spicelib::MOVED(XFORM.subarray([4, 5]), 3, LRBLCK.subarray_mut([1, 2]));
spicelib::MOVED(XFORM.subarray([4, 6]), 3, LRBLCK.subarray_mut([1, 3]));
BLERR = spicelib::VDISTG(ULBLCK.as_slice(), LRBLCK.as_slice(), 9);
if (BLERR != 0.0) {
spicelib::SETMSG(
b"L2 distance between blocks on main diagonal is #; this distance must be zero.",
ctx,
);
spicelib::ERRDP(b"#", BLERR, ctx);
spicelib::SIGERR(b"SPICE(INVALIDMATRIX)", ctx)?;
spicelib::CHKOUT(b"T_XFORM", ctx)?;
return Ok(());
}
*NRMERR = 0.0;
for I in 1..=3 {
*NRMERR = intrinsics::DMAX1(&[
*NRMERR,
f64::abs((1.0 - spicelib::VNORM(ULBLCK.subarray([1, I])))),
]);
}
spicelib::XPOSE(ULBLCK.as_slice(), XPBLCK.as_slice_mut());
for I in 1..=3 {
*NRMERR = intrinsics::DMAX1(&[
*NRMERR,
f64::abs((1.0 - spicelib::VNORM(XPBLCK.subarray([1, I])))),
]);
}
*DETERR = f64::abs((1.0 - spicelib::DET(ULBLCK.as_slice())));
spicelib::QDERIV(
9,
RMINUS.as_slice(),
RPLUS.as_slice(),
DELTA,
DSCRET.as_slice_mut(),
ctx,
)?;
if spicelib::FAILED(ctx) {
spicelib::CHKOUT(b"T_XFORM", ctx)?;
return Ok(());
}
spicelib::XPOSE(DSCRET.as_slice(), XPD.as_slice_mut());
for I in 1..=3 {
spicelib::VEQU(XPBLCK.subarray([1, I]), RSTATE.as_slice_mut());
spicelib::VEQU(XPD.subarray([1, I]), RSTATE.subarray_mut(4));
spicelib::DVHAT(RSTATE.as_slice(), DSHARP.as_slice_mut());
spicelib::VEQU(DSHARP.subarray(4), DSCRTR.subarray_mut([1, I]));
}
spicelib::XPOSE(DSCRTR.as_slice(), DSCRET.as_slice_mut());
*DRVERR = spicelib::VDISTG(DSCRET.as_slice(), DRBLCK.as_slice(), 9);
*DRLERR = spicelib::VRELG(DSCRET.as_slice(), DRBLCK.as_slice(), 9);
spicelib::VSUBG(
DSCRET.as_slice(),
DRBLCK.as_slice(),
9,
DRDIFF.as_slice_mut(),
);
spicelib::CHKOUT(b"T_XFORM", ctx)?;
Ok(())
}