binary
Contents
binary.c
Subroutines that control the integration of the circumbinary planet orbital dynamics module.
- Author
David Fleming (dflemin3)
- Date
Jan 12 2016
- Description
Module to model circumbinary planet dynamics.
(circumbinary planet(s))
body approximation and hence the CBPs are not allowed to graviationally interact.
Note
body 0 = primary star, body 1 = secondary star, body 2+ = CBP
Note
The :cite:`Leung2013` theory ONLY applies to the restricted 3
Functions
-
void BodyCopyBinary(BODY *dest, BODY *src, int foo, int iNumBodies, int iBody)
Copy body properties from src to dest for cbp
-
void InitializeBodyBinary(BODY *body, CONTROL *control, UPDATE *update, int iBody, int iModule)
Only use this function for malloc’ing stuff Since nothing has to be malloc’ed for binary, do nothing
-
void InitializeUpdateTmpBodyBinary(BODY *body, CONTROL *control, UPDATE *update, int iBody)
No need to allocate anything
-
void ReadFreeEcc(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
Free eccentricity, can’t be in primary file Note: Do error checking for negative values
-
void ReadLL13N0(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
Lee + Leung 2013 Mean Motion N0 This parameter cannot exist in primary file
-
void ReadLL13K0(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
Lee + Leung 2013 radial epicyclic frequency This parameter cannot exist in primary file
-
void ReadLL13V0(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
Lee + Leung 2013 vertical epicyclic frequency This parameter cannot exist in primary file
-
void ReadFreeInc(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
This parameter cannot exist in the primary file Free inclination goes from 0 to 180 degrees
-
void ReadLL13PhiAB(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
This parameter cannot exist in the primary file PhiAB goes from [0,360) if in degrees
-
void ReadCBPM0(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
This parameter cannot exist in the primary file CBPM0 goes from [0,360) if in degrees
-
void ReadCBPZeta(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
This parameter cannot exist in the primary file. dCBPZeta goes from [0,360) if in degrees
-
void ReadCBPPsi(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
This parameter cannot exist in the primary file. dCBPPsi goes from [0,360) if in degrees
-
void ReadHaltHolmanUnstable(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
This parameter cannot exist in primary file
-
void ReadHaltRocheLobe(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, int iFile)
This parameter cannot exist in primary file
-
void InitializeOptionsBinary(OPTIONS *options, fnReadOption fnRead[])
Initialization Options for BINARY
-
void ReadOptionsBinary(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, SYSTEM *system, fnReadOption fnRead[], int iBody)
Read all BINARY input options.
-
void fnForceBehaviorBinary(BODY *body, MODULE *module, EVOLVE *evolve, IO *io, SYSTEM *system, UPDATE *update, fnUpdateVariable ***fnUpdate, int iBody, int iModule)
-
void AssignBinaryDerivatives(BODY *body, EVOLVE *evolve, UPDATE *update, fnUpdateVariable ***fnUpdate, int iBody)
-
void NullBinaryDerivatives(BODY *body, EVOLVE *evolve, UPDATE *update, fnUpdateVariable ***fnUpdate, int iBody)
-
void VerifyBinary(BODY *body, CONTROL *control, FILES *files, OPTIONS *options, OUTPUT *output, SYSTEM *system, UPDATE *update, int iBody, int iModule)
-
void FinalizeUpdateCBPRBinary(BODY *body, UPDATE *update, int *iEqn, int iVar, int iBody, int iFoo)
-
void FinalizeUpdateCBPZBinary(BODY *body, UPDATE *update, int *iEqn, int iVar, int iBody, int iFoo)
-
void FinalizeUpdateCBPPhiBinary(BODY *body, UPDATE *update, int *iEqn, int iVar, int iBody, int iFoo)
-
void FinalizeUpdateCBPRDotBinary(BODY *body, UPDATE *update, int *iEqn, int iVar, int iBody, int iFoo)
-
void FinalizeUpdateCBPZDotBinary(BODY *body, UPDATE *update, int *iEqn, int iVar, int iBody, int iFoo)
-
void FinalizeUpdateCBPPhiDotBinary(BODY *body, UPDATE *update, int *iEqn, int iVar, int iBody, int iFoo)
-
int fbHaltHolmanUnstable(BODY *body, EVOLVE *evolve, HALT *halt, IO *io, UPDATE *update, fnUpdateVariable ***fnUpdate, int iBody)
If the CBP’s dSemi is less than the Holman stability limit, it’s unstable and integration ends
-
int fbHaltRocheLobe(BODY *body, EVOLVE *evolve, HALT *halt, IO *io, UPDATE *update, fnUpdateVariable ***fnUpdate, int iBody)
If the secondary enters the roche lobe of the primary, HALT!
-
void WriteFreeEccBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteFreeIncBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteBinPriRBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
Write the binary primary star radial position
-
void WriteBinSecRBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
Write the binary secondary star radial position
-
void WriteBinPriPhiBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteBinSecPhiBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteCBPPhiBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteCBPPhiDotBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteLL13N0Binary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteLL13K0Binary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteLL13V0Binary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteCBPRBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
Write the circumbinary planet orbital radius (CBPR)
-
void WriteCBPR0Binary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
Write the circumbinary planet guiding radius (CBPR0)
-
void WriteCBPZBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteCBPRDotBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteCBPZDotBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
-
void WriteCBPInsol(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UNITS *units, UPDATE *update, int iBody, double *dTmp, char **cUnit)
Write Earth-normalized insolation received by CBP averaged over 1 binary orbit assuming P_bin << P_cbp
-
void InitializeOutputBinary(OUTPUT *output, fnWriteOutput fnWrite[])
-
void LogBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UPDATE *update, fnWriteOutput fnWrite[], FILE *fp)
Anything here? Nope.
-
void LogBodyBinary(BODY *body, CONTROL *control, OUTPUT *output, SYSTEM *system, UPDATE *update, fnWriteOutput fnWrite[], FILE *fp, int iBody)
-
double fndDot(double *a, double *b)
3D dot product
-
int fniDelta(int i, int j)
Kronecker Delta
-
void fnvCylToCartPos(double *daCylPos, double *dCartPos)
Convert from cylindrical position coords to cartesian (3 dimensional)
-
void fnvCylToCartVel(double *daCylPos, double *daCylVel, double *dCartVel)
Convert from cylindrical velocity coords to cartesian (3 dimensional)
-
void fnvSpecificAngMom(double *r, double *v, double *h)
Calculate specific angular momentum h = r x v in cartesian coords
-
double fndSpecificOrbEng(BODY *body, int iBody)
Calculate specific orbital energy eps = v^2/2 - mu/|r|
-
double fndComputeEcc(BODY *body, int iBody)
Compute CBP’s orbital eccentricity e = sqrt(1 + 2*eps*h*h/(mu*mu))
-
double fndComputeLongA(BODY *body, int iBody)
Compute a CBP’s longitude of ascending node See: https://en.wikipedia.org/wiki/Longitude_of_the_ascending_node
-
double fndMeanToEccentric(double M, double e)
Solves kepler’s equation via Newton’s method
- Parameters:
M – double, Mean anomaly
e, eccentricity –
-
double fndEccToTrue(double E, double e)
Convert eccentric anomaly to true anomaly
-
double fndHolmanStability(BODY *body)
Compute the dynamical stability limit, a_crit, first computed by Holman and Wiegert 1999 that depends on binary dSemi, dEcc If CBP.dSemi < a_crit, planet is unstable and system should halt
-
double fndRocheLobe(BODY *body)
Compute the roche lobe of the primary according to Egglton’s formula given in https://en.wikipedia.org/wiki/Roche_lobe
-
double fndBinaryMeanAnomaly(double dMeanMotion, double dTime, double dPhi)
Compute the binary mean anomaly M = n*t + phi where phi is an arbitrary offset Note: When used with the binary, dPhi == dLL13PhiAB
-
double fndPhi0(double dTime, double dMeanMotion, double dVarPhi)
Circular (azimuthal) motion of the guiding center for a cbp: phi0 dVarPhi here is equal to dCBPM0, the initial CBP mean anomaly LL13 Eqn 20
-
double fndPot0dR(int j, int k, double R, BODY *body)
LL13 Eqn 15: d/dR of binary potential component 0
-
double fndPot1dR(int j, int k, double R, BODY *body)
LL13 eqn 16: d/dR of binary potential component 1
-
double fndn(double R, BODY *body)
LL13 function defined in paragraph in between eqn 24 and 25 which is like the mean motion at R
-
double fndFluxApproxBinary(BODY *body, int iBody)
Compute the approximate flux in the limit P_bin << P_cbp received by the CBP from the 2 stars averaged over 1 binary orbit Assumes binary orb elements don’t vary much per orbit (safe assumption)
-
double fndFluxExactBinary(BODY *body, int iBody, double L0, double L1)
Compute the exact flux (as close to exact as you want) received by the CBP from the 2 stars averaged over 1 CBP orbit Assumes binary orb elements don’t vary much over 1 CBP orbit Also assumes that 1 CBP orbit is approximately Keplerian
-
double fndApproxEqTemp(BODY *body, int iBody, double dAlbedo)
Compute the approximate equlibrirum temperature for a circumbinary planet averaged over the binary orbit
binary.h
Subroutines that control the integration of the circumbinary planet orbital dynamics module.
- Author
David Fleming (dflemin3)
- Date
Jan 12 2016
Defines
-
K_MAX
-
FLUX_INT_MAX
-
KEQNTOL
-
MAX_KEPLER_ITERS
-
FLUX_EARTH
-
OPTSTARTBINARY
-
OPTENDBINARY
-
OPT_FREEECC
-
OPT_FREEINC
-
OPT_LL13N0
-
OPT_LL13K0
-
OPT_LL13V0
-
OPT_LL13PHIAB
-
OPT_CBPM0
-
OPT_CBPZETA
-
OPT_CBPPSI
-
OPT_HALTHOLMAN
-
OPT_HALTROCHELOBE
-
OUTSTARTBINARY
-
OUTENDBINARY
-
OUT_FREEECC
-
OUT_FREEINC
-
OUT_LL13N0
-
OUT_LL13K0
-
OUT_LL13V0
-
OUT_CYLPOS
-
OUT_CBPR
-
OUT_CBPZ
-
OUT_CBPPHI
-
OUT_CBPRDOT
-
OUT_CBPZDOT
-
OUT_CBPPHIDOT
-
OUT_CBPR0
-
OUT_CBPINSOL
-
OUT_BINPRIR
-
OUT_BINPRIPHI
-
OUT_BINSECR
-
OUT_BINSECPHI