-
Notifications
You must be signed in to change notification settings - Fork 0
/
phaselib.c
128 lines (113 loc) · 3.55 KB
/
phaselib.c
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
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include <defs_nadc.h>
#include <defs_scia.h>
#include <proto_scia.h>
bool Use_Extern_Alloc = true;
void myprint(void);
void print_doubles(double *ds, long n)
{
long i;
for (i=0; i<n; i++)
{
printf("%f\n", ds[i]);
}
}
void print_double(double d)
{
printf("%f\n", d);
}
void myprint()
{
printf("hello world\n");
}
struct roe_rec {
double julianDay;
unsigned short orbit;
unsigned short relOrbit;
unsigned char phase;
unsigned char cycle;
unsigned short repeat;
unsigned char saaDay;
unsigned char saaEclipse;
double eclipseExit;
double eclipseEntry;
double period;
double anxLongitude;
char UTC_anx[28];
char UTC_flt[28];
char mlst[8];
};
/*+++++++++++++++++++++++++
NOTE: modified version of the original nadc_tools function!! orbitPhase is not made absolute!
.IDENTifer GET_SCIA_ROE_INFO
.PURPOSE get orbit phase and SAA flag from ROE records
.INPUT/OUTPUT
call as GET_SCIA_ROE_INFO( eclipseMode, jday,
&absOrbit, &saaFlag, &orbitPhase );
input:
bool eclipseMode : TRUE - orbit phase used for SDMF (v2.4)
FALSE - orbit phase as used by ESA
double jday : Julian day (# days since 2000-01-01)
output:
int *absOrbit : absolute orbit number
float *saaFlag : in-precise SAA flag
float *orbitPhase : orbit phase [0,1]
.RETURNS nothing
error status passed by global variable ``nadc_stat''
.COMMENTS none
-------------------------*/
void GET_SCIA_ROE_INFO_MOD( bool eclipseMode, const double jday,
int *absOrbit, bool *saaFlag, float *orbitPhase )
{
const double secPerDay = 60. * 60 * 24;
static struct roe_rec roe;
double tdiff, phase;
/*
* initialise return values
*/
*absOrbit = -1;
*saaFlag = FALSE;
*orbitPhase = -1.f;
/*
* get absOrbit and ROE entry for given julianDay
*/
if ( _GET_ROE_ENTRY( jday, &roe ) < 0 ) return;
/* set absolute orbit number */
*absOrbit = roe.orbit;
/* calculate orbit phase */
tdiff = (jday - roe.julianDay) * secPerDay - roe.eclipseEntry;
phase = fmod( tdiff, roe.period ) / roe.period;
if ( ! eclipseMode ) {
phase += 0.5 *
((roe.eclipseEntry - roe.eclipseExit) / roe.period - 0.5);
}
*orbitPhase = phase; // ((phase >= 0) ? (float) phase : (float) (phase + 1));
/* set SAA flag */
tdiff = (jday - roe.julianDay) * secPerDay;
if ( tdiff > roe.eclipseExit && tdiff < roe.eclipseEntry )
*saaFlag = (roe.saaDay == UCHAR_ZERO);
else
*saaFlag = (roe.saaEclipse == UCHAR_ZERO);
}
void _GET_SCIA_ROE_ORBITPHASE(bool eclipseMode, bool saaFlag, int32_t num, int32_t orbit, float *orbitPhase, double *julianDay)
{
int32_t nm;
for (nm = 0; nm < num; nm++)
{
GET_SCIA_ROE_INFO_MOD(eclipseMode, julianDay[nm],
&orbit, &saaFlag, orbitPhase+nm);
}
}
void _GET_SCIA_ROE_ORBITPHASE_ORBIT(bool eclipseMode, bool saaFlag, int32_t num, int32_t *orbit, float *orbitPhase, double *julianDay)
{
int32_t nm;
for (nm = 0; nm < num; nm++)
{
GET_SCIA_ROE_INFO_MOD(eclipseMode, julianDay[nm],
orbit+nm, &saaFlag, orbitPhase+nm);
//printf("orb %d = %d\n", nm, orbit[nm]);
}
}