Commit a2a54551 authored by Takhir Fakhrutdinov's avatar Takhir Fakhrutdinov

добавили detection

parent 9aa9cbd5
......@@ -25,3 +25,7 @@ write_buildinfo.f95
!orbconverter/
!identoptoneset/
!qorbits/
!detection/
!detectionduplet/
!detectionmanual/
......@@ -54,7 +54,7 @@ else
RELCFLAGS = -g -O0 -DDEBUG=$(DEBUG)
endif
SOLVERS=gencatalog fineorbit qorbits seance identification identoptoneset orbconverter ephemerides
SOLVERS=gencatalog fineorbit qorbits seance identification identoptoneset orbconverter ephemerides detection detectionduplet detectionmanual
all: dirs lib $(SOLVERS)
cp $(JPL) $(JPLTARG)
......
write_buildinfo.f95
!>
!> @file detection.f95
!> @date Feb 18 9 2020
!>
!> @brief Программа обнаружения новых объектов
!> @details Программа анализирует выборку непривязанных измерений на предмет обнаружения нового
!> объекта. Срели орбит, находящихся в стадии обнаружения (т.е. прстроенных на основании двух, трех
!> или одной длинной), осуществляется поиск орбиты, наилучшим образом согласующейся с измереними
!> исследуемой проводки. В случае успешного построения уточненной орбиты в базе данных заводится
!> новый физичесий объект, которому приваивается временный номер, и орбита переходит в стадию
!> подтверждения и сопровождения.
!>
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON
!> @param [out] - результаты работы передаются через стандартный файл OUTPUT_UNIT в формате JSON
!>
!> { "init": {
!> > "track": track, -- уникальный номер проводки;
!!
!> > "mstype": mstype, -- тип целевой проводки;
!!
!> > "ttm": ttm, -- время проведения измерения;
!!
!> > "nipinfo":{ -- информация об измерительных пунктах;
!!
!> > "optical":[список X1], -- информация об оптических измерительных пунктах;
!!
!> > "rls":[список X2], -- информация о радиолокационооых измерительных пунктах;
!!
!> > },
!!
!> > "meas": { -- измерительная информация;
!!
!> > "optical": [ список X3 ], -- массив оптических измерений;
!!
!> > "rls": [ список X4 ], -- массив радиолокационных измерений;
!!
!> > },
!!
!> > "orbits":[ список X5], -- актуальный список орбит, каждая строка 60 элементов( расширенный фазовый вектор);
!!
!> > "orbits_list":[ список X6 ], -- актуальный список орбит, сформированный на основе обработки оптической информации;
!!
!> > "detected_orbits":[ список X7 ], -- список орбит на обнаружении;
!!
!> > "prm_history":[ список X8 ], -- протокол изменений точности измеряемых параметров;
!!
!> > "dext":[ список X9 ], -- массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...);
!!
!> > "detected_trans":[ список X10 ], -- массив соответствия проводок временным орбитах;
!!
!> > "binds":[список X11] -- информационный массив о проводках, включенных в выборку,
!>
!> }}
!!
!> где
!!
!> "track" - уникальный номер проводки;
!!
!> "mstype" - тип целевой проводки;
!!
!> "ttm" - время проведения измерения;
!!
!> 1) Список X1 - представляет собой масссив с информациенй об ИП.
!>
!> NIPINFO(NIPINFO_SIZE_) - массив c общей информацией о НИП:
!>
!> - 1 - ID измерительного пункта;
!> - 2 - декартовы координаты ИП в WGS-84 (координата X);
!> - 3 - декартовы координаты ИП в WGS-84 (координата Y);
!> - 4 - декартовы координаты ИП в WGS-84 (координата Z);
!> - 5 - учет аберрации на пункте ( 0 - не учитывается, 1 - учиттывается );
!> - 6 - СКО астрометрической ошибки, arcsec;
!> - 7 - СКО случайной составляющей ошибки измерения времени, sec;
!> - 8 - МО систематической ошибки измерения времени кадра, sec;
!> - 9 - Количество оптических каналов, шт;
!> - 10 - номер телеграммы;
!>
!> где NIPINFO_SIZE_=10
!>
!> 2) Список X2 - представляет собой масссив с информациенй об ИП.
!>
!> LOCINFO(NRNIP,LOCINFO_SIZE_) - массив c общей информацией о радиолокационном ИП
!>
!> - 1 - ID измерительного пункта;
!> - 2 - декартовы координаты ИП в WGS-84 (координата X);
!> - 3 - декартовы координаты ИП в WGS-84 (координата Y);
!> - 4 - декартовы координаты ИП в WGS-84 (координата Z);
!> - 5 - учет рефракции на пункте (0 - не учитывается; 1 - учиттывается);
!> - 6 - СКО случайной ошибки измерения угловых параметров, arcsec;
!> - 7 - СКО случайной составляющей ошибки измерения времени, sec;
!> - 8 - МО систематической ошибки измерения времени кадра, sec;
!> - 9 - СКО случайной ошибки измерения дальности, км;
!> - 10 - МО систематической ошибки измерения дальности, км;
!> - 11 - СКО случайной ошибки измерения скорости дальности, км/c;
!> - 12 - азимут направления нормали антены радиолокатора в топоцентрической СК, град;
!> - 13 - угол места направления нормали антены радиолокатора в топоцентрической СК, град;
!> - 14 - номер телеграммы;
!>
!> где LOCINFO_SIZE_=14
!>
!> 3) Список X3 - представляет собой масссив с измерительной оптической информациенй.
!!
!> Массив в формате json для NZAS оптических измерений:
!>
!> "meas" : [[ROPT(1,1),ROPT(1,2),...,ROPT(1,ROPT_SIZE_)],
!!
!> > [ROPT(2,1),ROPT(2,2),...,ROPT(2,ROPT_SIZE_)], ...
!!
!> > [ROPT(NZAS,1),ROPT(NZAS,2),...,ROPT(NZAS,ROPT_SIZE_)]]
!>
!> ROPT(NZAS,ROPT_SIZE_) - массив сеанса оптических измерений:
!>
!> - 1 - Номер присвоенный проводке в комплексе
!> - 2 - Номер ИП
!> - 3 - MJD измерения; JD
!> - 4 - угол прямого восхождения в J2000 в часах, h
!> - 5 - угол склонения в J2000 в градусах, град
!> - 6 - СКО астрометрической ошибки склонения, arcsec;
!> - 7 - СКО астрометрической ошибки прямого восхождения, arcsec/15;
!> - 8 - Блеск, mag;
!> - 9 - индикатор наличия аномальных измерений:
!> * ?X - данные после предварительной обработки (rsident);
!> * 0 - изерение нормальное;
!> * 1 - измерение аномальное;
!> * 2 - среднее СКО измерений в проводке не соответствует заявленным;
!> * 3 - недостаточное количество измерений;
!> * 4 - интервал проводки слишком большой;
!> ( предположение об апроксимации полиномом 2-го пор неверно);
!> * X? - данные после решения задачи оценивания;
!> * 0? - оценка отсутствует;
!> * 1? - измерение нормальное;
!> * 2? - измерение аномальное.
!!
!> - 10 - (*) СКО шумовой составляющей ошибки измерений по RA (оценка ско измерений с единичным весом), arcsec
!> - 11 - (*) СКО шумовой составляющей ошибки измерений по DEC (оценка ско измерений с единичным весом), arcsec
!> - 12 - (*) невязки относительно сглаживающего полинома по RA, arcsec;
!> - 13 - (*) невязки относительно сглаживающего полинома по DEC, arcsec;
!> - 14 - (#) транверсальные невязки относительно полученной оценки орбиты, arcsec;
!> - 15 - (#) нормальные невязки относительно полученной оценки орбиты, arcsec;
!> - 16 - (#) СКО шумовой составляющей трансверсальной ошибки измерений, arcsec;
!> - 17 - (#) СКО шумовой составляющей нормальной ошибки измерений, arcsec;
!> - 18 - (#) временная интерпретация трансверсальных невязок, sec;
!> - 19 - (#) МО временной ошибки измерений, sec;
!> - 20 - (#) СКО временной ошибки измерений, sec;
!> - 21 - (*) Угол места в топоцентрической системе координат, рад;
!> - 22 - (*) Азимут в топоцентрической системе координат, рад.
!>
!> Примечание: СКО шумовой составляющей, которая характерна для всей проводки вцелом и
!> имеет одно и то же значение для всей проводки,
!> вынесена в эту таблицу из-за использования механизма прореживания
!> (*) - результат задачи идентификации
!> (#) - результат задачи оценивания
!>
!> 4) Список X4 - представляет собой масссив с измерительной радиолокационной информацией.
!!
!> Массив в формате json для NZAS радиолокационных измерений:
!> "rloc" : [[RLOC(1,1),RLOC(1,2),...,RLOC(1,RLOC_SIZE_)],
!!
!> > [RLOC(2,1),RLOC(2,2),...,RLOC(2,RLOC_SIZE_)], ...
!!
!> > [RLOC(NZAS,1),RLOC(NZAS,2),...,RLOC(NZAS,RLOC_SIZE_)]]
!>
!> RLOC(NZAS,RLOC_SIZE_) - массив сеанса радиолокационных измерений:
!>
!> - 1 - Номер присвоенный проводке в комплексе
!> - 2 - Номер ИП
!> - 3 - MJD измерения JD
!> - 4 - антенный азимут рад
!> - 5 - антенный угол места рад
!> - 6 - наклонная дальность км
!> - 7 - скорость изменения наклонной дальности км/сек
!> - 8 - Амплитуда сигнала относительные единицы
!> - 9 - индикатор наличия аномальных измерений
!> * ?X - данные после предварительной обработки (rsident)
!> * 0 - измерение нормальное
!> * 1 - измерение аномальное
!> * 2 - среднее СКО измерений в проводке не соответствует заявленным
!> * 3 - недостаточное количество измерений
!> * 4 - интервал проводки слишком большой
!> ( предположение об апроксимации полиномом 2-го пор неверно)
!> * X? - данные после решения задачи оценивания
!> * 0? - оценка отсутствует
!> * 1? - измерение нормальное
!> * 2? - измерение аномальное
!>
!> - 10 - (*) СКО шумовой составляющей ошибки измерений по азимуту (оценка ско измерений с единичным весом) arcsec
!> - 11 - (*) СКО шумовой составляющей ошибки измерений по углу места (оценка ско измерений с единичным весом) arcsec
!> - 12 - (*) невязки относительно сглаживающего полинома по азимуту arcsec
!> - 13 - (*) невязки относительно сглаживающего полинома по углу места arcsec
!> - 14 - (#) транверсальные невязки относительно полученной оценки орбиты arcsec
!> - 15 - (#) невязки относительно полученной оценки орбиты вдоль нормали к плоскости орбиты arcsec
!> - 16 - (#) СКО шумовой составляющей ошибки измерений вдоль трансверсали arcsec
!> - 17 - (#) СКО шумовой составляющей ошибки измерений вдоль нормали к плоскости орбиты arcsec
!> - 18 - (#) временная интерпретация трансверсальных невязок sec
!> - 19 - (#) МО временной ошибки измерений sec
!> - 20 - (#) СКО временной ошибки измерений sec
!> - 21 - (*) Угол места в топоцентрической системе координат рад
!> - 22 - (*) Азимут в топоцентрической системе координат рад
!> - 23 - Несущая частота кГц
!> - 24 - (*) СКО шумовой составляющей ошибки измерений наклонной дальности (оценка ско измерений с единичным весом) км
!> - 25 - (*) СКО шумовой составляющей ошибки измерений скорости изменения (оценка ско измерений с единичным весом) км/сек
!> - 26 - (*) невязки относительно сглаживающего полинома по наклонной дальности км
!> - 27 - (*) невязки относительно сглаживающего полинома по скорости изменения наклонной дальности км
!> - 28 - (#) радиальные невязки относительно полученной оценки орбиты км
!> - 29 - (#) невязки скорости изменения дальности в радиальном направлении относительно полученной оценки орбиты км/сек
!> - 30 - (#) СКО шумовой составляющей ошибки измерений дальности в радиальном направлении км
!> - 31 - (#) СКО шумовой составляющей ошибки измерений скорости изменнения дальности в радиальном направлении км/сек
!> - 32 - Межрупорный коэффициент корреляции (по необходимости) -
!>
!> Примечание: СКО шумовой составляющей, которая характерна для всей проводки вцелом и
!> имеет одно и то же значение для всей проводки,
!> вынесена в эту таблицу из-за использования механизма прореживания
!> (*) - результат задачи идентификации
!> (#) - результат задачи оценивания
!>
!> 5) список X5 представляет собой динамический список орбит актуального каталога КО:
!>
!> Массив в формате json для N космических объектов:
!>
!> "orbits" : [[D_CAT(1,1),D_CAT(1,2),...,D_CAT(1,ORBIT_SIZE_)],
!!
!> > [D_CAT(2,1),D_CAT(2,2),...,D_CAT(2,ORBIT_SIZE_)], ...
!!
!> > [D_CAT(N,1),D_CAT(N,2),...,D_CAT(N,ORBITT_SIZE_)]]
!>
!> D_CAT(NDCAT,ORBIT_SIZE_) - массив c информацией о КО:
!>
!> - 1 - NKO;
!> - 2 - MJD каталога;
!> - 3-5 - координаты X,Y,Z в СК J2000;
!> - 6-8 - скорости по X,Y,Z в СК J2000;
!> - 9 - коэффициент светового давления k*S/m;
!> - 10 - баллистический коэффициент Сx*S/2m;
!> - 11-13 - СКО координат X,Y,Z в СК J2000;
!> - 14-16 - СКО скоростей по X,Y,Z в СК J2000;
!> - 17 - СКО коэффициента светового давления;
!> - 18 - СКО баллистического коэффициента;
!> - 19 - отношение площади к массе;
!> - 20 - усредненное значение ОПМ м**2/кг;
!> - 21 - коэффициент отражения;
!> - 22 - коэффициент лобового сопротивления;
!> - 23 - блеск;
!> - 24 - СКО блеска;
!> - 25 - признак маневрирования;
!> - 26 - признак важности;
!> - 27 - счетчик обработанных пакетов измерений;
!> - 28 - интервал корреляции;
!> - 29 - ID проводки, которой соответствует оценка вектора состояния;
!> - 30-57 - элементы ковариационной матрицы;
!> где
!> - 30-44 верхний треугольник:
!> (1,2),(1,3),(1,4),(1,5),(1,6)
!> (2,3),(2,4),(2,5),(2,6)
!> (3,4),(3,5),(3,6)
!> (4,5),(4,6)
!> (5,6);
!>
!> - 45-56 (1,7),(1,8)
!> (2,7),(2,8)
!> (3,7),(3,8)
!> (4,7),(4,8)
!> (5,7),(5,8)
!> (6,7),(6,8);
!>
!> - 57 (7,8);
!>
!> - 58 - дисперсия измерения с единичным весом пакета участвовавшем в уточнениии
!> в случае типа орбиты 9 поле содержит интервал прогнозирования
!> от первой родительской орбиты того же типа, который указан в поле 59;
!> - 59 - информационно-управляющее поле для орбит актуального каталога:
!> указание на тип орбиты, которая явилась родительской по отношению к
!> сформированной актуальной;
!> тип соответствует нумерации орбит для поля 60
!>
!> для орбит сформированных по оптике (индекс списка орбит равен 3) :
!> * 0 - требуется подтверждение орбиты;
!> * 1 - орбита подтверждена по внешнему каталогу ЗНХ;
!> * 2 - орбита подтверждена по внешнему каталогу KK ВВС США;
!> * 3 - орбита подтверждена по обоим внешним каталогам;
!> * 4 - орбита подтверждена по оптическим измерениям с двух НИП или двух ночей;
!> * 5 - орбита подтверждена по внешнему каталогу ЗНХ и по оптическим измерениям;
!> * 6 - орбита подтверждена по внешнему каталогу TLE и по оптическим измерениям;
!> * 7 - орбита подтверждена по внешним каталогам и по оптическим измерениям;
!> * 8 - орбита с хорошими точностными характеристиками, полученными в результате решения задачи оценвания;
!> * XXX? - признак маневра:
!> В случае когда индекс динамического списк орбит равен 4;
!> + 0 - обычная орбита;
!> + 1 - опорная орбита;
!> + 2 - орбита в момент начала маневра;
!> + 3 - орбита в момент окончания маневра;
!>
!> - 60 - индекс динамического списка орбит:
!> 1. - массив с описанием орбиты сформирован по каталогу ЗНХ (z);
!> 2. - согласованные на выбранном интервале орбиты сформированые по каталогу КК ВВС США (u);
!> 3. - действующие орбиты сформированные по оптике (^ o);
!> 4. - сглаженные орбиты подготовленные для ведения внутреннего каталога (f);
!> 5. - некоррелированные орбиты (d);
!> 6. - массив с описанием орбиты сформирован по альманаху (G);
!> 7. - массив с описанием орбиты сформирован по оригинальному tle (t);
!> 8. - резерв;
!> 9. - орбита актуального каталога (a) ;
!>
!> где ORBIT_SIZE_=60.
!>
!> 6) список X6 представляет собой динамический список орбит КО построенных по оптической информации:
!>
!> Массив в формате json для NPCAT космических объектов:
!>
!> "orbit_list" : [[L_CAT(1,1),L_CAT(1,2),...,L_CAT(1,ORBIT_SIZE_)],
!!
!> > [L_CAT(2,1),L_CAT(2,2),...,L_CAT(2,ORBIT_SIZE_)], ...
!!
!> > [L_CAT(NPCAT,1),L_CAT(NPCAT,2),...,L_CAT(NPCAT,ORBITT_SIZE_)]]
!>
!> L_CAT(NPCAT,ORBIT_SIZE_) - массив c информацией о КО имеет структуру, представленную в п. 5
!>
!>
!> 7) список X7 представляет список орбит, находящихся на обнаружении;
!>
!> Массив в формате json для NUCAT космических объектов:
!>
!> "orbdetected" : [[ORBDETECTED(1,1),ORBDETECTED(1,2),...,ORBDETECTED(1,ORBIT_SIZE_)],
!!
!> > [ORBDETECTED(2,1),ORBDETECTED(2,2),...,ORBDETECTED(2,ORBIT_SIZE_)], ...
!!
!> > [ORBDETECTED(NUCAT,1),ORBDETECTED(NUCAT,2),...,ORBDETECTED(NUCAT,ORBITT_SIZE_)]]
!>
!> ORBDETECTED(NUCAT,ORBIT_SIZE_) - массив c информацией о КО имеет структуру, представленную в п. 5
!>
!> 8) список X8 представляет собой массив, содержащий протокол изменений точности измеряемых параметров;
!>
!> "prm_history" : [[HIST(1,1),HIST(1,2),...,HIST(1,HIST_SIZE_)],
!!
!> > [HIST(2,1),HIST(2,2),...,HIST(2,HIST_SIZE_)], ...
!!
!> > [HIST(NHIST,1),HIST(NHIST,2),...,HIST(NHIST,HIST_SIZE_)]]
!>
!> HIST(NHIST,HIST_SIZE_) R*8 - массив c информацией о смене характеритик точности ИП
!>
!> - 1 - ID измерительного пункта
!> - 2 - ID измеряемого параметра
!> - 3 - TT(MJD) дата изменения параметра
!> - 4 - новое значение измеряемого параметра
!>
!> где HIST_SIZE_ = 4
!>
!> 9) список X9 представляет собой информационный массив с параметрами вращения Земли и данными о космической погоде
!> для N суток;
!>
!> "dext" : [[D_EXT(1,1),D_EXT(1,2),...,D_EXT(1,DEXT_SIZE_)],
!>
!> >>> [D_EXT(2,1),D_EXT(2,2),...,D_EXT(2,DEXT_SIZE_)], ...
!>
!> >>> [D_EXT(N,1),D_EXT(N,2),...,D_EXT(N,DEXT_SIZE_)]]
!>
!> D_EXT(NDEXT,DEXT_SIZE_) - массив с параметрами вращения Земли и данными о космической погоде:
!>
!> - 1 - MJD, чтобы получить JD надо прибавить 2400000,5;
!> - 2 - Xp, (as) ;
!> - 3 - Yp (as);
!> - 4 - UT1-UTC, (s);
!> - 5 - dX, (mas);
!> - 6 - dY, (mas);
!> - 7 - delta AT, (s) ;
!> - 8 - F10.7 индекс равный плотности потока на длине волны 10.7;
!> - 9 - F81 среднее взвешенное значение индекса F10.7 за 81 день;
!> - 10 - Kp квазилогарифмический коэффициент.
!>
!> где DEXT_SIZE_=10;
!>
!> При расчете F0 (75,100,125,150,175,200,250) берется ближайшее к значению F81.
!>
!> 10) список X10 представляет собой информационный массив утанавливающий ооответствие выборки
!> ID непривязанных проводок к вычисленной орбите, по результатам обработки которых она
!> получена;
!>
!> "detected_trans" : [[SUBSET(1,1),SUBSET(1,2)],
!!
!> > [SUBSET(2,1),SUBSET(2,2)], ... ,
!!
!> > [SUBSET(NSUBS,1),SUBSET(NSUBS,2)]]
!>
!> SUBSET(NTRAN,2) I*8 - выборка из массива данных содержащая привязку ранее обработанных
!> измерений к временным объектам
!> (одной проводке может принадлежать несколько временных орбит?)...продумать
!>
!> - 1 - ID проводки
!> - 2 - ID привязанной к ней временная орбита
!>
!>
!> 11) список X11 представляет собой информационный массив о проводках:
!>
!> Массив содержащий результат работы программы привязки.
!> Он заполняется в два этапа (candidates, binding).
!>
!> Массив в формате json для NBINDS проводок:
!> "binds" : [[BINDS(1,1),BINDS(1,2),...,BINDS(1,BINDS_SIZE_)],
!!
!> >>> [BINDS(2,1),BINDS(2,2),...,BINDS(2,BINDS_SIZE_)], ...
!!
!> >>> [BINDS(NBINDS,1),BINDS(NBINDS,2),...,BINDS(NBINDS,BINDS_SIZE_)]]
!>
!> BINDS(NPRV,BINDS_SIZE_) - массив с результатами привязки
!>
!> - 1. - (*) Номер присвоенный проводке в комплексе
!> - 2. - Номер объекта NKO присвоенный выбранной проводке
!> - 3. - (*) Номер сета(набор кадров с одинаковыми моментами времени) Этот номер присваивается
!> при первоначальной обработке сеанса.
!> - 4. - (*) Количество измерений в проводке
!> - 5. - (*) количество измерений в проводке признанных номинальными
!> - 6. - значение функционала
!> - 7. - средняя угловая ошибка вдоль орбиты
!> - 8. - средняя угловая ошибка по нормали к орбите
!> - 9. - СКО оценки измерений (номинал или верхний предел для формирования весовой матрицы)
!> - 10. - (*) тип сглаживающего полинома
!> - 0 - нет данных
!> - 1 - алгебраический полином 1-й степени (линейный)
!> - 2 - алгебраический полином 2-й степени (квадратичный)
!> - 3 - полином Чебышёва 2-й степени
!> - 11. - (*) коэффициент при нулевой степени (свободный член) аппроксимирующего полинома по RA
!> - 12. - (*) коэффициент при первой степени аппроксимирующего полинома по RA
!> - 13. - (*) коэффициент при второй степени аппроксимирующего полинома по RA
!> - 14. - (*) коэффициент при нулевой степени (свободный член) аппроксимирующего полинома по DEC
!> - 15. - (*) коэффициент при первой степени аппроксимирующего полинома по DEC
!> - 16. - (*) коэффициент при второй степени аппроксимирующего полинома по DEC
!> - 17. - (*) время задания сглаженных значений отнесенных на середину интервала TT
!> - 18. - (*) сглаженное значение RA
!> - 19. - (*) сглаженное значение DEC
!> - 20-25. - номера объектов-кандидатов по критерию близости спрогнозируемых измерений
!> - 26,27. - номер объектов-кандидатов по критерию близости спрогнозированных измерений объектов имеющих TLE
!> - 28. - Индикатор обработки проводки (код состояния оценки)
!> - 0 - проводка не обработана
!> - 1 - проводка обработана (требуется подтверждение)
!> - 2 - проводка обработана (достоверность подтверждена)
!> - 3 - проводка забракована
!> - 29. - НКО подозрительного объекта
!> - 30. - Индикатор наличия аномальной засечки в проводке
!> - 31. - номер задачи, инициализирующей изменение в массиве описания проводки
!> - 0 - seance
!> - 1 - identification
!> - 2 - qorbits
!> - 3 - fineorbits
!> - 4 - detection
!> - 32. - код операции, инициализирующей изменение в массиве описания проводки
!> - 0 - ничего не делать
!> - 1 - записать
!> - 2 - перепривязать
!> - 3 - анулировать
!> - 4 - записать вектора с маневром
!> - 33. - код состояния привязки к объекту динамического списка орбит
!> - 0 - проводка не привязана
!> - 1 - проводка привязана автоматически
!> - 2 - выполнена ручная привязка
!> - 3 - проводка была отвязана
!> - 4 - была выполнена перепривязка
!> - 5 - выполняется проверка гипотез
!> - -1 - проводка забракована
!> Этим кодам соответствуют символьные коды:
!> * " " - проводку следует обработать
!> * "+" - проводка была привязана
!> * "m" - ручная привязка требуется сохранить привязку при любом исходе решения задачи
!> * "-" - проводка была отвязана
!> * "<" - была выполнена альтернативная привязка
!> * "?" - выполняется проверка гипотез
!> * "A" - проводка забракована
!> - 34. - статус проводки (разрешение на запуск перепривязки)
!> - 0 - не обработана (следует запускать анализ перепривязки)
!> - 1 - обработана (перепривязку запускать не следует)
!> - 35. - значение функционала для объекта при первоначальной идентификации
!> - 36. - средняя угловая ошибка вдоль орбиты для объекта при первоначальной идентификации
!> - 37. - средняя угловая ошибка по нормали к орбите для объекта при первоначальной идентификации
!> - 38. - индикатор завершения перебора гипотез
!> - 39. - МО вычисленной средней ошибки по времени для эталонного объекта
!> - 40. - СКО вычисленной средней ошибки по времени для эталонного объекта
!> - 41. - МО вычисленной средней ошибки вдоль орбиты
!> - 42. - СКО вычисленной средней ошибки вдоль орбиты
!> - 43. - МО вычисленной средней ошибки поперек орбиты
!> - 44. - СКО вычисленной средней ошибки поперек орбиты
!>
!>
!> Описание результата файла stdout:
!>
!> Файл в формате JSON представляет собой результат работы программы идентификации,
!> представленных в виде списка. Его состав формируется в зависимости от заданных НУ.
!>
!> { "id":"ADAPSLive! v.1.0",
!> "result": {
!>
!> "track": track, -- уникальный номер проводки;
!>
!> "ttm": ttm, -- время проведения измерения;
!>
!> "binds": [ [...], [...] , ... , [...] ],
!>
!> "detected_trans": [ ... ],
!>
!> "orbdetected": [ ... ],
!>
!> "add" : { "subset" : [ [ ID проводки, ID орбиты ], ... , [ ... ] ],
!>
!> "orbits" : [ { "o":[ список X12], "x": [список X13] } ,
!>
!> . . .
!>
!> { "o":[ список X12], "x": [список X13] } ] ,
!>
!> "del" : { "subset" : [ [ ID проводки, ID орбиты ], ... , [ ... ] ],
!>
!> "orbits" : [ список X14 ] },
!>
!> "rc": rc -- код возврата
!>
!> } }
!>
!> Описание результата файла stdout
!> Описание результата файла stderr - отладочная информация
!>
#define __MODULE_VERSION__ '3.8.1'
#define DEBUG
program detection
! необходимые модули для разбора входящего потока
use rdjson
use wrjson
use library_m
implicit none
integer, parameter :: SUBSET_SIZE_ = 2 ! размерность массива отобранных измерений для формирования новой орбиты
integer, parameter :: DETVC_SIZE_ = 12 ! размерность массива отобранных измерений для формирования новой орбиты
type(fson_value), pointer :: init,value,array ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: result,rs_obj,p ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
real(8) :: new_orbit(ORBIT_SIZE_) ! вектор параметров уточненной орбиты
character(len=26) :: tm ! календарное дата и время проводки
integer(8) :: track ! уникальный идетификатор измерения
integer :: i,j ! рабочие переменные для инксов циклов
integer :: TASK ! номер задачи
integer :: COMMAND ! номер команды
integer :: CODEestimation ! код состояния оценки
integer :: CODEbind ! код состояния привязки
integer :: mstype ! тип обрабатываемой проводки 0/1 - оптика/рлс
integer :: RC ! код возврата
integer :: alloc_err ! признаки ошибки выделения памяти и вызова подпрограмм ! 0 - СИСТ 1 - ТС12406 2 MPC
logical :: check_message = .false. ! останов если сообщение не соответсвует формату
logical :: is_sys_message ! признак сообщения соответстувующего ADASPLive! v.1.0
real(8), allocatable :: orbits(:,:) ! массив параметров каталожных орбит adaps
real(8), allocatable :: orbits_list(:,:) ! массив параметров динамических орбит adaps
real(8), allocatable :: dext(:,:) ! массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...)
real(8), allocatable :: nipinfo(:,:) ! массив c информацией об оптическом ИП
real(8), allocatable :: locinfo(:,:) ! информационный массив о радиолокационном ИП
real(8), allocatable :: detected_orbits(:,:) ! массив параметров временных орбит
real(8), allocatable :: detvc(:,:) ! массив параметров временных орбит в БД
real(8), allocatable :: meas(:,:) ! массив измерений ( строки переменной длины в зависимости от первого элемента
! в последней строке новое измерение
real(8), allocatable :: rloc(:,:) ! массив радиолокационных измерений
real(8), allocatable :: binds (:,:) ! массив с параметрами привязок - 12.06.2017
real(8), allocatable :: prm_history(:,:) ! массив истории изменения параметров ИП
integer(8), allocatable :: subset(:,:) ! массив отобранных измерений для cформированых временных орбит
! 1 - ID некоррелированной проводки
! 2 - номер временной орбиты которой может принадлежать проводка
! но пока недостаточно для уверенного обнаружения
real(8), dimension(10) :: binds_fill = (/99999.0D00,99999.0D00,99999.0D00,0.0D00,0.0D00,&
10.0D00,0.0D00,10.0D00,0.0D00,10.0D00/)
! разбираем входной поток
value => fson_parse('',INPUT_UNIT)
result => js_object(null())
is_sys_message = js_init_result(value,result,check_message)
init => value
if(is_sys_message) then
init => fson_value_get(value,'init')
endif
rs_obj => js_object(result,'result')
call fson_get(init,'track',track) ! ид провдки
call js_add(rs_obj,'track',track)
if(.not.associated(fson_value_get(init,'tm'))) then
! Дубликат проводки выходим
call fson_destroy(value) ! закончили разбор НУ
call js_add(rs_obj,'rc',0)
call fson_print(result)
call fson_destroy(result)
write(ERROR_UNIT,*) 'LOG: track:',track,' is duplicate...' ! Печать диагностики
call write_buildinfo()
stop
endif
call fson_get(init,'mstype',mstype) ! тип целевой проводки 0/1 - оптика/рлс
call fson_get(init,'tm',tm) ! время привязки проводки
call js_add(rs_obj,'tm',tm)
call get_alloc_matrix(fson_value_get(init,'binds'), BINDS_SIZE_,binds) ! информация о проводках 25.04.2017
call get_alloc_matrix(fson_value_get(init,'dext'), DEXT_SIZE_, dext) ! читаем массив dext
call get_alloc_matrix(fson_value_get(init,'orbits'), ORBIT_SIZE_,orbits) ! каталожные орбиты...
call get_alloc_matrix(fson_value_get(init,'orbits_list'),ORBIT_SIZE_,orbits_list) ! оптические орбиты...
call get_alloc_matrix(fson_value_get(init,'det_orbits'), DETVC_SIZE_,detvc) ! временные орбиты...
call get_alloc_matrix(fson_value_get(init,'det_trans'), SUBSET_SIZE_,subset) ! читаем массив соответсвия проводок временным орбитам
p => fson_value_get(init,'meas') ! измерения
if(associated(fson_value_get(p,'optical'))) call get_meas(fson_value_get(p,'optical'),ROPT_SIZE_,meas)
if(associated(fson_value_get(p,'rls'))) call get_meas(fson_value_get(p,'rls'), RLOC_SIZE_,rloc)
call get_nipinfo(init,nipinfo,locinfo) ! параметры ИП
p => fson_value_get(init,'prm_history') ! изменения параметров ИП
if(associated(p)) call get_alloc_matrix(p,HIST_SIZE_,prm_history)
call init_nkomap(init)
! use rdjson
! пример nko = getnko(int(orbits(1,1)))
call fson_destroy(value) ! закончили разбор НУ
if(size(detvc,1).gt.0) then
allocate(detected_orbits(size(detvc,1),ORBIT_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate detected_orbits array'
detected_orbits = 0.0D00
do i = lbound(detvc,1),ubound(detvc,1)
do j = lbound(detvc,2),ubound(detvc,2)
select case(j)
case (1:10)
detected_orbits(i, j) = detvc(i,j)
case (11)
detected_orbits(i,20) = detvc(i,j)
case (12)
detected_orbits(i,23) = detvc(i,j)
endselect
enddo
enddo
endif
! Обеспечение совместимости
do i=1,size(binds,1)
if(isnan(binds(i,35))) binds(i,35:44) = binds_fill
enddo
!#ifdef DEBUG
write(ERROR_UNIT,*) "detection : nc_detectnew ..."
!#endif
!call nc_newdetection(track,mstype,meas, rloc,binds, dext, nipinfo, locinfo,subset, detected_orbits, new_orbit, RC, rs_obj)
call nc_detectnew(track,mstype,meas, rloc,binds, dext, nipinfo, locinfo,prm_history, subset, detected_orbits, new_orbit, RC, rs_obj)
!#ifdef DEBUG
write(ERROR_UNIT,*) "detection : nc_detectnew ... done : RC=",RC
!#endif
! если RC >0 создана временная орбита с использованием проводок, перечисленных в массиве соответствия newsub
!--------------------------------------------------------------------------------------------------------------------
! Код возврата
! 0 - ничего не делать
! 1 - есть подозрительные орбиты не достаточные для уверенного обнаружения
! обновить орбиты и привязки к временным объектам
! 3 - обнаружен новый объект
! завести новый объект
! приклеить к нему проводки
! удалить информацию о некоррелированных проводках образовавших орбиту нового объекта из
! массива некоррелированных проводок
!--------------------------------------------------------------------------------------------------------------------
! выводим в стандартный поток stdout полученные параметры орбиты
!--------------------------------------------------------------------------------------------------------------------
! В случае выполнения программы детектирования с ошибкой
! присваеивается код RC=0 (НИЧЕГО НЕ ДЕЛАТЬ)
if(RC.lt.0) RC=0
call js_add(rs_obj,'rc',RC)
select case(RC)
case (1)
COMMAND = 1
CODEestimation = 0
CODEbind=0
write(ERROR_UNIT,*) 'LOG: NEW ORBIT ARE FINDED RC=',RC
case default
write(ERROR_UNIT,*) 'LOG: track=',track,' tm=',tm
write(ERROR_UNIT,*) 'LOG: n_dext=',size(dext,1)
write(ERROR_UNIT,*) 'LOG: n_meas=',size(meas,1)
write(ERROR_UNIT,*) 'LOG: n_orbits_list=',size(orbits_list,1)
write(ERROR_UNIT,*) 'LOG: n_orbits=',size(orbits,1)
write(ERROR_UNIT,*) 'LOG: n_bind=',size(binds,1)
write(ERROR_UNIT,*) 'LOG: exit_code=',RC
COMMAND = 0
CODEestimation = 0
CODEbind = 0
endselect
!--------------------------------------------------------------------------------------------------------------------
! запись привязок
!--------------------------------------------------------------------------------------------------------------------
TASK = 4
array => js_array(rs_obj,'binds')
do i = 1, size(binds,1)
if(int(binds(i,1),8).ne.track) cycle
p => js_array(array)
call js_add(p,value=int(binds(i,1),8)) ! ID проводки
call js_add(p,value=int(binds(i,2))) ! НКО привязанного объекта
call js_add(p,value=int(binds(i,3))) ! Номер сета в сеансе
call js_add(p,value=int(binds(i,4))) ! Количество измерений в проводке
call js_add(p,value=int(binds(i,5))) ! Количество номинальных измерений в проводке
call js_add(p,value=binds(i,6)) ! Значение функционала
call js_add(p,value=binds(i,7)) ! Средняя угловая ошибка вдоль орбиты
call js_add(p,value=binds(i,8)) ! Средняя угловая поперек орбиты
call js_add(p,value=binds(i,9)) ! СКО оценки измерений
call js_add(p,value=int(binds(i,10))) ! Тип сглаживающего полинома
call js_add(p,binds(i,11:16)) ! Коэффициенты полиномов
call js_add(p,value=binds(i,17)) ! Время задания сглаженного значения измерений
call js_add(p,value=binds(i,18)) ! Время сглаженного значения RA
call js_add(p,value=binds(i,19)) ! Время сглаженного значения DEC
call js_add(p,int(binds(i,20:27))) ! НКО подозрительного объекта
call js_add(p,value=int(binds(i,28))) ! Индикатор обработки проводки
call js_add(p,value=int(binds(i,29))) ! НКО подозрительного объекта
call js_add(p,value=int(binds(i,30))) ! индикатор наличия аномальной засечки в проводке
call js_add(p,value=TASK) ! номер задачии инициализировавшей изменение в проводке
call js_add(p,value=COMMAND) ! код операции, инициализирующей изменение в проводке
call js_add(p,value=CODEestimation) ! код состояния оценки, которая соответствует проводке
call js_add(p,value=CODEbind) ! код состояния привязки
call js_add(p,value=binds(i,35)) ! Значение функционала (запоминаем)
call js_add(p,value=binds(i,36)) ! Средняя угловая ошибка вдоль орбиты (запоминаем)
call js_add(p,value=binds(i,37)) ! Средняя угловая поперек орбиты (запоминаем)
call js_add(p,value=int(binds(i,38))) ! Индикатор завершения проверки гипотез
call js_add(p,value=binds(i,39)) ! МО временной ошибки (запоминаем)
call js_add(p,value=binds(i,40)) ! СКО временной ошибки (запоминаем)
call js_add(p,value=binds(i,41)) ! Ошибка измерения вдоль орбиты
call js_add(p,value=binds(i,42)) ! СКО Ошибки измерения вдоль орбиты
call js_add(p,value=binds(i,43)) ! Ошибка измерения поперек орбиты
call js_add(p,value=binds(i,44)) ! СКО Ошибки измерения поперек орбиты
enddo
! ----------------------------------------------------------------------------------------------------------------------
! освобождаем память
! ----------------------------------------------------------------------------------------------------------------------
if(allocated(orbits)) deallocate(orbits)
if(allocated(orbits_list)) deallocate(orbits_list)
if(allocated(detected_orbits)) deallocate(detected_orbits)
if(allocated(detvc)) deallocate(detvc)
if(allocated(dext)) deallocate(dext)
if(allocated(meas)) deallocate(meas)
if(allocated(subset)) deallocate(subset)
if(allocated(nipinfo)) deallocate(nipinfo)
if(allocated(locinfo)) deallocate(locinfo)
if(allocated(prm_history)) deallocate(prm_history)
if(allocated(binds)) deallocate(binds)
! ----------------------------------------------------------------------------------------------------------------------
! выводим результат
! ----------------------------------------------------------------------------------------------------------------------
call fson_print(result)
call fson_destroy(result)
call write_buildinfo()
end program detection
\ No newline at end of file
MAIN=detection
include ../makefile.inc
\ No newline at end of file
!>
!> @file detectionduplet.f95
!> @date Jul 21 2020
!>
!> @brief Программа определения первоначальной орбиты по двум непривязанным проводкам
!> @details Программа анализирует пару непривязанных проводок на предмет построения
!> первоначальной орбиты, которая обеспечивает минимальное значение выбранного функционала.
!> объекта.
!>
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON
!> @param [out] - результаты работы передаются через стандартный файл OUTPUT_UNIT в формате JSON
!>
!> { "init": {
!> > "track": track, -- уникальный номер проводки;
!!
!> > "mstype": mstype, -- тип целевой проводки;
!!
!> > "ttm": ttm, -- время проведения измерения;
!!
!> > "nipinfo":{ -- информация об измерительных пунктах;
!!
!> > "optical":[список X1], -- информация об оптических измерительных пунктах;
!!
!> > "rls":[список X2], -- информация о радиолокационооых измерительных пунктах;
!!
!> > },
!!
!> > "meas": { -- измерительная информация;
!!
!> > "optical": [ список X3 ], -- массив оптических измерений;
!!
!> > "rls": [ список X4 ], -- массив радиолокационных измерений;
!!
!> > },
!!
!> > "orbits":[ список X5 ], -- актуальный список орбит, каждая строка 60 элементов( расширенный фазовый вектор);
!!
!> > "orbits_list":[ список X6 ], -- актуальный список орбит, сформированный на основе обработки оптической информации;
!!
!> > "detected_orbits":[ список X7 ], -- список орбит на обнаружении;
!!
!> > "prm_history":[ список X8 ], -- протокол изменений точности измеряемых параметров;
!!
!> > "dext":[ список X9 ], -- массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...);
!!
!> > "detected_trans":[ список X10 ], -- массив соответствия проводок временным орбитах;
!!
!> > "binds":[список X11] -- информационный массив о проводках, включенных в выборку,
!!
!> }}
!!
!> где
!!
!> "track" - уникальный номер проводки;
!!
!> "mstype" - тип целевой проводки;
!!
!> "ttm" - время проведения измерения;
!!
!> 1) Список X1 - представляет собой масссив с информациенй об ИП.
!>
!> NIPINFO(NIPINFO_SIZE_) - массив c общей информацией о НИП:
!>
!> - 1 - ID измерительного пункта;
!> - 2 - декартовы координаты ИП в WGS-84 (координата X);
!> - 3 - декартовы координаты ИП в WGS-84 (координата Y);
!> - 4 - декартовы координаты ИП в WGS-84 (координата Z);
!> - 5 - учет аберрации на пункте ( 0 - не учитывается, 1 - учиттывается );
!> - 6 - СКО астрометрической ошибки, arcsec;
!> - 7 - СКО случайной составляющей ошибки измерения времени, sec;
!> - 8 - МО систематической ошибки измерения времени кадра, sec;
!> - 9 - Количество оптических каналов, шт;
!> - 10 - номер телеграммы;
!>
!> где NIPINFO_SIZE_=10
!>
!> 2) Список X2 - представляет собой масссив с информациенй об ИП.
!>
!> LOCINFO(NRNIP,LOCINFO_SIZE_) - массив c общей информацией о радиолокационном ИП
!>
!> - 1 - ID измерительного пункта;
!> - 2 - декартовы координаты ИП в WGS-84 (координата X);
!> - 3 - декартовы координаты ИП в WGS-84 (координата Y);
!> - 4 - декартовы координаты ИП в WGS-84 (координата Z);
!> - 5 - учет рефракции на пункте (0 - не учитывается; 1 - учиттывается);
!> - 6 - СКО случайной ошибки измерения угловых параметров, arcsec;
!> - 7 - СКО случайной составляющей ошибки измерения времени, sec;
!> - 8 - МО систематической ошибки измерения времени кадра, sec;
!> - 9 - СКО случайной ошибки измерения дальности, км;
!> - 10 - МО систематической ошибки измерения дальности, км;
!> - 11 - СКО случайной ошибки измерения скорости дальности, км/c;
!> - 12 - азимут направления нормали антены радиолокатора в топоцентрической СК, град;
!> - 13 - угол места направления нормали антены радиолокатора в топоцентрической СК, град;
!> - 14 - номер телеграммы;
!>
!> где LOCINFO_SIZE_=14
!>
!> 3) Список X3 - представляет собой масссив с измерительной оптической информациенй.
!!
!> Массив в формате json для NZAS оптических измерений:
!>
!> "meas" : [[ROPT(1,1),ROPT(1,2),...,ROPT(1,ROPT_SIZE_)],
!!
!> > [ROPT(2,1),ROPT(2,2),...,ROPT(2,ROPT_SIZE_)], ...
!!
!> > [ROPT(NZAS,1),ROPT(NZAS,2),...,ROPT(NZAS,ROPT_SIZE_)]]
!>
!> ROPT(NZAS,ROPT_SIZE_) - массив сеанса оптических измерений:
!>
!> - 1 - Номер присвоенный проводке в комплексе
!> - 2 - Номер ИП
!> - 3 - MJD измерения; JD
!> - 4 - угол прямого восхождения в J2000 в часах, h
!> - 5 - угол склонения в J2000 в градусах, град
!> - 6 - СКО астрометрической ошибки склонения, arcsec;
!> - 7 - СКО астрометрической ошибки прямого восхождения, arcsec/15;
!> - 8 - Блеск, mag;
!> - 9 - индикатор наличия аномальных измерений:
!> * ?X - данные после предварительной обработки (rsident);
!> * 0 - изерение нормальное;
!> * 1 - измерение аномальное;
!> * 2 - среднее СКО измерений в проводке не соответствует заявленным;
!> * 3 - недостаточное количество измерений;
!> * 4 - интервал проводки слишком большой;
!> ( предположение об апроксимации полиномом 2-го пор неверно);
!> * X? - данные после решения задачи оценивания;
!> * 0? - оценка отсутствует;
!> * 1? - измерение нормальное;
!> * 2? - измерение аномальное.
!!
!> - 10 - (*) СКО шумовой составляющей ошибки измерений по RA (оценка ско измерений с единичным весом), arcsec
!> - 11 - (*) СКО шумовой составляющей ошибки измерений по DEC (оценка ско измерений с единичным весом), arcsec
!> - 12 - (*) невязки относительно сглаживающего полинома по RA, arcsec;
!> - 13 - (*) невязки относительно сглаживающего полинома по DEC, arcsec;
!> - 14 - (#) транверсальные невязки относительно полученной оценки орбиты, arcsec;
!> - 15 - (#) нормальные невязки относительно полученной оценки орбиты, arcsec;
!> - 16 - (#) СКО шумовой составляющей трансверсальной ошибки измерений, arcsec;
!> - 17 - (#) СКО шумовой составляющей нормальной ошибки измерений, arcsec;
!> - 18 - (#) временная интерпретация трансверсальных невязок, sec;
!> - 19 - (#) МО временной ошибки измерений, sec;
!> - 20 - (#) СКО временной ошибки измерений, sec;
!> - 21 - (*) Угол места в топоцентрической системе координат, рад;
!> - 22 - (*) Азимут в топоцентрической системе координат, рад.
!>
!> Примечание: СКО шумовой составляющей, которая характерна для всей проводки вцелом и
!> имеет одно и то же значение для всей проводки,
!> вынесена в эту таблицу из-за использования механизма прореживания
!> (*) - результат задачи идентификации
!> (#) - результат задачи оценивания
!>
!> 4) Список X4 - представляет собой масссив с измерительной радиолокационной информацией.
!!
!> Массив в формате json для NZAS радиолокационных измерений:
!> "rloc" : [[RLOC(1,1),RLOC(1,2),...,RLOC(1,RLOC_SIZE_)],
!!
!> > [RLOC(2,1),RLOC(2,2),...,RLOC(2,RLOC_SIZE_)], ...
!!
!> > [RLOC(NZAS,1),RLOC(NZAS,2),...,RLOC(NZAS,RLOC_SIZE_)]]
!>
!> RLOC(NZAS,RLOC_SIZE_) - массив сеанса радиолокационных измерений:
!>
!> - 1 - Номер присвоенный проводке в комплексе
!> - 2 - Номер ИП
!> - 3 - MJD измерения JD
!> - 4 - антенный азимут рад
!> - 5 - антенный угол места рад
!> - 6 - наклонная дальность км
!> - 7 - скорость изменения наклонной дальности км/сек
!> - 8 - Амплитуда сигнала относительные единицы
!> - 9 - индикатор наличия аномальных измерений
!> * ?X - данные после предварительной обработки (rsident)
!> * 0 - измерение нормальное
!> * 1 - измерение аномальное
!> * 2 - среднее СКО измерений в проводке не соответствует заявленным
!> * 3 - недостаточное количество измерений
!> * 4 - интервал проводки слишком большой
!> ( предположение об апроксимации полиномом 2-го пор неверно)
!> * X? - данные после решения задачи оценивания
!> * 0? - оценка отсутствует
!> * 1? - измерение нормальное
!> * 2? - измерение аномальное
!>
!> - 10 - (*) СКО шумовой составляющей ошибки измерений по азимуту (оценка ско измерений с единичным весом) arcsec
!> - 11 - (*) СКО шумовой составляющей ошибки измерений по углу места (оценка ско измерений с единичным весом) arcsec
!> - 12 - (*) невязки относительно сглаживающего полинома по азимуту arcsec
!> - 13 - (*) невязки относительно сглаживающего полинома по углу места arcsec
!> - 14 - (#) транверсальные невязки относительно полученной оценки орбиты arcsec
!> - 15 - (#) невязки относительно полученной оценки орбиты вдоль нормали к плоскости орбиты arcsec
!> - 16 - (#) СКО шумовой составляющей ошибки измерений вдоль трансверсали arcsec
!> - 17 - (#) СКО шумовой составляющей ошибки измерений вдоль нормали к плоскости орбиты arcsec
!> - 18 - (#) временная интерпретация трансверсальных невязок sec
!> - 19 - (#) МО временной ошибки измерений sec
!> - 20 - (#) СКО временной ошибки измерений sec
!> - 21 - (*) Угол места в топоцентрической системе координат рад
!> - 22 - (*) Азимут в топоцентрической системе координат рад
!> - 23 - Несущая частота кГц
!> - 24 - (*) СКО шумовой составляющей ошибки измерений наклонной дальности (оценка ско измерений с единичным весом) км
!> - 25 - (*) СКО шумовой составляющей ошибки измерений скорости изменения (оценка ско измерений с единичным весом) км/сек
!> - 26 - (*) невязки относительно сглаживающего полинома по наклонной дальности км
!> - 27 - (*) невязки относительно сглаживающего полинома по скорости изменения наклонной дальности км
!> - 28 - (#) радиальные невязки относительно полученной оценки орбиты км
!> - 29 - (#) невязки скорости изменения дальности в радиальном направлении относительно полученной оценки орбиты км/сек
!> - 30 - (#) СКО шумовой составляющей ошибки измерений дальности в радиальном направлении км
!> - 31 - (#) СКО шумовой составляющей ошибки измерений скорости изменнения дальности в радиальном направлении км/сек
!> - 32 - Межрупорный коэффициент корреляции (по необходимости) -
!>
!> Примечание: СКО шумовой составляющей, которая характерна для всей проводки вцелом и
!> имеет одно и то же значение для всей проводки,
!> вынесена в эту таблицу из-за использования механизма прореживания
!> (*) - результат задачи идентификации
!> (#) - результат задачи оценивания
!>
!> 5) список X5 представляет собой динамический список орбит актуального каталога КО:
!>
!> Массив в формате json для N космических объектов:
!>
!> "orbits" : [[D_CAT(1,1),D_CAT(1,2),...,D_CAT(1,ORBIT_SIZE_)],
!!
!> > [D_CAT(2,1),D_CAT(2,2),...,D_CAT(2,ORBIT_SIZE_)], ...
!!
!> > [D_CAT(N,1),D_CAT(N,2),...,D_CAT(N,ORBITT_SIZE_)]]
!>
!> D_CAT(NDCAT,ORBIT_SIZE_) - массив c информацией о КО:
!>
!> - 1 - NKO;
!> - 2 - MJD каталога;
!> - 3-5 - координаты X,Y,Z в СК J2000;
!> - 6-8 - скорости по X,Y,Z в СК J2000;
!> - 9 - коэффициент светового давления k*S/m;
!> - 10 - баллистический коэффициент Сx*S/2m;
!> - 11-13 - СКО координат X,Y,Z в СК J2000;
!> - 14-16 - СКО скоростей по X,Y,Z в СК J2000;
!> - 17 - СКО коэффициента светового давления;
!> - 18 - СКО баллистического коэффициента;
!> - 19 - отношение площади к массе;
!> - 20 - усредненное значение ОПМ м**2/кг;
!> - 21 - коэффициент отражения;
!> - 22 - коэффициент лобового сопротивления;
!> - 23 - блеск;
!> - 24 - СКО блеска;
!> - 25 - признак маневрирования;
!> - 26 - признак важности;
!> - 27 - счетчик обработанных пакетов измерений;
!> - 28 - интервал корреляции;
!> - 29 - ID проводки, которой соответствует оценка вектора состояния;
!> - 30-57 - элементы ковариационной матрицы;
!> где
!> - 30-44 верхний треугольник:
!> (1,2),(1,3),(1,4),(1,5),(1,6)
!> (2,3),(2,4),(2,5),(2,6)
!> (3,4),(3,5),(3,6)
!> (4,5),(4,6)
!> (5,6);
!>
!> - 45-56 (1,7),(1,8)
!> (2,7),(2,8)
!> (3,7),(3,8)
!> (4,7),(4,8)
!> (5,7),(5,8)
!> (6,7),(6,8);
!>
!> - 57 (7,8);
!>
!> - 58 - дисперсия измерения с единичным весом пакета участвовавшем в уточнениии
!> в случае типа орбиты 9 поле содержит интервал прогнозирования
!> от первой родительской орбиты того же типа, который указан в поле 59;
!> - 59 - информационно-управляющее поле для орбит актуального каталога:
!> указание на тип орбиты, которая явилась родительской по отношению к
!> сформированной актуальной;
!> тип соответствует нумерации орбит для поля 60
!>
!> для орбит сформированных по оптике (индекс списка орбит равен 3) :
!> * 0 - требуется подтверждение орбиты;
!> * 1 - орбита подтверждена по внешнему каталогу ЗНХ;
!> * 2 - орбита подтверждена по внешнему каталогу KK ВВС США;
!> * 3 - орбита подтверждена по обоим внешним каталогам;
!> * 4 - орбита подтверждена по оптическим измерениям с двух НИП или двух ночей;
!> * 5 - орбита подтверждена по внешнему каталогу ЗНХ и по оптическим измерениям;
!> * 6 - орбита подтверждена по внешнему каталогу TLE и по оптическим измерениям;
!> * 7 - орбита подтверждена по внешним каталогам и по оптическим измерениям;
!> * 8 - орбита с хорошими точностными характеристиками, полученными в результате решения задачи оценвания;
!> * XXX? - признак маневра:
!> В случае когда индекс динамического списк орбит равен 4;
!> + 0 - обычная орбита;
!> + 1 - опорная орбита;
!> + 2 - орбита в момент начала маневра;
!> + 3 - орбита в момент окончания маневра;
!>
!> - 60 - индекс динамического списка орбит:
!> 1. - массив с описанием орбиты сформирован по каталогу ЗНХ (z);
!> 2. - согласованные на выбранном интервале орбиты сформированые по каталогу КК ВВС США (u);
!> 3. - действующие орбиты сформированные по оптике (^ o);
!> 4. - сглаженные орбиты подготовленные для ведения внутреннего каталога (f);
!> 5. - некоррелированные орбиты (d);
!> 6. - массив с описанием орбиты сформирован по альманаху (G);
!> 7. - массив с описанием орбиты сформирован по оригинальному tle (t);
!> 8. - резерв;
!> 9. - орбита актуального каталога (a) ;
!>
!> где ORBIT_SIZE_=60.
!>
!> 6) список X6 представляет собой динамический список орбит КО построенных по оптической информации:
!>
!> Массив в формате json для NPCAT космических объектов:
!>
!> "orbit_list" : [[L_CAT(1,1),L_CAT(1,2),...,L_CAT(1,ORBIT_SIZE_)],
!!
!> > [L_CAT(2,1),L_CAT(2,2),...,L_CAT(2,ORBIT_SIZE_)], ...
!!
!> > [L_CAT(NPCAT,1),L_CAT(NPCAT,2),...,L_CAT(NPCAT,ORBITT_SIZE_)]]
!>
!> L_CAT(NPCAT,ORBIT_SIZE_) - массив c информацией о КО имеет структуру, представленную в п. 5
!>
!>
!> 7) список X7 представляет список орбит, находящихся на обнаружении;
!>
!> Массив в формате json для NUCAT космических объектов:
!>
!> "orbdetected" : [[ORBDETECTED(1,1),ORBDETECTED(1,2),...,ORBDETECTED(1,ORBIT_SIZE_)],
!!
!> > [ORBDETECTED(2,1),ORBDETECTED(2,2),...,ORBDETECTED(2,ORBIT_SIZE_)], ...
!!
!> > [ORBDETECTED(NUCAT,1),ORBDETECTED(NUCAT,2),...,ORBDETECTED(NUCAT,ORBITT_SIZE_)]]
!>
!> ORBDETECTED(NUCAT,ORBIT_SIZE_) - массив c информацией о КО имеет структуру, представленную в п. 5
!>
!> 8) список X8 представляет собой массив, содержащий протокол изменений точности измеряемых параметров;
!>
!> "prm_history" : [[HIST(1,1),HIST(1,2),...,HIST(1,HIST_SIZE_)],
!!
!> > [HIST(2,1),HIST(2,2),...,HIST(2,HIST_SIZE_)], ...
!!
!> > [HIST(NHIST,1),HIST(NHIST,2),...,HIST(NHIST,HIST_SIZE_)]]
!>
!> HIST(NHIST,HIST_SIZE_) R*8 - массив c информацией о смене характеритик точности ИП
!>
!> - 1 - ID измерительного пункта
!> - 2 - ID измеряемого параметра
!> - 3 - TT(MJD) дата изменения параметра
!> - 4 - новое значение измеряемого параметра
!>
!> где HIST_SIZE_ = 4
!>
!> 9) список X9 представляет собой информационный массив с параметрами вращения Земли и данными о космической погоде
!> для N суток;
!>
!> "dext" : [[D_EXT(1,1),D_EXT(1,2),...,D_EXT(1,DEXT_SIZE_)],
!>
!> >>> [D_EXT(2,1),D_EXT(2,2),...,D_EXT(2,DEXT_SIZE_)], ...
!>
!> >>> [D_EXT(N,1),D_EXT(N,2),...,D_EXT(N,DEXT_SIZE_)]]
!>
!> D_EXT(NDEXT,DEXT_SIZE_) - массив с параметрами вращения Земли и данными о космической погоде:
!>
!> - 1 - MJD, чтобы получить JD надо прибавить 2400000,5;
!> - 2 - Xp, (as) ;
!> - 3 - Yp (as);
!> - 4 - UT1-UTC, (s);
!> - 5 - dX, (mas);
!> - 6 - dY, (mas);
!> - 7 - delta AT, (s) ;
!> - 8 - F10.7 индекс равный плотности потока на длине волны 10.7;
!> - 9 - F81 среднее взвешенное значение индекса F10.7 за 81 день;
!> - 10 - Kp квазилогарифмический коэффициент.
!>
!> где DEXT_SIZE_=10;
!>
!> При расчете F0 (75,100,125,150,175,200,250) берется ближайшее к значению F81.
!>
!> 10) список X10 представляет собой информационный массив утанавливающий ооответствие выборки
!> ID непривязанных проводок к вычисленной орбите, по результатам обработки которых она
!> получена;
!>
!> "detected_trans" : [[SUBSET(1,1),SUBSET(1,2)],
!!
!> > [SUBSET(2,1),SUBSET(2,2)], ... ,
!!
!> > [SUBSET(NSUBS,1),SUBSET(NSUBS,2)]]
!>
!> SUBSET(NTRAN,2) I*8 - выборка из массива данных содержащая привязку ранее обработанных
!> измерений к временным объектам
!> (одной проводке может принадлежать несколько временных орбит?)...продумать
!>
!> - 1 - ID проводки
!> - 2 - ID привязанной к ней временная орбита
!>
!>
!> 11) список X11 представляет собой информационный массив о проводках:
!>
!> Массив содержащий результат работы программы привязки.
!> Он заполняется в два этапа (candidates, binding).
!>
!> Массив в формате json для NBINDS проводок:
!> "binds" : [[BINDS(1,1),BINDS(1,2),...,BINDS(1,BINDS_SIZE_)],
!!
!> >>> [BINDS(2,1),BINDS(2,2),...,BINDS(2,BINDS_SIZE_)], ...
!!
!> >>> [BINDS(NBINDS,1),BINDS(NBINDS,2),...,BINDS(NBINDS,BINDS_SIZE_)]]
!>
!> BINDS(NPRV,BINDS_SIZE_) - массив с результатами привязки
!>
!> - 1. - (*) Номер присвоенный проводке в комплексе
!> - 2. - Номер объекта NKO присвоенный выбранной проводке
!> - 3. - (*) Номер сета(набор кадров с одинаковыми моментами времени) Этот номер присваивается
!> при первоначальной обработке сеанса.
!> - 4. - (*) Количество измерений в проводке
!> - 5. - (*) количество измерений в проводке признанных номинальными
!> - 6. - значение функционала
!> - 7. - средняя угловая ошибка вдоль орбиты
!> - 8. - средняя угловая ошибка по нормали к орбите
!> - 9. - СКО оценки измерений (номинал или верхний предел для формирования весовой матрицы)
!> - 10. - (*) тип сглаживающего полинома
!> - 0 - нет данных
!> - 1 - алгебраический полином 1-й степени (линейный)
!> - 2 - алгебраический полином 2-й степени (квадратичный)
!> - 3 - полином Чебышёва 2-й степени
!> - 11. - (*) коэффициент при нулевой степени (свободный член) аппроксимирующего полинома по RA
!> - 12. - (*) коэффициент при первой степени аппроксимирующего полинома по RA
!> - 13. - (*) коэффициент при второй степени аппроксимирующего полинома по RA
!> - 14. - (*) коэффициент при нулевой степени (свободный член) аппроксимирующего полинома по DEC
!> - 15. - (*) коэффициент при первой степени аппроксимирующего полинома по DEC
!> - 16. - (*) коэффициент при второй степени аппроксимирующего полинома по DEC
!> - 17. - (*) время задания сглаженных значений отнесенных на середину интервала TT
!> - 18. - (*) сглаженное значение RA
!> - 19. - (*) сглаженное значение DEC
!> - 20-25. - номера объектов-кандидатов по критерию близости спрогнозируемых измерений
!> - 26,27. - номер объектов-кандидатов по критерию близости спрогнозированных измерений объектов имеющих TLE
!> - 28. - Индикатор обработки проводки (код состояния оценки)
!> - 0 - проводка не обработана
!> - 1 - проводка обработана (требуется подтверждение)
!> - 2 - проводка обработана (достоверность подтверждена)
!> - 3 - проводка забракована
!> - 29. - НКО подозрительного объекта
!> - 30. - Индикатор наличия аномальной засечки в проводке
!> - 31. - номер задачи, инициализирующей изменение в массиве описания проводки
!> - 0 - seance
!> - 1 - identification
!> - 2 - qorbits
!> - 3 - fineorbits
!> - 4 - detection
!> - 32. - код операции, инициализирующей изменение в массиве описания проводки
!> - 0 - ничего не делать
!> - 1 - записать
!> - 2 - перепривязать
!> - 3 - анулировать
!> - 4 - записать вектора с маневром
!> - 33. - код состояния привязки к объекту динамического списка орбит
!> - 0 - проводка не привязана
!> - 1 - проводка привязана автоматически
!> - 2 - выполнена ручная привязка
!> - 3 - проводка была отвязана
!> - 4 - была выполнена перепривязка
!> - 5 - выполняется проверка гипотез
!> - -1 - проводка забракована
!> Этим кодам соответствуют символьные коды:
!> * " " - проводку следует обработать
!> * "+" - проводка была привязана
!> * "m" - ручная привязка требуется сохранить привязку при любом исходе решения задачи
!> * "-" - проводка была отвязана
!> * "<" - была выполнена альтернативная привязка
!> * "?" - выполняется проверка гипотез
!> * "A" - проводка забракована
!> - 34. - статус проводки (разрешение на запуск перепривязки)
!> - 0 - не обработана (следует запускать анализ перепривязки)
!> - 1 - обработана (перепривязку запускать не следует)
!> - 35. - значение функционала для объекта при первоначальной идентификации
!> - 36. - средняя угловая ошибка вдоль орбиты для объекта при первоначальной идентификации
!> - 37. - средняя угловая ошибка по нормали к орбите для объекта при первоначальной идентификации
!> - 38. - индикатор завершения перебора гипотез
!> - 39. - МО вычисленной средней ошибки по времени для эталонного объекта
!> - 40. - СКО вычисленной средней ошибки по времени для эталонного объекта
!> - 41. - МО вычисленной средней ошибки вдоль орбиты
!> - 42. - СКО вычисленной средней ошибки вдоль орбиты
!> - 43. - МО вычисленной средней ошибки поперек орбиты
!> - 44. - СКО вычисленной средней ошибки поперек орбиты
!>
!> Описание результата файла stdout:
!>
!> Файл в формате JSON представляет собой результат работы программы идентификации,
!> представленных в виде списка. Его состав формируется в зависимости от заданных НУ.
!>
!> { "id":"ADAPSLive! v.1.0",
!> "result": {
!>
!> "track": track, -- уникальный номер проводки;
!>
!> "ttm": ttm, -- время проведения измерения;
!>
!> "binds": [ [...], [...] , ... , [...] ],
!>
!> "detected_trans": [ ... ],
!>
!> "orbdetected": [ ... ],
!>
!> "add" : { "subset" : [ [ ID проводки, ID орбиты ], ... , [ ... ] ],
!>
!> "orbits" : [ { "o":[ список X12], "x": [список X13] } ,
!>
!> . . .
!>
!> { "o":[ список X12], "x": [список X13] } ] ,
!>
!> "del" : { "subset" : [ [ ID проводки, ID орбиты ], ... , [ ... ] ],
!>
!> "orbits" : [ список X14 ] },
!>
!> "rc": rc -- код возврата
!>
!> } }
!>
!> Описание результата файла stdout
!> Описание результата файла stderr - отладочная информация
!>
#define __MODULE_VERSION__ '3.9.1'
#define DEBUG
program detectionduplet
! необходимые модули для разбора входящего потока
use fson
use fson_value_m
use rdjson
use wrjson
use library_m
use const_m
implicit none
type(fson_value), pointer :: init,value,bat ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: result,rs_arr,rs_obj,p ! рабочие указатели на элементы выходного потока соответственно корень, массив, строка, элемент
real(8) :: new_orbit(ORBIT_SIZE_) ! вектор параметров уточненной орбиты
integer(8) :: track ! уникальный идетификатор измерения
character(len=26) :: tm ! календарное дата и время проводки
integer :: i,n,n_bat = 0 ! рабочие переменные для инксов циклов
integer :: NKOA,NKOB ! ID номера НКО, участвующие в расчете дуплета
integer :: mstype ! тип обрабатываемой проводки 0/1 - оптика/рлс
! 0 - проводка не привязана
! 1 - проводка привязана автоматически
! 2 - выполнена ручная привязка
! 3 - проводка была отвязана
! 4 - была выполнена перепривязка
! 5 - выполняется проверка гипотез
! -1 - проводка забракована
! Этим кодам соответствуют символьные коды:
! " " - проводку следует обработать
! "+" - проводка была привязана
! "m" - ручная привязка требуется сохранить привязку при любом исходе решения задачи
! "-" - проводка была отвязана
! "<" - была выполнена альтернативная привязка
! "?" - выполняется проверка гипотез
! "A" - проводка забракована
integer :: RC ! код возврата
logical :: check_message = .false. ! останов если сообщение не соответсвует формату
logical :: is_sys_message ! признак сообщения соответстувующего ADASPLive! v.1.0
real(8), allocatable :: dext(:,:) ! массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...)
real(8), allocatable :: nipinfo(:,:) ! массив c информацией об оптическом ИП
real(8), allocatable :: locinfo(:,:) ! информационный массив о радиолокационном ИП
real(8), allocatable :: meas(:,:) ! массив измерений ( строки переменной длины в зависимости от первого элемента
! в последней строке новое измерение
real(8), allocatable :: rloc(:,:) ! массив радиолокационных измерений
real(8), allocatable :: binds (:,:) ! массив с параметрами привязок - 12.06.2017
real(8), allocatable :: prm_history(:,:) ! массив истории изменения параметров ИП
real(8), dimension(10) :: binds_fill = (/99999.0D00,99999.0D00,99999.0D00,0.0D00,0.0D00,&
10.0D00,0.0D00,10.0D00,0.0D00,10.0D00/)
#ifdef DEBUG
write(ERROR_UNIT,*) "LOG: detectionduplet ..."
#endif
! разбираем входной поток
value => fson_parse('',INPUT_UNIT)
result => js_object(null())
is_sys_message = js_init_result(value,result,check_message)
init => value
if(is_sys_message) then
init => fson_value_get(value,'init')
endif
rs_arr => js_array(result,'result')
! общие НУ
call get_alloc_matrix(fson_value_get(init,'dext'), DEXT_SIZE_, dext) ! читаем массив dext
! call init_nkomap(init) ! 02.08.2020
! проверяем наличие пачки пар
bat => fson_value_get(init,'pairs')
if(associated(bat)) n_bat = fson_value_count(bat)
!#ifdef DEBUG
write(ERROR_UNIT,*) "detectionduplet : n_bat:",n_bat
!#endif
do n = 1,n_bat
init => fson_value_get(bat,n)
rs_obj => js_object(rs_arr)
call fson_get(init,'track',track) ! ид провдки
call fson_get(init,'tm',tm) ! время привязки проводки
call fson_get(init,'mstype',mstype) ! тип целевой проводки 0/1 - оптика/рлс
p => fson_value_get(init,'binds') ! измерения
if( .not.associated(p).or.fson_value_count(p).lt.2 ) then
call js_add(rs_obj,'rc',0)
cycle
endif
call get_alloc_matrix(fson_value_get(init,'binds'),BINDS_SIZE_,binds) ! информация о проводках 25.04.2017
call get_nipinfo(init,nipinfo,locinfo)
p => fson_value_get(init,'meas') ! измерения
if(associated(fson_value_get(p,'optical'))) call get_meas(fson_value_get(p,'optical'),ROPT_SIZE_,meas)
if(associated(fson_value_get(p,'rls'))) call get_meas(fson_value_get(p,'rls'), RLOC_SIZE_,rloc)
p => fson_value_get(init,'prm_history')
if(associated(p)) call get_alloc_matrix(p,HIST_SIZE_,prm_history) ! история изменения параметров ИП
call js_add(rs_obj,'track',track)
call js_add(rs_obj,'tm',tm)
write(ERROR_UNIT,*) 'LOG: track:',track ! Печать диагностики и вполнение расчетов
! Обеспечение совместимости
do i=1,size(binds,1)
if(isnan(binds(i,6))) binds(i,6) = PENALTY
if(isnan(binds(i,35))) binds(i,35:44) = binds_fill
enddo
NKOA=int(binds(1,2))
NKOB=int(binds(2,2))
!#ifdef DEBUG
write(ERROR_UNIT,*)
write(ERROR_UNIT,*) "detectionduplet : pair:",int(binds(1,1)),int(binds(2,1))
write(ERROR_UNIT,*) "detectionduplet : NKOA:",int(binds(1,2))," NKOB:",int(binds(2,2))
!#endif
if(NKOA.gt.0.or.NKOB.gt.0) then
if(NKOA.gt.0) write(ERROR_UNIT,*) "detectionduplet : binded NKOA:",int(binds(1,2))
if(NKOB.gt.0) write(ERROR_UNIT,*) "detectionduplet : binded NKOB:",int(binds(2,2))
write(ERROR_UNIT,*) "detectionduplet : pair:",int(binds(1,1)),int(binds(2,1))," --> skipped"
RC=0 ! нет решения (ничего не делать)
else
!#ifdef DEBUG
write(ERROR_UNIT,*) "detectionduplet : nc_detectiontwobindorbit ..."
!#endif
call nc_detecttwobindorbit(track,mstype,meas, rloc,binds, dext, nipinfo, locinfo, prm_history,new_orbit, RC, rs_obj)
!#ifdef DEBUG
write(ERROR_UNIT,*) "detectionduplet : nc_detectiontwobindorbit ... done : RC=",RC
!#endif
endif
!--------------------------------------------------------------------------------------------------------------------
! Код возврата
! 0 - ничего не делать
! 1 - есть подозрительные орбиты не достаточные для уверенного обнаружения
! обновить орбиты и привязки к временным объектам
! 3 - обнаружен новый объект
! завести новый объект
! приклеить к нему проводки
! удалить информацию о некоррелированных проводках образовавших орбиту нового объекта из
! массива некоррелированных проводок
!--------------------------------------------------------------------------------------------------------------------
! выводим в стандартный поток stdout полученные параметры орбиты
!--------------------------------------------------------------------------------------------------------------------
call js_add(rs_obj,'rc',RC)
! ----------------------------------------------------------------------------------------------------------------------
! освобождаем память
! ----------------------------------------------------------------------------------------------------------------------
if(allocated(meas)) deallocate(meas)
if(allocated(rloc)) deallocate(rloc)
if(allocated(nipinfo)) deallocate(nipinfo)
if(allocated(locinfo)) deallocate(locinfo)
if(allocated(binds)) deallocate(binds)
enddo
if(allocated(dext)) deallocate(dext)
! ----------------------------------------------------------------------------------------------------------------------
! выводим результат
! ----------------------------------------------------------------------------------------------------------------------
call fson_destroy(value) ! закончили разбор НУ
call fson_print(result)
call fson_destroy(result)
call write_buildinfo()
end program detectionduplet
\ No newline at end of file
MAIN=detectionduplet
include ../makefile.inc
\ No newline at end of file
!>
!> @file detectionmanual.f95
!> @date Apr 12 2022
!>
!> @brief Программа оценки вектора состояния КО вновь обнаруженного объекта.
!> @details Программа анализирует выборку измерений, относящихся к одному объекту
!> новому физичскому объекту. Программа решает задачу первоначального определения
!> орбиты. В случает успешного построения первоначальной орбиты, программа решает
!> задачу поиска оценки вектора состояния КО, формирования его ковариационной
!> матрицы на момент последней засечки в заданной выборке измерений.
!>
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON
!> @param [out] - результаты работы передаются через стандартный файл OUTPUT_UNIT в формате JSON
!>
!> { "init": {
!> > "meas": { -- измерительная информация;
!!
!> > "optical": [ список X1 ], -- массив оптических измерений;
!!
!> > "rls": [ список X2 ], -- массив радиолокационных измерений;
!!
!> > },
!!
!> > "binds":[список X3] -- информационный массив о проводках, включенных в выборку,
!!
!> > "nipinfo":{ -- информация об измерительных пунктах;
!!
!> > "optical":[список X4], -- информация об оптических измерительных пунктах;
!!
!> > "rls":[список X5], -- информация о радиолокационооых измерительных пунктах;
!!
!> > },
!!
!> > "dext":[ список X6 ], -- массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...);
!!
!> > "prm_history":[ список X7 ], -- протокол изменений точности измеряемых параметров;
!!
!> }}
!!
!> где
!!
!> 1) Список X1 - представляет собой масссив с измерительной оптической информациенй.
!!
!> Массив в формате json для NZAS оптических измерений:
!>
!> "meas" : [[ROPT(1,1),ROPT(1,2),...,ROPT(1,ROPT_SIZE_)],
!!
!> > [ROPT(2,1),ROPT(2,2),...,ROPT(2,ROPT_SIZE_)], ...
!!
!> > [ROPT(NZAS,1),ROPT(NZAS,2),...,ROPT(NZAS,ROPT_SIZE_)]]
!>
!> ROPT(NZAS,ROPT_SIZE_) - массив сеанса оптических измерений:
!>
!> - 1 - Номер присвоенный проводке в комплексе
!> - 2 - Номер ИП
!> - 3 - MJD измерения; JD
!> - 4 - угол прямого восхождения в J2000 в часах, h
!> - 5 - угол склонения в J2000 в градусах, град
!> - 6 - СКО астрометрической ошибки склонения, arcsec;
!> - 7 - СКО астрометрической ошибки прямого восхождения, arcsec/15;
!> - 8 - Блеск, mag;
!> - 9 - индикатор наличия аномальных измерений:
!> * ?X - данные после предварительной обработки (rsident);
!> * 0 - изерение нормальное;
!> * 1 - измерение аномальное;
!> * 2 - среднее СКО измерений в проводке не соответствует заявленным;
!> * 3 - недостаточное количество измерений;
!> * 4 - интервал проводки слишком большой;
!> ( предположение об апроксимации полиномом 2-го пор неверно);
!> * X? - данные после решения задачи оценивания;
!> * 0? - оценка отсутствует;
!> * 1? - измерение нормальное;
!> * 2? - измерение аномальное.
!!
!> - 10 - (*) СКО шумовой составляющей ошибки измерений по RA
!> (оценка ско измерений с единичным весом), arcsec
!> - 11 - (*) СКО шумовой составляющей ошибки измерений по DEC
!> (оценка ско измерений с единичным весом), arcsec
!> - 12 - (*) невязки относительно сглаживающего полинома по RA, arcsec;
!> - 13 - (*) невязки относительно сглаживающего полинома по DEC, arcsec;
!> - 14 - (#) транверсальные невязки относительно полученной оценки орбиты, arcsec;
!> - 15 - (#) нормальные невязки относительно полученной оценки орбиты, arcsec;
!> - 16 - (#) СКО шумовой составляющей трансверсальной ошибки измерений, arcsec;
!> - 17 - (#) СКО шумовой составляющей нормальной ошибки измерений, arcsec;
!> - 18 - (#) временная интерпретация трансверсальных невязок, sec;
!> - 19 - (#) МО временной ошибки измерений, sec;
!> - 20 - (#) СКО временной ошибки измерений, sec;
!> - 21 - (*) Угол места в топоцентрической системе координат, рад;
!> - 22 - (*) Азимут в топоцентрической системе координат, рад.
!>
!> Примечание: СКО шумовой составляющей, которая характерна для всей проводки вцелом и
!> имеет одно и то же значение для всей проводки,
!> вынесена в эту таблицу из-за использования механизма прореживания
!> (*) - результат задачи идентификации
!> (#) - результат задачи оценивания
!>
!> 2) Список X2 - представляет собой масссив с измерительной радиолокационной информацией.
!!
!> Массив в формате json для NZAS радиолокационных измерений:
!> "rloc" : [[RLOC(1,1),RLOC(1,2),...,RLOC(1,RLOC_SIZE_)],
!!
!> > [RLOC(2,1),RLOC(2,2),...,RLOC(2,RLOC_SIZE_)], ...
!!
!> > [RLOC(NZAS,1),RLOC(NZAS,2),...,RLOC(NZAS,RLOC_SIZE_)]]
!>
!> RLOC(NZAS,RLOC_SIZE_) - массив сеанса радиолокационных измерений:
!>
!> - 1 - Номер присвоенный проводке в комплексе
!> - 2 - Номер ИП
!> - 3 - MJD измерения, JD
!> - 4 - антенный азимут, град
!> - 5 - антенный угол места, град
!> - 6 - наклонная дальность, км
!> - 7 - скорость изменения наклонной дальности, км/сек
!> - 8 - Амплитуда сигнала, относительные единицы
!> - 9 - индикатор наличия аномальных измерений
!> * ?X - данные после предварительной обработки (rsident)
!> * 0 - измерение нормальное
!> * 1 - измерение аномальное
!> * 2 - среднее СКО измерений в проводке не соответствует заявленным
!> * 3 - недостаточное количество измерений
!> * 4 - интервал проводки слишком большой
!> ( предположение об апроксимации полиномом 2-го пор неверно)
!> * X? - данные после решения задачи оценивания
!> * 0? - оценка отсутствует
!> * 1? - измерение нормальное
!> * 2? - измерение аномальное
!>
!> - 10 - (*) СКО шумовой составляющей ошибки измерений по азимуту
!> (оценка ско измерений с единичным весом), arcsec
!> - 11 - (*) СКО шумовой составляющей ошибки измерений по углу места
!> (оценка ско измерений с единичным весом), arcsec
!> - 12 - (*) невязки относительно сглаживающего полинома
!> по азимуту, arcsec
!> - 13 - (*) невязки относительно сглаживающего полинома
!> по углу места, arcsec
!> - 14 - (#) транверсальные невязки относительно полученной
!> оценки орбиты, arcsec
!> - 15 - (#) невязки относительно полученной оценки орбиты
!> вдоль нормали к плоскости орбиты, arcsec
!> - 16 - (#) СКО шумовой составляющей ошибки измерений
!> вдоль трансверсали, arcsec
!> - 17 - (#) СКО шумовой составляющей ошибки измерений
!> вдоль нормали к плоскости орбиты, arcsec
!> - 18 - (#) временная интерпретация трансверсальных невязок, sec
!> - 19 - (#) МО временной ошибки измерений, sec
!> - 20 - (#) СКО временной ошибки измерений, sec
!> - 21 - (*) Угол места в топоцентрической системе координат,,рад
!> - 22 - (*) Азимут в топоцентрической системе координат, рад
!> - 23 - Несущая частота, кГц
!> - 24 - (*) СКО шумовой составляющей ошибки измерений наклонной
!> дальности (оценка ско измерений с единичным весом), км
!> - 25 - (*) СКО шумовой составляющей ошибки измерений скорости
!> изменения (оценка ско измерений с единичным весом), км/сек
!> - 26 - (*) невязки относительно сглаживающего полинома по наклонной
!> дальности, км
!> - 27 - (*) невязки относительно сглаживающего полинома по скорости
!> изменения наклонной дальности, км
!> - 28 - (#) радиальные невязки относительно полученной
!> оценки орбиты, км
!> - 29 - (#) невязки скорости изменения дальности в радиальном
!> направлении относительно полученной оценки орбиты, км/сек
!> - 30 - (#) СКО шумовой составляющей ошибки измерений дальности
!> в радиальном направлении, км
!> - 31 - (#) СКО шумовой составляющей ошибки измерений скорости
!> изменнения дальности в радиальном направлении, км/сек
!> - 32 - Межрупорный коэффициент корреляции (по необходимости)
!>
!> Примечание: СКО шумовой составляющей, которая характерна для всей проводки
!> в целом и имеет одно и то же значение для всей проводки,
!> вынесена в эту таблицу из-за использования механизма прореживания
!> (*) - результат задачи идентификации
!> (#) - результат задачи оценивания
!>
!!
!> 3) список X3 представляет собой информационный массив о проводках:
!>
!> Массив содержащий результат работы программы привязки.
!> Он заполняется в два этапа (candidates, binding).
!>
!> Массив в формате json для NBINDS проводок:
!> "binds" : [[BINDS(1,1),BINDS(1,2),...,BINDS(1,BINDS_SIZE_)],
!!
!> >>> [BINDS(2,1),BINDS(2,2),...,BINDS(2,BINDS_SIZE_)], ...
!!
!> >>> [BINDS(NBINDS,1),BINDS(NBINDS,2),...,BINDS(NBINDS,BINDS_SIZE_)]]
!>
!> BINDS(NPRV,BINDS_SIZE_) - массив с результатами привязки
!>
!> - 1. - (*) Номер присвоенный проводке в комплексе
!> - 2. - Номер объекта NKO присвоенный выбранной проводке
!> - 3. - (*) Номер сета(набор кадров с одинаковыми моментами времени) Этот номер присваивается
!> при первоначальной обработке сеанса.
!> - 4. - (*) Количество измерений в проводке
!> - 5. - (*) количество измерений в проводке признанных номинальными
!> - 6. - значение функционала
!> - 7. - средняя угловая ошибка вдоль орбиты
!> - 8. - средняя угловая ошибка по нормали к орбите
!> - 9. - СКО оценки измерений (номинал или верхний предел для формирования весовой матрицы)
!> - 10. - (*) тип сглаживающего полинома
!> - 0 - нет данных
!> - 1 - алгебраический полином 1-й степени (линейный)
!> - 2 - алгебраический полином 2-й степени (квадратичный)
!> - 3 - полином Чебышёва 2-й степени
!> - 11. - (*) коэффициент при нулевой степени (свободный член) аппроксимирующего полинома по RA
!> - 12. - (*) коэффициент при первой степени аппроксимирующего полинома по RA
!> - 13. - (*) коэффициент при второй степени аппроксимирующего полинома по RA
!> - 14. - (*) коэффициент при нулевой степени (свободный член) аппроксимирующего полинома по DEC
!> - 15. - (*) коэффициент при первой степени аппроксимирующего полинома по DEC
!> - 16. - (*) коэффициент при второй степени аппроксимирующего полинома по DEC
!> - 17. - (*) время задания сглаженных значений отнесенных на середину интервала TT
!> - 18. - (*) сглаженное значение RA
!> - 19. - (*) сглаженное значение DEC
!> - 20-25. - номера объектов-кандидатов по критерию близости спрогнозируемых измерений
!> - 26,27. - номер объектов-кандидатов по критерию близости спрогнозированных измерений объектов имеющих TLE
!> - 28. - Индикатор обработки проводки (код состояния оценки)
!> - 0 - проводка не обработана
!> - 1 - проводка обработана (требуется подтверждение)
!> - 2 - проводка обработана (достоверность подтверждена)
!> - 3 - проводка забракована
!> - 29. - НКО подозрительного объекта
!> - 30. - Индикатор наличия аномальной засечки в проводке
!> - 31. - номер задачи, инициализирующей изменение в массиве описания проводки
!> - 0 - seance
!> - 1 - identification
!> - 2 - qorbits
!> - 3 - fineorbits
!> - 4 - detection
!> - 32. - код операции, инициализирующей изменение в массиве описания проводки
!> - 0 - ничего не делать
!> - 1 - записать
!> - 2 - перепривязать
!> - 3 - анулировать
!> - 4 - записать вектора с маневром
!> - 33. - код состояния привязки к объекту динамического списка орбит
!> - 0 - проводка не привязана
!> - 1 - проводка привязана автоматически
!> - 2 - выполнена ручная привязка
!> - 3 - проводка была отвязана
!> - 4 - была выполнена перепривязка
!> - 5 - выполняется проверка гипотез
!> - -1 - проводка забракована
!> Этим кодам соответствуют символьные коды:
!> * " " - проводку следует обработать
!> * "+" - проводка была привязана
!> * "m" - ручная привязка требуется сохранить привязку при любом исходе решения задачи
!> * "-" - проводка была отвязана
!> * "<" - была выполнена альтернативная привязка
!> * "?" - выполняется проверка гипотез
!> * "A" - проводка забракована
!> - 34. - статус проводки (разрешение на запуск перепривязки)
!> - 0 - не обработана (следует запускать анализ перепривязки)
!> - 1 - обработана (перепривязку запускать не следует)
!> - 35. - значение функционала для объекта при первоначальной идентификации
!> - 36. - средняя угловая ошибка вдоль орбиты для объекта при первоначальной идентификации
!> - 37. - средняя угловая ошибка по нормали к орбите для объекта при первоначальной идентификации
!> - 38. - индикатор завершения перебора гипотез
!> - 39. - МО вычисленной средней ошибки по времени для эталонного объекта
!> - 40. - СКО вычисленной средней ошибки по времени для эталонного объекта
!> - 41. - МО вычисленной средней ошибки вдоль орбиты
!> - 42. - СКО вычисленной средней ошибки вдоль орбиты
!> - 43. - МО вычисленной средней ошибки поперек орбиты
!> - 44. - СКО вычисленной средней ошибки поперек орбиты
!
!> 4) Список X4 - представляет собой масссив с информациенй о задействованных оптических ИП.
!!
!> Массив в формате json для NDNIP измерительных средствах:
!>
!> "optical" : [[NIPINFO(1,1),NIPINFO(1,2),...,NIPINFO(1,NIPINFO_SIZE_)],
!!
!> > [NIPINFO(2,1),NIPINFO(2,2),...,NIPINFO(2,NIPINFO_SIZE_)], ...
!!
!> > [NIPINFO(NDNIP,1),NIPINFO(NDNIP,2),...,NIPINFO(NDNIP,NIPINFO_SIZE_)]]
!>
!> NIPINFO(NIPINFO_SIZE_) - массив c общей информацией о НИП:
!>
!> - 1 - ID измерительного пункта;
!> - 2 - декартовы координаты ИП в WGS-84 (координата X);
!> - 3 - декартовы координаты ИП в WGS-84 (координата Y);
!> - 4 - декартовы координаты ИП в WGS-84 (координата Z);
!> - 5 - учет аберрации на пункте ( 0 - не учитывается, 1 - учиттывается );
!> - 6 - СКО астрометрической ошибки, arcsec;
!> - 7 - СКО случайной составляющей ошибки измерения времени, sec;
!> - 8 - МО систематической ошибки измерения времени кадра, sec;
!> - 9 - Количество оптических каналов, шт;
!> - 10 - номер телеграммы;
!>
!> где NIPINFO_SIZE_=10
!>
!> 5) Список X5 - представляет собой масссив с информациенй о задействованных радиолокационных ИП.
!>
!> Массив в формате json для NRNIP измерительных средствах:
!>
!> "rls" : [[LOCINFO(1,1),LOCINFO(1,2),...,LOCINFO(1,LOCINFO_SIZE_)],
!!
!> > [LOCINFO(2,1),LOCINFO(2,2),...,LOCINFO(2,LOCINFO_SIZE_)], ...
!!
!> > [LOCINFO(NDNIP,1),LOCINFO(NDNIP,2),...,LOCINFO(NDNIP,LOCINFO_SIZE_)]]
!>
!> LOCINFO(NRNIP,LOCINFO_SIZE_) - массив c общей информацией о радиолокационном ИП
!>
!> - 1 - ID измерительного пункта;
!> - 2 - декартовы координаты ИП в WGS-84 (координата X);
!> - 3 - декартовы координаты ИП в WGS-84 (координата Y);
!> - 4 - декартовы координаты ИП в WGS-84 (координата Z);
!> - 5 - учет рефракции на пункте (0 - не учитывается; 1 - учиттывается);
!> - 6 - СКО случайной ошибки измерения угловых параметров, arcsec;
!> - 7 - СКО случайной составляющей ошибки измерения времени, sec;
!> - 8 - МО систематической ошибки измерения времени кадра, sec;
!> - 9 - СКО случайной ошибки измерения дальности, км;
!> - 10 - МО систематической ошибки измерения дальности, км;
!> - 11 - СКО случайной ошибки измерения скорости дальности, км/c;
!> - 12 - азимут направления нормали антены радиолокатора в топоцентрической СК, град;
!> - 13 - угол места направления нормали антены радиолокатора в топоцентрической СК, град;
!> - 14 - номер телеграммы;
!>
!> где LOCINFO_SIZE_=14
!>
!> 6) список X6 представляет собой информационный массив с параметрами вращения Земли и данными о космической погоде
!> для N суток;
!>
!> "dext" : [[D_EXT(1,1),D_EXT(1,2),...,D_EXT(1,DEXT_SIZE_)],
!>
!> >>> [D_EXT(2,1),D_EXT(2,2),...,D_EXT(2,DEXT_SIZE_)], ...
!>
!> >>> [D_EXT(N,1),D_EXT(N,2),...,D_EXT(N,DEXT_SIZE_)]]
!>
!> D_EXT(NDEXT,DEXT_SIZE_) - массив с параметрами вращения Земли и данными о космической погоде:
!>
!> - 1 - MJD, чтобы получить JD надо прибавить 2400000,5;
!> - 2 - Xp, (as) ;
!> - 3 - Yp (as);
!> - 4 - UT1-UTC, (s);
!> - 5 - dX, (mas);
!> - 6 - dY, (mas);
!> - 7 - delta AT, (s) ;
!> - 8 - F10.7 индекс равный плотности потока на длине волны 10.7;
!> - 9 - F81 среднее взвешенное значение индекса F10.7 за 81 день;
!> - 10 - Kp квазилогарифмический коэффициент.
!>
!> где DEXT_SIZE_=10;
!>
!> При расчете F0 (75,100,125,150,175,200,250) берется ближайшее к значению F81.
!>
!>
!> 7) список X7 представляет собой массив, содержащий протокол изменений
!> точности измеряемых параметров;
!>
!> "prm_history" : [[HIST(1,1),HIST(1,2),...,HIST(1,HIST_SIZE_)],
!!
!> > [HIST(2,1),HIST(2,2),...,HIST(2,HIST_SIZE_)], ...
!!
!> > [HIST(NHIST,1),HIST(NHIST,2),...,HIST(NHIST,HIST_SIZE_)]]
!>
!> HIST(NHIST,HIST_SIZE_) R*8 - массив c информацией о смене характеритик точности ИП
!>
!> - 1 - ID измерительного пункта
!> - 2 - ID измеряемого параметра
!> - 3 - TT(MJD) дата изменения параметра
!> - 4 - новое значение измеряемого параметра
!>
!> где HIST_SIZE_ = 4
!>
!> Описание результата файла stdout:
!>
!> Файл в формате JSON представляет собой результат работы программы опредениения
!> параметров новой орбиты.
!>
!> { "id":"ADAPSLive! v.1.0",
!> "result": {
!!
!> "neworbit": [ список Y1],
!>
!> "binds": [ измененный список X3 ],
!!
!> "stat": [список Y2],
!!
!> "variance": [ список Y3 ],
!!
!> "rc": rc -- код возврата
!!
!> }}
!!
!> где
!!
!> 1) список Y1 представляет собой расширенный вектор состояния подготовленный для записи
!> в базу данных орбит в стадии подтверждения и сопровождения;
!>
!> Массив в формате json для новой орбиты:
!>
!> "neworbit" : [[XNEW(1),XNEW(2),...,XNEW(ORBIT_SIZE_)],
!>
!> XNEW(ORBIT_SIZE_) - массив c информацией о КО:
!>
!> - 1 - NKO;
!> - 2 - MJD каталога;
!> - 3-5 - координаты X,Y,Z в СК J2000;
!> - 6-8 - скорости по X,Y,Z в СК J2000;
!> - 9 - коэффициент светового давления k*S/m;
!> - 10 - баллистический коэффициент Сx*S/2m;
!> - 11-13 - СКО координат X,Y,Z в СК J2000;
!> - 14-16 - СКО скоростей по X,Y,Z в СК J2000;
!> - 17 - СКО коэффициента светового давления;
!> - 18 - СКО баллистического коэффициента;
!> - 19 - отношение площади к массе;
!> - 20 - усредненное значение ОПМ м**2/кг;
!> - 21 - коэффициент отражения;
!> - 22 - коэффициент лобового сопротивления;
!> - 23 - блеск;
!> - 24 - СКО блеска;
!> - 25 - признак маневрирования;
!> - 26 - признак важности;
!> - 27 - счетчик обработанных пакетов измерений;
!> - 28 - интервал корреляции;
!> - 29 - ID проводки, которой соответствует оценка вектора состояния;
!> - 30-57 - элементы ковариационной матрицы;
!> где
!> - 30-44 верхний треугольник:
!> (1,2),(1,3),(1,4),(1,5),(1,6)
!> (2,3),(2,4),(2,5),(2,6)
!> (3,4),(3,5),(3,6)
!> (4,5),(4,6)
!> (5,6);
!>
!> - 45-56 (1,7),(1,8)
!> (2,7),(2,8)
!> (3,7),(3,8)
!> (4,7),(4,8)
!> (5,7),(5,8)
!> (6,7),(6,8);
!>
!> - 57 (7,8);
!>
!> - 58 - дисперсия измерения с единичным весом пакета участвовавшем в уточнениии
!> в случае типа орбиты 9 поле содержит интервал прогнозирования
!> от первой родительской орбиты того же типа, который указан в поле 59;
!> - 59 - информационно-управляющее поле для орбит актуального каталога:
!> указание на тип орбиты, которая явилась родительской по отношению к
!> сформированной актуальной;
!> тип соответствует нумерации орбит для поля 60
!>
!> для орбит сформированных по оптике (индекс списка орбит равен 3) :
!> * 0 - требуется подтверждение орбиты;
!> * 1 - орбита подтверждена по внешнему каталогу ЗНХ;
!> * 2 - орбита подтверждена по внешнему каталогу KK ВВС США;
!> * 3 - орбита подтверждена по обоим внешним каталогам;
!> * 4 - орбита подтверждена по оптическим измерениям с двух НИП или двух ночей;
!> * 5 - орбита подтверждена по внешнему каталогу ЗНХ и по оптическим измерениям;
!> * 6 - орбита подтверждена по внешнему каталогу TLE и по оптическим измерениям;
!> * 7 - орбита подтверждена по внешним каталогам и по оптическим измерениям;
!> * 8 - орбита с хорошими точностными характеристиками, полученными в результате решения задачи оценвания;
!> * XXX? - признак маневра:
!> В случае когда индекс динамического списк орбит равен 4;
!> + 0 - обычная орбита;
!> + 1 - опорная орбита;
!> + 2 - орбита в момент начала маневра;
!> + 3 - орбита в момент окончания маневра;
!>
!> - 60 - индекс динамического списка орбит:
!> 1. - массив с описанием орбиты сформирован по каталогу ЗНХ (z);
!> 2. - согласованные на выбранном интервале орбиты сформированые по каталогу КК ВВС США (u);
!> 3. - действующие орбиты сформированные по оптике (^ o);
!> 4. - сглаженные орбиты подготовленные для ведения внутреннего каталога (f);
!> 5. - некоррелированные орбиты (d);
!> 6. - массив с описанием орбиты сформирован по альманаху (G);
!> 7. - массив с описанием орбиты сформирован по оригинальному tle (t);
!> 8. - резерв;
!> 9. - орбита актуального каталога (a) ;
!>
!> где ORBIT_SIZE_=60.
!!
!> 2) список Y2 представляет собой статистическую информацию, полученную в результате обработки
!> выборки измерений при определении параметров орбиты нового КО.
!>
!> Массив в формате json для статистической информации:
!>
!> "stat" : [STAT(1),STAT(2),...,STAT(STAT_SIZE_)]:
!> 1. - Интервал уточнения, сут;
!> 2. - Число ночей;
!> 3. - Количество задействованных ИП;
!> 4. - Матожидание по alfa, as;
!> 5. - Медиана по альфа, as;
!> 6. - СКО по альфа, as;
!> 7. - Матожидание по дельта, as;
!> 8. - Медиана по дельта, as;
!> 9. - СКО по дельта, as;
!> 10. - используемая система координат;
!> 11. - используемая модель ГПЗ;
!> 12. - используемая модель атмосферы;
!> 13. - используемая модель светового давления;
!> 14. - количество измерений на интервале уточнения;
!> 15. - количество проводок на интервале уточнения,
!!
!> где STAT_SIZE_=15.
!>
!> 3) список Y3 представляет собой массив с вычисленными невязками, полученных NSUM
!> измерений относительно их прогнозных значений.
!!
!> "variance" : [[ESUM(1,1),ESUM(1,2),...,ESUM(1,EOPT_SIZE_)],
!> [ESUM(2,1),ESUM(2,2),...,ESUM(2,EOPT_SIZE_)], ... ,
!> [ESUM(NSUM,1),ESUM(NSUM,2),...,ESUM(NSUM,EOPT_SIZE_)]]
!>
!> 1. - признак учета измерения в обработке;
!> 2. - Номер ИП;
!> 3. - MJD измерения;
!> 4. - невязка по прямому восхождению, угл сек (заполняется при уточнении);
!> 5. - невязка по склонению, угл сек (заполняется при уточнении);
!> 6. - невязка по продольной (трансверсальной) составляющей в орбитальной СК (N);
!> 7. - невязка по нормальной составляющей в орбитальной ск (B);
!> 8. - СКО шумовой составляющей трансверсальной ошибки измерений;
!> 9. - СКО шумовой составляющей бинормальной ошибки измерений;
!> 10. - временная интерпретация трансверсальных невязок;
!> 11. - МО временной ошибки измерений;
!> 12. - СКО временной ошибки измерений;
!> 13. - ID проводки;
!> 14. - невязка вдоль линии визирования (радиальная);
!> 15. - СКО шумовой составляющей радиальной ошибки измерений;
!> 16. - индекс в массиве METRSUM,
!>
!> где EOPT_SIZE_=16.
!>
!> Описание результата файла stderr - отладочная информация.
!>
function dbl2short(ms) result (d)
real(8), intent(in) :: ms
integer(2) :: d
if(ms.gt.327.67) then
d = 32767
else if(ms.lt.-327.67) then
d = -32767
else
d = int(ms*100,2)
endif
end function dbl2short
program detectionmanual
! Внешние модули
use, intrinsic :: iso_fortran_env
use fson
use fson_value_m
use rdjson
use wrjson
use adaps_m
use const_m
use library_m
implicit none
integer(2), external :: dbl2short ! Функции
! размеры динамических массивов
REAL(8) :: XABS(XABS_SIZE_) ! вектор состояния в инерциальной декартовой системе координат J2000
REAL(8) :: XZNH(ZNH_SIZE_) ! описание состояния объекта в формате Хуторовского
REAL(8) :: XTLE(TLE_SIZE_) ! вектор состояния в двустрочных элементах
real(8) :: XA(6) ! вектор состояния КО (используется для проверки)
real(8) :: TTcheck ! TT новой ордиты (используется для проверки)
real(8) :: new_orbit(ORBIT_SIZE_) ! вектор параметров уточненной орбиты
real(8) :: statistic(STAT_SIZE_) ! массив статистики
real(8) :: Xall(XALL_SIZE_) ! массив параметоров орбиты для графиков
integer :: NOPT ! количество прореженных оптических измерений
integer :: NLOC ! количество прореженных радиолокационных измерений
integer :: RCcheck ! код корректности полученной орбиты
integer :: alloc_err = 0 ! признаки ошибки выделения памяти
integer :: exit_code = 0 ! признаки ошибки вызова подпрограмм
INTEGER :: EXITCONV ! код возврата из программы конвертации орбит
integer :: i,j ! рабочие переменные для инксов циклов
integer :: ESTATUS = 0 ! наличие оценки вектора состояния
type(fson_value), pointer :: init ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: value ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: array ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: result ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: rs_obj ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: p ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
logical :: check_message = .false. ! останов если сообщение не соответсвует формату
logical :: is_sys_message ! признак сообщения
real(8), allocatable :: dext(:,:) ! массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...)
real(8), allocatable :: EOPT(:,:) ! массив невязок оптических измерений
real(8), allocatable :: ELOC(:,:) ! массив невязок радиолокационных измерений
real(8), allocatable :: binds(:,:) ! массив с параметрами привязок - 25.04.2017
real(8), allocatable :: nipinfo(:,:) ! массив c информацией об оптическом ИП
real(8), allocatable :: locinfo(:,:) ! информационный массив о радиолокационном ИП
real(8), allocatable :: ropt(:,:) ! массив оптических измерений
real(8), allocatable :: rloc(:,:) ! массив радиолокационных измерений
real(8), allocatable :: prm_history(:,:) ! массив истории изменения параметров ИП
real(8) :: binds_fill(10) = (/99999.0D00,99999.0D00,99999.0D00,0.0D00,0.0D00,&
10.0D00,0.0D00,10.0D00,0.0D00,10.0D00/)
character(len=30), allocatable :: times_opt(:) ! массив календарных времён засечек опитики
character(len=30), allocatable :: times_loc(:) ! массив календарных времён засечек радио
! 0.0 Инициализация
NOPT = 0; NLOC = 0
! 1.0 разбираем входной поток
value => fson_parse('',INPUT_UNIT)
result => js_object(null())
is_sys_message = js_init_result(value,result,check_message)
init => value
if(is_sys_message) then
init => fson_value_get(value,'init')
endif
rs_obj => js_object(result,'result')
! 2.0 пропускаем пустые НУ, это происходит если проводку отвязали вручную в момент запроса НУ
if (fson_value_count(init).eq.0) then
call fson_print(result)
call fson_destroy(result)
call write_buildinfo()
stop 'WARNING: Skip empty initial conditions.'
endif
! Читаем массив с ПВЗ и данными о солнечной активности
call get_alloc_matrix(fson_value_get(init,'dext'),DEXT_SIZE_,dext)
! Читаем информацию о непривязанных проводках
call get_alloc_matrix(fson_value_get(init,'binds'),BINDS_SIZE_,binds)
! Читаем данные об изменении характеристик измерительных средств
p => fson_value_get(init,'prm_history')
if(associated(p)) call get_alloc_matrix(p,HIST_SIZE_,prm_history)
array => fson_value_get(init,'meas') ! измерения
! Читаем оптические измерения
p => fson_value_get(array,'optical')
if(associated(p)) call get_meas(p,ROPT_SIZE_,ropt,times_opt)
! Читаем радиолокационные измерения
p => fson_value_get(array,'rls')
if(associated(p)) call get_meas(p,RLOC_SIZE_,rloc,times_loc)
! Определяем количество оптических и радиолокационных измерений
if(allocated(ropt)) NOPT = size(ropt,1)
if(allocated(rloc)) NLOC = size(rloc,1)
array => fson_value_get(init,'nipinfo') ! текущие параметры ИП
! Читаем массив с параметрами оптических измерительных средств
p => fson_value_get(array,'optical')
if(associated(p)) call get_alloc_matrix(p,NIPINFO_SIZE_,nipinfo)
! Читаем массив с параметрами радиолокационных измерительных средств
p => fson_value_get(array,'rls')
if(associated(p)) call get_alloc_matrix(p,LOCINFO_SIZE_,locinfo)
! Завершение разбора НУ
call fson_destroy(value)
! 3.0 Формируем будущий массив невязок
if(NOPT.gt.0) then
allocate (EOPT(NOPT,EOPT_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate EOPT array'
EOPT(:,1) = 0.0D00 ! первой колонке присваиваем 0.0
do i = 1, NOPT
EOPT(i,2:3) = ropt(i,2:3) ! nip_id,mjd
EOPT(i,16) = i
enddo
endif
if(NLOC.gt.0) then
allocate (ELOC(NLOC,EOPT_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate ELOC array'
ELOC(:,1) = 0.0D00 ! первой колонке присваиваем 0.0
do i = 1, NLOC
ELOC(i,2:3) = rloc(i,2:3) ! nip_id,mjd
ELOC(i,16) = i
enddo
endif
! 4.0 Обеспечение совместимости различных версий программ
do i=1,size(binds,1)
if(isnan(binds(i,35))) binds(i,35:44) = binds_fill
enddo
call write_buildinfo()
if(allocated(ropt)) write(ERROR_UNIT,*) 'LOG: NOPT:',NOPT
if(allocated(rloc)) write(ERROR_UNIT,*) 'LOG: NLOC:',NLOC
if(allocated(nipinfo)) write(ERROR_UNIT,*) 'LOG: nipinfo size:',size(nipinfo,1)
if(allocated(locinfo)) write(ERROR_UNIT,*) 'LOG: locinfo size:',size(locinfo,1)
exit_code = 0
statistic(:) = 0.0D00
! 5.0 Решение задачи оценивания
if(NOPT.gt.0.or.NLOC.gt.0) then
! 5.4 Получение оценки вектора состояния
call nc_detectmanual(ROPT,RLOC,binds,nipinfo,locinfo,prm_history,dext, EOPT,ELOC, new_orbit, statistic,Xall, exit_code)
! exit_code - команда, которую надо выполнить в базе
! 0 - ничего не делать
! 1 - записать в базу
! 2 - перепривязать
! 3 - анулировать привязку
! 5.6 Определяем признак наличия приемлимой оценки
if(exit_code.eq.1) then
XA(1:6)=new_orbit(3:8)
RCcheck=nc_checkorbit(XA)
if(RCcheck.eq.0) then
TTcheck=new_orbit(2)+JDconst
RCcheck=nc_checktt(TTcheck)
endif
if(RCcheck.eq.0) ESTATUS = 1
endif
! ВНИМАНИЕ : перепривязку временно отключена
if(exit_code.eq.2) exit_code=0
if(ESTATUS.eq.0) then
write(ERROR_UNIT,*) "5.7 qorbits : REZULT: No operation "
else
write(ERROR_UNIT,*) "5.7 qorbits : new_orbit:"; call nc_printxorb(new_orbit)
endif
#ifdef DEBUG
write(ERROR_UNIT,*) "5.7.1 qorbits : ITOG: EOPT:"; call nc_printeopt(EOPT)
write(ERROR_UNIT,*) "5.7.2 qorbits : ITOG: ELOC:"; call nc_printeopt(ELOC)
#endif
!#ifdef DEBUG
if(ESTATUS.eq.1) then
write(ERROR_UNIT,*) "5.10 qorbits : STATISTIC:"; call nc_printstat(statistic)
endif
!#endif
! 6.0 Анализ задачи оценивания и перепривязка
! 6.1 Заполняем рабочий массив привязок BINDS в случае успешного решения задачи
call js_add(rs_obj,'rc',exit_code)
else
exit_code = -1
write(ERROR_UNIT,*) "6.5 qorbits : DEBUG: NO meas in list RC=",exit_code
call js_add(rs_obj,'rc',exit_code)
endif
!#ifdef DEBUG
write(ERROR_UNIT,*) "6.X qorbits : EXIT_CODE RC=",exit_code
exit_code=1
!#endif
! 7.0 Формирование JSON
select case(exit_code)
case (1)
call js_add(js_array(rs_obj,'orbit'),new_orbit(3:))
call js_add(js_array(rs_obj,'stat'),statistic)
call js_add(js_array(rs_obj,'xall'),xall)
! Конвертируем орбиту
call nc_convorb(new_orbit,Dext,XABS,XZNH,XTLE,EXITCONV)
if(EXITCONV.eq.0) then
call js_add(js_array(rs_obj,'abs'),XABS)
call js_add(js_array(rs_obj,'znh'),XZNH)
if(XTLE(4).gt.0.0D00) then
call js_add(js_array(rs_obj,'tle'),XTLE)
endif
endif
! пробрасываем времена засечек проводки после прореживания...
! call js_copy(fson_value_get(init,'times'),js_array(rs_obj,'times'),'')
if(fson_value_count(array).ge.1) then
call fson_value_add(rs_obj,array)
else
call fson_value_destroy(array)
endif
! выводим массив невязок без НИП ID , заменяем его на ID измерения
array => js_array(rs_obj,'variance')
if(allocated(EOPT)) then
do i = 1,NOPT
if(fson_value_count(array).eq.0.and.EOPT(i,1).eq.0.0) cycle
p => js_array(array)
call js_add(p,value=int(EOPT(i,1))) ! used
call js_add(p,value=int(ropt(i,1),8)) ! trans_id
call js_add(p,value=trim(times_opt(i))) ! utc
do j=4,7
call js_add(p,value=int(dbl2short(EOPT(i,j)))) ! невязки
enddo
enddo
endif
if(allocated(ELOC)) then
do i = 1,NLOC
if(fson_value_count(array).eq.0.and.ELOC(i,1).eq.0.0) cycle
p => js_array(array)
call js_add(p,value=int(ELOC(i,1))) ! used
call js_add(p,value=int(rloc(i,1),8)) ! trans_id
call js_add(p,value=trim(times_loc(i))) ! utc
do j=4,7
call js_add(p,value=int(dbl2short(ELOC(i,j)))) ! невязки
enddo
enddo
endif
! запись привязок
array => js_array(rs_obj,'binds')
do i = 1, size(binds,1)
! Записываем только для изменивших свое состояние и последней
p => js_array(array)
call js_add(p,value=int(binds(i,1),8)) ! ID проводки
call js_add(p,value=int(binds(i,2))) ! НКО привязанного объекта
call js_add(p,value=int(binds(i,3))) ! Номер сета в сеансе
call js_add(p,value=int(binds(i,4))) ! кол-во измерений в проводке
call js_add(p,value=int(binds(i,5))) ! кол-во номинальных измерений в проводке
call js_add(p,value=binds(i,6)) ! Значение функционала
call js_add(p,value=binds(i,7)) ! Средняя угловая ошибка вдоль орбиты
call js_add(p,value=binds(i,8)) ! Средняя угловая поперек орбиты
call js_add(p,value=binds(i,9)) ! СКО оценки измерений
call js_add(p,value=int(binds(i,10))) ! Тип сглаживающего полинома
call js_add(p,binds(i,11:16)) ! Коэффициенты полиномов
call js_add(p,value=binds(i,17)) ! Время задания сглаженного значения измерений
call js_add(p,value=binds(i,18)) ! Время сглаженного значения RA
call js_add(p,value=binds(i,19)) ! Время сглаженного значения DEC
call js_add(p,int(binds(i,20:27))) ! НКО подозрительного объекта
call js_add(p,value=int(binds(i,28))) ! Индикатор обработки проводки
call js_add(p,value=int(binds(i,29))) ! НКО подозрительного объекта
call js_add(p,value=int(binds(i,30))) ! индикатор наличия аномальной засечки в проводке
call js_add(p,value=int(binds(i,31))) ! номер задачии инициализировавшей изменение в проводке
call js_add(p,value=int(binds(i,32))) ! код операции, инициализирующей изменение в проводке
call js_add(p,value=int(binds(i,33))) ! код состояния оценки, которая соответствует проводке
call js_add(p,value=int(binds(i,34))) ! код состояния привязки
call js_add(p,value=binds(i,35)) ! Значение функционала (запоминаем)
call js_add(p,value=binds(i,36)) ! Средняя угловая ошибка вдоль орбиты ( запоминаем)
call js_add(p,value=binds(i,37)) ! Средняя угловая поперек орбиты (запоминаем)
call js_add(p,value=int(binds(i,38))) ! индикатор завершения проверки гипотез
call js_add(p,value=binds(i,39)) ! МО временной ошибки (запоминаем)
call js_add(p,value=binds(i,40)) ! СКО временной ошибки (запоминаем)
call js_add(p,value=binds(i,41)) ! Ошибка измерения вдоль орбиты
call js_add(p,value=binds(i,42)) ! СКО Ошибки измерения вдоль орбиты
call js_add(p,value=binds(i,43)) ! Ошибка измерения поперек орбиты
call js_add(p,value=binds(i,44)) ! СКО Ошибки измерения поперек орбиты
enddo
case default
write(ERROR_UNIT,*) 'WARNING: n_nips=',size(nipinfo,1)
write(ERROR_UNIT,*) 'WARNING: n_dext=',size(dext,1)
write(ERROR_UNIT,*) 'WARNING: NOPT=',NOPT," NLOC=",NLOC
endselect
! 7.0 освобождаем память
if(allocated(dext)) deallocate(dext)
if(allocated(ropt)) deallocate(ropt)
if(allocated(times_opt)) deallocate(times_opt)
if(allocated(rloc)) deallocate(rloc)
if(allocated(times_loc)) deallocate(times_loc)
if(allocated(EOPT)) deallocate(EOPT)
if(allocated(ELOC)) deallocate(ELOC)
if(allocated(locinfo)) deallocate(locinfo)
if(allocated(nipinfo)) deallocate(nipinfo)
! 8.0 выводим результат
call fson_print(result)
call fson_destroy(result)
!call write_buildinfo()
end program detectionmanual
MAIN=detectionmanual
include ../makefile.inc
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment