//---------------------------------------------------------------------------
#include 
#pragma hdrstop
#include "table2NC.h"
#include "trigo.h"
//---------------------------------------------------------------------------

extern double p;			        // longitude of lunar perigee
extern double N;			        // longitude of moon's node

// la table2 est issue à l'origine du "Manual of harmonic analysis and prediction of tides"
// de P. Shureman. Elle a été complétée par un certain nombre de constantes
// qui ne figuraient pas dans cette table.
// La table donne pour chaque constituent, son nom, les coefficients
// par lesquels il faut multiplier les variables de base, la vitesse
// angulaire et les fonctions de correction nodale qui s'appliquent.
// Par la suite, la table a été modifiée en remplacant les fonctions de correction nodale,
// par celles qui figurent dans la "liste standard des constituents" publiée
// par le "Tidal Committee" de l'IHO.
//  T            angle horaire moyen
//  s            longitude moyenne de la lune
//  h            longitude moyenne du soleil
//  p            longitude moyenne du périgée de la lune
//  p1           longitude moyenne du périgée du soleil
// deg           phase
// speed
//  u            correction nodale de phase
//  f            facteur de correction nodale d'amplitude

 struct constituentsNC table2NC[nb_const]=
 //           T  s  h  p p1  deg     speed      u       f
{
//					longues periodes
{ "SA"      , 0, 0, 1, 0, 0,   0,  0.0410686, zero,    one},
{ "SSA"     , 0, 0, 2, 0, 0,   0,  0.0821373, zero,    one},
{ "MSM"     , 0, 1,-2, 1, 0,   0,  0.4715211, zero,    f2M2},   // MNum = M2-Nu2
{ "MM"      , 0, 1, 0,-1, 0,   0,  0.5443747, zero,    fMm},
{ "MSF"     , 0, 2,-2, 0, 0,   0,  1.0158958, uminusM2,fM2},    // S2-M2
{ "MF"      , 0, 2, 0, 0, 0,   0,  1.0980331, uMf,     fMf},
//							diurnes
{ "2Q1"     , 1,-4, 1, 2, 0, -90, 12.8542862, uO1,     fO1},
{ "SIGMA1"  , 1,-4, 3, 0, 0, -90, 12.9271398, uO1,     fO1},
{ "Q1"      , 1,-3, 1, 1, 0, -90, 13.3986609, uO1,     fO1},
{ "RHO1"    , 1,-3, 3,-1, 0, -90, 13.4715145, uO1,     fO1},
{ "O1"      , 1,-2, 1, 0, 0, -90, 13.9430356, uO1,     fO1},
{ "MS1"     , 1,-2, 2, 0, 0,+180, 13.9841042, uM2,     fM2},    // M2-S1
{ "MP1"     , 1,-2, 3, 0, 0, +90, 14.0251729, uM2,     fM2},
{ "M1"      , 1,-1, 1, 1, 0, +90, 14.4966939, uM1,     fM1},
{ "CHI1"    , 1,-1, 3,-1, 0, +90, 14.5695476, uJ1,     fJ1},
{ "PI1"     , 1, 0,-2, 0, 1, -90, 14.9178647, zero,    one},
{ "P1"      , 1, 0,-1, 0, 0, -90, 14.9589314, zero,    one},
{ "S1"      , 1, 0, 0, 0, 0, -90, 15.0      , zero,    one},
{ "K1"      , 1, 0, 1, 0, 0, +90, 15.0410686, uK1,     fK1},
{ "PSI1"    , 1, 0, 2, 0,-1, +90, 15.0821353, zero,    one},
{ "PHI1"    , 1, 0, 3, 0, 0, +90, 15.1232059, uJ1,     fJ1},
{ "THETA1"  , 1, 1,-1, 1, 0, +90, 15.5125897, uJ1,     fJ1},
{ "J1"      , 1, 1, 1,-1, 0, +90, 15.5854433, uJ1,     fJ1},
{ "OO1"     , 1, 2, 1, 0, 0, +90, 16.1391017, uK2mQ1,  fK2Q1}, //like KQ1=K2-Q1
//                        semi diurnes
{ "2MN2S2"  , 2,-7, 6, 1, 0,   0, 26.4079380, u3M2,    f3M2},
{ "2NS2"    , 2,-6, 4, 2, 0,   0, 26.8794591, u2M2,    f2M2},
{ "3M2S2"   , 2,-6, 6, 0, 0,   0, 26.9523127, u3M2,    f3M2},
{ "OQ2"     , 2,-5, 2, 1, 0,   0, 27.3416965, u2M2mK2, f2M2K2}, // MNK2
{ "MNS2"    , 2,-5, 4, 1, 0,   0, 27.4238337, u2M2,    f2M2},
{ "MNUS2"   , 2,-5, 6,-1, 0,   0, 27.4966874, u2M2,    f2M2},
{ "2MK2"    , 2,-4, 2, 0, 0,   0, 27.8860712, u2M2mK2, f2M2K2}, // 2M2-K2
{ "2N2"     , 2,-4, 2, 2, 0,   0, 27.8953548, uM2,     fM2},
{ "MU2"     , 2,-4, 4, 0, 0,   0, 27.9682084, uM2,     fM2},
{ "N2"      , 2,-3, 2, 1, 0,   0, 28.4397295, uM2,     fM2},
{ "NU2"     , 2,-3, 4,-1, 0,   0, 28.5125831, uM2,     fM2},
{ "OP2"     , 2,-2, 0, 0, 0,   0, 28.9019670, uM2mK2,  fM2K2},  // MSK2
{ "GAMMA2"  , 2,-2, 0, 2, 0,+180, 28.9112506, uGamma2, fGamma2},
{ "M(SK)2"  , 2,-2, 1, 0,+1,+180, 28.9430375, uM2mK1,  fM2K1},  // M2+S1-K1
{ "M2"      , 2,-2, 2, 0, 0,   0, 28.9841042, uM2,     fM2},
{ "M(KS)2"  , 2,-2, 3, 0,-1,   0, 29.0251709, uM2pK1,  fM2K1},  // M2+K1-S1
{ "MKS2"    , 2,-2, 4, 0, 0,   0, 29.0662415, uM2pK2,  fM2K2},
{ "LAMBDA2" , 2,-1, 0, 1, 0,+180, 29.4556253, uM2,     fM2},
{ "L2"      , 2,-1, 2,-1, 0,+180, 29.5284789, uL2,     fL2},    // 2MN2
{ "NKM2"    , 2,-1, 2, 1, 0,   0, 29.5377625, uK2,     f2M2K2}, //N2+K2-M2
{ "T2"      , 2, 0,-1, 0, 1,   0, 29.9589333, zero,    one},
{ "S2"      , 2, 0, 0, 0, 0,   0, 30.0      , zero,    one},
{ "R2"      , 2, 0, 1, 0,-1,+180, 30.0410667, zero,    one},
{ "K2"      , 2, 0, 2, 0, 0,   0, 30.0821373, uK2,     fK2},
{ "MSN2"    , 2, 1, 0,-1, 0,   0, 30.5443747, zero,    f2M2},   // ETA2
{ "KJ2"     , 2, 1, 2,-1, 0,   0, 30.6265120, uK1pJ1,  fK1J1},  // K1+J1
{ "2SM2"    , 2, 2,-2, 0, 0,   0, 31.0158958, uminusM2,fM2},
{ "SKM2"    , 2, 2, 0, 0, 0,   0, 31.0980331, uK2mM2,  fM2K2},
//							tiers diurnes
{ "2MK3"    , 3,-4, 3, 0, 0, -90, 42.9271398, u2M2pK1, f2M2K1}, // 2M2+K1
{ "M3"      , 3,-3, 3, 0, 0,+180, 43.4761563, uM3,      fM3},
{ "SO3"     , 3,-2, 1, 0, 0, -90, 43.9430356, uO1,      fO1},
{ "MS3"     , 3,-2, 2, 0, 0,+180, 43.9841042, uM2,      fM2},
{ "MK3"     , 3,-2, 3, 0, 0, +90, 44.0251729, uM2pK1,   fM2K1},
{ "SP3"     , 3, 0,-1, 0, 0,   0, 44.9589314, zero,     one},
{ "S3"      , 3, 0, 0, 0, 0,   0, 45.0      , zero,     one},
{ "SK3"     , 3, 0, 1, 0, 0, +90, 45.0410686, uK1,      fK1},
//							quart diurnes
{ "2MMUS4"  , 4,-8, 8, 0, 0,   0, 55.9364168, u3M2,     f3M2},
{ "2MNS4"   , 4,-7, 6, 1, 0,   0, 56.4079380, u3M2,     f3M2},
{ "N4"      , 4,-6, 4, 2, 0,   0, 56.8794591, u2M2,     f2M2},
{ "3MS4"    , 4,-6, 6, 0, 0,   0, 56.9523127, u3M2,     f3M2},
{ "MN4"     , 4,-5, 4, 1, 0,   0, 57.4238337, u2M2,     f2M2},
{ "MNU4"    , 4,-5, 6,-1, 0,   0, 57.4966874, u2M2,     f2M2},
{ "2MSK4"   , 4,-4, 2, 0, 0,   0, 57.8860712, u2M2mK2,  f2M2K2},// 2M2+S2-K2
{ "M4"      , 4,-4, 4, 0, 0,   0, 57.9682084, u2M2,     f2M2},
{ "2MKS4"   , 4,-4, 6, 0, 0,   0, 58.0503457, u2M2pK2,  f2M2K2},// 2M2+K2-S2
{ "SN4"     , 4,-3, 2, 1, 0,   0, 58.4397295, uM2,      fM2},
{ "3MN4"    , 4,-3, 4,-1, 0,   0, 58.5125832, u2M2,     f4M2},  // ML4
{ "NK4"     , 4,-3, 4, 1, 0,   0, 58.5218667, uM2pK2,   fM2K2},
{ "MT4"     , 4,-2, 1, 0, 1,   0, 58.9430375, uM2,      fM2},
{ "MS4"     , 4,-2, 2, 0, 0,   0, 58.9841042, uM2,      fM2},
{ "MK4"     , 4,-2, 4, 0, 0,   0, 59.0662415, uM2pK2,   fM2K2},
{ "2SNM4"   , 4,-1, 0, 1, 0,   0, 59.4556253, zero,     f2M2},
{ "2MSN4"   , 4,-1, 2,-1, 0,   0, 59.5284789, uM2,      f3M2},
{ "S4"      , 4, 0, 0, 0, 0,   0, 60.0      , zero,     one},
{ "SK4"     , 4, 0, 2, 0, 0,   0, 60.0821372, uK2,      fK2},
//							6 eme diurnes
{ "3MNK6"   , 6,-9, 6, 1, 0,   0, 85.3099049, u4M2mK2, f4M2K2},
{ "3MNS6"   , 6,-9, 8, 1, 0,   0, 85.3920422, u4M2,    f4M2},
{ "3MNUS6"  , 6,-9,10,-1, 0,   0, 85.4648958, u4M2,    f4M2},
{ "4MK6"    , 6,-8, 6, 0, 0,   0, 85.8542796, u4M2mK2, f4M2K2},
{ "2NM6"    , 6,-8, 6, 2, 0,   0, 85.8635632, u3M2,    f3M2},
{ "4MS6"    , 6,-8, 8, 0, 0,   0, 85.9364169, u4M2,    f4M2},
{ "2MN6"    , 6,-7, 6, 1, 0,   0, 86.4079380, u3M2,    f3M2},
{ "2MNU6"   , 6,-7, 8,-1, 0,   0, 86.4807915, u3M2,    f3M2},
{ "3MSK6"   , 6,-6, 4, 0, 0,   0, 86.8701754, u3M2mK2, f3M2K2},
{ "M6"      , 6,-6, 6, 0, 0,   0, 86.9523127, u3M2,    f3M2},
{ "3MKS6"   , 6,-6, 8, 0, 0,   0, 87.0344499, u3M2pK2, f3M2K2},
{ "MSN6"    , 6,-5, 4, 1, 0,   0, 87.4238337, u2M2,    f2M2},
{ "4MN6"    , 6,-5, 6,-1, 0,   0, 87.4966874, u3M2,    f5M2},   // 2ML6
{ "MNK6"    , 6,-5, 6, 1, 0,   0, 87.5059709, u2M2pK2, f2M2K2}, //M2+N2+K2
{ "2MT6"    , 6,-4, 3, 0, 1,   0, 87.9271417, u2M2,    f2M2},
{ "2MS6"    , 6,-4, 4, 0, 0,   0, 87.9682084, u2M2,    f2M2},
{ "2MK6"    , 6,-4, 6, 0, 0,   0, 88.0503457, u2M2pK2, f2M2K2},
{ "2SN6"    , 6,-3, 2, 1, 0,   0, 88.4397295, uM2,     fM2},
{ "3MSN6"   , 6,-3, 4,-1, 0,   0, 88.5125831, u2M2,    f4M2},
{ "3MKN6"   , 6,-3, 6,-1, 0,   0, 88.5947203, u2M2pK2, f4M2K2}, // 3M2+K2-N2
{ "2SM6"    , 6,-2, 2, 0, 0,   0, 88.9841042, uM2,     fM2},
{ "MSK6"    , 6,-2, 4, 0, 0,   0, 89.0662415, uM2pK2,  fM2K2},
//							8 eme diurnes
{ "2(MN)8"  , 8,-10,8, 2, 0,   0, 114.8476675, u4M2,    f4M2},
{ "3MN8"    , 8,-9, 8, 1, 0,   0, 115.3920422, u4M2,    f4M2},
{ "3MNU8"   , 8,-9,10,-1, 0,   0, 115.4648957, u4M2,    f4M2},
{ "M8"      , 8,-8, 8, 0, 0,   0, 115.9364169, u4M2,    f4M2},
{ "2MSN8"   , 8,-7, 6, 1, 0,   0, 116.4079380, u3M2,    f3M2},
{ "3MS8"    , 8,-6, 6, 0, 0,   0, 116.9523127, u3M2,    f3M2},
{ "3MK8"    , 8,-6, 8, 0, 0,   0, 117.0344499, u3M2pK2, f3M2K2},
{ "4MSN8"   , 8,-5, 6,-1, 0,   0, 117.4966873, u3M2,    f5M2},
{ "2(MS)8"  , 8,-4, 4, 0, 0,   0, 117.9682084, u2M2,    f2M2},
//							10 eme diurnes
{ "4MN10"   ,10,-11,10, 1, 0,  0, 144.3761463, u5M2,    f5M2},
{ "M10"     ,10,-10,10, 0, 0,  0, 144.9205210, u5M2,    f5M2},
{ "3MSN10"  ,10, -9, 8, 1, 0,  0, 145.3920421, u4M2,    f4M2},
{ "4MS10"   ,10, -8, 8, 0, 0,  0, 145.9364168, u4M2,    f4M2},
{ "5MSN10"  ,10, -7, 8,-1, 0,  0, 146.4807915, u4M2,    f6M2},
{ "3M2S10"  ,10, -6, 6, 0, 0,  0, 146.9523126, u3M2,    f3M2},
};
//---------------------------------------------------------------------------
double zero() { return 0.; }
double one()  { return 1.; }
//---------------------------------------------------------------------------
double fMm()
{ return 1.0 -0.1311*cos_deg(N) +0.0538*cos_deg(2.*p)+0.0205*cos_deg(2.*p-N); }
double uMf() { return -23.7*sin_deg(N) +2.7*sin_deg(2.*N) -0.4*sin_deg(3.*N); }
double fMf() { return 1.084 +0.415*cos_deg(N) +0.039*cos_deg(2.*N); }
//---------------------------------------------------------------------------
double uO1() { return 10.80*sin_deg(N) -1.34*sin_deg(2.*N) +0.19*sin_deg(3.*N);}
double fO1() { return 1.0176 +0.1871*cos_deg(N) -0.0147*cos_deg(2.*N); }
//---------------------------------------------------------------------------
double uK1() { return -8.86*sin_deg(N) +0.68*sin_deg(2.*N) -0.07*sin_deg(3.*N);}
double fK1() { return 1.0060 +0.1150*cos_deg(N)- 0.0088*cos_deg(2.*N)+ 0.0006*cos_deg(3.*N);}
//---------------------------------------------------------------------------
double uJ1() { return -12.94*sin_deg(N) +1.34*sin_deg(2.*N) -0.19*sin_deg(3.*N);}
double fJ1() { return 1.1029 +0.1676*cos_deg(N) -0.0170*cos_deg(2.*N) +0.0016*cos_deg(3.*N); }
//---------------------------------------------------------------------------
double uM2() { return -2.14*sin_deg(N); }
double fM2() { return 1.0007 -0.0373*cos_deg(N) + 0.0002*cos_deg(2.*N); }
//---------------------------------------------------------------------------
double uK2() { return -17.74*sin_deg(N) +0.68*sin_deg(2.*N) -0.04*sin_deg(3.*N);}
double fK2() { return 1.0246 +0.2863*cos_deg(N) + 0.0083*cos_deg(2.*N) - 0.0015*cos_deg(3.*N); }
//---------------------------------------------------------------------------
double uM3() { return -3.21*sin_deg(N); }
double fM3() { return pow(sqrt(fM2()),3); }
//---------------------------------------------------------------------------
double uminusM2() { return -uM2(); }
double u2M2()     { return 2.*uM2(); }
double u3M2()     { return 3.*uM2(); }
double u4M2()     { return 4.*uM2(); }
double u5M2()     { return 5.*uM2(); }
double u6M2()     { return 6.*uM2(); }
//---------------------------------------------------------------------------
double f2M2() { return pow(fM2(),2.); }
double f3M2() { return pow(fM2(),3.); }
double f4M2() { return pow(fM2(),4.); }
double f5M2() { return pow(fM2(),5.); }
double f6M2() { return pow(fM2(),6.); }
//---------------------------------------------------------------------------
// dans le nom des fonctions qui suivent, m sgnifie moins, p signifie plus
double uM2mK1()  { return uM2()-uK1(); }
double uM2pK1()  { return uM2()+uK1(); }
double fM2K1()   { return fM2()*fK1(); }
double u2M2pK1() { return 2.*uM2()+uK1(); }
double f2M2K1()  { return pow(fM2(),2.)*fK1(); }
//---------------------------------------------------------------------------
double uM2mK2()  { return uM2()-uK2(); }
double uM2pK2()  { return uM2()+uK2(); }
double uK2mM2()  { return uK2()-uM2(); }
double fM2K2()   { return fM2()*fK2(); }
//---------------------------------------------------------------------------
double u2M2mK2()  { return 2.*uM2()-uK2(); }
double u2M2pK2()  { return 2.*uM2()+uK2(); }
double f2M2K2()   { return pow(fM2(),2.)*fK2(); }
//---------------------------------------------------------------------------
double u3M2mK2()  { return 3.*uM2()-uK2(); }
double u3M2pK2()  { return 3.*uM2()+uK2(); }
double f3M2K2()   { return pow(fM2(),3.)*fK2(); }
//---------------------------------------------------------------------------
double u4M2mK2()  { return 4.*uM2()-uK2(); }
double f4M2K2()   { return pow(fM2(),4)*fK2(); }
//---------------------------------------------------------------------------
double uM1() { return RadToDeg*atan2(sin_deg(p)+0.2*sin_deg(p-N) ,
                                   2.*(cos_deg(p)+0.2*cos_deg(p-N)) ); }
double fM1() { return sqrt(pow(sin_deg(p)+0.2*sin_deg(p-N),2) +
                           pow(2.*(cos_deg(p)+0.2*cos_deg(p-N)),2)); }
//---------------------------------------------------------------------------
double uGamma2() { return RadToDeg*atan2(0.147*sin_deg(2.*(N-p)) ,
                                        1.+0.147*cos_deg(2.*(N-p)) ); }
double fGamma2() { return sqrt(pow(0.147*sin_deg(2.*(N-p)),2) +
                               pow(1.+0.147*cos_deg(2.*(N-p)),2)); }
//---------------------------------------------------------------------------
double uL2()
{ return RadToDeg*atan2(
   -0.2505*sin_deg(2.*p)-0.1102*sin_deg(2.*p-N)-0.0156*sin_deg(2.*p-2.*N)-0.037*sin_deg(N),
 1.-0.2505*cos_deg(2.*p)-0.1102*cos_deg(2.*p-N)-0.0156*cos_deg(2.*p-2.*N)-0.037*cos_deg(N) ); }
double fL2()
{ return sqrt(
pow(-0.2505*sin_deg(2.*p)-0.1102*sin_deg(2.*p-N)-0.0156*sin_deg(2.*p-2.*N)-0.037*sin_deg(N),2)+
pow(1.-0.2505*cos_deg(2.*p)-0.1102*cos_deg(2.*p-N)-0.0156*cos_deg(2.*p-2.*N)-0.037*cos_deg(N),2) ); }
//---------------------------------------------------------------------------
double uK1pJ1()
{ return uK1()+uJ1(); }
double fK1J1()
{ return fK1()*fJ1(); }
//---------------------------------------------------------------------------
double uK2mQ1()
{ return uK2()-uO1(); }
double fK2Q1()
{ return fK2()*fO1(); }
//---------------------------------------------------------------------------
#pragma package(smart_init)