Commit 158b1398 authored by Takhir Fakhrutdinov's avatar Takhir Fakhrutdinov

отладка сборки

parent 15e42185
......@@ -23,7 +23,7 @@ OBJF=$(BUILD)/test.o
GCC=gcc
FC=gfortran
AR=ar
GCCFLAGS += -g -Wall -c -O -I/opt/local/include -I/usr/local/include -I$(INCLUDE)
GCCFLAGS += -g -Wall -c -O -I/opt/local/include -I/usr/include -I$(INCLUDE)
GCCFLAGS += $(FCEXTRA)
FCFLAGS += -Wall -ffree-line-length-none -c -O -J$(MODDIR) -cpp
......
MAIN=library
include ../makefile.inc
\ No newline at end of file
!> @file nc_forcesium.f95
!> @date Apr 01, 2020
!>
!> @brief Генерация эфемерид для программы отображения
!> @details Программа выполняет расчет эфемерид космического объекта с заданным шагом для
!> использования в программе отображения состояния околоземной космической обстановки.
!>
!> Входные параметры
!>
!> D_CAT(1,ORBIT_SIZE_) R*8 - массив содержащий данные актуального списка орбит
!>
!> Выходные параметры
!>
!> XNEW(97,3) R*8 - эфемеридная информация
!>
submodule (library_m) lib_nc_forcesium
contains ! внутренй код
subroutine nc_forcesium(D_CAT,XNEW)
use adaps_m
use const_m
use library_m
IMPLICIT NONE
! Формальные параметры
REAL(8), intent(inout) :: D_CAT(1,ORBIT_SIZE_) !< вектор состояния КО
REAL(8), intent(inout) :: XNEW(97,3) !< эфемеридная информация
REAL(8) :: TTBEG ! TT задания начальных условий
REAL(8) :: TTIZM ! TT текущее
REAL(8) :: XK(6),XA(6),XAEND(6),XKEND(6)
REAL(8) :: DAT,DUT1,XP,YP
REAL(8) :: RITRS(3,3),RJ2000(3,3)
REAL(8) :: TIME = 86400.0D00
REAL(8) :: STEPINT=900.0D00 ! шаг интегрирования
! Рабочие массивы и переменные
INTEGER :: I,J,K
! орбиту в декартовых J2000 преобразуем в кеплеровы орбиты
DAT = DNULL
DUT1 = DNULL
XP = DNULL
YP = DNULL
XA(1:6)=D_CAT(1,3:8)
call nc_x2k(XA,XK)
TTBEG=D_CAT(1,2)+JDconst
do i=0,96
TTIZM = TTBEG+STEPINT*i/TIME
! Прогнозируем по Кеплеру
call nc_prkep(TTBEG,TTIZM,XK,XKEND)
! определяем координаты в J2000
CALL nc_k2x(XKEND,XAEND)
call nc_itrs2j2000 ( TTIZM, DNULL, DAT, DUT1, XP, YP, RITRS)
! берем нужную матрицу
do j=1,3
do k=1,3
RJ2000(j,k)=RITRS(k,j)
enddo
enddo
call nc_mabc(3,3,1,RJ2000,XAEND,XA)
XNEW(i+1,1:3)=XA(1:3)
enddo
RETURN
END
end submodule
\ No newline at end of file
This diff is collapsed.
!> @file nc_formf200.f95
!> @date Apr 26, 2019
!>
!> @brief Подпрограмма определения различных характеристик движения
!> КО по заданному вектору в СК J2000.0
!> @details Подпрограмма определения различных характеристик движения
!> КО по заданному вектору в СК J2000.0
!>
!> Формальные параметры
!>
!> @param[in] CNKO T - структура с номерами объектов
!> @param[in] Dext(NDEXT,DEXT_SIZE_) R*8 - массив динамических данных IERS
!> @param[in] XSAT (ORBIT_SIZE_) R*8 - массив состояния
!> @param[in] STAT(STAT_SIZE_) R*8 - массив статистики
!> @param[out] RC I*4 - код возврата
!>
!> Структура с номерами объекта и прочей лабудой необходимая для заполнения формы 200/400:
!>
!> type SATCAT
!>
!> integer :: dbno - Номер объекта в базе
!>
!> character (len=7) :: adaps - номер объекта в базе ADAPS (если есть номер NORAD = norad, если нет = Aznh)
!>
!> integer :: norad - номер объекта в каталоге КК ВВС США
!>
!> integer :: kiam - номер объекта в БД ИПМ
!>
!> integer :: znh - номер объекта в БД ЗНХ
!>
!> character (len=11) :: intdesNORAD - Международное обозначение объекта в каталоге КК ВВС США YYYY-NNNPPP
!> YYYY - год запуска NNN - порядковый номер запуск в году PPP - буквенное порядковое обозначение объекта в запуске
!>
!> character (len=11) :: intdesIPM - Международное обозначение объекта в сегменте АСПОС YYYYNNNkkkk
!> YYYY - год запуска NNN - порядковый номер запуск в году kkkk - порядковый номер объекта в запуске
!>
!> character (len=11) :: objecttype - тип объекта
!>
!> character (len=40) :: satname - название объекта
!>
!> character (len=10) :: site - полигон запуска
!>
!> character (len=10) :: launch - дата запуска
!>
!> character (len=10) :: notActive - время прекращения существования
!>
!> end type
!>
submodule (library_m) lib_nc_formf200
contains ! внутренй код
SUBROUTINE nc_formf200(CNKO,Dext,XSAT,STAT,RC,result)
use fson
use adaps_m
use const_m
use param_m
use wrjson
use forms_m
implicit none
type(SATCAT), intent(inout) :: CNKO !< структура с описанием номеров объекта
real(8), allocatable, intent(inout) :: Dext(:,:) !< массив с внешними данными
real(8), intent(inout) :: XSAT(ORBIT_SIZE_) !< расширенный вектор состояния КО
real(8), intent(inout) :: STAT(STAT_SIZE_) !< Статистика:
integer, intent(inout) :: RC !< код возврата
type(fson_value), pointer :: result !< результат в формате json
integer :: NDEXT
integer :: UVars ! тип уточняемых параметров
! 0 - только 6-и мерный вектор
! 1 - 6-и мерный вектор и баллистический коэффициент
! 2 - 6-и мерный вектор и коэффициент светового давления
! 3 - 6-и мерный вектор баллистический коэффициент и коэффициент светового давления
type(fson_value), pointer :: p ! результат в формате json
! Анализируем входные данные
RC=0; NDEXT=0
if(allocated(Dext)) NDEXT = size(Dext,1) ! количество строк
if(NDEXT.le.0) then
RC = -6; write(ERROR_UNIT,*) " nc_formf200 WARNING! control dimension"; return
endif
#ifdef DEBUG
write(ERROR_UNIT,*) "nc_formf200 : Dext:",NDEXT; call nc_printdext(Dext)
write(ERROR_UNIT,*) "nc_formf200 : XSAT"; call nc_printxorb(Xsat)
#endif
P_MODEL(1)=1 ! гравитационноное влияние Солнца
P_MODEL(2)=1 ! гравитационное влияние Луны
P_MODEL(3)=1 ! нецентральность поля тяготения Земли
P_MODEL(4)=1 ! учет светового давления
P_MODEL(5)=1 ! учет сопротивления атмосферы
P_MODEL(6)=8 ! количество учитываемых гармоник ГПЗ
UVars = 0 ! Тип уточняемых параметров
call frm_object_info(CNKO,result) ! Выводим содержимое блока ObjectInfo
call js_add(result,'Revolution','') ! Номер витка
call js_add(result,'EstimMoment',trim(itoa(2))) ! Тип момента уточнения
! 1 - на момент первого измерения
! 2 - на момент последнего измерения
! 3 - на середину мерного интервала
! 4 - на момент НУ
call js_add(result,'UVars',trim(itoa(UVars))) ! Тип уточняемых параметров
call frm_motion_model(result)
p => js_array(result,'StateVector')
call js_add(js_object(p),'coordsys','J2000')
call nc_formstatevector(UVars,XSAT,Dext,RC,js_object(p)) ! печать содержимого блока StateVector
call frm_statistics(STAT,result)
RC=0
end subroutine
end submodule
\ No newline at end of file
!> @file nc_formf400.f95
!> @date Apr 26, 2019
!>
!> @brief Подпрограмма определения различных характеристик сближения
!> @details Подпрограмма определения различных характеристик сближения
!> двух объектов по заданным векторам состояния в начальный момент и
!> момент максимального сближения
!>
!> Формальные параметры
!>
!> @param[in] CNKO_A T - структура с номерами объектa A
!> @param[in] CNKO_B T - структура с номерами объектa B
!> @param[in] Xbeg_A(ORBIT_SIZE_) R*8 - массив состояния объекта A в начальный момент времени
!> @param[in] Xbeg_B(ORBIT_SIZE_) R*8 - массив состояния объекта B в начальный момент времени
!> @param[in] Xend_A(ORBIT_SIZE_) R*8 - массив состояния объекта A в момент максимального сближения
!> @param[in] Xend_B(ORBIT_SIZE_) R*8 - массив состояния объекта B в момент максимального сближения
!> @param[in] NDEXT I*4 - количество строк в блоке динамических данных
!> @param[in] Dext(NDEXT,DEXT_SIZE_) R*8 - массив динамических данных IERS
!> @param[out] RC I - код возврата
!>
!>
!> Структура с номерами объекта и прочей лабудой необходимая для заполнения формы 200/400:
!>
!> type SATCAT
!>
!> integer :: dbno - Номер объекта в базе
!>
!> character (len=7) :: adaps - номер объекта в базе ADAPS (если есть номер NORAD = norad, если нет = Aznh)
!>
!> integer :: norad - номер объекта в каталоге КК ВВС США
!>
!> integer :: kiam - номер объекта в БД ИПМ
!>
!> integer :: znh - номер объекта в БД ЗНХ
!>
!> character (len=11) :: intdesNORAD - Международное обозначение объекта в каталоге КК ВВС США YYYY-NNNPPP
!> YYYY - год запуска NNN - порядковый номер запуск в году PPP - буквенное порядковое обозначение объекта в запуске
!>
!> character (len=11) :: intdesIPM - Международное обозначение объекта в сегменте АСПОС YYYYNNNkkkk
!> YYYY - год запуска NNN - порядковый номер запуск в году kkkk - порядковый номер объекта в запуске
!>
!> character (len=11) :: objecttype - тип объекта
!>
!> character (len=40) :: satname - название объекта
!>
!> character (len=10) :: site - полигон запуска
!>
!> character (len=10) :: launch - дата запуска
!>
!> character (len=10) :: notActive - время прекращения существования
!>
!> end type
!>
submodule (library_m) lib_nc_formf400
contains ! внутренй код
SUBROUTINE nc_formf400(CNKO_A,CNKO_B,XBEG_A,XBEG_B,XEND_A,XEND_B,Dext,RC, result)
use fson
use adaps_m
use const_m
use param_m
use forms_m
use wrjson
implicit none
type(SATCAT), intent(inout) :: CNKO_A !< структура с описанием номеров объекта A
type(SATCAT), intent(inout) :: CNKO_B !< структура с описанием номеров объекта B
real(8), intent(inout) :: XBEG_A(ORBIT_SIZE_) !< массив состояния объекта A в начальный момент времени
real(8), intent(inout) :: XBEG_B(ORBIT_SIZE_) !< массив состояния объекта B в начальный момент времени
real(8), intent(inout) :: XEND_A(ORBIT_SIZE_) !< массив состояния объекта A в момент времени максимального сближения
real(8), intent(inout) :: XEND_B(ORBIT_SIZE_) !< массив состояния объекта B в момент времени максимального сближения
real(8), allocatable, intent(inout) :: Dext(:,:) !< массив с внешними данными
integer, intent(inout) :: RC !< код возврата
type(fson_value), pointer :: result !< результат в формате json
integer :: NDEXT
integer :: UVars ! тип уточняемых параметров
! 0 - только 6-и мерный вектор
! 1 - 6-и мерный вектор и баллистический коэффициент
! 2 - 6-и мерный вектор и коэффициент светового давления
! 3 - 6-и мерный вектор баллистический коэффициент и коэффициент светового давления
type(fson_value), pointer :: p,po
#ifdef DEBUG
integer :: i ! рабочие
#endif
! Анализируем входные данные
RC=0; NDEXT=0
if(allocated(Dext)) NDEXT = size(Dext,1) ! количество строк
if(NDEXT.le.0) then
RC = -6; write(ERROR_UNIT,*) " nc_formf200 WARNING! control dimension"; return
endif
#ifdef DEBUG
write(ERROR_UNIT,*) "nc_formf400 : Dext:",NDEXT; call nc_printdext(Dext)
write(ERROR_UNIT,*) "XBEG_A:"
write(ERROR_UNIT,'(6G20.13)') (XBEG_A(i),i=1,ORBIT_SIZE_)
write(ERROR_UNIT,*) "XBEG_B:"
write(ERROR_UNIT,'(6G20.13)') (XBEG_B(i),i=1,ORBIT_SIZE_)
write(ERROR_UNIT,*) "XEND_A:"
write(ERROR_UNIT,'(6G20.13)') (XEND_A(i),i=1,ORBIT_SIZE_)
write(ERROR_UNIT,*) "XEND_B:"
write(ERROR_UNIT,'(6G20.13)') (XEND_B(i),i=1,ORBIT_SIZE_)
#endif
P_MODEL(1)=1 ! гравитационноное влияние Солнца
P_MODEL(2)=1 ! гравитационное влияние Луны
P_MODEL(3)=1 ! нецентральность поля тяготения Земли
P_MODEL(4)=1 ! учет светового давления
P_MODEL(5)=1 ! учет сопротивления атмосферы
P_MODEL(6)=8 ! количество учитываемых гармоник ГПЗ
UVars = 0 ! Тип уточняемых параметров
po => js_object(result,'PrimaryObject')
call frm_object_info(CNKO_A,po) ! Выводим содержимое блока ObjectInfo
p => js_array(po,'InitialStateVector')
call js_add(js_object(p),'coordsys','J2000')
call nc_formstatevector(UVars,XBEG_A,Dext,RC,js_object(p)) ! печать содержимого блока StateVector
p => js_array(po,'PropagatedStateVector')
call js_add(js_object(p),'coordsys','J2000')
call nc_formstatevector(UVars,XEND_A,Dext,RC,js_object(p)) ! печать содержимого блока StateVector
call nc_formapproach(XEND_A,XEND_B,Dext,RC,po) ! печать параметров сближения
call frm_motion_model(po)
po => js_object(result,'ApproachingObject')
call frm_object_info(CNKO_B,po) ! Выводим содержимое блока ObjectInfo
p => js_array(po,'InitialStateVector')
call js_add(js_object(p),'coordsys','J2000')
call nc_formstatevector(UVars,XBEG_B,Dext,RC,js_object(p)) ! печать содержимого блока StateVector
p => js_array(po,'PropagatedStateVector')
call js_add(js_object(p),'coordsys','J2000')
call nc_formstatevector(UVars,XEND_B,Dext,RC,js_object(p)) ! печать содержимого блока StateVector
call nc_formapproach(XEND_B,XEND_A,Dext,RC,po) ! печать параметров сближения
call frm_motion_model(po)
call nc_formother(XEND_A,XEND_B,Dext,RC,result) ! печать параметров сближения
RC=0
END
end submodule
\ No newline at end of file
!> @file nc_formother.f95
!> @date Apr 24, 2019
!>
!> @brief Подпрограмма вывода элементов опасного сближения
!> @details Подпрограмма вывода элементов опасного сближения
!> a именно:
!> @verbatim
!> <ApproachDate> дата и время момента максимальноого сближения
!> <MinimalDistance> минимальное геометрическое расстояние между сближающимися объектами
!> <Velocity> относительная скорость на момент максимального сближения
!> @endverbatim
!>
!> Формальные параметры
!>
!> @param[in] XSAT_A(ORBIT_SIZE_) R*4 - массив описывающий состояние объекта A
!> @param[in] XSAT_B(ORBIT_SIZE_) R*8 - массив описывающий состояние объекта B
!> @param[in] NDEXT I*4 - количество строк в блоке динамических данных
!> @param[in] Dext(NDEXT,DEXT_SIZE_) R*8 - массив динамических данных IERS
!>
!> Выходные параметры:
!> @param[out] RC I*4 - код возврата
!> @param[out] resust pointer - указатель на область вывода результатов
!>
submodule (library_m) lib_nc_formother
contains ! внутренй код
SUBROUTINE nc_formother(XSAT_A,XSAT_B,Dext,RC,result)
use adaps_m
use const_m
use forms_m
use fson
IMPLICIT NONE
real(8) :: nc_mag
REAL(8), intent(inout) :: XSAT_A(ORBIT_SIZE_) !< расширенный вектор сотсояния объекта A
REAL(8), intent(inout) :: XSAT_B(ORBIT_SIZE_) !< расширенный вектор сотсояния объекта B
REAL(8), allocatable, intent(inout) :: Dext(:,:) !< массив с внешними данными
INTEGER, intent(inout) :: RC !< код возврата
type(fson_value), pointer :: result !< указатель на область вывода результатов
REAL(8) :: XA(6) ! вектор КО в J2000 для объекта A
REAL(8) :: XB(6) ! вектор КО в J2000 для объекта B
REAL(8) :: Velocity ! относительная скорость объектов в момент максимального сближения
REAL(8) :: MinimalDistance ! минимальное геометрическое расстояние между сближающимися объектами
REAL(8) :: DUT1 ! параметры вращения земли delta UT1 (UT1-UTC)
REAL(8) :: DAT ! параметры вращения Земли Delta AT (UTC-TAI)
REAL(8) :: XP ! параметры вращения Земли Смещение полюса XP на дату P_JD
REAL(8) :: YP ! параметры вращения Земли Смещение полюса YP на дату P_JD
real(8) :: TT ! TT
real(8) :: UTC2TT ! поправка для перевода из UTC в TT
real(8) :: TT2UTC ! поправка для перевода из UTC в TT
INTEGER :: NDEXT
! Анализируем входные данные
RC=0; NDEXT=0
if(allocated(Dext)) NDEXT = size(Dext,1) ! количество строк
if(NDEXT.le.0) then
RC = -6; write(ERROR_UNIT,*) " nc_formf200 WARNING! control dimension"; return
endif
#ifdef DEBUG
write(ERROR_UNIT,*) "nc_formother : Dext:",NDEXT; call nc_printdext(Dext)
write(ERROR_UNIT,*) "nc_formother : XSAT_A"; call nc_printxorb(XSAT_A)
write(ERROR_UNIT,*) "nc_formother : XSAT_B"; call nc_printxorb(XSAT_B)
#endif
! Определяем значения IERS для даты
TT=XSAT_A(2)+JDconst ! время TT = UTC + delta AT + 32.184 = UTC + Dext(7)
call nc_iers(TT,Dext,DAT,DUT1,XP,YP,RC) ! получаем параметры вращения Земли
UTC2TT=(DAT+32.184D00) ! поправка UTC-TT (DAT+32.184) в секундах
#ifdef DEBUG
write(ERROR_UNIT,*) "UTC2TT,s", UTC2TT
#endif
TT2UTC= - UTC2TT/SECDAY ! поправка TT-UTC в сутках
call frm_datetime(TT,TT2UTC,'ApproachDate',result)
XA(1:6)=XSAT_A(3:8)
XB(1:6)=XSAT_B(3:8)
MinimalDistance=nc_mag((XB(1)-XA(1)),(XB(2)-XA(2)),(XB(3)-XA(3)))
Velocity=nc_mag((XB(4)-XA(4)),(XB(5)-XA(5)),(XB(6)-XA(6)))
call frm_additem(result,'MinimalDistance','unit','km',MinimalDistance)
call frm_additem(result,'Velocity','unit','km/s',Velocity)
RC=0
END
end submodule
\ No newline at end of file
This diff is collapsed.
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