double Actions_AxisymmetricFudge_InterpTables::Getu0(double utry,double E,double Delta,double Iu,double Lzsq,double sh1sq, double v, double sv2){ uturn_st UVV(this,E,Delta,Iu,Lzsq,sh1sq,v,sv2); double ui,uo=0.,dut=duturnfn(utry,&UVV); if(dut>0){//inside while(dut>0){ ui=utry; utry*=1.2; dut=duturnfn(utry,&UVV); } uo=utry; }else{//outside while(dut<0){ uo=utry; utry*=.8; dut=duturnfn(utry,&UVV); } ui=utry; } if(ui<TINY_UV and uo<TINY_UV){ int status; minimiser1D min(&negduturnfn,1e-1,1e-5,100.,10.,1e-3,&status,&UVV); return min.minimise(100); } if(dut!=dut or std::isinf(dut) or std::isnan(dut)){ std::cerr<<"duturnfn is nan in Getu0\n"; return us; } root_find RF(TINY_UV,100); double ufound = RF.findroot(&duturnfn,ui,uo,&UVV); return ufound; }
double Actions_AxisymmetricFudge_InterpTables::dPhiu(const VecDoub& uv,double *f,double Delta){ //returns Phiu(u) and dPhi/dR etc UVProlateSpheroidCoordSys UVV(Delta); VecDoub Rz = UVV.uv2Rz(uv); VecDoub F = Pot->Forces({Rz[0],0.,Rz[1]}); f[0]=-F[0];f[1]=-F[2]; return Pot->Phi({Rz[0],0.,Rz[1]}); }
double Actions_AxisymmetricFudge_InterpTables::Phiuv(const VecDoub& uv,double Delta){ UVProlateSpheroidCoordSys UVV(Delta); VecDoub Rz = UVV.uv2Rz(uv); return Pot->Phi({Rz[0],0.,Rz[1]}); }