halo_solver_main Subroutine

public subroutine halo_solver_main(config_file_name, debug)

Uses

  • proc~~halo_solver_main~~UsesGraph proc~halo_solver_main halo_solver_main module~parameters_module parameters_module proc~halo_solver_main->module~parameters_module fortran_astrodynamics_toolkit fortran_astrodynamics_toolkit module~parameters_module->fortran_astrodynamics_toolkit module~halo_kinds_module halo_kinds_module module~parameters_module->module~halo_kinds_module iso_fortran_env iso_fortran_env module~halo_kinds_module->iso_fortran_env

Main program to solve the Halo targeting problem.

Author

  • Jacob Williams : Sept. 2017

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: config_file_name

the config file to read

logical, intent(in) :: debug

for debugging prints


Calls

proc~~halo_solver_main~~CallsGraph proc~halo_solver_main halo_solver_main proc~constraint_violations mission_type%constraint_violations proc~halo_solver_main->proc~constraint_violations proc~define_problem_size mission_type%define_problem_size proc~halo_solver_main->proc~define_problem_size proc~export_trajectory_json_file mission_type%export_trajectory_json_file proc~halo_solver_main->proc~export_trajectory_json_file proc~generate_eclipse_data mission_type%generate_eclipse_data proc~halo_solver_main->proc~generate_eclipse_data proc~get_case_name mission_type%get_case_name proc~halo_solver_main->proc~get_case_name proc~get_segment_inputs segment%get_segment_inputs proc~halo_solver_main->proc~get_segment_inputs proc~get_x_from_json_file mission_type%get_x_from_json_file proc~halo_solver_main->proc~get_x_from_json_file proc~initialize_the_solver my_solver_type%initialize_the_solver proc~halo_solver_main->proc~initialize_the_solver proc~plot_trajectory mission_type%plot_trajectory proc~halo_solver_main->proc~plot_trajectory proc~print_constraint_defects mission_type%print_constraint_defects proc~halo_solver_main->proc~print_constraint_defects proc~put_x_in_segments mission_type%put_x_in_segments proc~halo_solver_main->proc~put_x_in_segments proc~write_optvars_to_file mission_type%write_optvars_to_file proc~halo_solver_main->proc~write_optvars_to_file solve solve proc~halo_solver_main->solve status status proc~halo_solver_main->status proc~constraint_violations->proc~put_x_in_segments proc~get_problem_arrays mission_type%get_problem_arrays proc~constraint_violations->proc~get_problem_arrays proc~propagate_segment segment%propagate_segment proc~constraint_violations->proc~propagate_segment proc~segs_to_propagate mission_type%segs_to_propagate proc~constraint_violations->proc~segs_to_propagate add add proc~export_trajectory_json_file->add create_array create_array proc~export_trajectory_json_file->create_array create_object create_object proc~export_trajectory_json_file->create_object destroy destroy proc~export_trajectory_json_file->destroy initialize initialize proc~export_trajectory_json_file->initialize insert_after insert_after proc~export_trajectory_json_file->insert_after proc~destroy_trajectory trajectory%destroy_trajectory proc~export_trajectory_json_file->proc~destroy_trajectory proc~export_trajectory_json_file->proc~propagate_segment proc~generate_eclipse_data->proc~get_case_name proc~generate_eclipse_data->add icrf_frame icrf_frame proc~generate_eclipse_data->icrf_frame proc~generate_eclipse_data->initialize proc~generate_eclipse_data->proc~destroy_trajectory proc~get_sun_fraction get_sun_fraction proc~generate_eclipse_data->proc~get_sun_fraction proc~generate_eclipse_data->proc~propagate_segment transform transform proc~generate_eclipse_data->transform two_body_rotating_frame two_body_rotating_frame proc~generate_eclipse_data->two_body_rotating_frame get get proc~get_x_from_json_file->get get_child get_child proc~get_x_from_json_file->get_child info info proc~get_x_from_json_file->info load load proc~get_x_from_json_file->load proc~initialize_the_solver->proc~define_problem_size proc~initialize_the_solver->status proc~initialize_the_solver->initialize proc~get_sparsity_pattern mission_type%get_sparsity_pattern proc~initialize_the_solver->proc~get_sparsity_pattern proc~initialize_the_mission mission_type%initialize_the_mission proc~initialize_the_solver->proc~initialize_the_mission proc~read_config_file my_solver_type%read_config_file proc~initialize_the_solver->proc~read_config_file proc~plot_trajectory->proc~get_case_name add_3d_plot add_3d_plot proc~plot_trajectory->add_3d_plot add_sphere add_sphere proc~plot_trajectory->add_sphere proc~plot_trajectory->initialize proc~plot_trajectory->proc~destroy_trajectory proc~plot_trajectory->proc~propagate_segment savefig savefig proc~plot_trajectory->savefig proc~print_constraint_defects->proc~define_problem_size proc~print_constraint_defects->proc~get_problem_arrays proc~put_x_in_segments->proc~define_problem_size extract_vector extract_vector proc~put_x_in_segments->extract_vector proc~set_segment_inputs segment%set_segment_inputs proc~put_x_in_segments->proc~set_segment_inputs proc~write_optvars_to_file->proc~get_case_name proc~write_optvars_to_file->add proc~write_optvars_to_file->create_array proc~write_optvars_to_file->create_object proc~write_optvars_to_file->destroy proc~write_optvars_to_file->initialize proc~write_optvars_to_file->insert_after fill_vector fill_vector proc~get_problem_arrays->fill_vector proc~get_sparsity_pattern->proc~define_problem_size proc~apparent_position apparent_position proc~get_sun_fraction->proc~apparent_position proc~cubic_shadow_model cubic_shadow_model proc~get_sun_fraction->proc~cubic_shadow_model proc~from_j2000moon_to_j2000ssb from_j2000moon_to_j2000ssb proc~get_sun_fraction->proc~from_j2000moon_to_j2000ssb proc~initialize_the_mission->proc~define_problem_size proc~initialize_the_mission->initialize proc~initialize_the_mission->proc~get_problem_arrays proc~initialize_the_mission->proc~get_sparsity_pattern proc~initialize_the_mission->proc~set_segment_inputs initialize_splinded_ephemeris initialize_splinded_ephemeris proc~initialize_the_mission->initialize_splinded_ephemeris magnitude magnitude proc~initialize_the_mission->magnitude proc~get_scales_from_segs mission_type%get_scales_from_segs proc~initialize_the_mission->proc~get_scales_from_segs set_dpert set_dpert proc~initialize_the_mission->set_dpert set_sparsity_pattern set_sparsity_pattern proc~initialize_the_mission->set_sparsity_pattern proc~propagate_segment->icrf_frame proc~propagate_segment->transform proc~propagate_segment->two_body_rotating_frame first_call first_call proc~propagate_segment->first_call integrate integrate proc~propagate_segment->integrate proc~set_segment_outputs segment%set_segment_outputs proc~propagate_segment->proc~set_segment_outputs proc~read_config_file->initialize evaluate evaluate proc~read_config_file->evaluate none~get config_file%get proc~read_config_file->none~get proc~generate_patch_points mission_type%generate_patch_points proc~read_config_file->proc~generate_patch_points proc~read_epoch read_epoch proc~read_config_file->proc~read_epoch proc~update_epoch mission_type%update_epoch proc~read_config_file->proc~update_epoch proc~set_segment_inputs->icrf_frame proc~set_segment_inputs->transform proc~set_segment_inputs->two_body_rotating_frame proc~get_char config_file%get_char none~get->proc~get_char proc~get_int config_file%get_int none~get->proc~get_int proc~get_logical config_file%get_logical none~get->proc~get_logical proc~get_real config_file%get_real none~get->proc~get_real proc~get_real_vec config_file%get_real_vec none~get->proc~get_real_vec axis_angle_rotation axis_angle_rotation proc~apparent_position->axis_angle_rotation cross cross proc~apparent_position->cross proc~get_pos get_pos proc~apparent_position->proc~get_pos unit unit proc~apparent_position->unit acosd acosd proc~cubic_shadow_model->acosd asind asind proc~cubic_shadow_model->asind proc~cubic_shadow_model->unit wrap_angle wrap_angle proc~cubic_shadow_model->wrap_angle proc~from_j2000moon_to_j2000ssb->icrf_frame proc~from_j2000moon_to_j2000ssb->transform proc~generate_patch_points->initialize proc~generate_patch_points->first_call proc~generate_patch_points->integrate compute_crtpb_parameter compute_crtpb_parameter proc~generate_patch_points->compute_crtpb_parameter proc~get_scales_from_segs->proc~define_problem_size proc~get_scales_from_segs->fill_vector proc~read_epoch->none~get jd_to_et jd_to_et proc~read_epoch->jd_to_et julian_date julian_date proc~read_epoch->julian_date et_to_jd et_to_jd proc~update_epoch->et_to_jd proc~update_epoch->jd_to_et proc~update_epoch->julian_date julian_date_to_calendar_date julian_date_to_calendar_date proc~update_epoch->julian_date_to_calendar_date proc~get_char->get proc~get_int->get proc~get_logical->get get_r get_r proc~get_pos->get_r get_rv get_rv proc~get_pos->get_rv proc~get_real->get proc~get_real_vec->get

Source Code

    subroutine halo_solver_main(config_file_name,debug)

    use parameters_module
!$  use omp_lib

    implicit none

    character(len=*),intent(in) :: config_file_name  !! the config file to read
    logical,intent(in) :: debug !! for debugging prints

    type(my_solver_type) :: solver  !! an instance of the solver that we will use
    real(wp),dimension(:),allocatable :: x  !! solver opt vars vector ["forward-backward" formulation]
    integer :: m  !! number of functions
    real(wp),dimension(:),allocatable :: f  !! function vector (constraint violations)
    real(wp) :: tstart, tend  !! for timing
    real(wp) :: tstart_cpu, tend_cpu  !! for timing
    integer :: istat
    character(len=:),allocatable :: message  !! Text status message from solver
    integer :: n_segs, iseg
    real(wp),dimension(6) :: x_rotating
    character(len=:),allocatable :: mkspk_input, bsp_output  !! filenames for mkspk
!$  integer :: tid, nthreads

!$OMP PARALLEL PRIVATE(NTHREADS, TID)
!$
!$  tid = omp_get_thread_num()
!$
!$  if (tid == 0) then
!$      nthreads = omp_get_num_threads()
!$      write(*,'(A,1X,I3)') ' * Number of OMP threads: ', OMP_get_num_threads()
!$  end if
!$
!$OMP END PARALLEL

    if (debug) then
        write(*,*) ''
        write(*,*) '----------------------'
        write(*,*) 'Initializing...'
        write(*,*) '----------------------'
        write(*,*) ''
    end if

    call solver%init(config_file_name,x)  ! initialize the solver & mission (and generate the initial guess)

    if (allocated(solver%mission%initial_guess_from_file)) then
        if (solver%mission%initial_guess_from_file /= '') then
            !TODO: add some error checking here !
            if (debug) write(*,*) 'Reading initial guess from file: '//solver%mission%initial_guess_from_file
            call solver%mission%get_x_from_json_file(x) ! get solution from the file
            call solver%mission%put_x_in_segments(x) ! populate segs with solution
        end if
    end if

    if (solver%mission%generate_plots) &
        call solver%mission%plot('guess', draw_trajectory=.true.)    ! plot the initial guess
    if (solver%mission%generate_guess_and_solution_files) &
        call solver%mission%write_optvars_to_file('guess',x)    ! write guess to a file

    !....debugging....
    ! if (solver%mission%generate_trajectory_files) &
    !     call solver%mission%plot('guess',&
    !             draw_trajectory = .false., &
    !             export_trajectory=solver%mission%generate_trajectory_files)
    !....debugging....

    if (debug) then
        call solver%mission%define_problem_size(m=m)
        allocate(f(m))
        call solver%mission%constraint_violations(x,f)
        write(*,*) ''
        write(*,*) '----------------------'
        write(*,*) 'Initial Guess...'
        write(*,*) '----------------------'
        write(*,*) ''
        write(*,'(A/,*(F30.16/))') 'x:      ', x * solver%mission%xscale    ! unscaled values
        write(*,*) ''
        write(*,'(A/,*(F30.16/))') 'f:      ', f    ! scaled values
        write(*,*) ''
    end if

    if (debug) then
        write(*,*) 'INITIAL GUESS:'
        call solver%mission%define_problem_size(n_segs=n_segs)
        do iseg = 1, n_segs
            call solver%mission%segs(iseg)%get_inputs(x0_rotating=x_rotating)
            write(*,'(I5, *(F15.6,1X))') iseg, x_rotating
        end do
    end if

    if (solver%mission%solve) then
        if (debug) then
            write(*,*) ''
            write(*,*) '----------------------'
            write(*,*) 'Solving...'
            write(*,*) '----------------------'
            write(*,*) ''
        end if
        write(*,'(A)') ' * Solving'
        write(*,*) ''

        call cpu_time(tstart_cpu)
!$      tstart = omp_get_wtime()
        call solver%solve(x)  ! call the solver
        call solver%status(istat=istat, message=message)
        call cpu_time(tend_cpu)
!$      tend = omp_get_wtime()
        call solver%mission%put_x_in_segments(x) ! populate segs with solution
    else
        call cpu_time(tstart_cpu)
        call cpu_time(tend_cpu)
        message = 'Not solved'
    end if

    if (debug) then
        write(*,*) ''
        write(*,*) '----------------------'
        write(*,*) 'Solution...'
        write(*,*) '----------------------'
        write(*,*) ''
    end if

    write(*,*) ''
    write(*,'(A)') ' * Status: '//message
    write(*,'(A,1x,F10.3,1x,a)') ' * Elapsed cpu_time: ', (tend_cpu-tstart_cpu), 'sec'
!$  write(*,'(A,1x,F10.3,1x,a)') ' * OMP wall time   : ', (tend-tstart), 'sec'
    write(*,*) ''

    if (solver%mission%generate_guess_and_solution_files) then
        if (debug) write(*,*) 'generate solution file'
        call solver%mission%write_optvars_to_file('solution',x) ! write solution to a file
    end if

    ! export solution to plot or trajectory file
    if (solver%mission%generate_trajectory_files .or. solver%mission%generate_plots) then
        if (debug) write(*,*) 'export solution trajectory'
        call solver%mission%plot('solution',&
                draw_trajectory=solver%mission%generate_plots, &
                export_trajectory=solver%mission%generate_trajectory_files)
    end if

    if (solver%mission%generate_kernel) then
        if (.not. solver%mission%generate_trajectory_files) then
            write(*,*) 'error: kernel generation requires the trajectory file to be exported'
        else
            if (debug) write(*,*) 'generate kernel'
            mkspk_input = 'solution_'//solver%mission%get_case_name()//'.txt'
            bsp_output  = 'solution_'//solver%mission%get_case_name()//'.bsp'
            call execute_command_line('kernel/mkspk -setup kernel/setup.txt -input '//mkspk_input//' -output '//bsp_output)
        end if
    end if

    if (debug) then
        write(*,*) 'SOLUTION:'
        call solver%mission%define_problem_size(n_segs=n_segs)
        do iseg = 1, n_segs
            call solver%mission%segs(iseg)%get_inputs(x0_rotating=x_rotating)
            write(*,'(I5, *(F15.6,1X))') iseg, x_rotating
        end do
    end if

    if (solver%mission%generate_defect_file) then
        if (debug) write(*,*) 'generate defect file'
        call solver%mission%print_constraint_defects('solution_defects_'//&
                                                     solver%mission%get_case_name()//&
                                                     '.csv')
    end if

    if (solver%mission%generate_json_trajectory_file) then
        if (debug) write(*,*) 'export JSON trajectory file'
        call solver%mission%export_trajectory_json_file('traj_'//solver%mission%get_case_name())
    end if

    if (solver%mission%generate_eclipse_files) then
        if (debug) write(*,*) 'generate eclipse file'
        call solver%mission%generate_eclipse_data('eclipse', &
                                                  filetype = solver%mission%eclipse_filetype)
    end if

    if (solver%mission%run_pyvista_script) then
        if (debug) write(*,*) 'run pyvista script'
        !mkspk_input = 'solution_'//solver%mission%get_case_name()//'.txt'
        mkspk_input = 'traj_'//solver%mission%get_case_name()//'.json'
        call execute_command_line('python ./python/plot_utilities.py '//mkspk_input)
    end if

    end subroutine halo_solver_main