61 using namespace StringUtils;
64 const int OceanLoadTides::NSTD = 11;
66 const int OceanLoadTides::NDER = 342;
86 int OceanLoadTides::initializeSites(vector<string>& sites,
string filename)
90 bool allsites =
false;
91 if (sites.size() == 0)
97 ifstream infile(filename.c_str());
98 if (!infile || !infile.is_open())
100 Exception e(
"File " + filename +
" could not be opened.");
107 vector<double>
coeff;
115 getline(infile, line);
129 while (!line.empty())
132 if (
word ==
string(
"lon/lat:"))
144 else if (looking && line.length() <= 21)
157 sites.push_back(site);
161 for (i = 0; i < sites.size(); i++)
164 if (site == sites[i])
183 " is corrupted for site " + site +
184 " - offending line follows\n" + line);
188 for (i = 0; i < 11; i++)
195 for (i = 0; i <
coeff.size(); i++)
199 oss <<
" " << setprecision(5) << setw(7) <<
coeff[i];
203 oss <<
" " << setprecision(1) << setw(7) <<
coeff[i];
205 if ((i + 1) % 11 == 0)
214 coefficientMap[site] =
coeff;
218 coeff.push_back(lat);
219 coeff.push_back(lon);
220 positionMap[site] =
coeff;
225 vector<string>::iterator
pos;
226 pos = find(sites.begin(), sites.end(), site);
227 if (
pos != sites.end())
238 if (infile.eof() || !infile.good())
253 Exception E(
"std except: " +
string(e.what()));
279 Exception e(
"Site " + site +
" has not been initialized.");
284 vector<double>
coeff = coefficientMap[site];
291 double fday(
time.secOfDay());
294 int iyear, imm, iday;
300 static const double speed[11] = {
301 1.40519E-4, 1.45444E-4, 1.37880E-4, 1.45842E-4,
302 0.72921E-4, 0.67598E-4, 0.72523E-4, 0.64959E-4,
303 0.053234E-4, 0.026392E-4, 0.003982E-4};
304 static const double angfac[44] = {
310 -2.0, 0.0, -3.0, 0.0,
311 0.0, -2.0, 0.0, -3.0,
319 0.25, -0.25, -0.25, -0.25,
323 int icapd = iday + 365 * (iyear - 75) + ((iyear - 73) / 4);
327 0.74996579132101300 + 2.73785088295687885e-5 * double(icapd);
330 double H0 = 279.69668 + (36000.768930485 + 0.000303 * capt) * capt;
334 ((0.0000019 * capt - 0.001133) * capt + 481267.88314137) * capt +
339 ((-0.000012 * capt - 0.010325) * capt + 4069.0340329577) * capt +
353 static const double twopi = 6.28318530718;
354 for (
int k = 0; k < 11; k++)
356 angles[k] = speed[k] * fday + angfac[k] * H0 +
357 angfac[11 + k] * S0 + angfac[22 + k] * P0 +
358 angfac[33 + k] * twopi;
359 angles[k] = ::fmod(angles[k], twopi);
372 for (
int i = 0; i < 3; i++)
375 for (
int j = 0; j < 11; j++)
376 dc[i] +=
coeff[i * 11 + j] *
394 Exception E(
"std except: " +
string(e.what()));
425 Exception e(
"Site " + site +
" has not been initialized.");
430 vector<double>
coeff = coefficientMap[site];
436 static const NVector SchInd[] = {
451 if ((
int)(
sizeof(SchInd) /
sizeof(
NVector)) != NSTD)
453 Exception e(
"Static SchInd array is corrupted");
460 double dayfr(ttag.
secOfDay() / 86400.0);
463 double T((ttag.
dMJD() - 51544.5) / 36525.0);
466 double Del[5], freqDel[5];
469 T * (477198.8675605000 +
470 T * (0.0088553333 + T * (0.0000143431 + T * (-0.0000000680))));
475 T * (-0.0001536667 + T * (0.0000000378 + T * (-0.0000000032))));
480 T * (-0.0035420000 + T * (-0.0000002881 + T * (0.0000000012))));
485 T * (-0.0017696111 + T * (0.0000018314 + T * (-0.0000000088))));
488 T * (-1934.1362619722 +
489 T * (0.0020756111 + T * (0.0000021394 + T * (-0.0000000165))));
490 for (i = 0; i < 5; i++)
491 Del[i] = ::fmod(Del[i], 360.0);
492 freqDel[0] = 0.0362916471 + 0.0000000013 * T;
493 freqDel[1] = 0.0027377786;
494 freqDel[2] = 0.0367481951 - 0.0000000005 * T;
495 freqDel[3] = 0.0338631920 - 0.0000000003 * T;
496 freqDel[4] = -0.0001470938 + 0.0000000003 * T;
499 double Dood[6], freqDood[6];
500 Dood[0] = 360.0 * dayfr - Del[3];
501 Dood[1] = Del[2] + Del[4];
502 Dood[2] = Dood[1] - Del[3];
503 Dood[3] = Dood[1] - Del[0];
505 Dood[5] = Dood[2] - Del[1];
506 for (i = 0; i < 6; i++)
507 Dood[i] = ::fmod(Dood[i], 360.0);
509 freqDood[0] = 1.0 - freqDel[3];
510 freqDood[1] = freqDel[2] + freqDel[4];
511 freqDood[2] = freqDood[1] - freqDel[3];
512 freqDood[3] = freqDood[1] - freqDel[0];
513 freqDood[4] = -freqDel[4];
514 freqDood[5] = freqDood[2] - freqDel[1];
518 double amp[NSTD], phs[NSTD];
519 double ampS[NDER], ampW[NDER],
521 double phsS[NDER], phsW[NDER],
527 for (i = 0; i < NSTD; i++)
530 phs[i] = -
coeff[33 + i];
556 nder = deriveTides(SchInd,
amp, phs, Dood, freqDood, ampU, phsU, freq,
561 for (i = 0; i < NSTD; i++)
564 phs[i] = -
coeff[44 + i];
572 nder = deriveTides(SchInd,
amp, phs, Dood, freqDood, ampW, phsW, freq,
577 for (i = 0; i < NSTD; i++)
580 phs[i] = -
coeff[55 + i];
588 nder = deriveTides(SchInd,
amp, phs, Dood, freqDood, ampS, phsS, freq,
596 for (i = 0; i < nder; i++)
607 for (i = 0; i < nder; i++)
618 for (i = 0; i < nder; i++)
646 Exception E(
"std except: " +
string(e.what()));
658 int OceanLoadTides::deriveTides(
const NVector SchInd[],
const double amp[],
659 const double phs[],
const double Dood[],
660 const double freqDood[],
double ampDer[],
661 double phsDer[],
double freqDer[],
665 static const int stdindex[] = {0, 1, 2, 3, 109, 110,
666 111, 112, 263, 264, 265};
668 static const double DerAmp[] = {
669 .632208, .294107, .121046, .079915, .023818, -.023589, .022994,
670 .019333, -.017871, .017192, .016018, .004671, -.004662, -.004519,
671 .004470, .004467, .002589, -.002455, -.002172, .001972, .001947,
672 .001914, -.001898, .001802, .001304, .001170, .001130, .001061,
673 -.001022, -.001017, .001014, .000901, -.000857, .000855, .000855,
674 .000772, .000741, .000741, -.000721, .000698, .000658, .000654,
675 -.000653, .000633, .000626, -.000598, .000590, .000544, .000479,
676 -.000464, .000413, -.000390, .000373, .000366, .000366, -.000360,
677 -.000355, .000354, .000329, .000328, .000319, .000302, .000279,
678 -.000274, -.000272, .000248, -.000225, .000224, -.000223, -.000216,
679 .000211, .000209, .000194, .000185, -.000174, -.000171, .000159,
680 .000131, .000127, .000120, .000118, .000117, .000108, .000107,
681 .000105, -.000102, .000102, .000099, -.000096, .000095, -.000089,
682 -.000085, -.000084, -.000081, -.000077, -.000072, -.000067, .000066,
683 .000064, .000063, .000063, .000063, .000062, .000062, -.000060,
684 .000056, .000053, .000051, .000050, .368645, -.262232, -.121995,
685 -.050208, .050031, -.049470, .020620, .020613, .011279, -.009530,
686 -.009469, -.008012, .007414, -.007300, .007227, -.007131, -.006644,
687 .005249, .004137, .004087, .003944, .003943, .003420, .003418,
688 .002885, .002884, .002160, -.001936, .001934, -.001798, .001690,
689 .001689, .001516, .001514, -.001511, .001383, .001372, .001371,
690 -.001253, -.001075, .001020, .000901, .000865, -.000794, .000788,
691 .000782, -.000747, -.000745, .000670, -.000603, -.000597, .000542,
692 .000542, -.000541, -.000469, -.000440, .000438, .000422, .000410,
693 -.000374, -.000365, .000345, .000335, -.000321, -.000319, .000307,
694 .000291, .000290, -.000289, .000286, .000275, .000271, .000263,
695 -.000245, .000225, .000225, .000221, -.000202, -.000200, -.000199,
696 .000192, .000183, .000183, .000183, -.000170, .000169, .000168,
697 .000162, .000149, -.000147, -.000141, .000138, .000136, .000136,
698 .000127, .000127, -.000126, -.000121, -.000121, .000117, -.000116,
699 -.000114, -.000114, -.000114, .000114, .000113, .000109, .000108,
700 .000106, -.000106, -.000106, .000105, .000104, -.000103, -.000100,
701 -.000100, -.000100, .000099, -.000098, .000093, .000093, .000090,
702 -.000088, .000083, -.000083, -.000082, -.000081, -.000079, -.000077,
703 -.000075, -.000075, -.000075, .000071, .000071, -.000071, .000068,
704 .000068, .000065, .000065, .000064, .000064, .000064, -.000064,
705 -.000060, .000056, .000056, .000053, .000053, .000053, -.000053,
706 .000053, .000053, .000052, .000050, -.066607, -.035184, -.030988,
707 .027929, -.027616, -.012753, -.006728, -.005837, -.005286, -.004921,
708 -.002884, -.002583, -.002422, .002310, .002283, -.002037, .001883,
709 -.001811, -.001687, -.001004, -.000925, -.000844, .000766, .000766,
710 -.000700, -.000495, -.000492, .000491, .000483, .000437, -.000416,
711 -.000384, .000374, -.000312, -.000288, -.000273, .000259, .000245,
712 -.000232, .000229, -.000216, .000206, -.000204, -.000202, .000200,
713 .000195, -.000190, .000187, .000180, -.000179, .000170, .000153,
714 -.000137, -.000119, -.000119, -.000112, -.000110, -.000110, .000107,
715 -.000095, -.000095, -.000091, -.000090, -.000081, -.000079, -.000079,
716 .000077, -.000073, .000069, -.000067, -.000066, .000065, .000064,
717 -.000062, .000060, .000059, -.000056, .000055, -.000051};
719 static const NVector DerInd[] = {
720 {2, 0, 0, 0, 0, 0}, {2, 2, -2, 0, 0, 0},
722 {2, 2, 0, 0, 0, 0}, {2, 2, 0, 0, 1, 0},
724 {2, -1, 2, -1, 0, 0}, {2, -2, 2, 0, 0, 0},
725 {2, 1, 0, -1, 0, 0}, {2, 2, -3, 0, 0, 1},
726 {2, -2, 0, 2, 0, 0}, {2, -3, 2, 1, 0, 0},
727 {2, 1, -2, 1, 0, 0}, {2, -1, 0, 1, -1, 0},
728 {2, 3, 0, -1, 0, 0}, {2, 1, 0, 1, 0, 0},
729 {2, 2, 0, 0, 2, 0}, {2, 2, -1, 0, 0, -1},
730 {2, 0, -1, 0, 0, 1}, {2, 1, 0, 1, 1, 0},
731 {2, 3, 0, -1, 1, 0}, {2, 0, 1, 0, 0, -1},
732 {2, 0, -2, 2, 0, 0}, {2, -3, 0, 3, 0, 0},
733 {2, -2, 3, 0, 0, -1}, {2, 4, 0, 0, 0, 0},
734 {2, -1, 1, 1, 0, -1}, {2, -1, 3, -1, 0, -1},
735 {2, 2, 0, 0, -1, 0}, {2, -1, -1, 1, 0, 1},
736 {2, 4, 0, 0, 1, 0}, {2, -3, 4, -1, 0, 0},
737 {2, -1, 2, -1, -1, 0}, {2, 3, -2, 1, 0, 0},
738 {2, 1, 2, -1, 0, 0}, {2, -4, 2, 2, 0, 0},
739 {2, 4, -2, 0, 0, 0}, {2, 0, 2, 0, 0, 0},
740 {2, -2, 2, 0, -1, 0}, {2, 2, -4, 0, 0, 2},
741 {2, 2, -2, 0, -1, 0}, {2, 1, 0, -1, -1, 0},
742 {2, -1, 1, 0, 0, 0}, {2, 2, -1, 0, 0, 1},
743 {2, 2, 1, 0, 0, -1}, {2, -2, 0, 2, -1, 0},
744 {2, -2, 4, -2, 0, 0}, {2, 2, 2, 0, 0, 0},
745 {2, -4, 4, 0, 0, 0}, {2, -1, 0, -1, -2, 0},
746 {2, 1, 2, -1, 1, 0}, {2, -1, -2, 3, 0, 0},
747 {2, 3, -2, 1, 1, 0}, {2, 4, 0, -2, 0, 0},
748 {2, 0, 0, 2, 0, 0}, {2, 0, 2, -2, 0, 0},
749 {2, 0, 2, 0, 1, 0}, {2, -3, 3, 1, 0, -1},
750 {2, 0, 0, 0, -2, 0}, {2, 4, 0, 0, 2, 0},
751 {2, 4, -2, 0, 1, 0}, {2, 0, 0, 0, 0, 2},
752 {2, 1, 0, 1, 2, 0}, {2, 0, -2, 0, -2, 0},
753 {2, -2, 1, 0, 0, 1}, {2, -2, 1, 2, 0, -1},
754 {2, -1, 1, -1, 0, 1}, {2, 5, 0, -1, 0, 0},
755 {2, 1, -3, 1, 0, 1}, {2, -2, -1, 2, 0, 1},
756 {2, 3, 0, -1, 2, 0}, {2, 1, -2, 1, -1, 0},
757 {2, 5, 0, -1, 1, 0}, {2, -4, 0, 4, 0, 0},
758 {2, -3, 2, 1, -1, 0}, {2, -2, 1, 1, 0, 0},
759 {2, 4, 0, -2, 1, 0}, {2, 0, 0, 2, 1, 0},
760 {2, -5, 4, 1, 0, 0}, {2, 0, 2, 0, 2, 0},
761 {2, -1, 2, 1, 0, 0}, {2, 5, -2, -1, 0, 0},
762 {2, 1, -1, 0, 0, 0}, {2, 2, -2, 0, 0, 2},
763 {2, -5, 2, 3, 0, 0}, {2, -1, -2, 1, -2, 0},
764 {2, -3, 5, -1, 0, -1}, {2, -1, 0, 0, 0, 1},
765 {2, -2, 0, 0, -2, 0}, {2, 0, -1, 1, 0, 0},
766 {2, -3, 1, 1, 0, 1}, {2, 3, 0, -1, -1, 0},
767 {2, 1, 0, 1, -1, 0}, {2, -1, 2, 1, 1, 0},
768 {2, 0, -3, 2, 0, 1}, {2, 1, -1, -1, 0, 1},
769 {2, -3, 0, 3, -1, 0}, {2, 0, -2, 2, -1, 0},
770 {2, -4, 3, 2, 0, -1}, {2, -1, 0, 1, -2, 0},
771 {2, 5, 0, -1, 2, 0}, {2, -4, 5, 0, 0, -1},
772 {2, -2, 4, 0, 0, -2}, {2, -1, 0, 1, 0, 2},
773 {2, -2, -2, 4, 0, 0}, {2, 3, -2, -1, -1, 0},
774 {2, -2, 5, -2, 0, -1}, {2, 0, -1, 0, -1, 1},
775 {2, 5, -2, -1, 1, 0}, {1, 1, 0, 0, 0, 0},
777 {1, 1, -2, 0, 0, 0}, {1, -2, 0, 1, 0, 0},
779 {1, -1, 0, 0, -1, 0}, {1, 2, 0, -1, 0, 0},
780 {1, 0, 0, 1, 0, 0}, {1, 3, 0, 0, 0, 0},
781 {1, -2, 2, -1, 0, 0}, {1, -2, 0, 1, -1, 0},
782 {1, -3, 2, 0, 0, 0}, {1, 0, 0, -1, 0, 0},
783 {1, 1, 0, 0, -1, 0}, {1, 3, 0, 0, 1, 0},
784 {1, 1, -3, 0, 0, 1}, {1, -3, 0, 2, 0, 0},
785 {1, 1, 2, 0, 0, 0}, {1, 0, 0, 1, 1, 0},
786 {1, 2, 0, -1, 1, 0}, {1, 0, 2, -1, 0, 0},
787 {1, 2, -2, 1, 0, 0}, {1, 3, -2, 0, 0, 0},
788 {1, -1, 2, 0, 0, 0}, {1, 1, 1, 0, 0, -1},
789 {1, 1, -1, 0, 0, 1}, {1, 4, 0, -1, 0, 0},
790 {1, -4, 2, 1, 0, 0}, {1, 0, -2, 1, 0, 0},
791 {1, -2, 2, -1, -1, 0}, {1, 3, 0, -2, 0, 0},
792 {1, -1, 0, 2, 0, 0}, {1, -1, 0, 0, -2, 0},
793 {1, 3, 0, 0, 2, 0}, {1, -3, 2, 0, -1, 0},
794 {1, 4, 0, -1, 1, 0}, {1, 0, 0, -1, -1, 0},
795 {1, 1, -2, 0, -1, 0}, {1, -3, 0, 2, -1, 0},
796 {1, 1, 0, 0, 2, 0}, {1, 1, -1, 0, 0, -1},
797 {1, -1, -1, 0, 0, 1}, {1, 0, 2, -1, 1, 0},
798 {1, -1, 1, 0, 0, -1}, {1, -1, -2, 2, 0, 0},
799 {1, 2, -2, 1, 1, 0}, {1, -4, 0, 3, 0, 0},
800 {1, -1, 2, 0, 1, 0}, {1, 3, -2, 0, 1, 0},
801 {1, 2, 0, -1, -1, 0}, {1, 0, 0, 1, -1, 0},
802 {1, -2, 2, 1, 0, 0}, {1, 4, -2, -1, 0, 0},
803 {1, -3, 3, 0, 0, -1}, {1, -2, 1, 1, 0, -1},
804 {1, -2, 3, -1, 0, -1}, {1, 0, -2, 1, -1, 0},
805 {1, -2, -1, 1, 0, 1}, {1, 4, -2, 1, 0, 0},
806 {1, -4, 4, -1, 0, 0}, {1, -4, 2, 1, -1, 0},
807 {1, 5, -2, 0, 0, 0}, {1, 3, 0, -2, 1, 0},
808 {1, -5, 2, 2, 0, 0}, {1, 2, 0, 1, 0, 0},
809 {1, 1, 3, 0, 0, -1}, {1, -2, 0, 1, -2, 0},
810 {1, 4, 0, -1, 2, 0}, {1, 1, -4, 0, 0, 2},
811 {1, 5, 0, -2, 0, 0}, {1, -1, 0, 2, 1, 0},
812 {1, -2, 1, 0, 0, 0}, {1, 4, -2, 1, 1, 0},
813 {1, -3, 4, -2, 0, 0}, {1, -1, 3, 0, 0, -1},
814 {1, 3, -3, 0, 0, 1}, {1, 5, -2, 0, 1, 0},
815 {1, 1, 2, 0, 1, 0}, {1, 2, 0, 1, 1, 0},
816 {1, -5, 4, 0, 0, 0}, {1, -2, 0, -1, -2, 0},
817 {1, 5, 0, -2, 1, 0}, {1, 1, 2, -2, 0, 0},
818 {1, 1, -2, 2, 0, 0}, {1, -2, 2, 1, 1, 0},
819 {1, 0, 3, -1, 0, -1}, {1, 2, -3, 1, 0, 1},
820 {1, -2, -2, 3, 0, 0}, {1, -1, 2, -2, 0, 0},
821 {1, -4, 3, 1, 0, -1}, {1, -4, 0, 3, -1, 0},
822 {1, -1, -2, 2, -1, 0}, {1, -2, 0, 3, 0, 0},
823 {1, 4, 0, -3, 0, 0}, {1, 0, 1, 1, 0, -1},
824 {1, 2, -1, -1, 0, 1}, {1, 2, -2, 1, -1, 0},
825 {1, 0, 0, -1, -2, 0}, {1, 2, 0, 1, 2, 0},
826 {1, 2, -2, -1, -1, 0}, {1, 0, 0, 1, 2, 0},
827 {1, 0, 1, 0, 0, 0}, {1, 2, -1, 0, 0, 0},
828 {1, 0, 2, -1, -1, 0}, {1, -1, -2, 0, -2, 0},
829 {1, -3, 1, 0, 0, 1}, {1, 3, -2, 0, -1, 0},
830 {1, -1, -1, 0, -1, 1}, {1, 4, -2, -1, 1, 0},
831 {1, 2, 1, -1, 0, -1}, {1, 0, -1, 1, 0, 1},
832 {1, -2, 4, -1, 0, 0}, {1, 4, -4, 1, 0, 0},
833 {1, -3, 1, 2, 0, -1}, {1, -3, 3, 0, -1, -1},
834 {1, 1, 2, 0, 2, 0}, {1, 1, -2, 0, -2, 0},
835 {1, 3, 0, 0, 3, 0}, {1, -1, 2, 0, -1, 0},
836 {1, -2, 1, -1, 0, 1}, {1, 0, -3, 1, 0, 1},
837 {1, -3, -1, 2, 0, 1}, {1, 2, 0, -1, 2, 0},
838 {1, 6, -2, -1, 0, 0}, {1, 2, 2, -1, 0, 0},
839 {1, -1, 1, 0, -1, -1}, {1, -2, 3, -1, -1, -1},
840 {1, -1, 0, 0, 0, 2}, {1, -5, 0, 4, 0, 0},
841 {1, 1, 0, 0, 0, -2}, {1, -2, 1, 1, -1, -1},
842 {1, 1, -1, 0, 1, 1}, {1, 1, 2, 0, 0, -2},
843 {1, -3, 1, 1, 0, 0}, {1, -4, 4, -1, -1, 0},
844 {1, 1, 0, -2, -1, 0}, {1, -2, -1, 1, -1, 1},
845 {1, -3, 2, 2, 0, 0}, {1, 5, -2, -2, 0, 0},
846 {1, 3, -4, 2, 0, 0}, {1, 1, -2, 0, 0, 2},
847 {1, -1, 4, -2, 0, 0}, {1, 2, 2, -1, 1, 0},
848 {1, -5, 2, 2, -1, 0}, {1, 1, -3, 0, -1, 1},
849 {1, 1, 1, 0, 1, -1}, {1, 6, -2, -1, 1, 0},
850 {1, -2, 2, -1, -2, 0}, {1, 4, -2, 1, 2, 0},
851 {1, -6, 4, 1, 0, 0}, {1, 5, -4, 0, 0, 0},
852 {1, -3, 4, 0, 0, 0}, {1, 1, 2, -2, 1, 0},
853 {1, -2, 1, 0, -1, 0}, {0, 2, 0, 0, 0, 0},
854 {0, 1, 0, -1, 0, 0}, {0, 0, 2, 0, 0, 0},
856 {0, 2, 0, 0, 1, 0}, {0, 3, 0, -1, 0, 0},
857 {0, 1, -2, 1, 0, 0}, {0, 2, -2, 0, 0, 0},
858 {0, 3, 0, -1, 1, 0}, {0, 0, 1, 0, 0, -1},
859 {0, 2, 0, -2, 0, 0}, {0, 2, 0, 0, 2, 0},
860 {0, 3, -2, 1, 0, 0}, {0, 1, 0, -1, -1, 0},
861 {0, 1, 0, -1, 1, 0}, {0, 4, -2, 0, 0, 0},
862 {0, 1, 0, 1, 0, 0}, {0, 0, 3, 0, 0, -1},
863 {0, 4, 0, -2, 0, 0}, {0, 3, -2, 1, 1, 0},
864 {0, 3, -2, -1, 0, 0}, {0, 4, -2, 0, 1, 0},
865 {0, 0, 2, 0, 1, 0}, {0, 1, 0, 1, 1, 0},
866 {0, 4, 0, -2, 1, 0}, {0, 3, 0, -1, 2, 0},
867 {0, 5, -2, -1, 0, 0}, {0, 1, 2, -1, 0, 0},
868 {0, 1, -2, 1, -1, 0}, {0, 1, -2, 1, 1, 0},
869 {0, 2, -2, 0, -1, 0}, {0, 2, -3, 0, 0, 1},
870 {0, 2, -2, 0, 1, 0}, {0, 0, 2, -2, 0, 0},
871 {0, 1, -3, 1, 0, 1}, {0, 0, 0, 0, 2, 0},
872 {0, 0, 1, 0, 0, 1}, {0, 1, 2, -1, 1, 0},
873 {0, 3, 0, -3, 0, 0}, {0, 2, 1, 0, 0, -1},
874 {0, 1, -1, -1, 0, 1}, {0, 1, 0, 1, 2, 0},
875 {0, 5, -2, -1, 1, 0}, {0, 2, -1, 0, 0, 1},
876 {0, 2, 2, -2, 0, 0}, {0, 1, -1, 0, 0, 0},
877 {0, 5, 0, -3, 0, 0}, {0, 2, 0, -2, 1, 0},
878 {0, 1, 1, -1, 0, -1}, {0, 3, -4, 1, 0, 0},
879 {0, 0, 2, 0, 2, 0}, {0, 2, 0, -2, -1, 0},
880 {0, 4, -3, 0, 0, 1}, {0, 3, -1, -1, 0, 1},
881 {0, 0, 2, 0, 0, -2}, {0, 3, -3, 1, 0, 1},
882 {0, 2, -4, 2, 0, 0}, {0, 4, -2, -2, 0, 0},
883 {0, 3, 1, -1, 0, -1}, {0, 5, -4, 1, 0, 0},
884 {0, 3, -2, -1, -1, 0}, {0, 3, -2, 1, 2, 0},
885 {0, 4, -4, 0, 0, 0}, {0, 6, -2, -2, 0, 0},
886 {0, 5, 0, -3, 1, 0}, {0, 4, -2, 0, 2, 0},
887 {0, 2, 2, -2, 1, 0}, {0, 0, 4, 0, 0, -2},
888 {0, 3, -1, 0, 0, 0}, {0, 3, -3, -1, 0, 1},
889 {0, 4, 0, -2, 2, 0}, {0, 1, -2, -1, -1, 0},
890 {0, 2, -1, 0, 0, -1}, {0, 4, -4, 2, 0, 0},
891 {0, 2, 1, 0, 1, -1}, {0, 3, -2, -1, 1, 0},
892 {0, 4, -3, 0, 1, 1}, {0, 2, 0, 0, 3, 0},
896 if ((
int)(
sizeof(DerAmp) /
sizeof(
double)) != NDER ||
897 (
int)(
sizeof(DerInd) /
sizeof(
NVector)) != NDER)
899 Exception e(
"Static arrays are corrupted");
904 static const double dtr(0.01745329252);
907 double RealAmp[NSTD], ImagAmp[NSTD], Freq[NSTD];
908 double phsrad, freq, phas;
909 for (i = 0; i < Nin; i++)
915 phsrad = phs[i] * dtr;
916 RealAmp[i] =
amp[i] *
::cos(phsrad) / ::fabs(DerAmp[j]);
917 ImagAmp[i] =
amp[i] *
::sin(phsrad) / ::fabs(DerAmp[j]);
924 for (k = 0; k < 6; k++)
926 freq += DerInd[j].
n[k] * freqDood[k];
948 for (i = 0; i < Nin; ++i)
950 QSort(Freq, key, Nin);
953 double tmpR[NSTD], tmpI[NSTD];
954 for (i = 0; i < Nin; ++i)
956 tmpR[i] = RealAmp[i];
957 tmpI[i] = ImagAmp[i];
959 for (i = 0; i < Nin; ++i)
961 RealAmp[i] = tmpR[key[i]];
962 ImagAmp[i] = tmpI[key[i]];
966 int nl(0), nm(0), nh(0);
968 for (i = 0; i < Nin; i++)
980 else if (Freq[i] < 1.5)
984 else if (Freq[i] < 2.5)
993 vector<double> Flow, Rlow, Ilow, Fmed, Rmed, Imed, Fhi, Rhi, Ihi;
994 for (i = 0; i <
nl; i++)
996 Flow.push_back(Freq[i]);
997 Rlow.push_back(RealAmp[i]);
998 Ilow.push_back(ImagAmp[i]);
1003 for (i =
nl; i <
nl + nm; i++)
1005 Fmed.push_back(Freq[i]);
1006 Rmed.push_back(RealAmp[i]);
1007 Imed.push_back(ImagAmp[i]);
1012 for (i =
nl + nm; i <
nl + nm + nh; i++)
1014 Fhi.push_back(Freq[i]);
1015 Rhi.push_back(RealAmp[i]);
1016 Ihi.push_back(ImagAmp[i]);
1036 for (j = 0; j < NDER; j++)
1039 if (DerInd[j].n[0] == 0 &&
nl == 0)
1045 freqDer[nout] = phsDer[nout] = 0.0;
1046 for (k = 0; k < 6; k++)
1048 freqDer[nout] += DerInd[j].
n[k] * freqDood[k];
1049 phsDer[nout] += DerInd[j].
n[k] * Dood[k];
1051 phsDer[nout] = ::fmod(phsDer[nout], 360.0);
1052 if (phsDer[nout] < 0.0)
1054 phsDer[nout] += 360.0;
1064 if (DerInd[j].n[0] == 0)
1066 phsDer[nout] += 180.0;
1068 else if (DerInd[j].n[0] == 1)
1070 phsDer[nout] += 90.0;
1074 freq = freqDer[nout];
1076 if (DerInd[j].n[0] == 0)
1087 else if (DerInd[j].n[0] == 1)
1098 else if (DerInd[j].n[0] == 2)
1110 ampDer[nout] = DerAmp[j] *
RSS(ramp,
iamp);
1111 phsDer[nout] += ::atan2(
iamp, ramp) / dtr;
1112 if (phsDer[nout] > 180.0)
1113 phsDer[nout] -= 360.0;