LALInspiral 5.0.3.1-eeff03c
LALSQTPNWaveform.c
Go to the documentation of this file.
1/**
2 * @file LALSQTPNWaveform.c
3 * Contains the function definition to create GWforms.
4 * @author László Veréb
5 * @date 2010.05.21.
6 */
7
8#include <lal/LALSQTPNWaveform.h>
9#include <lal/LALSQTPNIntegrator.h>
10#include <lal/LALSQTPNWaveformInterface.h>
11
12/**
13 * The macro function calculates the scalar product of two vectors.
14 * @param[in] a1 : the left vector
15 * @param[in] a2 : the right vector
16 * @return the product
17 */
18#define SCALAR_PRODUCT3(a1, a2) \
19 ((a1)[0] * (a2)[0] + (a1)[1] * (a2)[1] + (a1)[2] * (a2)[2]);
20
21/**
22 * The macro function calculates the vector product of two vectors.
23 * @param[in] left : the left vector
24 * @param[in] right : the right vector
25 * @param[out] product : the vector product
26 */
27#define VECTOR_PRODUCT3(left, right, product)\
28 (product)[0] = ((left)[1] * (right)[2] - (left)[2] * (right)[1]);\
29 (product)[1] = ((left)[2] * (right)[0] - (left)[0] * (right)[2]);\
30 (product)[2] = ((left)[0] * (right)[1] - (left)[1] * (right)[0]);
31
33
34 // variable declaration and initialization
35 REAL8 thetahat = 1039. / 4620.;
36 REAL8 spin_MPow2[2];
37 REAL8 m_m[2] = { params->mass[1] / params->mass[0], params->mass[0]
38 / params->mass[1] };
39 REAL8 piPow2 = SQT_SQR(LAL_PI);
40 REAL8 etaPow2 = SQT_SQR(params->eta);
41 REAL8 etaPow3 = etaPow2 * params->eta;
42 INT2 i;
43 for (i = 0; i < 2; i++) {
44 spin_MPow2[i] = params->chiAmp[i] * SQT_SQR(params->mass[i])
45 /SQT_SQR(params->totalMass);
46 }
47
48 // calculating the coefficients
49 params->coeff.domegaGlobal = params->eta * 96. / 5.;
51 params->coeff.meco[i] = -0.5 * params->eta
52 * (REAL8) (i + 2) / 3.;
53 }
54 switch (params->order) {
57 = (-4415./ 4032. + params->eta * 358675.
58 / 6048. + etaPow2 * 91495. / 1512.) * LAL_PI;
59#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
60 __attribute__ ((fallthrough));
61#endif
63 params->coeff.domega[LAL_PNORDER_THREE]
64 = (16447322263. / 139708800. - LAL_GAMMA
65 * 1712. / 105. + piPow2 * 16. / 3.)
66 + (-273811877. / 1088640.+ piPow2 * 451. / 48.
67 - thetahat * 88. / 3.) * params->eta + etaPow2
68 * 541. / 896. - etaPow3 * 5605. / 2592.;
69 params->coeff.domegaLN = -856. / 105.;
70 params->coeff.meco[LAL_PNORDER_THREE] *= -675. / 64.
71 + (209323. / 4032. - 205. * piPow2 / 96.
72 + (110. / 9.) * (1987. / 3080.)) * params->eta
73 - 155. * etaPow2 / 96. - 35. * etaPow3 / 5184.;
74#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
75 __attribute__ ((fallthrough));
76#endif
79 = -(4159. + 15876. * params->eta)
80 * LAL_PI / 672.;
81#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
82 __attribute__ ((fallthrough));
83#endif
84 case LAL_PNORDER_TWO:
85 params->coeff.domega[LAL_PNORDER_TWO] = 34103. / 18144.
86 + params->eta * 13661. / 2016.
87 + etaPow2 * 59. / 18.;
88 params->coeff.domegaSSselfConst = 0.;
89 params->coeff.domegaQMConst = 0.;
91 params->coeff.dchihSS[0] = spin_MPow2[1] / 2.;
92 params->coeff.dchihSS[1] = spin_MPow2[0] / 2.;
93 params->coeff.domegaSS[0] = 721. * params->eta
94 * params->chiAmp[0] * params->chiAmp[1]
95 / 48.;
96 params->coeff.domegaSS[1] = -247.
97 * params->coeff.domegaSS[0] / 721.;
98 params->coeff.mecoSS = -spin_MPow2[0]
99 * spin_MPow2[1];
100 }
102 for (i = 0; i < 2; i++) {
103 params->coeff.domegaSSself[i]
104 = -spin_MPow2[i]
105 * params->chiAmp[i] / 96.;
106 params->coeff.domegaSSselfConst -= 7.
107 * params->coeff.domegaSSself[i];
108 }
109 }
111 for (i = 0; i < 2; i++) {
112 params->coeff.domegaQM[i]
113 = spin_MPow2[i]
114 * params->chiAmp[i]
115 * params->qmParameter[i] * 7.5;
116 params->coeff.domegaQMConst
117 -= params->coeff.domegaQM[i]
118 / 3.;
119 params->coeff.dchihQM[i]
120 = -params->qmParameter[i]
121 * params->eta
122 * params->chiAmp[i] * 3. / 2.;
123 }
124 params->coeff.mecoQM = 2. * params->eta;
125 }
126 params->coeff.meco[LAL_PNORDER_TWO] *= (-81. + 57.
127 * params->eta - etaPow2) / 24.;
128#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
129 __attribute__ ((fallthrough));
130#endif
133 = 4. * LAL_PI;
134 if (params->interaction != 0) {
135 for (i = 0; i < 2; i++) {
136 params->coeff.dchihSO[i] = (4. + 3.
137 * m_m[i]) * params->eta / 2.;
138 params->coeff.dLNh[i] = -spin_MPow2[i]
139 / params->eta;
140 params->coeff.domegaSO[i]
141 = -spin_MPow2[i] * (113. + 75.
142 * m_m[i]) / 12.;
143 params->coeff.mecoSO[i]
144 = -spin_MPow2[i] * 5.
145 * params->eta * (4. + 3.
146 * m_m[i]) / 9.;
147 }
148 }
149#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
150 __attribute__ ((fallthrough));
151#endif
152 case LAL_PNORDER_ONE:
153 params->coeff.domega[LAL_PNORDER_ONE]
154 = -(743. + 924. * params->eta) / 336.;
155 params->coeff.meco[LAL_PNORDER_ONE] *= -(9.
156 + params->eta) / 12.;
157#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
158 __attribute__ ((fallthrough));
159#endif
160 case LAL_PNORDER_HALF:
161 params->coeff.domega[LAL_PNORDER_HALF] = 0.;
162#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
163 __attribute__ ((fallthrough));
164#endif
166 params->coeff.domega[LAL_PNORDER_NEWTONIAN] = 1.;
167 break;
168 default:
170 break;
171 }
172
173 return XLAL_SUCCESS;
174}
175
176int XLALSQTPNDerivator(UNUSED REAL8 t, const REAL8 values[], REAL8 dvalues[],
177 void * param) {
178
179 // variable declaration and initialization
181 const REAL8 *chi_p[2] = { values + LALSQTPN_CHIH1_1,
182 values + LALSQTPN_CHIH2_1 };
183 UINT2 i, j, k; // indexes
184 memset(dvalues, 0, LALSQTPN_NUM_OF_VAR * sizeof(REAL8));
185 REAL8 omegaPowi_3[8];
186 omegaPowi_3[0] = 1.;
187 omegaPowi_3[1] = cbrt(values[LALSQTPN_OMEGA]);
188 for (i = 2; i < 8; i++) {
189 omegaPowi_3[i] = omegaPowi_3[i - 1] * omegaPowi_3[1];
190 }
191 REAL8 SS_Omega, SSself_Omega, QM_Omega;
192 SS_Omega = SSself_Omega = QM_Omega = 0.;
193 REAL8 chih1chih2, chih1xchih2[2][3], LNhchih[2], LNhxchih[2][3];
194 chih1chih2 = SCALAR_PRODUCT3(chi_p[0], chi_p[1]);
195 for (i = 0; i < 2; i++) {
196 LNhchih[i] = SCALAR_PRODUCT3(values + LALSQTPN_LNH_1, chi_p[i]);
197 VECTOR_PRODUCT3(values + LALSQTPN_LNH_1, chi_p[i], LNhxchih[i]);
198 }
199
200 // calculating domega and MECO without the spin components
201 for (i = LAL_PNORDER_NEWTONIAN; i <= params->order; i++) {
202 dvalues[LALSQTPN_OMEGA] += params->coeff.domega[i]
203 * omegaPowi_3[i];
204 }
205 dvalues[LALSQTPN_MECO] += params->coeff.meco[0] / omegaPowi_3[1];
206 for (i = LAL_PNORDER_NEWTONIAN + 2; i <= params->order; i += 2) {
207 dvalues[LALSQTPN_MECO] += params->coeff.meco[i]
208 * omegaPowi_3[i - 1];
209 }
210
211 // calculating the other derivatives and the domega and MECO with spin
212 // components
213 switch (params->order) {
216 dvalues[LALSQTPN_OMEGA] += params->coeff.domegaLN
217 * log(16. * omegaPowi_3[2])
218 * omegaPowi_3[LAL_PNORDER_THREE];
219#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
220 __attribute__ ((fallthrough));
221#endif
223 case LAL_PNORDER_TWO:
226 // SS for domega
227 SS_Omega = params->coeff.domegaSS[0]
228 * LNhchih[0] * LNhchih[1]
229 + params->coeff.domegaSS[1]*chih1chih2;
230 // SS for MECO
231 dvalues[LALSQTPN_MECO] += params->coeff.mecoSS
232 * (chih1chih2 - 3 * LNhchih[0]
233 * LNhchih[1]) * omegaPowi_3[3];
234 // SS for dchih
235 for (i = 0; i < 2; i++) {
236 k = (i + 1) % 2; // the opposite index
237 VECTOR_PRODUCT3(chi_p[k], chi_p[i],
238 chih1xchih2[i]);
239 for (j = 0; j < 3; j++) {
240 // the 3*index is used,
241 // to acces the first spin, if
242 // index=0, otherwise
243 // the second spin
244 dvalues[LALSQTPN_CHIH1_1 + 3 * i + j]
245 += params->coeff.dchihSS[i]
246 * (chih1xchih2[i][j]
247 - 3. * LNhchih[k]
248 * LNhxchih[i][j])
249 * omegaPowi_3[6];
250 //((1.-2.*(!i))chih1xchih2[i][j] - 3. * LNhchih[k] * LNhxchih[i][j]) * omegaPowi_3[6];
251 }
252 }
253 }
256 // SSself for domega
257 SSself_Omega = params->coeff.domegaSSselfConst;
258 for (i = 0; i < 2; i++) {
259 SSself_Omega
260 += params->coeff.domegaSSself[i]
261 * SQT_SQR(LNhchih[i]);
262 }
263 }
266 QM_Omega = params->coeff.domegaQMConst;
267 for (i = 0; i < 2; i++) {
268 QM_Omega += params->coeff.domegaQM[i]
269 * SQT_SQR(LNhchih[i]);
270 // QM for dchih
271 for (j = 0; j < 3; j++) {
272 // the 3*index is used,
273 // to acces the first spin, if
274 // index=0, otherwise
275 // the second spin
276 dvalues[LALSQTPN_CHIH1_1 + 3 * i + j]
277 += params->coeff.dchihQM[i]
278 * LNhchih[i]
279 * LNhxchih[i][j]
280 * omegaPowi_3[6];
281 }
282 }
283 // QM for MECO
284 dvalues[LALSQTPN_MECO] += params->coeff.mecoQM
285 * QM_Omega * omegaPowi_3[3];
286 }
287 dvalues[LALSQTPN_OMEGA] += (QM_Omega + SSself_Omega
288 + SS_Omega) * omegaPowi_3[LAL_PNORDER_TWO];
289#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
290 __attribute__ ((fallthrough));
291#endif
293 if (params->interaction != 0) {
294 // SO for domega and MECO
295 for (i = 0; i < 2; i++) {
296 dvalues[LALSQTPN_OMEGA]
297 += params->coeff.domegaSO[i]
298 * LNhchih[i]
299 * omegaPowi_3[LAL_PNORDER_ONE_POINT_FIVE];
300 dvalues[LALSQTPN_MECO]
301 += params->coeff.mecoSO[i]
302 * LNhchih[i] * omegaPowi_3[2];
303 }
304 // dLNh and SO for dchih
305 for (i = 0; i < 3; i++) {
306 dvalues[LALSQTPN_CHIH1_1 + i]
307 += params->coeff.dchihSO[0]
308 * LNhxchih[0][i] * omegaPowi_3[5];
309 dvalues[LALSQTPN_CHIH2_1 + i]
310 += params->coeff.dchihSO[1]
311 * LNhxchih[1][i] * omegaPowi_3[5];
312 dvalues[LALSQTPN_LNH_1 + i]
313 += (params->coeff.dLNh[0]
314 * dvalues[LALSQTPN_CHIH1_1 + i]
315 + params->coeff.dLNh[1]
316 * dvalues[LALSQTPN_CHIH2_1 + i])
317 * omegaPowi_3[1];
318 }
319 }
320#if __GNUC__ >= 7 && !defined __INTEL_COMPILER
321 __attribute__ ((fallthrough));
322#endif
323 case LAL_PNORDER_ONE:
324 case LAL_PNORDER_HALF:
326 break;
327 default:
328 XLALPrintError("XLAL Error - %s: The PN order requested is not implemented for this approximant\n", __func__);
329 return XLAL_FAILURE;
330 }
331 dvalues[LALSQTPN_OMEGA] *= params->coeff.domegaGlobal * omegaPowi_3[7]
332 * omegaPowi_3[4];
333 dvalues[LALSQTPN_PHASE] = values[LALSQTPN_OMEGA]
334 + values[LALSQTPN_LNH_3] * (values[LALSQTPN_LNH_2]
335 * dvalues[LALSQTPN_LNH_1] - values[LALSQTPN_LNH_1]
336 * dvalues[LALSQTPN_LNH_2])
337 / (SQT_SQR(values[LALSQTPN_LNH_1])
338 + SQT_SQR(values[LALSQTPN_LNH_2]));
339
340 return GSL_SUCCESS;
341}
342
343// LAL wrapper to XLAL Generator function
345 XLAL_PRINT_DEPRECATION_WARNING("XLALSQTPNGenerator");
348
349 if(XLALSQTPNGenerator(waveform, params))
351
353 RETURN(status);
354}
355
357
358 if( !params || !waveform )
360
361 // variable declaration and initialization
362 UINT4 i = 0; // index
363 REAL8 time = 0.;
364 REAL8 LNhztol = 1.0e-8;
365 REAL8 alpha, amp, temp1, temp2;
366 const REAL8 geometrized_m_total = params->totalMass * LAL_MTSUN_SI;
367 const REAL8 freq_Step = geometrized_m_total * LAL_PI;
368 const REAL8 step = params->samplingTime / geometrized_m_total;
370 LALSQTPNIntegratorSystem integrator;
371 xlalErrno = 0;
375
376 // initializing the dynamic variables
377 values[LALSQTPN_PHASE] = params->phi;
378 values[LALSQTPN_OMEGA] = params->lowerFreq * freq_Step;
379 values[LALSQTPN_LNH_1] = sin(params->inclination); ///< \f$\hat{L_N}=\sin\iota\f$
380 values[LALSQTPN_LNH_2] = 0.; ///< \f$\hat{L_N}=0\f$
381 values[LALSQTPN_LNH_3] = cos(params->inclination); ///< \f$\hat{L_N}=\cos\iota\f$
382 values[LALSQTPN_MECO] = 0.;
383 for (i = 0; i < 3; i++) {
384 values[LALSQTPN_CHIH1_1 + i] = params->chih[0][i];
385 values[LALSQTPN_CHIH2_1 + i] = params->chih[1][i];
386 }
387
388 // filling the LALSQTPNCoefficients
389 xlalErrno = 0;
392 if( XLALSQTPNDerivator(time, values, dvalues, params) )
394 dvalues[LALSQTPN_MECO] = -1.; // to be able to start the loop
395 i = 0;
396 do {
397 alpha = atan2(values[LALSQTPN_LNH_2], values[LALSQTPN_LNH_1]);
398 amp = params->signalAmp * pow(values[LALSQTPN_OMEGA], 2. / 3.);
399
400 // calculating the waveform components
401 if (waveform->hp || waveform->hc || waveform->h) {
402 temp1 = -0.5*amp*cos(2.*values[LALSQTPN_PHASE])
403 * (values[LALSQTPN_LNH_3]
404 * values[LALSQTPN_LNH_3] + 1.);
405 temp2 = amp * sin(2.*values[LALSQTPN_PHASE])
406 * values[LALSQTPN_LNH_3];
407 if (waveform->h) {
408 waveform->hp->data[2*i] = temp1 * cos(2.*alpha)
409 + temp2 * sin(2.*alpha);
410 waveform->hc->data[2*i+1] = temp1
411 * sin(2.*alpha) - temp2 * cos(2.*alpha);
412 }
413 if (waveform->hp) {
414 waveform->hp->data[i] = temp1 * cos(2.*alpha)
415 + temp2 * sin(2.*alpha);
416 }
417 if (waveform->hc) {
418 waveform->hc->data[i] = temp1 * sin(2.*alpha)
419 - temp2 * cos(2.*alpha);
420 }
421 }
422 if (waveform->waveform) {
423 waveform->waveform->a->data->data[2*i] = -amp*0.5
424 * (1. + values[LALSQTPN_LNH_3]
425 * values[LALSQTPN_LNH_3]);
426 waveform->waveform->a->data->data[2*i + 1] = -amp
427 * values[LALSQTPN_LNH_3];
428 waveform->waveform->phi->data->data[i] = 2.
429 * (values[LALSQTPN_PHASE] - params->phi);
430 waveform->waveform->shift->data->data[i] = 2. * alpha;
431 waveform->waveform->f->data->data[i]
432 = values[LALSQTPN_OMEGA] / freq_Step;
433 }
434
435 // evolving
436 time = i++ * params->samplingTime;
437 xlalErrno = 0;
438 if(XLALSQTPNIntegratorFunc(values, &integrator, step)) {
440 }
441 // if one of the variables is nan, the PN approximation broke down
442 if (isnan(values[LALSQTPN_PHASE])
443 || isnan(values[LALSQTPN_OMEGA])
444 || isnan(values[LALSQTPN_LNH_1])
445 || isnan(values[LALSQTPN_LNH_2])
446 || isnan(values[LALSQTPN_LNH_3])
447 || isnan(values[LALSQTPN_CHIH1_1])
448 || isnan(values[LALSQTPN_CHIH1_2])
449 || isnan(values[LALSQTPN_CHIH1_3])
450 || isnan(values[LALSQTPN_CHIH2_1])
451 || isnan(values[LALSQTPN_CHIH2_2])
452 || isnan(values[LALSQTPN_CHIH2_3])) {
453 break;
454 }
455 if( XLALSQTPNDerivator(time, values, dvalues, params) )
457 if ((waveform->waveform &&
458 i == waveform->waveform->f->data->length) ||
459 (waveform->hp && i == waveform->hp->length) ||
460 (waveform->hc && i == waveform->hc->length)) {
461 XLALSQTPNIntegratorFree(&integrator);
463 }
464 } while (dvalues[LALSQTPN_MECO] < 0. && dvalues[LALSQTPN_OMEGA] > 0.0
465 && SQT_SQR(values[LALSQTPN_LNH_3]) < 1. - LNhztol
466 && values[LALSQTPN_OMEGA] / freq_Step
467 < params->samplingFreq / 2.
468 /* && values[LALSQTPN_OMEGA] / freq_Step
469 < params->finalFreq*/);
470 if (waveform->hp || waveform->hc){
471 params->finalFreq = values[LALSQTPN_OMEGA]
472 / (LAL_PI * geometrized_m_total);
473 params->coalescenceTime = time;
474 }
475 if (waveform->waveform->a){
476 params->finalFreq = waveform->waveform->f->data->data[i-1];
477 }
478
479 waveform->length = i;
480 XLALSQTPNIntegratorFree(&integrator);
481
482 return XLAL_SUCCESS;
483}
#define SCALAR_PRODUCT3(a1, a2)
The macro function calculates the scalar product of two vectors.
#define VECTOR_PRODUCT3(left, right, product)
The macro function calculates the vector product of two vectors.
#define ATTATCHSTATUSPTR(statusptr)
#define DETATCHSTATUSPTR(statusptr)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
#define ABORTXLAL(sp)
double i
#define __attribute__(x)
#define LAL_PI
#define LAL_MTSUN_SI
#define LAL_GAMMA
double REAL8
int16_t INT2
uint16_t UINT2
uint32_t UINT4
@ LAL_INSPIRAL_INTERACTION_QUAD_MONO_2PN
Quadrupole-monopole interaction.
Definition: LALInspiral.h:121
@ LAL_INSPIRAL_INTERACTION_SPIN_SPIN_2PN
Spin-spin interaction.
Definition: LALInspiral.h:119
@ LAL_INSPIRAL_INTERACTION_SPIN_SPIN_SELF_2PN
Spin-spin-self interaction.
Definition: LALInspiral.h:120
int XLALSQTPNIntegratorInit(LALSQTPNIntegratorSystem *integrator, INT2 num, void *params, int(*derivator)(REAL8, const REAL8[], REAL8[], void *))
The function initialize the integration method.
void XLALSQTPNIntegratorFree(LALSQTPNIntegratorSystem *integrator)
The function deallocates the memory allocated for the integrator function.
int XLALSQTPNIntegratorFunc(REAL8 values[], LALSQTPNIntegratorSystem *integrator, REAL8 step)
The function evolves the system with the given time-step.
int XLALSQTPNDerivator(UNUSED REAL8 t, const REAL8 values[], REAL8 dvalues[], void *param)
The function calculates the derived values.
void LALSQTPNGenerator(LALStatus *status, LALSQTPNWave *waveform, LALSQTPNWaveformParams *params)
int XLALSQTPNFillCoefficients(LALSQTPNWaveformParams *const params)
The function fills the LALSQTPNCoefficients structure with the needed coefficients for calculating th...
#define SQT_SQR(a)
The macro function returns the square of the argument.
int XLALSQTPNGenerator(LALSQTPNWave *waveform, LALSQTPNWaveformParams *params)
The function generates the parameters of the waveform.
@ LALSQTPN_CHIH1_2
index of the 's y component
@ LALSQTPN_CHIH1_1
index of the 's x component
@ LALSQTPN_MECO
index of the MECO
@ LALSQTPN_LNH_3
index of the 's z component
@ LALSQTPN_CHIH1_3
index of the 's z component
@ LALSQTPN_NUM_OF_VAR
number of the dynamic variables
@ LALSQTPN_OMEGA
index of the
@ LALSQTPN_CHIH2_2
index of the 's y component
@ LALSQTPN_LNH_2
index of the 's y component
@ LALSQTPN_CHIH2_3
index of the 's z component
@ LALSQTPN_CHIH2_1
index of the 's x component
@ LALSQTPN_LNH_1
index of the 's x component
@ LALSQTPN_PHASE
index of the phase
LAL_PNORDER_TWO_POINT_FIVE
LAL_PNORDER_THREE
LAL_PNORDER_TWO
LAL_PNORDER_ONE
LAL_PNORDER_PSEUDO_FOUR
LAL_PNORDER_THREE_POINT_FIVE
LAL_PNORDER_HALF
LAL_PNORDER_ONE_POINT_FIVE
LAL_PNORDER_NEWTONIAN
#define xlalErrno
#define XLAL_ERROR(...)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
#define XLAL_PRINT_DEPRECATION_WARNING(replacement)
XLAL_EBADLEN
XLAL_SUCCESS
XLAL_EFAULT
XLAL_EFUNC
XLAL_EINVAL
XLAL_FAILURE
double alpha
REAL4TimeSeries * shift
REAL4TimeVectorSeries * a
REAL8TimeSeries * phi
REAL4TimeSeries * f
The structure contains the integration method and its settings.
REAL4Vector * hp
REAL4Vector * h
CoherentGW * waveform
REAL4Vector * hc
The structure contains the system's and the generator's parameters.
REAL4Sequence * data
REAL4VectorSequence * data
REAL4 * data
REAL8Sequence * data
REAL8 * data
double inclination