Commit 4a9e78fe authored by Takhir Fakhrutdinov's avatar Takhir Fakhrutdinov

Добавили папки с программами

parent 158b1398
......@@ -18,3 +18,10 @@ write_buildinfo.f95
!modules/
!library/
!gencatalog/
!fineorbit/
!identification/
!seance/
!ephemerides/
!orbconverter/
!identoptoneset/
!qorbits/
\ No newline at end of file
......@@ -54,7 +54,7 @@ else
RELCFLAGS = -g -O0 -DDEBUG=$(DEBUG)
endif
SOLVERS=gencatalog
SOLVERS=gencatalog fineorbit qorbits seance identification identoptoneset orbconverter ephemerides
all: dirs lib $(SOLVERS)
cp $(JPL) $(JPLTARG)
......
write_buildinfo.f95
!------------------------------------------------------------------------------
!> @group OMCC - АСПОС ОКП
!> @author Нью-Ком Технолоджис
!> @file ephemerides.f95
!> @date Apr 4, 2019
!> @brief Программа расчета эфемерид
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON
!
!> Описание программы:
!> Описание файла INPUT_UNIT
!> {
!> "ttm":, -- время последней засечки (измерения)
!> "orbits":[], -- массив параметров каталожных орбит, каждая строка 60 элементов( фазовый вектор) за время хх* дней
!> "dext":[] -- массив размерностью xx (дней) * 10 - mjd,pm_x,pm_y,ut1_utc,dx,dy,tai_utc+tt_tai (frac of date),f_10_7,f_81,kp
!> }
!> Описание результата файла OUTPUT_UNIT
!> { "id":"ADAPSLive! v.1.0",
!>
!> > "result": {
!> >> "gro":xxx,
!> >> "vc":xx,
!> >> "orbids":[2020001,20200002,...],
!> >> "data":[
!> >>> { "nko":36767,
!> >>> "ephem":[
!> >>>> [2459199.0008007409,4430.0407658654003,-1754.5404565638801,-5399.7096644412104,4.4475961943785602,-3.5259684252846597,4.8017905094111004],
!> >>>> [2459199.0008007409,4430.0407658654003,-1754.5404565638801,-5399.7096644412104,4.4475961943785602,-3.5259684252846597,4.8017905094111004],
!> >>>> ...
!> >>> ]
!> >>> }
!> >> ]
!> > }
!> }
!> Описание результата файла stderr - отладочная информация
!------------------------------------------------------------------------------
#define __MODULE_VERSION__ '1.1.1'
program ephemerides
! необходимые модули
use fson
use fson_value_m
use rdjson
use wrjson
use adaps_m
use const_m
use library_m
implicit none
integer :: rc ! код возврата
integer :: gro ! номер группы КО
integer :: vc ! тип ВС
!integer :: sz
real(8) :: mjd_beg ! время начала выдачи эфемеридной информации в формате mjd
real(8) :: interval ! интервал прогноза в сутках
real(8) :: step ! Шаг вывода эфемеридной информации
logical :: stop_not_adaps_message = .false. ! останов если сообщение не соответсвует формату adaps
logical :: is_adaps_message ! признак сообщения соответстувующего ADASPLive! v.1.0
!real(8) :: nipinfo(NIPINFO_SIZE_) = 0.0D0 ! информационный массив о НИП
!real(8) :: locinfo(LOCINFO_SIZE_) = 0.0D0 ! информационный массив о НИП
type(fson_value), pointer :: init,value ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: result,rs_obj ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: eph_obj ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
real(8), allocatable :: orbits(:,:) ! динамический список орбит
real(8), allocatable :: dext(:,:) ! массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...)
! разбираем входной поток
value => fson_parse('',INPUT_UNIT)
result => js_object(null())
is_adaps_message = js_init_result(value,result,stop_not_adaps_message)
init => value
if(is_adaps_message) then
init => fson_value_get(value,'init')
endif
rs_obj => js_object(result,'result')
! копируем идентификаторы орбит
call js_copy(fson_value_get(init,'orbids'),js_array(rs_obj,'orbids'),'')
! копируем времена орбит
call js_copy(fson_value_get(init,'times'),js_array(rs_obj,'times'),'')
call fson_get(init,'gro',gro)
call fson_get(init,'vc', vc)
call js_add(rs_obj,'gro',gro)
call js_add(rs_obj,'vc', vc)
! получаем время начала прогнозирования в формате mjd
call fson_get(init,'mjd_beg',mjd_beg)
! получаем интервал прогнозирования в формате сутки
call fson_get(init,'interval',interval)
! получаем шаг вывода эфемерид
call fson_get(init,'step',step)
! читаем массив текущих каталожных орбит...
call get_alloc_matrix(fson_value_get(init,'orbits'),ORBIT_SIZE_,orbits)
! читаем массив dext
call get_alloc_matrix(fson_value_get(init,'dext'),DEXT_SIZE_,dext)
! информация о ИП
!p => fson_value_get(init,'nipinfo')
!sz = fson_value_count(p)
!if(sz.eq.NIPINFO_SIZE_) then
! call get_vector(p,nipinfo)
!else
! call get_vector(p,locinfo)
!endif
write(ERROR_UNIT,*) "LOG: objects count:",size(orbits,1)," mjd:",mjd_beg
! освобождаем память
call fson_destroy(value)
! выполняем расчет
eph_obj => js_array(rs_obj,'data')
call nc_genephemeris(mjd_beg,interval,step,orbits,dext,rc,eph_obj)
if(rc.ne.0) write(ERROR_UNIT,*) 'nc_genephemeris exit code:',rc
! освобождаем память
if(allocated(orbits)) deallocate(orbits)
if(allocated(dext)) deallocate(dext)
! выводим результат
call fson_print(result)
call fson_destroy(result)
call write_buildinfo()
end program ephemerides
MAIN=ephemerides
include ../makefile.inc
\ No newline at end of file
write_buildinfo.f95
!------------------------------------------------------------------------------
!> @group adaps - АСПОС ОКП
!> @author ИПМ им.Келдыша
!> @file fineorbit.f95
!> @date August 18, 2013
!> @brief программа улучшения орбиты каталога adaps по орбитам полученным в результате обработки оптических измерений
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON
!> @image html fineorbit.png
!> Описание программы:
!> Описание файла INPUT_UNIT
!> {
!> "ar":[ -- массив записей типа:
!> {
!> "mjd_cat":, -- время формирования каталожной орбиты (в формате mjd)
!> "ttm_cat":, -- время формирования каталожной орбиты (во внутреннем формате БД)
!> "orbits":[], -- массив параметров каталожных орбит, каждая строка 60 элементов( фазовый вектор) за время хх* дней
!> "dext":[], -- массив размерностью xx (дней) * 10 - mjd,pm_x,pm_y,ut1_utc,dx,dy,tai_utc+tt_tai (frac of date),f_10_7,f_81,kp
!> "orbits_list":[], -- массив параметров орбит уточненных по оптике - в каждой строке 60 элементов( фазовый вектор) за время хх* дней
!> "confirm":[], -- массив ид "оптических" орбит соответсвует кол-ву строк в orbits_list
!> "object" -- структура описывающая КО
!> }
!> ]
!> }
!> Описание результата файла stdout
!> Описание результата файла stderr - отладочная информация
!------------------------------------------------------------------------------
#define __MODULE_VERSION__ '3.8.1'
program fineorbit
! необходимые модули для разбора входящего потока
use, intrinsic :: iso_fortran_env
use fson
use fson_value_m
use rdjson
use wrjson
use adaps_m
use library_m
implicit none
type (SATCAT) :: CNKO ! структура для описания объекта / введена 21.04.2014
integer :: n_orbits ! соответствующие размерности динамических массивов
integer :: n_dext ! соответствующие размерности динамических массивов
integer :: n_orbits_list ! соответствующие размерности динамических массивов
integer :: n_bind ! размерность массива с параметрами проводок - 25.05.2017
integer :: n_confirm ! размерность массива с параметрами проводок - 25.05.2017
integer :: limit = 500 ! предельное количестово проверяемях орбит
! связано с ограничением размера выделяемой динамической памяти
integer :: n_excat ! соответствующие размерности динамических массивов
integer :: n_man ! соответствующие размерности динамических массивов - 13.02.2017
real(8), allocatable :: orbits(:,:) ! массив параметров каталожных орбит adaps
real(8), allocatable :: orbits_list(:,:) ! массив параметров динамических орбит adaps
real(8), allocatable :: binds (:,:) ! массив с параметрами привязок - 25.05.2017
real(8), allocatable :: dext(:,:) ! массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...)
! real(8), allocatable :: maneuvers(:,:) ! массив параметров манёвров - 13.02.2017
! real(8), allocatable :: excat(:,:) ! массив параметров орбит внешних каталогов
! в последней строке новое измерение
integer(8), allocatable :: confirm (:,:) ! массив с подтверждениями оптических орбит
real(8), allocatable :: WOCAT(:,:)
integer(8), allocatable :: WCONF(:,:)
real(8) :: new_orbit(ORBIT_SIZE_) ! вектор параметров уточненной орбиты
real(8) :: man_orbit(ORBIT_SIZE_) ! вектор параметров орбиты после маневра
real(8) :: Xall(XALL_SIZE_) ! массив параметоров орбиты для графиков
real(8) :: XallMAN(XALL_SIZE_) ! массив параметоров орбиты для графиков
real(8) :: bind(BINDS_SIZE_) ! массив с описанием обрабатываемой проводки
real(8) :: newbind(BINDS_SIZE_) ! массив с обновленным описанием обрабатываемой проводки
integer :: exit_err ! признаки ошибки выделения памяти и вызова подпрограмм
integer :: exit_rebind ! код завершения программы перепривязки
integer :: exit_NULL = 0
integer(8) :: ttm_cat ! время каталога в формате БД
real(8) :: mjd_cat ! время каталога в формате mjd
integer :: b,b_count=1 ! рабочие переменные для инксов циклов
integer(8) :: ID_noconf ! id проводки
integer(8) :: IDbinds ! id привязки
integer :: TASK ! номер задачи
integer :: COMMAND ! номер команды
integer :: alloc_err ! код возврата
integer :: i,j ! переменная цикла
type(fson_value), pointer :: batch,array ! в последней строке новое измерение
type(fson_value), pointer :: init,value,p,r ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: result,rs_arr,rs_rec ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
logical :: stop_not_adaps_message = .false. ! останов если сообщение не соответсвует формату adaps
logical :: is_adaps_message ! признак сообщения соответстувующего ADASPLive! v.1.0
! разбираем входной поток
value => fson_parse('',INPUT_UNIT)
result => js_object(null())
is_adaps_message = js_init_result(value,result,stop_not_adaps_message)
init => value
if(is_adaps_message) then
init => fson_value_get(value,'init')
endif
rs_arr => js_array(result,'result')
! Пачка задач?
array => fson_value_get(init,'ar')
if(associated(array)) then
b_count = fson_value_count(array)
endif
write(ERROR_UNIT,*) "fineorbit : b_count=",b_count
do b = 1,b_count
if(b.gt.b_count.or.b.le.0) then
write(ERROR_UNIT,*) "fineorbit : ERROR b=",b
return
else
!#ifdef DEBUG
write(ERROR_UNIT,*)
write(ERROR_UNIT,*) "fineorbit : b=",b," from b_count=",b_count
!#endif
endif
if(associated(array)) then
batch => fson_value_get(array,b)
else
batch => init
endif
! получаем время формирования каталога
call fson_get(batch,'ttm_cat',ttm_cat)
call fson_get(batch,'mjd_cat',mjd_cat)
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : ttm_cat=",ttm_cat," mjd_cat=",mjd_cat
!#endif
n_orbits=0; n_confirm=0; n_orbits_list=0; n_excat = 0
n_dext = 0; n_bind=0; n_man=0
! читаем массив каталожных орбит...
call readOrbits(batch,'orbits',n_orbits,orbits)
write(ERROR_UNIT,*) "fineorbit : n_orbits=",n_orbits
! читаем массив соответствующих идентификаторов оптических динамических орбит...
call readAllocIMatrix(batch,'confirm',n_confirm,CONFIRM_SIZE_,confirm)
write(ERROR_UNIT,*) "fineorbit : n_confirm=",n_confirm
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 1 : allocated(confirm)", allocated(confirm)
#endif
! читаем массив оптических динамических орбит...
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 1 : allocated(orbits_list)", allocated(orbits_list)
#endif
call readOrbits(batch,'orbits_list',n_orbits_list,orbits_list)
write(ERROR_UNIT,*) "fineorbit : n_orbits_list=",n_orbits_list
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 1 : allocated(orbits_list)", allocated(orbits_list)
#endif
! читаем массив внешних каталогов орбит (пока не используется)
! call readOrbits(batch,'ext_cats',n_excat,excat)
! читаем массив dext
call readDext(batch,n_dext,dext)
write(ERROR_UNIT,*) "fineorbit : n_dext=",n_dext
! Заполнение структры описания объекта
call readObject(fson_value_get(batch,'object'),CNKO)
write(ERROR_UNIT,*) "fineorbit : CNKO:",CNKO
! ! читаем массив манёвров 13.02.2017
! call readAllocMatrix(batch,'orbits_eval',n_man,MAN_SIZE_,maneuvers)
! читаем массив c информацией о проводках 25.04.2017
call readAllocMatrix(batch,'binds',n_bind,BINDS_SIZE_,binds)
write(ERROR_UNIT,*) "fineorbit : n_bind=",n_bind
#ifdef DEBUG
call nc_printbinds(binds)
#endif
! расcчитываем орбиту
write(ERROR_UNIT,*) 'fineorbit : nko:',CNKO%adaps," calculating ..."
if(n_orbits_list.gt.limit) then
write(ERROR_UNIT,*) 'fineorbit : allocated limit confirmation orbit ',limit
allocate (WOCAT(limit,ORBIT_SIZE_),stat=alloc_err)
if(alloc_err.eq.0) allocate (WCONF(limit,CONFIRM_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop "nc_fineorbit : ERROR: can not allocate memory"
do i=1,limit
WOCAT(i,:)=orbits_list(n_orbits_list-limit+i,:)
WCONF(i,:)=confirm(n_orbits_list-limit+i,:)
enddo
else
allocate (WOCAT(n_orbits_list,ORBIT_SIZE_),stat=alloc_err)
if(alloc_err.eq.0) allocate (WCONF(n_orbits_list,CONFIRM_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop "nc_fineorbit : ERROR: can not allocate memory"
do i=1,n_orbits_list
WOCAT(i,:)=orbits_list(i,:)
WCONF(i,:)=confirm(i,:)
enddo
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 2 : allocated(WOCAT)", allocated(WOCAT)
#endif
endif
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 2 : allocated(orbits_list)", allocated(orbits_list)
#endif
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : nc_mnkfine ... : b=",b
!#endif
call nc_mnkfine(CNKO, mjd_cat, orbits, WOCAT, dext, WCONF, new_orbit, man_orbit, Xall,XallMAN,ID_noconf,exit_err)
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 2 : allocated(orbits_list)", allocated(orbits_list)
#endif
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : nc_mnkfine ... done : RC=",exit_err," b=",b
!#endif
!if(b.gt.4) return
! Вывод результата
! exit_err - управляющее поле
! Действия:
! exit_err <= 0 не делать ничего
! exit_err = 1 записать улучшенную оценку орбиты в базу
! exit_err = 2 привязка (по известному id) анулируется (отправляется к некоррелированным)
! { Было бы правильным отправить ее на переобработку (по альтернативному NKO)
! если альтернативного нет то к некоррелированным }
! оценку анулировать
! сформировать новую fineorbits с новым пакетом оценок
! exit_err = 3 записать две орбиты маневра в базу (время должно быть взято из орбит
! сформировать новую fineorbits с новым пакетом оценок
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : nc_mnkfine RC=",exit_err
!#endif
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 3 : allocated(orbits_list)", allocated(orbits_list)
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 3 : n_orbits_list", n_orbits_list
#endif
if(n_orbits_list.gt.limit) then
do i=1,limit
orbits_list(n_orbits_list-limit+i,:)=WOCAT(i,:)
confirm(n_orbits_list-limit+i,:)=WCONF(i,:)
enddo
if(allocated(WOCAT)) deallocate(WOCAT)
if(allocated(WCONF)) deallocate(WCONF)
else
do i=1,n_orbits_list
orbits_list(i,:)=WOCAT(i,:)
confirm(i,:)=WCONF(i,:)
enddo
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 4 : allocated(WOCAT)", allocated(WOCAT)
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 4 : allocated(orbits_list)", allocated(orbits_list)
#endif
if(allocated(WOCAT)) deallocate(WOCAT)
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 5: allocated(WOCAT)", allocated(WOCAT)
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 5: allocated(WCONF)", allocated(WCONF)
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 5: allocated(orbits_list)", allocated(orbits_list)
#endif
if(allocated(WCONF)) deallocate(WCONF)
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 6: allocated(WCONF)", allocated(WCONF)
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 6: allocated(orbits_list)", allocated(orbits_list)
#endif
endif
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : ERROR_UNIT",ERROR_UNIT
#endif
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : allocated(confirm):",allocated(confirm)
#endif
!if(b.gt.4) return
#ifdef DEBUG
write(ERROR_UNIT,*) "1.2 nc_mnkfine : point 7 : allocated(orbits_list)", allocated(orbits_list)
#endif
nullify(rs_rec)
rs_rec => js_object(rs_arr)
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : ERROR_UNIT",ERROR_UNIT,exit_NULL,exit_err
#endif
!if(b.gt.4) return
if(exit_err.eq.2) then
call js_add(rs_rec,'rc',exit_NULL)
write(ERROR_UNIT,*) "fineorbit : WARNING! CHANGE CODE 2 ---> 0"
else
call js_add(rs_rec,'rc',exit_err)
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : ERROR_UNIT",ERROR_UNIT,exit_err
#endif
!if(b.gt.4) return
endif
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : ERROR_UNIT",ERROR_UNIT
#endif
!if(b.gt.4) return
call js_add(rs_rec,'ttm_cat',ttm_cat)
TASK = 3 ! Номер задачи
!if(b.gt.4) return
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : ERROR_UNIT",ERROR_UNIT
#endif
if(exit_err.eq.2) exit_err = 0
!if(b.gt.4) return
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : exit_err=",exit_err
#endif
!if(b.gt.4) return
if(exit_err.eq.1) then
write(ERROR_UNIT,*) 'fineorbit : exit_err=1 : generate orbit for nko:',CNKO%adaps
nullify(p)
p => js_array(rs_rec,'orbits')
nullify(r)
r => js_object(p)
call js_add(r,'nko',CNKO%dbno)
call js_add(r,'mjd',new_orbit(2))
call js_add(js_array(r,'params'),new_orbit(3:))
call js_add(js_array(r,'xall'),Xall)
write(ERROR_UNIT,*) 'fineorbit : generate orbit for nko:',CNKO%adaps
elseif(exit_err.eq.2) then
write(ERROR_UNIT,*) 'fineorbit : exit_err=2 : rebinding ... nko:',CNKO%adaps
COMMAND = 2
call js_add(rs_rec,'nko',CNKO%dbno)
IDbinds = 0
do j=1, n_orbits_list
if(int(confirm(j,1),8).eq.ID_noconf) IDbinds=int(confirm(j,2),8)
enddo
#ifdef DEBUG
write(ERROR_UNIT,*) 'fineorbit : IDbinds=',IDbinds," ID_noconf=",ID_noconf
#endif
if(IDbinds.ne.0) then
do i = 1, n_bind
if(int(binds(i,1),8).ne.IDbinds) cycle
call js_add(rs_rec,'orbit_id',ID_noconf)
r => js_array(rs_rec,'binds')
bind(:)=binds(i,:)
bind(31) = TASK
bind(32) = COMMAND
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : i=",i," BIND:"
write(ERROR_UNIT,'(8G18.11)') BIND
#endif
call nc_rebindfine(bind, newbind,exit_rebind)
#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : nc_rebindfine RC=",exit_rebind
write(ERROR_UNIT,*) "fineorbit : NEW BIND:"
write(ERROR_UNIT,'(8G19.12)') NEWBIND
#endif
! восстанавливаем массив привязок
if(exit_rebind.ge.0) then
write(ERROR_UNIT,*) "fineorbit : rebind code RC=",exit_rebind
!if(TASK.ne.3) then
! p => js_array(r)
call js_add(r,value=int(newbind(1),8)) ! ID проводки
call js_add(r,value=int(newbind(2))) ! НКО привязанного объекта
call js_add(r,value=int(newbind(3))) ! Номер сета в сеансе
call js_add(r,value=int(newbind(4))) ! Количество измерений в проводке
call js_add(r,value=int(newbind(5))) ! Количество номинальных измерений в проводке
call js_add(r,value=newbind(6)) ! Значение функционала
call js_add(r,value=newbind(7)) ! Средняя угловая ошибка вдоль орбиты
call js_add(r,value=newbind(8)) ! Средняя угловая поперек орбиты
call js_add(r,value=newbind(9)) ! СКО оценки измерений
call js_add(r,value=int(newbind(10))) ! Тип сглаживающего полинома
call js_add(r,newbind(11:16)) ! Коэффициенты полиномов
call js_add(r,value=newbind(17)) ! Время задания сглаженного значения измерений
call js_add(r,value=newbind(18)) ! Время сглаженного значения RA
call js_add(r,value=newbind(19)) ! Время сглаженного значения DEC
call js_add(r,int(newbind(20:27))) ! НКО подозрительного объекта
call js_add(r,value=int(newbind(28))) ! Индикатор обработки проводки
call js_add(r,value=int(newbind(29))) ! НКО подозрительного объекта
call js_add(r,value=int(newbind(30))) ! индикатор наличия аномальной засечки в проводке
call js_add(r,value=TASK) ! номер задачии инициализировавшей изменение в проводке
call js_add(r,value=int(newbind(32))) ! код операции, инициализирующей изменение в проводке
call js_add(r,value=int(newbind(33))) ! код состояния оценки, которая соответствует проводке
call js_add(r,value=int(newbind(34))) ! код состояния привязки (лицензия на перепривязку)
call js_add(r,value=newbind(35)) ! Значение функционала (запоминаем)
call js_add(r,value=newbind(36)) ! Средняя угловая ошибка вдоль орбиты (запоминаем)
call js_add(r,value=newbind(37)) ! Средняя угловая поперек орбиты (запоминаем)
call js_add(r,value=int(newbind(38))) ! Индикатор завершения проверки гипотез
call js_add(r,value=newbind(39)) ! МО ошибки измерения времени
call js_add(r,value=newbind(40)) ! СКО ошибки измерения времени
call js_add(r,value=newbind(41)) ! МО вычисленной средней ошибки вдоль орбиты
call js_add(r,value=newbind(42)) ! СКО вычисленной средней ошибки вдоль орбиты
call js_add(r,value=newbind(43)) ! МО вычисленной средней ошибки поперек орбиты
call js_add(r,value=newbind(44)) ! СКО вычисленной средней ошибки поперек орбиты
!endif
endif
enddo
endif
write(ERROR_UNIT,*) 'fineorbit : remove transaction:',ID_noconf,' from nko:',CNKO%adaps
elseif(exit_err.eq.3) then
p => js_array(rs_rec,'orbits')
r => js_object(p)
call js_add(r,'nko',CNKO%dbno)
call js_add(r,'mjd',new_orbit(2))
call js_add(js_array(r,'params'),new_orbit(3:))
call js_add(js_array(r,'xall'),Xall)
r => js_object(p)
call js_add(r,'nko',CNKO%dbno)
call js_add(r,'mjd',man_orbit(2))
call js_add(js_array(r,'params'),man_orbit(3:))
call js_add(js_array(r,'xall'),XallMAN)
write(ERROR_UNIT,*) 'fineorbit : generate 2 orbits for maneuver of nko:',CNKO%adaps
else
write(ERROR_UNIT,*) 'fineorbit : no action for nko:',CNKO%adaps,' exit code:',exit_err
! по идее так должно быть
! p => js_array(rs_rec,'orbits')
! r => js_object(p)
call js_add(rs_rec,'nko',CNKO%dbno)
! call js_add(r,'nko',CNKO%dbno)
endif
!if(b.gt.4) return
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : allocated:",allocated(orbits_list)
!#endif
! освобождаем память
if(allocated(orbits_list)) deallocate(orbits_list)
!if(b.gt.4) return
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : allocated:",allocated(confirm)
!#endif
!if(b.gt.4) return
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : allocated:",allocated(binds),allocated(orbits),allocated(dext)
!#endif
!if(b.gt.4) return
if(allocated(confirm)) deallocate(confirm)
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : allocated:",allocated(confirm)
!#endif
!if(b.gt.4) return
if(allocated(binds)) deallocate(binds)
if(allocated(orbits)) deallocate(orbits)
if(allocated(dext)) deallocate(dext)
! if(allocated(maneuvers)) deallocate(maneuvers)
! if(allocated(excat)) deallocate(excat)
!#ifdef DEBUG
write(ERROR_UNIT,*) "fineorbit : allocated:",allocated(orbits_list)
write(ERROR_UNIT,*) "fineorbit : allocated:",allocated(confirm),allocated(binds),allocated(orbits),allocated(dext)
!#endif
!if(b.gt.4) return
write(ERROR_UNIT,*) 'fineorbit : nko: ',CNKO%adaps," ... done"
enddo
call fson_destroy(value)
! выводим результат
call fson_print(result)
! совобождаем память
call fson_destroy(result)
call write_buildinfo()
end program fineorbit
\ No newline at end of file
MAIN=fineorbit
include ../makefile.inc
\ No newline at end of file
!> @file identification.f95
!> @date Feb 11, 2020
!>
!> @brief Программа идентификации оптических измерений
!> @details Программа инетификации оптических измерений
!>
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON
!> @param [out] - результаты работы передаются через стандартный файл OUTPUT_UNIT в формате JSON
!>
!> Описание файла INPUT_UNIT.
!>
!> { "init": {
!> > "file_id": fileID, -- идентификатор файла начальных условий;
!!
!> > "nightid": nightid, -- дата наблюдательной ночи;
!!
!> > "times": [...] -- служебный информационный массив;
!!
!> > "nipinfo":[список X1], -- информация об измерительном пункте;
!!
!> > "meas":[ список X2 ], -- массив оптических измерений;
!!
!> > "current":[ список X3], -- текущий список орбит, каждая строка 60 элементов
!> ( расширенный фазовый вектор);
!!
!> > "previous":[ список X4 ], -- предыдущий список орбит, каждая строка 60 элементов
!> ( расширенный фазовый вектор);
!!
!> > "ucat":[ список X5 ], -- действующий список согласованных по TLE орбит,
!> каждая строка 60 элементов
!> ( расширенный фазовый вектор);
!!
!> > "tlecat":[ список X6 ], -- действующий список орбит в элементах TLE;
!!
!> > "tlelist":[ список X7 ], -- действующий список орбит space-track в элементах TLE;
!!
!> > "dext":[ список X8 ], -- массив внешних данных XX*10
!> (iers и идексов солнечной активности на период xx* дней...);
!!
!> > "cluster_info":[ список X9 ], -- массив с информацией о составе орбитальных кластеров;
!!
!> > "binds":[список X10], -- информационный массив о проводках, включенных в выборку,
!!
!> > "prm_history":[ список X11 ] -- протокол изменений точности измеряемых параметров;
!!
!> }}
!!
!> где
!!
!> "file_id" - идентификатор выборки проводок в базе данных;
!!
!> "nightid" - строка ГГГГДДД, где ГГГГ - год, ДДД - номер дня в году;
!!
!> "times" - представляет собой список целочисленных представлений времен задания измерений в базе данных;
!!
!> 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 - представляет собой масссив с измерительной оптической информациенй.
!!
!> Массив в формате 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 - (*) Азимут в топоцентрической системе координат, рад.
!>
!> Примечание: СКО шумовой составляющей, которая характерна для всей проводки вцелом и
!> имеет одно и то же значение для всей проводки,
!> вынесена в эту таблицу из-за использования механизма прореживания
!> (*) - результат задачи идентификации
!> (#) - результат задачи оценивания
!>
!> 3) список X3 представляет собой динамический список орбит актуального каталога КО:
!>
!> Массив в формате json для N космических объектов:
!>
!> "current" : [[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.
!>
!> 4) список X4 представляет собой динамический список орбит предыдущего каталога КО:
!>
!> Массив в формате json для NPCAT космических объектов:
!>
!> "previous" : [[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 информацией о КО имеет структуру, представленную в п. 3
!>
!>
!> 5) список X5 представляет собой действующий список согласованных по TLE орбит КО:
!>
!> Массив в формате json для NUCAT космических объектов:
!>
!> "ucat" : [[U_CAT(1,1),U_CAT(1,2),...,U_CAT(1,ORBIT_SIZE_)],
!!
!> > [U_CAT(2,1),U_CAT(2,2),...,U_CAT(2,ORBIT_SIZE_)], ...
!!
!> > [U_CAT(NUCAT,1),U_CAT(NUCAT,2),...,U_CAT(NUCAT,ORBITT_SIZE_)]]
!>
!> U_CAT(NUCAT,ORBIT_SIZE_) - массив c информацией о КО имеет структуру, представленную в п. 3
!>
!>
!> 6) список X6 представляет собой массив содержащий данные актуального каталога в формате tle
!>
!> Массив в формате json для NWTLE космических объектов:
!>
!> "tlecat" : [[WTLE(1,1),WTLE(1,2),...,WTLE(1,WTLE_SIZE_)],
!!
!> > [WTLE(2,1),WTLE(2,2),...,WTLE(2,WTLE_SIZE_)], ...
!!
!> > [WTLE(NWTLE,1),WTLE(NWTLE,2),...,WTLE(NWTLE,WTLE_SIZE_)]]
!>
!> WTLE(NWTLE,WTLE_SIZE_) - массив c информацией о КО:
!>
!> Состав массива данных WTLE:
!>
!> - 1 - Идентификационный номер КО, NKO;
!> - 2 - MJD задания вектора состояния,JD;
!> - 3 - долгота восходящего узла, рад;
!> - 4 - наклонение, рад;
!> - 5 - Частота обращения (рад / мин);
!> - 6 - эксцентриситет;
!> - 7 - аргумент перигея, рад;
!> - 8 - средняя аномалия, рад;
!> - 9 - Первая производная от среднего движения (ускорение), деленная на два;
!> - 10 - Вторая производная от среднего движения, деленная на шесть;
!> - 11 - Коэффициент торможения B* (BSTAR);
!>
!> где WTLE_SIZE_=11
!>
!>
!> 7) список X7 представляет собой массив содержащий данные оригинального tle каталога NORAD:
!>
!> Массив в формате json для NOTLE космических объектов:
!>
!> "tlelist" : [[OTLE(1,1),OTLE(1,2),...,OTLE(1,OTLE_SIZE_)],
!!
!> > [OTLE(2,1),OTLE(2,2),...,OTLE(2,OTLE_SIZE_)], ...
!!
!> > [OTLE(NOTLE,1),OTLE(NOTLE,2),...,OTLE(NOTLE,OTLE_SIZE_)]]
!>
!> OTLE(NPTLE,OTLE_SIZE_) - массив c информацией о КО:
!>
!> Состав массива данных OTLE:
!>
!> - 1 - идентификационный номер КО,NKO
!> - 2 - MJD измерения, (TT)
!> - 3 - Первая производная от среднего движения (ускорение), деленная на два
!> - 4 - Вторая производная от среднего движения, деленная на шесть
!> - 5 - Коэффициент торможения B* (BSTAR)
!> - 6 - изначально типы эфемерид, сейчас 0
!> (SGP=1,SGP4=2,SDP4=3,SGP8=4,SDP8=5)
!> - 7 - наклонение, град
!> - 8 - долгота восходящего узла, град
!> - 9 - эксцентриситет
!> - 10 - аргумент перигея, град
!> - 11 - средняя аномалия, град
!> - 12 - Частота обращения (оборотов в день)
!>
!> где OTLE_SIZE_=12
!>
!>
!> 8) список X8 представляет собой информационный массив с параметрами вращения Земли и данными о космической погоде
!> для 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.
!>
!> 9) список X9 представляет собой информационный массив о составе кластеров:
!>
!> CLUSTER_INFO(NCLST,CLUSTER_SIZE_) R*8 - массив c составом кластеров,
!>
!> где CLUSTER_SIZE_ = 3
!>
!> OTLE(NPTLE,OTLE_SIZE_) - массив c информацией о КО:
!>
!> Состав массива данных OTLE:
!>
!> - 1. - номер группы
!> - 2. - идентификационный номер КО
!> - 3. - тип обработки
!>
!> Массив в формате json для N объектов:
!> "cluster_info" : [[CLST(1,1),CLST(1,2),CLST(1,CLUSTER_SIZE_)],
!!
!> > [CLST(2,1),CLST(2,2),CLST(2,CLUSTER_SIZE_)], ...
!! >
!> [CLST(N,1),CLST(N,2),CLST(N,CLUSTER_SIZE_)]]
!>
!> 10) список X10 представляет собой информационный массив о проводках:
!>
!> Массив содержащий результат работы программы привязки.
!> Он заполняется в два этапа (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. - СКО вычисленной средней ошибки поперек орбиты
!>
!> 11) список X11 представляет собой массив, содержащий протокол изменений
!> точности измеряемых параметров;
!>
!> "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": {
!!
!> "binds": [ [...], [...] , ... , [...] ],
!!
!> "ratings": [ список X11 ],
!!
!> "file_id": fileID,
!!
!> "dev": nipID,
!!
!> "times": [...]
!> }}
!>
!> где
!>
!> "ADAPSLive! v.1.0" - описательная часть программного комплекса.
!>
!> "result" - список, представляющий собой список массивов, содержащий результат идентификации.
!> Массив содержащий результат работы программы привязки имеет вид аналогичный
!> списку X10
!!
!> "raitings" - список, представляющий собой список массивов с параметрами изменения рейтинга
!> зон области ГСО.
!!
!> Состав массива данных OTLE:
!>
!> - 1. Целочисленное представление времени измерения;
!> - 2. долгота сегмента области ГСО, в которой проведено наблюдение;
!> - 3. широта сегмента области, в которой проведено наблюдение;
!> - 4. величина минимального блеска обнаруженного объекта.
!>
!> Массив в формате json для N проводок:
!> "raiting" : [[RAIT(1,1),RAIT(1,2),RAIT(1,4)],
!!
!> [RAIT(2,1),RAIT(2,2),RAIT(2,4)], ...
!!
!> [RAIT(N,1),RAIT(N,2),RAIT(N,4)]]
!!
!> "file_id" - идентификатор выборки проводок в базе данных.
!!
!> "dev" - идентификатор измерительного пункта в базе данных.
!!
!> "times" - служебный информационный массив
!>
!> Описание результата файла stderr - отладочная информация
!>
#define __MODULE_VERSION__ '3.9.0'
program identification
! необходимые модули для разбора входящего потока
use fson
use fson_value_m
use rdjson
use wrjson
use library_m
implicit none
type(fson_value), pointer :: init,value,array ! рабочие указатели на элементы входного
! потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: result,rs_obj,p ! рабочие указатели на элементы выходного
! потока соответственно корень, массив, строка, элемент
real(8) :: gloss(360,40) ! массив с информацией об измерениях объектов с минимальным блеском
! в последней строке новое измерение
integer :: n_current = 0, n_dext =0 ! соответствующие размерности динамических массивов
integer :: n_previous = 0 ! размерность предыдущего списка орбит
integer :: n_tlecat = 0 ! 04.08.16
integer :: n_tlelist = 0 ! 09.05.17
integer :: n_ucat = 0 ! 31.01.17
integer :: n_meas =0,n_binds =0 ! соответствующие размерности динамических массивов
integer :: n_cluster =0 ! размерность массива объектов из кластера
integer :: alloc_err ! признаки ошибки выделения памяти и вызова подпрограмм
integer :: exit_err ! признаки ошибки выделения памяти и вызова подпрограмм
integer :: nip ! номер ИП
integer :: i,j ! рабочие переменные для инксов циклов
integer :: conf ! конфигурация вычислений
integer(8) :: file_id ! идентификатор файла
character(len=7) :: night ! Дата наблюдательной ночи
logical :: stop_not_adaps_message = .false. ! останов если сообщение не соответсвует формату adaps
logical :: is_adaps_message ! признак сообщения соответстувующего ADASPLive! v.1.0
real(8), allocatable :: binds(:,:) ! массив привязок
real(8), allocatable :: current(:,:) ! действующий список орбит
real(8), allocatable :: previous(:,:) ! предыдущий список орбит
real(8), allocatable :: tlecat(:,:) ! действующий список орбит в элементах TLE
real(8), allocatable :: ucat(:,:) ! действующий список согласованных TLE орбит
real(8), allocatable :: tlelist(:,:) ! список окрайних орбит space-track в элементах TLE
real(8), allocatable :: dext(:,:) ! массив внешних данных XX*10
! (iers и идексов солнечной активности на период xx* дней...)
real(8), allocatable :: cluster_info(:,:) ! массив с информацией о составе кластера
real(8), allocatable :: meas(:,:) ! массив измерений ( строки переменной длины
! в зависимости от первого элемента)
real(8), allocatable :: nipinfo(:,:) ! информационный массив о НИП
real(8), allocatable :: prm_history(:,:) ! массив истории изменения параметров ИП
! разбираем входной поток
value => fson_parse('',INPUT_UNIT)
result => js_object(null())
is_adaps_message = js_init_result(value,result,stop_not_adaps_message)
init => value
if(is_adaps_message) then
init => fson_value_get(value,'init')
endif
rs_obj => js_object(result,'result')
! пробрасываем 'times'
if( associated(fson_value_get(init,'times'))) then
p => js_array(rs_obj,'times')
call js_copy(fson_value_get(init,'times'),p,'')
endif
! получаем ид файла
call fson_get(init,'file_id',file_id)
! получаем дату наблюдательной ночи
call fson_get(init,'nightid',night)
call js_add(rs_obj,'nightid',night)
! получаем конфигурацию расчётов
call fson_get(init,'conf',conf)
call js_add(rs_obj,'conf',conf)
! читаем массив текущих каталожных орбит...
call readOrbitsWOCV(init,'orbits',n_current,current)
! читаем массив предыдущих каталожных орбит...
call readOrbitsWOCV(init,'previous',n_previous,previous)
! читаем массив согласованных TLE орбит...
call readOrbitsWOCV(init,'ucat',n_ucat,ucat)
! читаем массив текущих каталожных орбит в элемента TLE
call readAllocMatrix(init,'tlecat',n_tlecat,WTLE_SIZE_,tlecat)
! читаем массив крайних орбит space-track в элемента TLE
call readAllocMatrix(init,'tlelist',n_tlelist,OTLE_SIZE_,tlelist)
! читаем массив dext
call readDext(init,n_dext,dext)
! читаем информацию о кластерах
call readAllocMatrix(init,'cluster_info',n_cluster,CLUSTER_SIZE_,cluster_info)
! читаем массив измерений и считаем кол-во проводок
call readAllocMatrix(init,'meas',n_meas,ROPT_SIZE_,meas)
! читаем параметры ИП
allocate (nipinfo(1,NIPINFO_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate binds array'
call readVector(fson_value_get(init,'nipinfo'),nipinfo(1,:))
nip=int(nipinfo(1,10))
! читаем массив привязок
call readAllocMatrix(init,'binds',n_binds,BINDS_SIZE_,binds)
p => fson_value_get(init,'prm_history')
if(associated(p)) call get_alloc_matrix(p,HIST_SIZE_,prm_history) ! история изменения параметров ИП
! освобождаем память
call fson_destroy(value)
! отладочная информация
write(ERROR_UNIT,*) 'LOG: file_id: ',file_id,' nip_id:',nip, " set:",int(binds(1,3))
call nc_identopt(nipinfo,prm_history,meas,current,previous,ucat,tlecat,tlelist,dext,cluster_info, binds,gloss,exit_err)
! выводим в стандартный поток stdout полученные привязки
if(exit_err.eq.0) then
call js_add(rs_obj,'file_id',file_id)
call js_add(rs_obj,'dev',int(nipinfo(1,1)))
! запись привязок
array => js_array(rs_obj,'binds')
do i = 1, n_binds
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))) ! разрешение на запуск перепривязки (код состояния проводки)
! (0-разрешается запустить перепривязку)
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
! запись рейтинга сегментов зоны ГСО по блеску
array => js_array(rs_obj,'ratings')
do i=1,360
do j=1,40
if(gloss(i,j).ne.0.0D00) then
p => js_array(array)
call js_add(p,value=i)
call js_add(p,value=j)
call js_add(p,value=gloss(i,j))
endif
enddo
enddo
! запись индикаторов наличия аномальных измерений и СКО
! array => js_array(rs_obj,'meas')
! do i=1,n_meas
! p => js_array(array)
! call js_add(p,value=int(meas(i,1),8))
! call js_add(p,meas(i,3:))
! enddo
else
write(ERROR_UNIT,*) 'DEBUG: n_current = ',n_current
write(ERROR_UNIT,*) 'DEBUG: n_current = ',n_previous
write(ERROR_UNIT,*) 'DEBUG: n_meas = ',n_meas
write(ERROR_UNIT,*) 'DEBUG: n_binds = ',n_binds
write(ERROR_UNIT,*) 'DEBUG: n_dext = ',n_dext
write(ERROR_UNIT,*) 'ERROR! identification exit code = ',exit_err
endif
! освобождаем память
if(allocated(current)) deallocate(current)
if(allocated(previous)) deallocate(previous)
if(allocated(dext)) deallocate(dext)
if(allocated(meas)) deallocate(meas)
if(allocated(cluster_info)) deallocate(cluster_info)
if(allocated(binds)) deallocate(binds)
! выводим результат
call fson_print(result)
call fson_destroy(result)
call write_buildinfo()
end program identification
\ No newline at end of file
MAIN=identification
include ../makefile.inc
\ No newline at end of file
!> @file identoptoneset.f95
!> @date May 20, 2020
!>
!> @brief Программа идентификации оптических измерений, объединенных в сет
!> @details Программа инетификации оптических измерений, объединенных в сет
!>
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON
!> @param [out] - результаты работы передаются через стандартный файл OUTPUT_UNIT в формате JSON
!>
!> Описание файла INPUT_UNIT.
!>
!> { "init": {
!> > "file_id": fileID, -- идентификатор файла начальных условий;
!!
!> > "ttm_catalog": ttm, -- время задания каталога орбит;
!!
!> > "times": [...] -- служебный информационный массив;
!!
!> > "nipinfo":[список X1], -- информация об измерительном пункте;
!!
!> > "meas":[ список X2 ], -- массив оптических измерений;
!!
!> > "current":[ список X3], -- текущий список орбит, каждая строка 60 элементов
!> ( расширенный фазовый вектор);
!!
!> > "previous":[ список X4 ], -- предыдущий список орбит, каждая строка 60 элементов
!> ( расширенный фазовый вектор);
!!
!> > "ucat":[ список X5 ], -- действующий список согласованных по TLE орбит,
!> каждая строка 60 элементов
!> ( расширенный фазовый вектор);
!!
!> > "tlecat":[ список X6 ], -- действующий список орбит в элементах TLE;
!!
!> > "tlelist":[ список X7 ], -- действующий список орбит space-track в элементах TLE;
!!
!> > "dext":[ список X8 ], -- массив внешних данных XX*10
!> (iers и идексов солнечной активности на период xx* дней...);
!!
!> > "cluster_info":[ список X9 ], -- массив с информацией о составе орбитальных кластеров;
!!
!> > "meas_r":[ список X10 ], -- массив оригинальных оптических измерений;
!!
!> > "prm_history":[ список X11 ], -- протокол изменений точности измеряемых параметров;
!!
!> }}
!!
!> где
!!
!> "file_id" - идентификатор выборки проводок в базе данных;
!!
!> "ttm_catalog" - целочисленное представлеие времени задания каталога орбит в базе данных;
!!
!> "times" - представляет собой список целочисленных представлений времен задания измерений в базе данных;
!!
!> 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 - представляет собой масссив с измерительной оптической информациенй.
!!
!> Массив в формате 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 - (*) Азимут в топоцентрической системе координат, рад.
!>
!> Примечание: СКО шумовой составляющей, которая характерна для всей проводки вцелом и
!> имеет одно и то же значение для всей проводки,
!> вынесена в эту таблицу из-за использования механизма прореживания
!> (*) - результат задачи идентификации
!> (#) - результат задачи оценивания
!>
!> 3) список X3 представляет собой динамический список орбит актуального каталога КО:
!>
!> Массив в формате json для N космических объектов:
!>
!> "current" : [[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.
!>
!> 4) список X4 представляет собой динамический список орбит предыдущего каталога КО:
!>
!> Массив в формате json для NPCAT космических объектов:
!>
!> "previous" : [[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 информацией о КО имеет структуру, представленную в п. 3
!>
!>
!> 5) список X5 представляет собой действующий список согласованных по TLE орбит КО:
!>
!> Массив в формате json для NUCAT космических объектов:
!>
!> "ucat" : [[U_CAT(1,1),U_CAT(1,2),...,U_CAT(1,ORBIT_SIZE_)],
!!
!> > [U_CAT(2,1),U_CAT(2,2),...,U_CAT(2,ORBIT_SIZE_)], ...
!!
!> > [U_CAT(NUCAT,1),U_CAT(NUCAT,2),...,U_CAT(NUCAT,ORBITT_SIZE_)]]
!>
!> U_CAT(NUCAT,ORBIT_SIZE_) - массив c информацией о КО имеет структуру, представленную в п. 3
!>
!>
!> 6) список X6 представляет собой массив содержащий данные актуального каталога в формате tle
!>
!> Массив в формате json для NWTLE космических объектов:
!>
!> "tlecat" : [[WTLE(1,1),WTLE(1,2),...,WTLE(1,WTLE_SIZE_)],
!!
!> > [WTLE(2,1),WTLE(2,2),...,WTLE(2,WTLE_SIZE_)], ...
!!
!> > [WTLE(NWTLE,1),WTLE(NWTLE,2),...,WTLE(NWTLE,WTLE_SIZE_)]]
!>
!> WTLE(NWTLE,WTLE_SIZE_) - массив c информацией о КО:
!>
!> Состав массива данных WTLE:
!>
!> - 1 - Идентификационный номер КО, NKO;
!> - 2 - MJD задания вектора состояния,JD;
!> - 3 - долгота восходящего узла, рад;
!> - 4 - наклонение, рад;
!> - 5 - Частота обращения (рад / мин);
!> - 6 - эксцентриситет;
!> - 7 - аргумент перигея, рад;
!> - 8 - средняя аномалия, рад;
!> - 9 - Первая производная от среднего движения (ускорение), деленная на два;
!> - 10 - Вторая производная от среднего движения, деленная на шесть;
!> - 11 - Коэффициент торможения B* (BSTAR);
!>
!> где WTLE_SIZE_=11
!>
!>
!> 7) список X7 представляет собой массив содержащий данные оригинального tle каталога NORAD:
!>
!> Массив в формате json для NOTLE космических объектов:
!>
!> "tlelist" : [[OTLE(1,1),OTLE(1,2),...,OTLE(1,OTLE_SIZE_)],
!!
!> > [OTLE(2,1),OTLE(2,2),...,OTLE(2,OTLE_SIZE_)], ...
!!
!> > [OTLE(NOTLE,1),OTLE(NOTLE,2),...,OTLE(NOTLE,OTLE_SIZE_)]]
!>
!> OTLE(NPTLE,OTLE_SIZE_) - массив c информацией о КО:
!>
!> Состав массива данных OTLE:
!>
!> - 1 - идентификационный номер КО,NKO
!> - 2 - MJD измерения, (TT)
!> - 3 - Первая производная от среднего движения (ускорение), деленная на два
!> - 4 - Вторая производная от среднего движения, деленная на шесть
!> - 5 - Коэффициент торможения B* (BSTAR)
!> - 6 - изначально типы эфемерид, сейчас 0
!> (SGP=1,SGP4=2,SDP4=3,SGP8=4,SDP8=5)
!> - 7 - наклонение, град
!> - 8 - долгота восходящего узла, град
!> - 9 - эксцентриситет
!> - 10 - аргумент перигея, град
!> - 11 - средняя аномалия, град
!> - 12 - Частота обращения (оборотов в день)
!>
!> где OTLE_SIZE_=12
!>
!>
!> 8) список X8 представляет собой информационный массив с параметрами вращения Земли и данными о космической погоде
!> для 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.
!>
!> 9) список X9 представляет собой информационный массив о составе кластеров:
!>
!> CLUSTER_INFO(NCLST,CLUSTER_SIZE_) R*8 - массив c составом кластеров,
!>
!> где CLUSTER_SIZE_ = 3
!>
!> OTLE(NPTLE,OTLE_SIZE_) - массив c информацией о КО:
!>
!> Состав массива данных OTLE:
!>
!> - 1. - номер группы
!> - 2. - идентификационный номер КО
!> - 3. - тип обработки
!>
!> Массив в формате json для N объектов:
!> "cluster_info" : [[CLST(1,1),CLST(1,2),CLST(1,CLUSTER_SIZE_)],
!!
!> > [CLST(2,1),CLST(2,2),CLST(2,CLUSTER_SIZE_)], ...
!! >
!> [CLST(N,1),CLST(N,2),CLST(N,CLUSTER_SIZE_)]]
!>
!> 10) Список X10 - представляет собой масссив с оригинальной измерительной оптической информациенй.
!!
!> Массив в формате json для NZAS оптических измерений:
!>
!> "meas_r" : [[ORIG(1,1),ORIG(1,2),...,ORIG(1,SEANCE_IC_ROPT_SIZE_)],
!!
!> > [ORIG(2,1),ORIG(2,2),...,ORIG(2,SEANCE_IC_ROPT_SIZE_)], ...
!!
!> > [ORIG(NZAS,1),ORIG(NZAS,2),...,ORIG(NZAS,SEANCE_IC_ROPT_SIZE_)]]
!>
!> ORIG(NZAS,SEANCE_IC_ROPT_SIZE_) - массив сеанса оптических измерений:
!>
!> - 1 - Номер присвоенный проводке в комплексе
!> - 2 - Номер ИП
!> - 3 - MJD измерения; JD
!> - 4 - угол прямого восхождения в J2000 в часах, h
!> - 5 - угол склонения в J2000 в градусах, град
!> - 6 - СКО астрометрической ошибки склонения, arcsec;
!> - 7 - СКО астрометрической ошибки прямого восхождения, arcsec/15;
!> - 8 - Блеск, mag.
!>
!> где SEANCE_IC_ROPT_SIZE_ = 8
!>
!> 11) список X11 представляет собой массив, содержащий протокол изменений
!> точности измеряемых параметров;
!>
!> "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": {
!!
!> "binds": [ [...], [...] , ... , [...] ],
!!
!> "ratings": [ список X11 ],
!!
!> "file_id": fileID,
!!
!> "dev": nipID,
!!
!> "times": [...]
!> }}
!>
!> где
!>
!> "ADAPSLive! v.1.0" - описательная часть программного комплекса.
!>
!> "result" - список, представляющий собой список массивов, содержащий результат идентификации.
!> Массив содержащий результат работы программы привязки имеет вид аналогичный
!> списку X10
!!
!> "raitings" - список, представляющий собой список массивов с параметрами изменения рейтинга
!> зон области ГСО.
!!
!> Состав массива данных OTLE:
!>
!> - 1. Целочисленное представление времени измерения;
!> - 2. долгота сегмента области ГСО, в которой проведено наблюдение;
!> - 3. широта сегмента области, в которой проведено наблюдение;
!> - 4. величина минимального блеска обнаруженного объекта.
!>
!> Массив в формате json для N проводок:
!> "raiting" : [[RAIT(1,1),RAIT(1,2),RAIT(1,4)],
!!
!> [RAIT(2,1),RAIT(2,2),RAIT(2,4)], ...
!!
!> [RAIT(N,1),RAIT(N,2),RAIT(N,4)]]
!!
!> "file_id" - идентификатор выборки проводок в базе данных.
!!
!> "dev" - идентификатор измерительного пункта в базе данных.
!!
!> "times" - служебный информационный массив
!>
!> Описание результата файла stderr - отладочная информация
!>
#define __MODULE_VERSION__ '1.0.0'
program identoptoneset
! необходимые модули для разбора входящего потока
use fson
use fson_value_m
use rdjson
use wrjson
use library_m
implicit none
type(fson_value), pointer :: init,value,array ! рабочие указатели на элементы входного
! потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: result,rs_obj,p ! рабочие указатели на элементы выходного
! потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: alr_obj,pln_obj,pln_rec! рабочие указатели на элементы выходного потока
type(fson_value), pointer :: mp,rec_p,rec_a ! рабочие указатели на элементы json
real(8) :: gloss(360,40) ! массив с информацией об измерениях объектов с минимальным блеском
! в последней строке новое измерение
integer :: n_binds =0 ! соответствующие размерности динамических массивов
integer :: alloc_err ! признаки ошибки выделения памяти и вызова подпрограмм
integer :: exit_err ! признаки ошибки выделения памяти и вызова подпрограмм
integer :: nip ! номер ИП
integer :: i,j ! рабочие переменные для инксов циклов
integer :: conf ! конфигурация расчётов
integer :: rc_alert ! код возврата программы подхвата
integer(8) :: track = 0
integer(8) :: id_ufo ! ID непривязанной проводки
integer :: nko ! номер ИП
integer :: n_ufo ! количество измерений в непривязанной проводке
logical :: stop_not_adaps_message = .false. ! останов если сообщение не соответсвует формату adaps
logical :: is_adaps_message ! признак сообщения соответстувующего ADASPLive! v.1.0
logical :: not_indet ! признак непривязанной проводки
logical :: genplan ! признак генерации плана подхвата
character(len=7) :: night ! наблюдательная ночь YYYYDDD
character(len=30) :: time_cr ! рабочая переменная
real(8), allocatable :: binds(:,:) ! массив привязок
real(8), allocatable :: current(:,:) ! действующий список орбит
real(8), allocatable :: previous(:,:) ! предыдущий список орбит
real(8), allocatable :: tlecat(:,:) ! действующий список орбит в элементах TLE
real(8), allocatable :: ucat(:,:) ! действующий список согласованных TLE орбит
real(8), allocatable :: tlelist(:,:) ! список окрайних орбит space-track в элементах TLE
real(8), allocatable :: dext(:,:) ! массив внешних данных XX*10
! (iers и идексов солнечной активности на период xx* дней...)
real(8), allocatable :: cluster_info(:,:) ! массив с информацией о составе кластера
real(8), allocatable :: thin_meas(:,:) ! массив прореженных измерений
real(8), allocatable :: meas(:,:) ! массив измерений ( строки переменной длины
! в зависимости от первого элемента)
real(8), allocatable :: nipinfo(:,:) ! информационный массив о НИП
real(8), allocatable :: locinfo(:,:) ! информационный массив о радиолокационном ИП
real(8) :: ufo_binds(BINDS_SIZE_) ! информационный массив непривязанной проводки
real(8), allocatable :: nip_mask(:,:) ! маска горизонта для ИС
real(8), allocatable :: nip_tu(:,:) ! массив c техническими условиями планирования
real(8), allocatable :: meas_ufo(:,:) ! массив c измерениями неидентифицированной проводки
real(8), allocatable :: prm_history(:,:) ! массив истории изменения параметров ИП
integer :: pltype = 14
character(len=30), allocatable :: times_c(:) ! массив календарных времён засечек
character(len=30), allocatable :: thin_times_c(:) ! массив календарных времён засечек
#ifdef DEBUG
integer :: koid,ix
#endif
! разбираем входной поток
value => fson_parse('',INPUT_UNIT)
result => js_object(null())
is_adaps_message = js_init_result(value,result,stop_not_adaps_message)
init => value
if(is_adaps_message) then
init => fson_value_get(value,'init')
endif
rs_obj => js_object(result,'result')
! получаем дату наблюдательной ночи
call fson_get(init,'nightid',night)
call js_add(rs_obj,'nightid',night)
! получаем конфигурацию расчётов
call fson_get(init,'conf',conf)
call js_add(rs_obj,'conf',conf)
! получаем признак генерации плана подхвата
call fson_get(init,'genplan',genplan)
! читаем массив текущих каталожных орбит...
call get_orbits_wocv(fson_value_get(init,'orbits'),current)
! читаем массив предыдущих каталожных орбит...
call get_orbits_wocv(fson_value_get(init,'previous'),previous)
! читаем массив согласованных TLE орбит...
call get_orbits_wocv(fson_value_get(init,'ucat'),ucat)
! читаем массив текущих каталожных орбит в элемента TLE
call get_alloc_matrix(fson_value_get(init,'tlecat'),WTLE_SIZE_,tlecat)
! читаем массив крайних орбит space-track в элемента TLE
call get_alloc_matrix(fson_value_get(init,'tlelist'),OTLE_SIZE_,tlelist)
! читаем массив dext
call get_alloc_matrix(fson_value_get(init,'dext'),DEXT_SIZE_,dext)
! читаем информацию о кластерах
call get_alloc_matrix(fson_value_get(init,'cluster_info'),CLUSTER_SIZE_,cluster_info)
! читаем параметры ИП
allocate (nipinfo(1,NIPINFO_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate nipinfo array'
call get_vector(fson_value_get(init,'nipinfo'),nipinfo(1,:))
call js_add(rs_obj,'dev',int(nipinfo(1,1)))
nip=int(nipinfo(1,10)) ! для отладки
call get_meas(fson_value_get(init,'meas'),ROPT_SIZE_,meas,times_c)
call get_meas(fson_value_get(init,'thin_meas'),ROPT_SIZE_,thin_meas,thin_times_c)
call init_nkomap(init)
! use rdjson
! пример nko = getnko(int(orbits(1,1)))
#ifdef DEBUG
! Отладка и проверка
koid = 205682 ! 38978
write(ERROR_UNIT,*) 'LOG: test koid:',koid,'= nko:',getnko(koid),'= 38978'
ix = nc_getorbindex(koid,current)
write(ERROR_UNIT,*) 'LOG: orbit index:',ix
if(ix.gt.0) write(ERROR_UNIT,*) 'LOG: orbit:',current(ix,:)
write(ERROR_UNIT,*) 'LOG: tle index:',nc_getorbindex(koid,tlelist)
write(ERROR_UNIT,*) 'LOG: ucat index:',nc_getorbindex(koid,ucat)
write(ERROR_UNIT,*) 'LOG: tlecat index:',nc_getorbindex(koid,tlecat)
koid = 192264 ! 94324
! Отладка и проверка
write(ERROR_UNIT,*) 'LOG: test koid:',koid,'= nko:',getnko(koid),'= 94324'
ix = nc_getorbindex(koid,current)
write(ERROR_UNIT,*) 'LOG: orbit index:',ix
if(ix.gt.0) write(ERROR_UNIT,*) 'LOG: orbit:',current(ix,:)
write(ERROR_UNIT,*) 'LOG: tle index:',nc_getorbindex(koid,tlelist)
write(ERROR_UNIT,*) 'LOG: ucat index:',nc_getorbindex(koid,ucat)
write(ERROR_UNIT,*) 'LOG: tlecat index:',nc_getorbindex(koid,tlecat)
#endif
! читаем ТУ планирования
allocate (nip_tu(1,TU_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate nip_tu array'
call get_vector(fson_value_get(init,'tu'),nip_tu(1,:))
! читаем маску горизонта планирования
allocate (nip_mask(1,MASK_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate nip_mask array'
nip_mask(1,:) = nip_tu(1,1)
if(nip_tu(1,8).ne.0) call get_hmask(fson_value_get(init,'gmask'),nip_mask(1,:))
p => fson_value_get(init,'prm_history')
if(associated(p)) call get_alloc_matrix(p,HIST_SIZE_,prm_history) ! история изменения параметров ИП
! освобождаем память
call fson_destroy(value)
! подсчёт кол-ва проводок
track = 0
do i = 1, size(thin_meas,1)
if(int(thin_meas(i,1),8).ne.track) then
track = int(thin_meas(i,1),8)
n_binds = n_binds+1
endif
enddo
! выделяем память под массив привязок
allocate (binds(n_binds,BINDS_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate binds array'
binds = 0.0D00
! отладочная информация
write(ERROR_UNIT,*) 'LOG: nip_id:',nip, 'genplan:', genplan
! Запуск поиска кандидатов
call nc_seanceoptanalize(nipinfo, prm_history, meas, dext, binds, exit_err)
write(ERROR_UNIT,*) "LOG: identoptoneset : nc_seanceoptanalize RC=",exit_err
call nc_identopt(nipinfo,prm_history,thin_meas,current,previous,ucat,tlecat,tlelist,dext,cluster_info, binds,gloss,exit_err)
write(ERROR_UNIT,*) "LOG: identoptoneset : nc_identopt RC=",exit_err
! Определяем наличие непривязанных проводок
not_indet = .false.
do i=1,size(binds,1)
! Проверяем значение функцтонала
if(isnan(binds(i,6))) then
write(ERROR_UNIT,*) "identoptoneset : DEBUG: NaN detected in bind",i
binds(i,2) = 0
else
if(binds(i,6).gt.1.0D06) binds(i,2)=0
endif
if(int(binds(i,2)).le.0) then
not_indet = .true.
ufo_binds(:)=binds(i,:)
id_ufo=int(ufo_binds(1),8)
exit
endif
enddo
!#ifdef DEBUG
write(ERROR_UNIT,*) "identoptoneset: id_ufo:",id_ufo
!#endif
! Для первой встречной непривязанной проводки выполняем планирование подхвата
if(not_indet) then
nko = 99999
n_ufo = 0
do i=1,size(meas,1)
if(int(meas(i,1),8).eq.id_ufo) then
n_ufo = n_ufo + 1
endif
enddo
write(ERROR_UNIT,*) "identoptoneset : n_ufo=",n_ufo," id_ufo:",id_ufo
allocate (meas_ufo(n_ufo,ROPT_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'identoptoneset : allocate meas_ufo array'
j=0
do i=1,size(meas,1)
if(int(meas(i,1),8).eq.id_ufo) then
j=j+1
meas_ufo(j,:)=meas(i,:)
endif
enddo
write(ERROR_UNIT,*) 'size meas_ufo',size(meas_ufo,1)
alr_obj => js_object(rs_obj,'alert')
call js_add(alr_obj,'alert_track',id_ufo)
if(genplan) then
call js_add(alr_obj,'pltype',pltype)
pln_obj => js_object(alr_obj,itoa(int(nipinfo(1,1))))
pln_rec => js_array(pln_obj,'plan')
write(ERROR_UNIT,*) 'LOG: start nc_alertquick...'
call nc_alertquick(nko,meas_ufo,ufo_binds,nipinfo,locinfo,prm_history,nip_tu,nip_mask,dext,rc_alert,pln_rec)
endif
endif
! формируем измерительный массив MEAS, информационный массив BINDS
call js_add(rs_obj,'rc',exit_err)
if(exit_err.eq.0) then
! запись привязок
array => js_array(rs_obj,'binds')
do i = 1, n_binds
#ifdef DEBUG
write(ERROR_UNIT,*) i,"BINDS:",(binds(i,j),j=1,BINDS_SIZE_)
#endif
do j=1,BINDS_SIZE_
! Проверяем значение функционала
if(isNaN(binds(i,j))) then
binds(i,j)=PENALTY
write(ERROR_UNIT,*) "identoptoneset : DEBUG: NaN detected in bind",i,j
endif
enddo
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))) ! разрешение на запуск перепривязки (код состояния проводки)
! (0-разрешается запустить перепривязку)
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
! запись рейтинга сегментов зоны ГСО по блеску
array => js_array(rs_obj,'ratings')
do i=1,360
do j=1,40
if(gloss(i,j).ne.0.0D00) then
p => js_array(array)
call js_add(p,value=i)
call js_add(p,value=j)
call js_add(p,value=gloss(i,j))
endif
enddo
enddo
!-----------------------------------
! формируем данные для новых таблиц
!-----------------------------------
track = 0
if(allocated(meas)) then
array => js_array(rs_obj,'meas')
nullify(p)
do i=1,size(meas,1)
! Запись результатов обработки измерений
if(track.ne.int(meas(i,1),8)) then
if(track.gt.0) then
! Записываем время привязки проводки
call js_add(p,'tm',value=trim(adjustl(time_cr)))
endif
p => js_object(array)
track = int(meas(i,1),8)
call js_add(p,'track',value=track) ! номер проводки
call js_add(js_array(p,'cresult'),meas(i,10:11)) ! СКО ra,dec
mp => js_array(p,'result')
endif
rec_p => js_object(mp)
time_cr = times_c(i)
call js_add(rec_p,'tm',value=trim(adjustl(time_cr))) ! время засечки календарное
rec_a => js_array(rec_p,'rlst')
call js_add(rec_a,meas(i,21:22)) ! угол места, азимут
call js_add(rec_a,meas(i,12:13)) ! невязки RA,DEC
call js_add(rec_a,value=int(meas(i,9))) ! индикатор аномальности измерений
enddo
if(track.gt.0) call js_add(p,'tm',value=trim(adjustl(time_cr)))
track = 0
array => js_array(rs_obj,'times')
do i = 1,size(thin_meas,1)
if(track.ne.int(thin_meas(i,1),8)) then
if(track.gt.0) then
p => js_array(array)
call js_add(p,value=track)
call js_add(p,value=trim(adjustl(thin_times_c(i-1))))
endif
track = int(thin_meas(i,1),8)
endif
enddo
! последняя проводка
p => js_array(array)
call js_add(p,value=track)
call js_add(p,value=trim(adjustl(thin_times_c(size(thin_meas,1)))))
endif
else
write(ERROR_UNIT,*) 'DEBUG: n_current = ',size(current,1)
write(ERROR_UNIT,*) 'DEBUG: n_previous = ',size(previous,1)
write(ERROR_UNIT,*) 'DEBUG: n_meas = ',size(thin_meas,1)
write(ERROR_UNIT,*) 'DEBUG: n_binds = ',n_binds
write(ERROR_UNIT,*) 'DEBUG: n_dext = ',size(dext,1)
write(ERROR_UNIT,*) 'ERROR! identification exit code = ',exit_err
endif
! освобождаем память
if(allocated(current)) deallocate(current)
if(allocated(previous)) deallocate(previous)
if(allocated(tlecat)) deallocate(tlecat)
if(allocated(tlelist)) deallocate(tlelist)
if(allocated(ucat)) deallocate(ucat)
if(allocated(dext)) deallocate(dext)
if(allocated(meas)) deallocate(meas)
if(allocated(thin_meas)) deallocate(thin_meas)
if(allocated(cluster_info)) deallocate(cluster_info)
if(allocated(binds)) deallocate(binds)
! выводим результат
call fson_print(result)
call fson_destroy(result)
call write_buildinfo()
end program identoptoneset
\ No newline at end of file
MAIN=identoptoneset
include ../makefile.inc
\ No newline at end of file
MAIN=orbconverter
include ../makefile.inc
\ No newline at end of file
!------------------------------------------------------------------------------
!> @group АСПОС ОКП
!> @author Нью-Ком Технолоджис
!> @file orbconverter.f95
!> @date May 07, 2019
!> @brief программа формироваия динамического списка орбит (каталога) на момент времени...
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON
!> @image html orbconverter.png
!> Описание программы:
!> Описание файла INPUT_UNIT
!> {
!> "ar":[
!> "ttm": , -- внутреннее представление даты формирования динамического списка орбит
!> "mjd": , -- дата (в формате mjd) формирования динамического списка орбит
!> "orbit":[], -- массив параметров уточненной орбиты
!> "dext":[] -- массив размерностью xx (дней) * 10 -
!> -- mjd,pm_x,pm_y,ut1_utc,dx,dy,tai_utc+tt_tai (frac of date),f_10_7,f_81,kp
!> ]
!> }
!> Описание результата файла stdout
!> Описание результата файла stderr - отладочная информация
!------------------------------------------------------------------------------
#define __MODULE_VERSION__ '1.1.1'
program orbconverter
! необходимые модули для разбора входящего потока
use fson
use fson_value_m
use rdjson
use wrjson
use library_m
implicit none
real(8), allocatable :: dext(:,:) ! массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...)
real(8) :: abs_orbit(XABS_SIZE_) = 0.0D0 ! вектор параметров орбиты в декартовой
real(8) :: tle_orbit(TLE_SIZE_) = 0.0D0 ! вектор параметров орбиты tle
real(8) :: znh_orbit(ZNH_SIZE_) = 0.0D0 ! вектор параметров орбиты znh
real(8) :: sat_orbit(ORBIT_SIZE_) = 0.0D0 ! вектор параметров каталожной орбиты (ctl.t_orbitdynarc)
integer(8) :: ttm ! внутреннее предстваление времени орбиты
integer :: exit_err ! признаки ошибки выделения памяти и вызова подпрограмм
integer :: b,b_count = 1 ! рабочие переменные для инксов циклов
character(len=64) tp ! подтип задачи
type(fson_value), pointer :: value,init ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
type(fson_value), pointer :: batch,array !
type(fson_value), pointer :: p !
type(fson_value), pointer :: result,rs_obj,rs_rec ! рабочие указатели на элементы входного потока соответственно корень, массив, строка, элемент
logical :: stop_not_adaps_message = .false. ! останов если сообщение не соответсвует формату adaps
logical :: is_adaps_message ! признак сообщения соответстувующего ADASPLive! v.1.0
! разбираем входной поток
value => fson_parse('',INPUT_UNIT)
result => js_object(null())
is_adaps_message = js_init_result(value,result,stop_not_adaps_message)
init => value
if(is_adaps_message) then
init => fson_value_get(value,'init')
endif
rs_obj => js_object(result,'result')
p => fson_value_get(init,'tp')
if(associated(p)) then
call fson_get(init,'tp',tp)
call js_add(rs_obj,'tp',trim(tp))
endif
rs_rec => js_array(rs_obj,'orbits')
! Пачка задач?
array => fson_value_get(init,'ar')
if(associated(array)) then
b_count = fson_value_count(array)
endif
do b = 1,b_count
if(associated(array)) then
batch => fson_value_get(array,b)
else
batch => init
endif
! время
call fson_get(batch,'ttm',ttm)
! читаем орбиту...
call get_vector(fson_value_get(batch,'orbit'),sat_orbit)
! читаем dext
call get_alloc_matrix(fson_value_get(batch,'dext'),DEXT_SIZE_,dext)
! расчитываем орбиту
call nc_convorb(sat_orbit,dext,abs_orbit,znh_orbit,tle_orbit,exit_err)
! вывод результата в зависимости от формы представления результатов
if(exit_err.eq.0) then
rs_obj => js_object(rs_rec)
call js_add(rs_obj,'ttm',ttm)
call js_add(rs_obj,'nko',int(sat_orbit(1)))
call js_add(js_array(rs_obj,'abs'),abs_orbit)
call js_add(js_array(rs_obj,'znh'),znh_orbit)
if(tle_orbit(4).gt.0.0D00) then
call js_add(js_array(rs_obj,'tle'),tle_orbit)
endif
else
write(ERROR_UNIT,*) 'rc:',exit_err, 'index:', b
endif
! освобождаем память
if(allocated(dext)) deallocate(dext)
enddo
! отладочная информация
write(ERROR_UNIT,*) 'LOG: orbconverter ... done : converted ',b_count,' orbits.'
! освобождаем память
call fson_destroy(value)
! выводим результат
call fson_print(result)
call fson_destroy(result)
call write_buildinfo()
end program orbconverter
\ No newline at end of file
write_buildinfo.f95
MAIN=qorbits
include ../makefile.inc
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
write_buildinfo.f95
MAIN=seance
include ../makefile.inc
\ No newline at end of file
!> @file seance.f95
!> @date Feb 27, 2020
!>
!> @brief Программа анализа сеанса оптических измерений.
!> @details Программа производит анализ поступившего сеанса оптических измерений.
!>
!> @param [in] - входные параметры передаются через стандартный файл INPUT_UNIT в формате JSON.
!> @param [out] - результаты работы передаются через стандартный файл OUTPUT_UNIT в формате JSON.
!>
!> Описание файла INPUT_UNIT.
!>
!> { "meas":[ список X1 ], -- массив оптических измерений;
!!
!> > "times": [...] -- служебный информационный массив;
!!
!> > "nipinfo":[список X2], -- информация об измерительном пункте;
!!
!> > "meas_r":[ список X3 ], -- массив оригинальных оптических измерений;
!!
!> > "file_id": fileID, -- идентификатор файла начальных условий;
!!
!> > "dext":[ список X4 ], -- массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...);
!!
!> > "prm_history":[ список X5 ] -- протокол изменений точности измеряемых параметров;
!> }
!!
!> где
!!
!> "file_id" - идентификатор выборки проводок в базе данных;
!!
!> "times" - представляет собой список целочисленных представлений времен задания измерений в базе данных;
!!
!> 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 - представляет собой масссив с информациенй об ИП.
!>
!> 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
!>
!> 3) Список X3 - представляет собой масссив с оригинальной измерительной оптической информациенй.
!!
!> Массив в формате json для NZAS оптических измерений:
!>
!> "meas_r" : [[ORIG(1,1),ORIG(1,2),...,ORIG(1,SEANCE_IC_ROPT_SIZE_)],
!!
!> > [ORIG(2,1),ORIG(2,2),...,ORIG(2,SEANCE_IC_ROPT_SIZE_)], ...
!!
!> > [ORIG(NZAS,1),ORIG(NZAS,2),...,ORIG(NZAS,SEANCE_IC_ROPT_SIZE_)]]
!>
!> ORIG(NZAS,SEANCE_IC_ROPT_SIZE_) - массив сеанса оптических измерений:
!>
!> - 1 - Номер присвоенный проводке в комплексе
!> - 2 - Номер ИП
!> - 3 - MJD измерения; JD
!> - 4 - угол прямого восхождения в J2000 в часах, h
!> - 5 - угол склонения в J2000 в градусах, град
!> - 6 - СКО астрометрической ошибки склонения, arcsec;
!> - 7 - СКО астрометрической ошибки прямого восхождения, arcsec/15;
!> - 8 - Блеск, mag.
!>
!> где SEANCE_IC_ROPT_SIZE_ = 8
!>
!> 4) список X4 представляет собой информационный массив с параметрами вращения Земли и данными о космической погоде
!> для 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.
!>
!> 5) список X5 представляет собой массив, содержащий протокол изменений
!> точности измеряемых параметров;
!>
!> "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": {
!!
!> "binds": [ список X5 ],
!!
!> "meas" : [ ...],
!!
!> "file_id": fileID,
!!
!> "dev": nipID,
!> }}
!>
!> где
!>
!> "ADAPSLive! v.1.0" - описательная часть программного комплекса.
!>
!> "result" - список, представляющий собой список массивов, содержащий результат идентификации.
!> Массив содержащий результат работы программы привязки.
!!
!> где
!>
!> 5) список X5 представляет собой информационный массив о проводках:
!>
!> Массив содержащий результат работы программы привязки.
!> Он заполняется в два этапа (seance, identification).
!>
!> Массив в формате 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. - СКО вычисленной средней ошибки поперек орбиты
!>
!> "meas" - Скорректированный массив в формате json для NZAS оптических измерений, см список X1:
!>
!> "file_id" - идентификатор выборки проводок в базе данных.
!!
!> "dev" - идентификатор измерительного пункта в базе данных.
!>
!> Описание результата файла stderr - отладочная информация
!>
program seance
! необходимые модули для разбора входящего потока
use fson
use fson_value_m
use rdjson
use wrjson
use library_m
implicit none
integer :: n_current = 0 ! соответствующие размерности динамических массивов
integer :: n_dext = 0 ! соответствующие размерности динамических массивов
integer :: n_meas = 0 ! соответствующие размерности динамических массивов
integer :: n_binds = 0 ! соответствующие размерности динамических массивов
integer :: n_times = 0 ! соответствующие размерности динамических массивов
integer :: n_meas_r = 0 ! соответствующие размерности динамических массивов
real(8), allocatable :: nipinfo (:,:) ! информационный массив о НИП
real(8), allocatable, dimension(:,:) :: binds ! массив привязок
real(8), allocatable, dimension(:,:) :: dext ! массив внешних данных XX*10 (iers и идексов солнечной активности на период xx* дней...)
real(8), allocatable, dimension(:,:) :: meas ! массив измерений ( строки переменной длины в зависимости от первого элемента
integer(8), allocatable, dimension(:,:) :: times ! массив времён засечек
real(8), allocatable :: prm_history(:,:) ! массив истории изменения параметров ИП
real(8), allocatable, dimension(:,:) :: meas_r ! массив измерений (новый)
character(len=30), allocatable, dimension(:) :: times_c ! массив календарных времён засечек
character(len=30) :: time_cr ! рабочая переменная
real(8) :: swap ! рабочая переменная
integer :: alloc_err ! признаки ошибки выделения памяти и вызова подпрограмм
integer :: exit_err ! признаки ошибки выделения памяти и вызова подпрограмм
integer :: i,j ! рабочие переменные для инксов циклов
integer(8) :: trans_id
integer(8) :: file_id
integer(8) :: track = 0
type(fson_value), pointer :: init ! рабочие указатели на элементы json
type(fson_value), pointer :: value ! рабочие указатели на элементы json
type(fson_value), pointer :: array ! рабочие указатели на элементы json
type(fson_value), pointer :: result ! рабочие указатели на элементы json
type(fson_value), pointer :: rs_obj ! рабочие указатели на элементы json
type(fson_value), pointer :: p,mp,rec_p,rec_a ! рабочие указатели на элементы json
logical :: check_message = .false. ! останов если сообщение не соответсвует формату
logical :: is_sys_message ! признак сообщения
! разбираем входной поток
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,'file_id',file_id)
! читаем массив dext
call readDext(init,n_dext,dext)
p => fson_value_get(init,'prm_history')
if(associated(p)) call get_alloc_matrix(p,HIST_SIZE_,prm_history) ! история изменения параметров ИП
! читаем массив измерений и считаем кол-во проводок
call readAllocMatrix(init,'meas',n_meas,ROPT_SIZE_,meas)
call getMeas(fson_value_get(init,'meas_r'),ROPT_SIZE_,meas_r,times_c,SEANCE_IC_ROPT_SIZE_)
if(allocated(meas_r)) n_meas_r = size(meas_r,1)
trans_id = 0
do i = 1, n_meas
if(int(meas(i,1),8).ne.trans_id) then
trans_id = int(meas(i,1),8)
n_binds = n_binds+1
endif
enddo
! выделяем память под массив привязок
allocate (binds(n_binds,BINDS_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate binds array'
binds = 0.0D00
! читаем параметры ИП
allocate (nipinfo(1,NIPINFO_SIZE_),stat=alloc_err)
if(alloc_err.ne.0) stop 'ERROR: allocate binds array'
call readVector(fson_value_get(init,'nipinfo'),nipinfo(1,:))
! читаем массив времён засечек
call readAllocIMatrix(init,'times',n_times,2,times)
! освобождаем память
call fson_destroy(value)
! отладочная информация
write(ERROR_UNIT,*) 'LOG: file_id: ',file_id
! Запуск поиска кандидатов
call nc_seanceoptanalize(nipinfo, prm_history, meas, dext, binds, exit_err)
! выводим в стандартный поток stdout полученные привязки
if(exit_err.eq.0) then
call js_add(rs_obj,'file_id',file_id)
call js_add(rs_obj,'dev',int(nipinfo(1,1)))
! запись привязок
array => js_array(rs_obj,'binds')
do i = 1, n_binds
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))) ! разрешение на запуск перепривязки (код состояния проводки)
! (0-разрешается запустить перепривязку)
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
! запись индикаторов наличия аномальных измерений и СКО
! преобразуем измерения для выполнения sql insert
array => js_array(rs_obj,'meas')
do i=1,n_meas
! меняем местами блеск о ошибку по дельта
swap = meas(i,8)
meas(i,8) = floor(meas(i,7)*15.0*100+0.5)*0.01
meas(i,7) = swap
p => js_array(array)
call js_add(p,value=times(i,1))
call js_add(p,value=times(i,2))
call js_add(p,value=int(meas(i,2),4))
call js_add(js_array(p),meas(i,4:))
enddo
!-----------------------------------
! формируем данные для новых таблиц
!-----------------------------------
if(allocated(meas_r)) then
array => js_array(rs_obj,'meas_r')
j = 1
nullify(p)
do i=1,n_meas
! Запись новых измерений!
! Поскольку кол-во старых измерений всегда >= кол-ву новых
! в новых могут исключаться дубликаты из других файлов
if(n_meas_r.gt.0.and.times(i,1).eq.int(meas_r(j,1),8)) then
if(track.ne.int(meas_r(j,1),8)) then
if(track.gt.0) then
! Записываем время привязки проводки
call js_add(p,'tm',value=trim(adjustl(time_cr)))
endif
p => js_object(array)
track = int(meas_r(j,1),8)
call js_add(p,'track',value=track) ! номер проводки
call js_add(js_array(p,'cresult'),meas(i,10:11)) ! СКО ra,dec
mp => js_array(p,'result')
endif
rec_p => js_object(mp)
time_cr = times_c(j)
call js_add(rec_p,'tm',value=trim(adjustl(time_cr))) ! время засечки календарное
rec_a => js_array(rec_p,'rlst')
call js_add(rec_a,meas(i,21:22)) ! угол места, азимут
call js_add(rec_a,meas(i,12:13)) ! невязки RA,DEC
call js_add(rec_a,value=int(meas(i,9))) ! индикатор аномальности измерений
j=j+1
endif
enddo
if(track.gt.0) call js_add(p,'tm',value=trim(adjustl(time_cr)))
track = 0
array => js_array(rs_obj,'binds_r')
j = 1
nullify(p)
do i = 1,n_meas_r
if(track.ne.int(meas_r(i,1),8)) then
track = int(meas_r(i,1),8)
do while(track.ne.int(binds(j,1),8))
j=j+1
enddo
! записываем время привязки
if(associated(p)) call js_add(p,'tm',trim(adjustl(times_c(i-1))))
! записываем привязку
p => js_object(array)
call js_add(p,'track',track)
call js_add(p,'setno',int(binds(j,3))) ! Номер сета в сеансе
mp => js_array(p,'binds')
! Важно: записываем только реально считаемые параметры привязки...
call js_add(mp,value=int(binds(j,4))) ! Количество измерений в проводке
call js_add(mp,value=int(binds(j,5))) ! Количество номинальных измерений в проводке
call js_add(mp,value=int(binds(j,10))) ! Тип сглаживающего полинома
call js_add(mp,binds(j,11:19)) ! Коэффициенты полиномов, времена сглаженных: измерений, RA, DEC
endif
enddo
if(associated(p)) call js_add(p,'tm',trim(adjustl(times_c(i-1)))) ! Время привязки проводки
endif
!-----------------------------------
else
write(ERROR_UNIT,*) 'DEBUG: n_current = ',n_current,' n_meas = ',n_meas,' n_binds = ',n_binds,' n_dext = ',n_dext
write(ERROR_UNIT,*) 'WARNING: ERROR candidates exit code = ',exit_err
endif
! освобождаем память
if(allocated(dext)) deallocate(dext)
if(allocated(meas)) deallocate(meas)
if(allocated(meas_r)) deallocate(meas_r)
if(allocated(binds)) deallocate(binds)
if(allocated(times)) deallocate(times)
if(allocated(times_c)) deallocate(times_c)
! выводим результат
call fson_print(result)
call fson_destroy(result)
call write_buildinfo()
end program seance
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