use crate::{Vec3, Star};
use crate::{rpot1, rpot2, drpot1, drpot2};
pub fn face(q: f64, star: Star, spin: f64, direction: Vec3, rref: f64, pref: f64, acc: f64) -> (Vec3, Vec3, f64, f64) {
let mut pvec: Vec3;
let mut r: f64;
let cofm: Vec3 = match star {
Star::Primary => Vec3::cofm1(),
Star::Secondary => Vec3::cofm2(),
};
let rp: fn(f64, f64, &Vec3) -> f64 = match star {
Star::Primary => rpot1,
Star::Secondary => rpot2,
};
let drp: fn(f64, f64, &Vec3) -> Vec3 = match star {
Star::Primary => drpot1,
Star::Secondary => drpot2,
};
let mut tref: f64 = rp(q, spin, &(cofm + rref*direction));
if tref < pref {
panic!("stuff")
}
let mut r1: f64 = rref/2.;
let mut r2: f64 = rref;
tref = pref + 1.;
const MAXSEARCH: i32 = 30;
let mut i: i32 = 0;
while i < MAXSEARCH && tref > pref {
r1 = r2/2.;
tref = rp(q, spin, &(cofm + r1*direction));
if tref > pref {
r2 = r1;
}
i+=1;
}
if tref > pref {
panic!("other stuff");
}
const MAXCHOP: i32 = 100;
let mut nchop: i32 = 0;
while r2 - r1 > acc && nchop < MAXCHOP {
r = (r1 + r2)/2.;
pvec = cofm + r*direction;
if rp(q, spin, &pvec) < pref {
r1 = r;
}else {
r2 = r;
}
nchop += 1;
}
if nchop == MAXCHOP {
panic!("even more stuff");
}
r = (r1 + r2)/2.;
pvec = cofm + r*direction;
let mut dvec: Vec3 = drp(q, spin, &pvec);
let g = dvec.length();
dvec /= g;
return (pvec, dvec, r, g)
}