Multiple file access functions — CALCEPH - Octave/Matlab language 3.4.1 documentation

# Multiple file access functions

The following group of functions should be the preferred method to access to the library. They allow to access to multiple ephemeris files at the same time, even by multiple threads.

When an error occurs, these functions execute error handlers according to the behavior defined by the function `calceph_seterrorhandler()`.

## Thread notes

If the standard I/O functions such as fread are not reentrant then the CALCEPH I/O functions using them will not be reentrant either.

It's not safe for two threads to call the functions with the same object of type `CalcephBin` if and only if the function `CalcephBin.isthreadsafe()` returns a non-zero value. A previous call to the function `CalcephBin.prefetch()` is required for the function `CalcephBin.isthreadsafe()` to return a non-zero value.

It's safe for two threads to access simultaneously to the same ephemeris file with two different objects of type `CalcephBin`. In this case, each thread must open the same file.

## Usage

The following examples, that can be found in the directory examples of the library sources, show the typical usage of this group of functions.

The example in Octave/Matlab language is `mexmultiple.m`.

## Functions

### CalcephBin.open

static `CalcephBin.` `open`(filename) → eph

  Parameters: | filename (str) -- pathname of the file
  Returns: | ephemeris descriptor
  Return type: | CalcephBin

This function opens the file whose pathname is the string pointed to by filename, reads the two header blocks of this file and returns an ephemeris descriptor associated to it. This file must be compliant to the format specified by the 'original JPL binary' , 'INPOP 2.0 binary' or 'SPICE' ephemeris file. At the moment, supported SPICE files are the following :

> - text Planetary Constants Kernel (KPL/PCK) files
> - binary PCK (DAF/PCK) files.
> - binary SPK (DAF/SPK) files containing segments of type 1, 2, 3, 5, 8, 9, 12, 13, 17, 18, 20, 21, 102, 103 and 120.
> - meta kernel (KPL/MK) files.
> - frame kernel (KPL/FK) files. Only a basic support is provided.

Just after the call of `CalcephBin.open()`, the function `CalcephBin.prefetch()` should be called to accelerate future computations.

The function `CalcephBin.close()` must be called to free allocated memory by this function.

The following example opens the ephemeris file example1.dat

    peph = calceph.CalcephBin.open('example1.dat')

    % ...  computation ...

    peph.close()

### CalcephBin.open

static `CalcephBin.` `open`(array_filename) → eph

  Parameters: | array_filename (list) -- array of pathname of the files
  Returns: | ephemeris descriptor
  Return type: | CalcephBin

This function opens n files whose pathnames are the string pointed to by array_filename, reads the header blocks of these files and returns an ephemeris descriptor associated to them.

The array of files must be a cell array of character vectors (see details about cellstr) , and not an string or character arrays.

These files must have the same type (e.g., all files are SPICE files or original JPL files). This file must be compliant to the format specified by the 'original JPL binary' , 'INPOP 2.0 or 3.0 binary' or 'SPICE' ephemeris file. At the moment, supported SPICE files are the following :

> - text Planetary Constants Kernel (KPL/PCK) files
> - binary PCK (DAF/PCK) files.
> - binary SPK (DAF/SPK) files containing segments of type 1, 2, 3, 5, 8, 9, 12, 13, 17, 18, 20, 21, 102, 103 and 120.
> - meta kernel (KPL/MK) files.
> - frame kernel (KPL/FK) files. Only a basic support is provided.

Just after the call of `CalcephBin.open()`, the function `CalcephBin.prefetch()` should be called to accelerate future computations.

The function `CalcephBin.close()` must be called to free allocated memory by this function.

The following example opens the ephemeris file example1.bsp and example1.tpc

    peph = CalcephBin.open(cellstr({'example1.bsp', 'example1.tpc'}))

    % ... computation ...

    peph.close()

### CalcephBin.prefetch

`CalcephBin.` `prefetch`()

This function prefetches to the main memory all files associated to the ephemeris descriptor. This prefetching operation will accelerate the further computations performed with `CalcephBin.compute()`, `CalcephBin.compute_unit()`, `CalcephBin.compute_order()`, `CalcephBin.orient_unit()`, ... .

It requires that the file is smaller than the main memory. If multiple threads (e.g. threads of openMP or Posix Pthreads) prefetch the data for the same ephemeris file, the used memory will remain the same as if the prefetch operation was done by a single thread if and if the endianess of the file is the same as the computer and if the operating system, such as Linux, MacOS X other unix, supports the function mmap.

### CalcephBin.isthreadsafe

`CalcephBin.` `isthreadsafe`()

This function returns 1 if multiple threads can access the same ephemeris ephemeris descriptor, otherwise 0.

A previous call to the function `CalcephBin.prefetch()` is required, and the library should becompiled with --enable-thread=yes on Unix-like operating system, for the function `CalcephBin.isthreadsafe()` to return a non-zero value.

If this function returns 1, severals threads may use the same ephemeris descriptor for the computational functions `CalcephBin.compute()`, .... It allows to use the same object for parallel loops.

### CalcephBin.compute

`CalcephBin.` `compute`(JD0, time, target, center) → PV

  Parameters: | JD0 (double) -- Integer part of the Julian date time (double) -- Fraction part of the Julian date target (int) -- The body or reference point whose coordinates are required (see the list, below). center (int) -- The origin of the coordinate system (see the list, below). If target is 14, 15, 16 or 17 (nutation, libration, TT-TDB or TCG-TCB), center must be 0.
  Returns: | Depending on the target value, an array to receive the cartesian position (x,y,z) and the velocity (xdot, ydot, zdot), or a time scale transformation value, or the angles of the librations of the Moon and their derivatives, or the nutation angles and their derivatives.
  Return type: | vector

JD0 and time could be arrays of double-precision floating-point values.

This function reads, if needed, in the ephemeris file self and interpolates a single object, usually the position and velocity of one body (target) relative to another (center) for the time JD0+time and stores the results to PV. The ephemeris file self must have been previously opened with the function `CalcephBin.open()`.

The returned array PV has the following properties

> - If the target is TT-TDB, only the first element of this array will get the result. The time scale transformation TT-TDB is expressed in seconds.
> - If the target is TCG-TCB, only the first element of this array will get the result. The time scale transformation TCG-TCB is expressed in seconds.
> - If the target is Librations, the array contains the angles of the librations of the Moon and their derivatives. The angles of the librations of the Moon are expressed in radians and their derivatives are expressed in radians per day.
> - If the target is Nutations, the array contains the nutation angles and their derivatives. The nutation angles are expressed in radians and their derivatives are expressed in radians per day.
> - Otherwise the returned values is the cartesian position (x,y,z), expressed in Astronomical Unit (au), and the velocity (xdot, ydot, zdot), expressed in Astronomical Unit per day (au/day).

To get the best numerical precision for the interpolation, the time is splitted in two floating-point numbers. The argument JD0 should be an integer and time should be a fraction of the day. But you may call this function with time=0 and JD0, the desired time, if you don't take care about numerical precision.

The possible values for target and center are :

value | meaning
--- | ---
1 | Mercury Barycenter
2 | Venus Barycenter
3 | Earth
4 | Mars Barycenter
5 | Jupiter Barycenter
6 | Saturn Barycenter
7 | Uranus Barycenter
8 | Neptune Barycenter
9 | Pluto Barycenter
10 | Moon
11 | Sun
12 | Solar Sytem barycenter
13 | Earth-moon barycenter
14 | Nutation angles
15 | Librations
16 | TT-TDB
17 | TCG-TCB
asteroid number + CALCEPH_ASTEROID | asteroid

These accepted values by this function are the same as the value for the JPL function PLEPH, except for the values TT-TDB, TCG-TCB and asteroids.

For example, the value "CALCEPH_ASTEROID+4" for target or center specifies the asteroid Vesta.

The following example prints the heliocentric coordinates of Mars at time=2442457.5 and at 2442457.9

    jd0=2442457
    dt1=0.5E0
    dt2=0.9E0

    peph = CalcephBin.open('example1.dat');

    disp('heliocentric coordinates of Mars')
    PV1 = peph.compute(jd0, dt1, 4, 11)

    disp('heliocentric coordinates of Mars')
    PV2 = peph.compute(jd0, dt2, 4, 11)

    peph.close();

### CalcephBin.compute_unit

`CalcephBin.` `compute_unit`(JD0, time, target, center, unit) → PV

  Parameters: | JD0 (double) -- Integer part of the Julian date time (double) -- Fraction part of the Julian date target (int) -- The body or reference point whose coordinates are required. The numbering system depends on the parameter unit. center (int) -- The origin of the coordinate system. The numbering system depends on the parameter unit. unit (int) -- The units of PV. This integer is a sum of some unit constants (CALCEPH_UNIT_???) and/or the constant `USE_NAIFID`. If the unit contains `USE_NAIFID`, the NAIF identification numbering system is used for the target and the center (NAIF identification numbers for the list). If the unit doesnot contain `USE_NAIFID`, the old number system is used for the target and the center (see the list in the function `CalcephBin.compute()`).
  Returns: | Depending on the target value, an array to receive the cartesian position (x,y,z) and the velocity (xdot, ydot, zdot), or a time scale transformation value, or the angles of the librations of the Moon and their derivatives, or the nutation angles and their derivatives.
  Return type: | vector

JD0 and time could be arrays of double-precision floating-point values.

This function is similar to the function `CalcephBin.compute()`, except that the units of the output are specified.

This function reads, if needed, in the ephemeris file self and interpolates a single object, usually the position and velocity of one body (target) relative to another (center) for the time JD0+time and stores the results to PV. The ephemeris file self must have been previously opened with the function `CalcephBin.open()`. The output values are expressed in the units specified by unit.

This function checks the units if invalid combinations of units are given to the function.

The returned array PV has the following properties

> - If the target is the time scale transformation TT-TDB, only the first element of this array will get the result.
> - If the target is the time scale transformation TCG-TCB, only the first element of this array will get the result.
> - If the target is Librations, the array contains the angles of the librations of the Moon and their derivatives.
> - If the target is Nutations, the array contains the nutation angles and their derivatives.
> - Otherwise the returned value is the cartesian position (x,y,z) and the velocity (xdot, ydot, zdot).

The values stored in the array PV are expressed in the following units

> - The position and velocity are expressed in Astronomical Unit (au) if unit contains `UNIT_AU`.
> - The position and velocity are expressed in kilometers if unit contains `UNIT_KM`.
> - The velocity, TT-TDB, TCG-TCB, the derivatives of the angles of the nutation, or the derivatives of the librations of the Moon or are expressed in days if unit contains `UNIT_DAY`.
> - The velocity, TT-TDB, TCG-TCB, the derivatives of the angles of the nutation, or the derivatives of the librations of the Moon are expressed in seconds if unit contains `UNIT_SEC`.
> - The angles of the librations of the Moon or the nutation angles are expressed in radians if unit contains `UNIT_RAD`.

For example, to get the position and velocities expressed in kilometers and kilometers/seconds, the unit must be set to `UNIT_KM` + `UNIT_SEC`.

The following example prints the heliocentric coordinates of Mars at time=2442457.5

    jd0=2442457
    dt=0.5E0

    peph = CalcephBin.open('example1.dat');

    disp('heliocentric coordinates of Mars')
    PV1 = peph.compute_unit(jd0, dt, 4, 11, Constants.UNIT_KM+Constants.UNIT_SEC)

    disp('heliocentric coordinates of Mars')
    PV2 = peph.compute_unit(jd0, dt, NaifId.MARS_BARYCENTER, NaifId.SUN,
                            Constants.UNIT_KM+Constants.UNIT_SEC+Constants.USE_NAIFID)

    peph.close();

### CalcephBin.orient_unit

`CalcephBin.` `orient_unit`(JD0, time, target, unit) → PV

  Parameters: | JD0 (double) -- Integer part of the Julian date time (double) -- Fraction part of the Julian date target (int) -- The body whose orientations are requested. The numbering system depends on the parameter unit. unit (int) -- The units of PV. This integer is a sum of some unit constants (CALCEPH_UNIT_???) and/or the constant `USE_NAIFID`. If the unit contains `USE_NAIFID`, the NAIF identification numbering system is used for the target (NAIF identification numbers for the list). If the unit does not contain `USE_NAIFID`, the old number system is used for the target (see the list in the function `CalcephBin.compute()`).
  Returns: | An array to receive the euler angles, or nutation angles, and their derivatives for the orientation of the body.
  Return type: | vector

This function reads, if needed, in the ephemeris file self and interpolates the orientation of a single body (target) for the time JD0+time and stores the results to PV. The ephemeris file self must have been previously opened with the function `CalcephBin.open()`. The output values are expressed in the units specified by unit.

JD0 and time could be arrays of double-precision floating-point values.

This function checks the units if invalid combinations of units are given to the function.

The returned array PV has the following properties

> - If unit contains `OUTPUT_NUTATIONANGLES`, the array contains the nutation angles and their derivatives for the orientation of the body. At the present moment, only the nutation for the earth are supported in the original DE files.
> - If unit contains `OUTPUT_EULERANGLES`, or doesnot contain `OUTPUT_NUTATIONANGLES`, the array contains the euler angles and their derivatives for the orientation of the body.

The values stored in the array PV are expressed in the following units

> - The derivatives of the angles are expressed in days if unit contains `UNIT_DAY`.
> - The derivatives of the angles are expressed in seconds if unit contains `UNIT_SEC`.
> - The angles and their derivatives are expressed in radians if unit contains `UNIT_RAD`.

For example, to get the nutation angles of the Earth and their derivatives expressed in radian and radian/seconds using the NAIF identification numbering system, the target must be set to NAIFID_EARTH and the unit must be set to `OUTPUT_NUTATIONANGLES` + `UNIT_RAD` + `UNIT_SEC`.

The following example prints the angles of libration of the Moon at time=2442457.5

    jd0=2442457
    dt=0.5E0

    peph = CalcephBin.open('example1.dat');

    PV = peph.orient_unit(jd0, dt, NaifId.MOON,
                          Constants.USE_NAIFID+Constants.UNIT_RAD+Constants.UNIT_SEC)
    peph.close();

### CalcephBin.rotangmom_unit

`calcephpy.CalcephBin.` `rotangmom_unit`(JD0, time, target, unit) → PV

  Parameters: | JD0 (double) -- Integer part of the Julian date time (double) -- Fraction part of the Julian date target (int) -- The body whose orientations are requested. The numbering system depends on the parameter unit. unit (int) -- The units of PV. This integer is a sum of some unit constants (CALCEPH_UNIT_???) and/or the constant `USE_NAIFID`. If the unit contains `USE_NAIFID`, the NAIF identification numbering system is used for the target (NAIF identification numbers for the list). If the unit does not contain `USE_NAIFID`, the old number system is used for the target (see the list in the function `CalcephBin.compute()`).
  Returns: | An array to receive the angular momentum due to its rotation, divided by the product of the mass and of the square of the radius, and the derivatives, of the body.
  Return type: | vector

This function reads, if needed, in the ephemeris file self and interpolates the angular momentum vector due to the rotation of the body, divided by the product of the mass and of the square of the radius , of a single body (target) for the time JD0+time and stores the results to PV. The ephemeris file self must have been previously opened with the function `CalcephBin.open()`. The angular momentum , due to the rotation of the body, is defined as the product of the inertia matrix by the angular velocity vector . So the returned value is The output values are expressed in the units specified by unit.

JD0 and time could be arrays of double-precision floating-point values.

This function checks the units if invalid combinations of units are given to the function.

The values stored in the array PV are expressed in the following units

> - The angular momentum and its derivative are expressed in days if unit contains `UNIT_DAY`.
> - The angular momentum and its derivative are expressed in seconds if unit contains `UNIT_SEC`.

The following example prints the angular momentum, due to its rotation, for the Earth at time=2451419.5

    jd0=2451419
    dt=0.5E0

    peph = CalcephBin.open('example2_rotangmom.dat');

    G = peph.rotangmom_unit(jd0, dt, NaifId.EARTH,
                          Constants.USE_NAIFID+Constants.UNIT_SEC)

    peph.close();

### CalcephBin.compute_order

`CalcephBin.` `compute_order`(JD0, time, target, center, unit, order) → PVAJ

  Parameters: | JD0 (double) -- Integer part of the Julian date time (double) -- Fraction part of the Julian date target (int) -- The body or reference point whose coordinates are required. The numbering system depends on the parameter unit. center (int) -- The origin of the coordinate system. The numbering system depends on the parameter unit. unit (int) -- The units of PVAJ. This integer is a sum of some unit constants (CALCEPH_UNIT_???) and/or the constant `USE_NAIFID`. If the unit contains `USE_NAIFID`, the NAIF identification numbering system is used for the target and the center (NAIF identification numbers for the list). If the unit doesnot contain `USE_NAIFID`, the old number system is used for the target and the center (see the list in the function `CalcephBin.compute()`). order (int) -- The order of derivatives = 0 , only the position is computed. The first three numbers of PVAJ are valid for the results. = 1 , only the position and velocity are computed. The first six numbers of PVAJ are valid for the results. = 2 , only the position, velocity and acceleration are computed. The first nine numbers of PVAJ are valid for the results. = 3 , the position, velocity and acceleration and jerk are computed. The first twelve numbers of PVAJ are valid for the results. If order equals to 1, the behavior of `CalcephBin.compute_order()` is the same as `CalcephBin.compute_unit()`.
  Returns: | Depending on the target value, an array to receive the cartesian position (x,y,z), the velocity (xdot, ydot, zdot), the acceleration and the jerk, or a time scale transformation value, or the angles of the librations of the Moon and their successive derivatives, or the nutation angles and their successive derivatives.
  Return type: | vector

JD0 and time could be arrays of double-precision floating-point values.

This function is similar to the function `CalcephBin.compute_unit()`, except that the order of the computed derivatives is specified.

This function reads, if needed, in the ephemeris file self and interpolates a single object, usually the position and their derivatives of one body (target) relative to another (center) for the time JD0+time and stores the results to PVAJ. The ephemeris file self must have been previously opened with the function `CalcephBin.open()`. The order of the derivatives are specified by order. The output values are expressed in the units specified by unit.

The returned array PVAJ has the following properties

> - If the target is the time scale transformation TT-TDB, only the first elements of each component will get the result.
> - If the target is the time scale transformation TCG-TCB, only the first elements of each component will get the result.
> - If the target is Librations, the array contains the angles of the librations of the Moon and their successive derivatives.
> - If the target is Nutations, the array contains the nutation angles and their successive derivatives.
> - Otherwise the returned value is the cartesian position (x,y,z), the velocity (xdot, ydot, zdot), the jerk and the acceleration.

The returned array PVAJ must be large enough to store the results.

> - PVAJ[1:3] contain the position (x,y,z) and is always valid.
> - PVAJ[4:6] contain the velocity (dx/dt,dy/dt,dz/dt) and is only valid if order is greater or equal to 1.
> - PVAJ[7:9] contain the acceleration (d^2x/dt^2,d^2y/dt^2,d^2z/dt^2) and is only valid if order is greater or equal to 2.
> - PVAJ[10:12] contain the jerk (d^3x/dt^3,d^3y/dt^3,d^3z/dt^3) and is only valid if order is equal to 3.

The values stored in the array PVAJ are expressed in the following units

> - The position, velocity, acceleration and jerk are expressed in Astronomical Unit (au) if unit contains `UNIT_AU`.
> - The position, velocity, acceleration and jerk are expressed in kilometers if unit contains `UNIT_KM`.
> - The velocity, acceleration, jerk, TT-TDB, TCG-TCB or the derivatives of the angles of the librations of the Moon are expressed in days if unit contains `UNIT_DAY`.
> - The velocity, acceleration, jerk, TT-TDB, TCG-TCB or the derivatives of the angles of the librations of the Moon are expressed in seconds if unit contains `UNIT_SEC`.
> - The angles of the librations of the Moon are expressed in radians if unit contains `UNIT_RAD`.

For example, to get the positions, velocities, accelerations and jerks expressed in kilometers and kilometers/seconds, the unit must be set to `UNIT_KM` + `UNIT_SEC`.

This function checks the units if invalid combinations of units are given to the function.

The following example prints the heliocentric coordinates of Mars at time=2442457.5

    jd0=2442457
    dt=0.5E0

    peph = CalcephBin.open('example1.dat');

    % compute only the heliocentric position of Mars in km
    P = peph.compute_order(jd0, dt, NaifId.MARS_BARYCENTER, NaifId.SUN,
                            Constants.UNIT_KM+Constants.UNIT_SEC+Constants.USE_NAIFID, 0)

    % compute positions, velocities, accelerations and jerks of Mars in km and seconds
    PVAJ = peph.compute_order(jd0, dt, NaifId.MARS_BARYCENTER, NaifId.SUN,
                            Constants.UNIT_KM+Constants.UNIT_SEC+Constants.USE_NAIFID, 3)

    peph.close();

### CalcephBin.orient_order

`CalcephBin.` `orient_order`(JD0, time, target, unit, order) → PVAJ

  Parameters: | JD0 (double) -- Integer part of the Julian date time (double) -- Fraction part of the Julian date target (int) -- The body whose orientations are requested. The numbering system depends on the parameter unit. unit (int) -- The units of PV. This integer is a sum of some unit constants (CALCEPH_UNIT_???) and/or the constant `USE_NAIFID`. If the unit contains `USE_NAIFID`, the NAIF identification numbering system is used for the target (NAIF identification numbers for the list). If the unit does not contain `USE_NAIFID`, the old number system is used for the target (see the list in the function `CalcephBin.compute()`). order (int) -- The order of derivatives. = 0 , only the angles is computed. The first three numbers of PVAJ are valid for the results. = 1 , only the angles and the first derivative are computed. The first six numbers of PVAJ are valid for the results. = 2 , only the angles and the first and second derivatives are computed. The first nine numbers of PVAJ are valid for the results. = 3 , the angles and the first, second and third derivatives are computed. The first twelve numbers of PVAJ are valid for the results. If order equals to 1, the behavior of `CalcephBin.orient_order()` is the same as `CalcephBin.orient_unit()`.
  Returns: | An array to receive the euler angles, or nutation angles, and their derivatives for the orientation of the body.
  Return type: | vector

JD0 and time could be arrays of double-precision floating-point values.

This function is similar to the function `CalcephBin.orient_unit()`, except that the order of the computed derivatives is specified.

This function reads, if needed, in the ephemeris file self and interpolates the orientation of a single body (target) for the time JD0+time and stores the results to PVAJ. The order of the derivatives are specified by order. The ephemeris file self must have been previously opened with the function `CalcephBin.open()`. The output values are expressed in the units specified by unit.

This function checks the units if invalid combinations of units are given to the function.

The returned array PVAJ has the following properties

> - If unit contains `OUTPUT_NUTATIONANGLES`, the array contains the nutation angles and their successive derivatives for the orientation of the body. At the present moment, only the nutation for the earth are supported in the original DE files.
> - If unit contains `OUTPUT_EULERANGLES`, or doesnot contain `OUTPUT_NUTATIONANGLES`, the array contains the euler angles and their successive derivatives for the orientation of the body.

The returned array PVAJ must be large enough to store the results.

> - PVAJ[1:3] contain the angles and is always valid.
> - PVAJ[4:6] contain the first derivative and is only valid if order is greater or equal to 1.
> - PVAJ[7:9] contain the second derivative and is only valid if order is greater or equal to 2.
> - PVAJ[10:12] contain the third derivative and is only valid if order is equal to 3.

The values stored in the array PVAJ are expressed in the following units

> - The derivatives of the angles are expressed in days if unit contains `UNIT_DAY`.
> - The derivatives of the angles are expressed in seconds if unit contains `UNIT_SEC`.
> - The angles and their derivatives are expressed in radians if unit contains `UNIT_RAD`.

The following example prints only the angles of libration of the Moon at time=2442457.5

    jd0=2442457
    dt=0.5E0

    peph = CalcephBin.open('example1.dat');

    P = peph.orient_order(jd0, dt, NaifId.MOON,
                          Constants.USE_NAIFID+Constants.UNIT_RAD+Constants.UNIT_SEC, 0)

    peph.close();

### CalcephBin.rotangmom_order

`CalcephBin.` `rotangmom_order`(JD0, time, target, unit, order) → PVAJ

  Parameters: | JD0 (double) -- Integer part of the Julian date time (double) -- Fraction part of the Julian date target (int) -- The body whose orientations are requested. The numbering system depends on the parameter unit. unit (int) -- The units of PV. This integer is a sum of some unit constants (CALCEPH_UNIT_???) and/or the constant `USE_NAIFID`. If the unit contains `USE_NAIFID`, the NAIF identification numbering system is used for the target (NAIF identification numbers for the list). If the unit does not contain `USE_NAIFID`, the old number system is used for the target (see the list in the function `CalcephBin.compute()`). order (int) -- The order of derivatives. = 0 , only the angular momentum is computed. The first three numbers of PVAJ are valid for the results. = 1 , only the angular momentum and the first derivative are computed. The first six numbers of PVAJ are valid for the results. = 2 , only the angular momentum and the first and second derivatives are computed. The first nine numbers of PVAJ are valid for the results. = 3 , the angular momentum and the first, second and third derivatives are computed. The first twelve numbers of PVAJ are valid for the results. If order equals to 1, the behavior of `CalcephBin.rotangmom_order()` is the same as `CalcephBin.rotangmom_unit()`.
  Returns: | An array to receive the angular momentum due to its rotation, divided by the product of the mass and of the square of the radius, and their different order of the derivatives, of the body.
  Return type: | vector

This function is similar to the function `CalcephBin.orient_unit()`, except that the order of the computed derivatives is specified.

This function reads, if needed, in the ephemeris file self and interpolates the angular momentum vector due to the rotation of the body, divided by the product of the mass and of the square of the radius , of a single body (target) for the time JD0+time and stores the results to PVAJ. The angular momentum , due to the rotation of the body, is defined as the product of the inertia matrix by the angular velocity vector . So the returned value is The order of the derivatives are specified by order. The ephemeris file self must have been previously opened with the function `CalcephBin.open()`. The output values are expressed in the units specified by unit.

JD0 and time could be arrays of double-precision floating-point values.

This function checks the units if invalid combinations of units are given to the function.

The returned array PVAJ must be large enough to store the results.

> - PVAJ[1:3] contain the angular momentum and is always valid.
> - PVAJ[4:6] contain the first derivative and is only valid if order is greater or equal to 1.
> - PVAJ[7:9] contain the second derivative and is only valid if order is greater or equal to 2.
> - PVAJ[10:12] contain the third derivative and is only valid if order is equal to 3.

The values stored in the array PVAJ are expressed in the following units

> - The angular momentum and its derivatives are expressed in days if unit contains `UNIT_DAY`.
> - The angular momentum and its derivatives are expressed in seconds if unit contains `UNIT_SEC`.

The following example prints only the angular momentum, due to its rotation, of the Earth at time=2451419.5

    jd0=2451419
    dt=0.5E0

    peph = CalcephBin.open('example2_rotangmom.dat')

    G = peph.rotangmom_order(jd0, dt, NaifId.EARTH,
                          Constants.USE_NAIFID+Constants.UNIT_SEC, 0)

    peph.close()

### CalcephBin.getconstant

`CalcephBin.` `getconstant`(name) → value

  Parameters: | name (str) -- name of the constant
  Returns: | first value of the constant
  Return type: | double

This function returns the value associated to the constant name in the header of the ephemeris file self. Only the first value is returned if multiple values are associated to a constant, such as a list of values.

This function is the same function as `CalcephBin.getconstantsd()`.

The following example prints the value of the astronomical unit stored in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    AU = peph.getconstant('AU')
    peph.close();

### CalcephBin.getconstantsd

`CalcephBin.` `getconstantsd`(name) → value

  Parameters: | name (str) -- name of the constant
  Returns: | first value of the constant
  Return type: | double

This function returns, as a floating-point number, the value associated to the constant name in the header of the ephemeris file self. Only the first value is returned if multiple values are associated to a constant, such as a list of values. The value must be a floating-point or integer number, otherwise an error is reported.

This function is the same function as `CalcephBin.getconstant()`.

The following example prints the value of the astronomical unit stored in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    AU = peph.getconstantsd('AU')
    peph.close();

### CalcephBin.getconstantvd

`CalcephBin.` `getconstantvd`(name) → arrayvalue

  Parameters: | name (str) -- name of the constant
  Returns: | array of values for the constant
  Return type: | vector

This function returns, as floating-point numbers, all values associated to the constant name in the header of the ephemeris file self.

The values must be floating-point or integer numbers, otherwise an error is reported.

The following example prints the body radii of the earth stored in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    radii = peph.getconstantvd('BODY399_RADII')
    peph.close();

### CalcephBin.getconstantss

`CalcephBin.` `getconstantss`(name) → value

  Parameters: | name (str) -- name of the constant
  Returns: | first value of the constant
  Return type: | string

This function returns, as a string of character, the value associated to the constant name in the header of the ephemeris file self. Only the first value is returned if multiple values are associated to a constant, such as a list of values. The value must be a string, otherwise an error is reported.

The following example prints the value of the unit stored in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    UNIT = peph.getconstantss('UNIT')
    peph.close();

### CalcephBin.getconstantvs

`CalcephBin.` `getconstantvs`(name) → arrayvalue

  Parameters: | name (str) -- name of the constant
  Returns: | array of values for the constant
  Return type: | cell array of character vectors

This function returns, as strings of characters, all values associated to the constant name in the header of the ephemeris file self.

The values must be strings, otherwise an error is reported.

The following example prints the units of the mission stored in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    mission_units = peph.getconstantvs('MISSION_UNITS')
    peph.close();

### CalcephBin.getconstantcount

`CalcephBin.` `getconstantcount`()

  Returns: | number of constants
  Return type: | int

This function returns the number of constants available in the header of the ephemeris file self.

The following example prints the number of available constants stored in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    n = peph.getconstantcount()
    printf('number of constants=%d\n', n)
    peph.close();

### CalcephBin.getconstantindex

`CalcephBin.` `getconstantindex`(index) → name, value

  Parameters: | index (int) -- index of the constant, between 1 and `CalcephBin.getconstantcount()`
  Returns: | name of the constant, first value of the constant
  Return type: | str, double

This function returns the name and its value of the constant available at the specified index in the header of the ephemeris file self. The value of index must be between 1 and `CalcephBin.getconstantcount()`.

Only the first value is returned if multiple values are associated to a constant, such as a list of values.

The following example displays the name of the constants, stored in the ephemeris file, and their values

    peph = CalcephBin.open('example1.dat');
    n = peph.getconstantcount()
    for j=1:n
        [ name, value ] = peph.getconstantindex(j)
    end
    peph.close();

### CalcephBin.getfileversion

`CalcephBin.` `getfileversion`()

  Returns: | version of the ephemeris file
  Return type: | str

This function returns the version of the ephemeris file, as a string. For example, the argument version will contain 'INPOP10B', 'EPM2017' or 'DE405', ... .

If the file is an original JPL binary planetary ephemeris, then the version of the file can always be determined. If the file is a spice kernel, the version of the file is retrieved from the constant INPOP_PCK_VERSION, EPM_PCK_VERSION, or PCK_VERSION.

The following example prints the version of the ephemeris file.

    peph = CalcephBin.open('example1.dat');
    version = peph.getfileversion()
    peph.close();

### CalcephBin.gettimescale

`CalcephBin.` `gettimescale`()

  Returns: | time scale of the ephemeris file
  Return type: | int

This function returns the timescale of the ephemeris file self :
  - 1 if the quantities of all bodies are expressed in the TDB time scale.
  - 2 if the quantities of all bodies are expressed in the TCB time scale.

The following example prints the time scale available in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    timescale = peph.gettimescale()
    peph.close();

### CalcephBin.gettimespan

`CalcephBin.` `gettimespan`() → firsttime, lasttime, continuous

  Returns: | first and last available time, availability of the quantities of the bodies over the time span
  Return type: | double, double, int

This function returns the first and last time available in the ephemeris file self. The Julian date for the first and last time are expressed in the time scale returned by `CalcephBin.gettimescale()` .

It returns the following value in the parameter continuous :

> - 1 if the quantities of all bodies are available for any time between the first and last time.
> - 2 if the quantities of some bodies are available on discontinuous time intervals between the first and last time.
> - 3 if the quantities of each body are available on a continuous time interval between the first and last time, but not available for any time between the first and last time.

The following example prints the first and last time available in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    [firsttime, lasttime, continuous ] = peph.gettimespan()
    peph.close();

### CalcephBin.getpositionrecordcount

`calcephpy.CalcephBin.` `getpositionrecordcount`()

  Returns: | number of position's records
  Return type: | int

This function returns the number of position's records available in the ephemeris file self. Usually, the number of records is equal to the number of bodies in the ephemeris file if the timespan is continuous. If the timespan is discontinuous for the target and center bodies, then each different timespan is counted as a different record. If the ephemeris file contain timescale transformations' records, such as TT-TDB or TCG-TCB, then these records are included in the returned value.

The following example prints the number of position's records available in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    n = peph.getpositionrecordcount()
    printf('number of position''s record=%d\n', n)
    peph.close();

### CalcephBin.getpositionrecordindex

`CalcephBin.` `getpositionrecordindex`(index) → target, center, firsttime, lasttime, frame

  Parameters: | index (int) -- index of the position's record, between 1 and `CalcephBin.getpositionrecordcount()`
  Returns: | target : the target body center : the origin body firsttime : julian date of the first time lasttime : julian date of the last time frame : reference frame (see the list, below)
  Return type: | int, int, double, double, int

This function returns the target and origin bodies, the first and last time, and the reference frame available at the specified index for the position's records of the ephemeris file self. The NAIF identification numbering system is used for the target and center integers (NAIF identification numbers for the list). The Julian date for the first and last time are expressed in the time scale returned by `CalcephBin.gettimescale()`.

It returns the following value in the parameter frame :

value | Name
--- | ---
1 | ICRF

The following example displays the position's records stored in the ephemeris file.

    peph = CalcephBin.open('example1.dat');
    n = peph.getpositionrecordcount()
    for j=1:n
        [itarget, icenter, firsttime, lasttime, iframe] = peph.getpositionrecordindex(j)
    end
    peph.close();

### CalcephBin.getorientrecordcount

`CalcephBin.` `getorientrecordcount`()

  Returns: | number of orientation's records
  Return type: | int

This function returns the number of orientation's records available in the ephemeris file self. Usually, the number of records is equal to the number of bodies in the ephemeris file if the timespan is continuous. If the timespan is discontinuous for the target body, then each different timespan is counted as a different record.

The following example prints the number of orientation's records available in the ephemeris file

    peph = CalcephBin.open('example1.dat');
    n = peph.getorientrecordcount()
    printf('number of orientation''s record=%d\n', n)
    peph.close();

### CalcephBin.getorientrecordindex

`CalcephBin.` `getorientrecordindex`(index) → target, firsttime, lasttime, frame

  Parameters: | index (int) -- index of the orientation's record, between 1 and `CalcephBin.getorientrecordcount()`
  Returns: | target : the target body center : the origin body firsttime : julian date of the first time lasttime : julian date of the last time frame : reference frame (see the list, below)
  Return type: | int, double, double, int

This function returns the target body, the first and last time, and the reference frame available at the specified index for the orientation's records of the ephemeris file self. The NAIF identification numbering system is used for the target body (NAIF identification numbers for the list). The Julian date for the first and last time are expressed in the time scale returned by `CalcephBin.gettimescale()`.

It returns the following value in the parameter frame :

value | Name
--- | ---
1 | ICRF

The following example displays the orientation's records stored in the ephemeris file.

    peph = CalcephBin.open('example1.dat')
    n = peph.getorientrecordcount()
    for j=1:n
        [itarget, firsttime, lasttime, iframe] = peph.getorientrecordindex(j)
    end

    peph.close();

### CalcephBin.close

`calcephpy.CalcephBin.` `close`()

This function closes the access associated to the ephemeris descriptor and frees allocated memory for it.