1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
// $Id: deltaT-gen.c 11971 2011-10-14 09:28:58Z andrewross $
//
// Copyright (C) 2009 Alan W. Irwin
//
// This file is part of PLplot.
// PLplot is free software; you can redistribute it and/or modify
// it under the terms of the GNU Library General Public License as published
// by the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// PLplot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public License
// along with PLplot; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
//
// Program for generating spline representation (xspline, yspline,
// and y2spline arrays) header from deltaT.dat.
//
// The program assumes that argv[1] will be the input file, and
// argv[2] the output file. This works cross-platform without
// worrying about shell redirects of stdin and stdout that are
// not accessible on Windows, apparently.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dspline.h"
//--------------------------------------------------------------------------
// Function-like macro definitions
//--------------------------------------------------------------------------
#define MemError1( a ) do { fprintf( stderr, "MEMORY ERROR %d\n" a "\n", __LINE__ ); exit( __LINE__ ); } while ( 0 )
const char header[] = "" \
"/*\n" \
" This file is part of PLplot.\n" \
" \n" \
" PLplot is free software; you can redistribute it and/or modify\n" \
" it under the terms of the GNU Library General Public License as published\n" \
" by the Free Software Foundation; either version 2 of the License, or\n" \
" (at your option) any later version.\n" \
" \n" \
" PLplot is distributed in the hope that it will be useful,\n" \
" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" \
" GNU Library General Public License for more details.\n" \
" \n" \
" You should have received a copy of the GNU Library General Public License\n" \
" along with PLplot; if not, write to the Free Software\n" \
" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" \
" \n" \
" \n" \
" This header file contains spline data (xspline, yspline, and y2spline)\n" \
" for converting between UT1 and ephemeris time.\n" \
" It is an automatically generated file, so please do\n" \
" not edit it directly. Make any changes to deltaT.dat then use\n" \
" deltaT-gen to recreate this header file.\n" \
" \n" \
"*/";
int main( int argc, char *argv[] )
{
FILE *fr, *fw;
char readbuffer[256];
double *xspline = NULL;
double *yspline = NULL;
double *y2spline = NULL;
int i = 0;
int number_of_lines = 0;
if ( ( argc < 2 ) || ( fr = fopen( argv[1], "r" ) ) == NULL )
{
fprintf( stderr, "Cannot open first file as readable\n" );
exit( 1 );
}
if ( ( argc < 3 ) || ( fw = fopen( argv[2], "w" ) ) == NULL )
{
fprintf( stderr, "Cannot open second file as writable\n" );
exit( 1 );
}
//
// Work out how many lines we have all up
//
while ( ( fgets( readbuffer, 255, fr ) != NULL ) )
{
++number_of_lines;
}
//
// Allocate memory to the arrays which will hold the data
//
if ( ( xspline = (double *) calloc( (size_t) number_of_lines, (size_t) sizeof ( double ) ) ) == NULL )
MemError1( "Allocating memory to the xspline table" );
if ( ( yspline = (double *) calloc( (size_t) number_of_lines, (size_t) sizeof ( double ) ) ) == NULL )
MemError1( "Allocating memory to the yspline table" );
if ( ( y2spline = (double *) calloc( (size_t) number_of_lines, (size_t) sizeof ( double ) ) ) == NULL )
MemError1( "Allocating memory to the y2spline table" );
rewind( fr ); // Go back to the start of the file
//
// Read in line by line, and copy the numbers into our arrays
//
while ( ( fgets( readbuffer, 255, fr ) != NULL ) )
{
sscanf( readbuffer, "%lf %lf", (double *) &xspline[i], (double *) &yspline[i] );
i++;
}
fclose( fr );
// Calculate spline representation using second derivative condition
// on end points that is consistent with overall average parabolic shape
// of delta T curve (Morrison and Stephenson, 2004) with second
// derivative = 6.4e-3 secs/year/year.
dspline( xspline, yspline, number_of_lines, 2, 6.4e-3, 2, 6.4e-3, y2spline );
//
// Write the data out to file ready to be included in our source
//
fprintf( fw, "%s\n", header );
fprintf( fw, "const int number_of_entries_in_spline_tables=%d;\n\n", number_of_lines );
fprintf( fw, "const double xspline[%d] = {\n", number_of_lines );
for ( i = 0; i < number_of_lines; i++ )
{
fprintf( fw, "%10.0f,\n", xspline[i] );
}
fprintf( fw, "};\n" );
fprintf( fw, "const double yspline[%d] = {\n", number_of_lines );
for ( i = 0; i < number_of_lines; i++ )
{
fprintf( fw, "%10.0f,\n", yspline[i] );
}
fprintf( fw, "};\n" );
fprintf( fw, "const double y2spline[%d] = {\n", number_of_lines );
for ( i = 0; i < number_of_lines; i++ )
{
fprintf( fw, "%25.15e,\n", y2spline[i] );
}
fprintf( fw, "};\n" );
fclose( fw );
free( xspline );
free( yspline );
free( y2spline );
return ( 0 );
}
|