This function is meant to enable the parallel writing (with multiple threads) of several type 8 segments (discrete states of the positions and velocities, Lagrange interpolation with equal timesteps) in the time scale TDB to the SPK file associated to the ephemeris descriptor eph.

It reserves space in the file for target_count segments, each segment associated to a target in the targets array. Each target has its own interpolation interval length specified in the intlens_jd_tdb array, its own number of records specified in the record_counts array, and its own segment identifier specified in the segids array. All the targets share the same center, frame, start_..._tdb, end_..._tdb and deg parameters.

The array targets, intlens_jd_tdb, record_counts and segids must be of size target_count.

The reservation id returned by this function must be used in the function writeph_spk8_par_write() to write in the corresponding reserved space. In addition, the function writeph_spk8_par_write() will require a target_index, which is the index of the target in the targets array used in this function.

A call to writeph_spk8_par_reserve is always performed by a single thread and is followed by several calls to writeph_spk8_par_write() by one or several threads.

Warning

The data covers the same timespan from the date start_jd_tdb+start_frac_tdb to end_jd_tdb+end_frac_tdb for all targets, but each target may have a different number of polynomials. The time span record_counts*intlens_jd_tdb must be equal to the timespan defined from the date start_jd_tdb+start_frac_tdb to end_jd_tdb+end_frac_tdb. If the targets doesnot have the timespan, multiple reservations must be performed before the call to writing writeph_spk8_par_write().

The following example creates a new ephemeris file ephemeris.bsp with segment of type 8 for the heliocentric coordinates of Mercury and Venus using OpenMP.

t_writephbin *weph;

weph = writeph_spk_create("ephemeris.bsp","planet_2");
if (weph)
{
      int frame = 1; /* ICRF */
      int target_count = 2;
      int targets[2] = { NAIFID_MERCURY, NAIFID_VENUS };
      int records_count[2] = { 10, 20 };
      int len_timespan[2] = { 32, 16 };
      const char segids[2] = { "seg_mercury",  "seg_venus" };
      double jd_start = 2460000;
      double jd_end = 2460000+32*10;
      int reservation;
      int interpolation_degree = 7;

      reservation = writeph_spk8_seq_reserve(weph, target_count, targets, NAIFID_SUN,
                             frame, jd_start, 0.0, jd_end, 0.0,
                             len_timespan, record_counts, interpolation_degree, segids);

      #pragma omp parallel for
      for (int body = 0; body<target_count; body++)
      {
           #pragma omp parallel for
           for (int k=0; k<records_count[body]; k++)
           {
               double pos_vel[6];  /*  size = 6 components */

               double jd = jd_start+k*len_timespan;

               /* ... fill the array pos_vel with the positions and velocities at the date jd ...
                pos_vel[..] =...
               */
               writeph_spk8_par_write(weph, reservation, body,  k, 1,  pos_vel);
           }
      }


      writeph_close(weph);
}