Consolidated Prediction Format (CPF)

(as of Thursday, 28-Dec-2017 12:14:16 EST)

This page is used to accumlate errata/changes to the CPF documents and source code. It will be updated when needed.


Version v1.01d issued 21 December 2017

Only change were to modules in cpf_llr_c:

Create proper prototypes, and expand several arrays to prevent size mismatches that confuse certain compilers. Thanks to Nicolas Maurice of Observatoire de la Côte d'Azur for reporting this problem.

Version v1.01c issued 12 June 2015 (includes all changes since v1.01b)


Issue #: 2015-3

Date: 11 June 2015
Component: sample source code
Version: 1.01c
Routines: common_c/ephinterp.c, common_f/ephinterp.for, cpf_c/testc_leap.c, cpf_f/testf_leap.f
Problem:
Leap second flag was applied with the wrong sign
Impact:
Leap second flag not handled properly
Source: rlr
Changes to ephinterp

Change sign from - to + for 4 instances where leapsec_value is added to itime.

Changes to test[cf]_leap
Change sign from + to - in creating the station time after the leap second.


Issue #: 2015-2

Date: 3 February 2015
Component: sample source code
Version: 1.01b
Routines:common_c/ephinit.c, common_c/ephinterp.c common_f/ephinitu.for, common_f/ephinterp.for cpf_c/testc.c, cpf_c/testc_leap.c, cpf_c/testc_noleap.c cpf_f/testf.f, cpf_f/testf_leap.f, cpf_f/testf_noleap.f
Problem:
Leap second flag was not applied in the ephemeris routines.
Impact:
Leap second flag not handled properly.
Source: rlr
Change:
Changes to ephinit[u]:

Record the first entry where leap second flag is non-zero.
Changes to ephinterp:
After the first entry where leap second flag is non-zero, correct the requested 
interpolation time.

Added programs test[cf]_leap and test[cf]_noleap to demonstrate the changes.


Issue #: 2015-1

Date: 3 February 2015
Component: sample source code
Version: 1.01b
Routines:cpf_slr_f/cpf_inter.for and cpf_slr_c/cpf_inter.c
Problem:
Variable R3 should be a 3x3 real*8 matrix
Impact:
Only lunar-type separate outbond and inbound legs.
Source: rlr
Change:
Changes to cpf_inter.for:

Add R3(3,3) to line 63.
Changes to cpf_inter.c:
Change r3 on line 70 to r3[3][3] on line 68.


Issue #: 2011-01

Date: 27 October 2011
Component: sample source code
Version: 1.01a
Routine:cpf_sched/cpf_split.f
Problem:
Did not handle variable time spans properly when time span in record H2 was set to 0.
Impact:
Variable time spans between ephemeris entries, e.g. Radioastron
Source: rlr
Change:
Changes to cpf_split.f:
Replace line 150:

 DO jj = 1,nv*ephsep/60

with:

       ift= int((jdi(nv)- jdi(1) + (jdf(nv)- jdf(1)))*1440.d0)
             CC    DO jj = 1,nv*ephsep/60

DO jj = 1,ift

After line 54 add:

 integer ift

Issue #: 2010-2

Date: 12 April 2010
Component: sample source code
Version: 1.01a
Routines: cpf_sched/schedule.cr
Problem: Array overflow due to a character string being too short.
Impact: Could potentially cause a segmentation fault.
Source:Thanks to Martin Ettl <ettl.martin@gmx.de> for identifying this problem.
Changes to schedule.c.c:
Change lines 26
from

 char chr[3], fquit, ans,header1[256], header2[256], tar[25][2],  tarin[2]; 
to
 char chr[4], fquit, ans,header1[256], header2[256], tar[25][2],  tarin[2]; 

Issue #: 2010-1

Date: 12 April 2010
Component: sample source code
Version: 1.01a
Routines: cpf_llr_c/predpkg.c
Problem:Appears to be array out of bounds in routine rotmat as detemined by cppcheck. (The third element of 2-element array "a" is referenced. However, this routine was produced by f2c, which decrements the array address earlier in the routine.)
Impact: None, except giving the impression of a problem.
Source:Thanks to Martin Ettl <ettl.martin@gmx.de> for identifying this situation.
Optional changes to predpkg.c:
Change line 1143
from

 --a;

to

/*  --a; */
and lines 1156-1157:
from
a1 = ione * a[1];
           adot = ione * a[2];

to

a1 = ione * a[0];
           adot = ione * a[1];
           

Issue #: 2009-3

Date: 11 June 2009
Component: sample source code
Version: 1.01a
Component: sample source code
Version: 1.01a
Routines: cpf_inter.c and cpf_inter.for
Problem: Wrong units shown in documentation
Source: Thanks to Paul Liptack (Paul.Liptack @ boeing.com) for identifying these problems.
Changes to cpf_inter.c:
Change lines 35-36
from

           CC              DIFAZI   : POINT-BEHIND (AZIMUTH,   ARC SECONDS)   R*8
           CC              DIFELE   : POINT-BEHIND (ELEVATION, ARC SECONDS)   R*8
           
to
           CC              DIFAZI   : POINT-BEHIND (AZIMUTH,   DEGREES)       R*8
           CC              DIFELE   : POINT-BEHIND (ELEVATION, DEGREES)       R*8
Changes to cpf_inter.for:
Change line s 38-39
from
           CC              DIFAZI   : POINT-BEHIND (AZIMUTH,   ARC SECONDS)   R*8
           CC              DIFELE   : POINT-BEHIND (ELEVATION, ARC SECONDS)   R*8
to
           CC              DIFAZI   : POINT-BEHIND (AZIMUTH,   DEGREES)       R*8
           CC              DIFELE   : POINT-BEHIND (ELEVATION, DEGREES)       R*8

Issue #: 2009-2

Date: 11 June 2009
Component: sample source code
Version: 1.01a
Routines: cpf_inter.c and cpf_inter.for
Problem:Outbound (or instantaneous) (idir = 0 or 1) records must occur before inbound (idir=2) records or the index (nv*) will be wrong and could cause a program crash or unexpected results.
Source: Thanks to Paul Liptack (Paul.Liptack @ boeing.com) for identifying these problems.
Impact: Minor. Only LLR currently uses out- and in-bound records.No one uses inbound-only records at this time.
Changes: None yet. Prediction producer must currently prevent this out-of-sequence situation. Errata will be updated when fix to software is developed.


Issue #: 2009-1

Date: 11 June 2009
Component: sample source code
Routines: ephinit.c
Problem: Wrong indices used in assignment statements
Source: Thanks to Paul Liptack (Paul.Liptack @ boeing.com) for identifying these problems.
Impact: minimal. Offset records (50) are not currently used and the outbound and inbound relativity offsets (c12 and c23) agree to better than a nsec for the moon.
Changes to ephinit.c:
Change line 286
from

                        ephi.c23[ephi.nv] = -ephi.c12[ephi.nv];
           
to
                        ephi.c23[ephi.nv] = -ephi.c23[ephi.nv];
Change lines 321-324
from
                        /* In case there is not back vector */
                        ephi.offsetbackv[0][ephi.nv] = -ephi.offsetoutv[0][ephi.nv];
                        ephi.offsetbackv[1][ephi.nv] = -ephi.offsetoutv[1][ephi.nv];
                        ephi.offsetbackv[2][ephi.nv] = -ephi.offsetoutv[2][ephi.nv];
to
                        /* In case there is not back vector */
                        ephi.offsetbackv[0][ephi.nvoff] = -ephi.offsetoutv[0][ephi.nvoff];
                        ephi.offsetbackv[1][ephi.nvoff] = -ephi.offsetoutv[1][ephi.nvoff];
                        ephi.offsetbackv[2][ephi.nvoff] = -ephi.offsetoutv[2][ephi.nvoff];
Change lines 328-332
from
                        sscanf (&ephstr[3],
                           "%d %d %lf %lf %lf %lf", &idir,
                           &mjd, &sod, &ephi.offsetbackv[0][ephi.nv],
                           &ephi.offsetbackv[1][ephi.nv],
                           &ephi.offsetbackv[2][ephi.nv]);
to
           
                        sscanf (&ephstr[3],
                           "%d %d %lf %lf %lf %lf", &idir,
                           &mjd, &sod, &ephi.offsetbackv[0][ephi.nvoff],
                           &ephi.offsetbackv[1][ephi.nvoff],
                           &ephi.offsetbackv[2][ephi.nvoff]);