This function is meant to enable the parallel writing (with multiple threads) of several type 12 segments (discrete states of the positions and velocities, Hermite interpolation with equal timesteps) to the SPK file associated to the ephemeris descriptor eph. This function is similar to writeph_spk2_par_reserve(), except that it reserves enough space for type 12 segments (state vectors with derivatives). In the same way writeph_spk2_par_reserve() is used with writeph_spk2_par_write(), this function must be used with writeph_spk12_par_write().

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_spk12_par_write() to write in the corresponding reserved space. In addition, the function writeph_spk12_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_spk12_par_reserve is always performed by a single thread and is followed by several calls to writeph_spk12_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_spk12_par_write().

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

USE, INTRINSIC :: ISO_C_BINDING
use calceph
TYPE(C_PTR) :: weph
INTEGER len_timespan
REAL(8) :: jd_start, jd_end, jd
INTEGER frame, body, k, ret
REAL(8), dimension(6) :: pos_vel !  size  = 6 components
INTEGER, dimension(2) :: record_counts, targets
INTEGER target_count, reservation
REAL(8), dimension(2) :: len_timespan
CHARACTER(len=40), dimension (2) :: segids
INTEGER interpolation_degree

frame = 1 ! ICRF
target_count = 2
targets(1) = NAIFID_MERCURY
targets(2) = NAIFID_VENUS
len_timespan(1) = 32
len_timespan(2) = 16
record_counts(1) = 10
record_counts(2) = 20
segids(1) = "seg_mercury"//C_NULL_CHAR
segids(2) = "seg_venus"//C_NULL_CHAR
interpolation_degree = 12
jd_start = 2460000
jd_end = jd_start+32*10

weph = writeph_spk_create("ephemeris.bsp"//C_NULL_CHAR, "planet_2"//C_NULL_CHAR,0)
if (C_ASSOCIATED(weph)) then

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

     !$omp parallel for private(body)
     do body=0, target_count
          !$omp parallel for private(k, pos_vel, jd, ret)
          do k=0, record_counts(body)-1
              jd = jd_start+k*len_timespan(body)
              ! ... fill the array pos_vel with the positions and velocities at the date jd  ...
              ! pos_vel(...) =...
              ret = writeph_spk12_par_write(weph, reservation, body,  k, 1,  pos_vel)
          enddo
     enddo
     call writeph_close(weph)
endif