// File: /workspace/github_cpp_makefile_star2_O1/istellartech[P]OpenTsiolkovsky/./boost/numeric/odeint/integrate/detail/integrate_const.hpp
// Function: unsigned long boost::numeric::odeint::detail::integrate_const<boost::numeric::odeint::dense_output_runge_kutta<boost::numeric::odeint::controlled_runge_kutta<boost::numeric::odeint::runge_kutta_dopri5<std::array<double, 14ul>, double, std::array<double, 14ul>, double, boost::numeric::odeint::array_algebra, boost::numeric::odeint::default_operations, boost::numeric::odeint::initially_resizer>, boost::numeric::odeint::default_error_checker<double, boost::numeric::odeint::array_algebra, boost::numeric::odeint::default_operations>, boost::numeric::odeint::default_step_adjuster<double, double>, boost::numeric::odeint::initially_resizer, boost::numeric::odeint::explicit_error_stepper_fsal_tag>, boost::numeric::odeint::explicit_controlled_stepper_fsal_tag>, RocketStage, std::array<double, 14ul>, double, std::reference_wrapper<CsvObserver>>(boost::numeric::odeint::dense_output_runge_kutta<boost::numeric::odeint::controlled_runge_kutta<boost::numeric::odeint::runge_kutta_dopri5<std::array<double, 14ul>, double, std::array<double, 14ul>, double, boost::numeric::odeint::array_algebra, boost::numeric::odeint::default_operations, boost::numeric::odeint::initially_resizer>, boost::numeric::odeint::default_error_checker<double, boost::numeric::odeint::array_algebra, boost::numeric::odeint::default_operations>, boost::numeric::odeint::default_step_adjuster<double, double>, boost::numeric::odeint::initially_resizer, boost::numeric::odeint::explicit_error_stepper_fsal_tag>, boost::numeric::odeint::explicit_controlled_stepper_fsal_tag>, RocketStage, std::array<double, 14ul>&, double, double, double, std::reference_wrapper<CsvObserver>, boost::numeric::odeint::dense_output_stepper_tag)
size_t integrate_const(
        Stepper stepper , System system , State &start_state ,
        Time start_time , Time end_time , Time dt ,
        Observer observer , dense_output_stepper_tag
)
{
    typename odeint::unwrap_reference< Observer >::type &obs = observer;
    typename odeint::unwrap_reference< Stepper >::type &st = stepper;

    Time time = start_time;
    
    st.initialize( start_state , time , dt );
    obs( start_state , time );
    time += dt;

    int obs_step( 1 );
    int real_step( 0 );
    
    while( less_eq_with_sign( static_cast<Time>(time+dt) , end_time , dt ) )
    {
        while( less_eq_with_sign( time , st.current_time() , dt ) )
        {
            st.calc_state( time , start_state );
            obs( start_state , time );
            ++obs_step;
            // direct computation of the time avoids error propagation happening when using time += dt
            // we need clumsy type analysis to get boost units working here
            time = start_time + static_cast< typename unit_value_type<Time>::type >(obs_step) * dt;
        }
        // we have not reached the end, do another real step
        if( less_with_sign( static_cast<Time>(st.current_time()+st.current_time_step()) ,
                            end_time ,
                            st.current_time_step() ) )
        {
            while( less_eq_with_sign( st.current_time() , time , dt ) )
            {
                st.do_step( system );
                ++real_step;
            }
        }
        else if( less_with_sign( st.current_time() , end_time , st.current_time_step() ) )
        { // do the last step ending exactly on the end point
            st.initialize( st.current_state() , st.current_time() , end_time - st.current_time() );
            st.do_step( system );
            ++real_step;
        }
        
    }
    // last observation, if we are still in observation interval
    // might happen due to finite precision problems when computing the the time
    if( less_eq_with_sign( time , end_time , dt ) )
    {
        st.calc_state( time , start_state );
        obs( start_state , time );
    }
    
    return real_step;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x1de8, %rsp           # imm = 0x1DE8
movq %rdx, %rbx
movsd %xmm1, 0x18(%rsp)
movq %rsi, %r14
movq %rdi, 0x58(%rsp)
leaq 0x1e20(%rsp), %r15
cmpb $0x0, 0x588(%r15)
jne 0x1afe0
movb $0x1, 0x588(%r15)
leaq 0x600(%r15), %r12
cmpb $0x0, 0x589(%r15)
leaq 0x590(%r15), %r13
movq %r12, %rdi
cmovneq %r13, %rdi
movl $0xe, %ecx
movq %r14, %rsi
rep  movsq (%rsi), %es:(%rdi)
movsd %xmm0, 0x750(%r15)
movsd %xmm2, 0x760(%r15)
movb $0x0, 0x768(%r15)
movq (%rbx), %rax
movq %rbx, %rdi
movq %r14, %rsi
movsd %xmm0, 0x48(%rsp)
movsd %xmm2, 0x8(%rsp)
callq *0x8(%rax)
movsd 0x8(%rsp), %xmm5
movsd 0x48(%rsp), %xmm4
addsd %xmm5, %xmm4
movapd %xmm4, %xmm0
addsd %xmm5, %xmm0
movsd 0x18(%rsp), %xmm2
movapd %xmm2, %xmm1
subsd %xmm0, %xmm1
subsd %xmm2, %xmm0
movsd 0xcccc(%rip), %xmm7     # 0x27d38
xorl %eax, %eax
ucomisd %xmm0, %xmm7
setae %al
xorl %ecx, %ecx
ucomisd %xmm1, %xmm7
setae %cl
xorpd %xmm8, %xmm8
ucomisd %xmm8, %xmm5
cmoval %eax, %ecx
xorl %ebp, %ebp
cmpb $0x1, %cl
jne 0x1b3e3
movq %r12, 0x28(%rsp)
movq %r14, 0x30(%rsp)
movq %rbx, 0x38(%rsp)
movl $0x1, %ebx
leaq 0x670(%r15), %rsi
leaq 0x6e0(%r15), %rdi
movq %rsi, 0x50(%rsp)
movq %rdi, 0x20(%rsp)
movq %r13, 0x10(%rsp)
movq %rbp, 0x40(%rsp)
movq %r15, %rdx
movsd 0x750(%r15), %xmm2
movapd %xmm4, %xmm0
subsd %xmm2, %xmm0
xorl %eax, %eax
ucomisd %xmm0, %xmm7
setae %al
movapd %xmm2, %xmm0
subsd %xmm4, %xmm0
xorl %ecx, %ecx
ucomisd %xmm0, %xmm7
setae %cl
ucomisd %xmm8, %xmm5
cmoval %eax, %ecx
cmpb $0x1, %cl
jne 0x1b1e4
movq 0x38(%rsp), %rbp
movq 0x30(%rsp), %r14
movq 0x28(%rsp), %r12
movq %rdx, %r15
movq 0x10(%rsp), %r13
movsd %xmm4, (%rsp)
cmpb $0x0, 0x589(%r15)
movq %r13, %rdx
cmovneq %r12, %rdx
movq %rsi, %rcx
cmovneq %rdi, %rcx
movq %r12, %r8
cmovneq %r13, %r8
movsd 0x758(%r15), %xmm1
movq 0x20(%rsp), %r9
cmovneq %rsi, %r9
movq %r15, %rdi
movapd %xmm4, %xmm0
movq %r14, %rsi
callq 0x1b5f8
movq (%rbp), %rax
movq %rbp, %rdi
movq %r14, %rsi
movsd (%rsp), %xmm0
callq *0x8(%rax)
movq 0x20(%rsp), %rdi
movq 0x50(%rsp), %rsi
xorpd %xmm8, %xmm8
movsd 0xcbaa(%rip), %xmm7     # 0x27d38
movsd 0x8(%rsp), %xmm5
incl %ebx
xorps %xmm4, %xmm4
cvtsi2sd %ebx, %xmm4
mulsd %xmm5, %xmm4
addsd 0x48(%rsp), %xmm4
movsd 0x750(%r15), %xmm2
movapd %xmm4, %xmm0
subsd %xmm2, %xmm0
xorl %eax, %eax
ucomisd %xmm0, %xmm7
setae %al
movapd %xmm2, %xmm0
subsd %xmm4, %xmm0
xorl %ecx, %ecx
ucomisd %xmm0, %xmm7
setae %cl
ucomisd %xmm8, %xmm5
cmoval %eax, %ecx
testb %cl, %cl
jne 0x1b122
jmp 0x1b1e7
movq %rdx, %r15
movsd 0x760(%r15), %xmm0
movapd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd 0x18(%rsp), %xmm6
movapd %xmm6, %xmm3
subsd %xmm1, %xmm3
xorl %eax, %eax
ucomisd %xmm7, %xmm3
seta %al
subsd %xmm6, %xmm1
xorl %ecx, %ecx
ucomisd %xmm7, %xmm1
seta %cl
ucomisd %xmm8, %xmm0
cmoval %eax, %ecx
cmpb $0x1, %cl
movq 0x58(%rsp), %r14
jne 0x1b2f1
movsd 0x750(%r15), %xmm0
movapd %xmm4, %xmm1
subsd %xmm0, %xmm1
subsd %xmm4, %xmm0
xorl %eax, %eax
ucomisd %xmm0, %xmm7
setae %al
xorl %ecx, %ecx
ucomisd %xmm1, %xmm7
setae %cl
ucomisd %xmm8, %xmm5
cmoval %eax, %ecx
cmpb $0x1, %cl
movq 0x10(%rsp), %r13
movq 0x40(%rsp), %rbp
leaq 0xf20(%rsp), %r12
jne 0x1b38b
movsd %xmm4, (%rsp)
movq %r12, %rdi
movq %r14, %rsi
callq 0x17bda
movq %r15, %rdi
movq %r12, %rsi
callq 0x1b49e
movq %r12, %rdi
callq 0x7358
incl %ebp
movsd 0x750(%r15), %xmm0
movsd (%rsp), %xmm4
movapd %xmm4, %xmm1
subsd %xmm0, %xmm1
subsd %xmm4, %xmm0
xorl %eax, %eax
movsd 0xca73(%rip), %xmm7     # 0x27d38
ucomisd %xmm0, %xmm7
setae %al
xorl %ecx, %ecx
ucomisd %xmm1, %xmm7
setae %cl
movsd 0x8(%rsp), %xmm5
xorpd %xmm8, %xmm8
ucomisd %xmm8, %xmm5
cmoval %eax, %ecx
testb %cl, %cl
jne 0x1b281
jmp 0x1b38b
movapd %xmm6, %xmm1
subsd %xmm2, %xmm1
xorl %eax, %eax
ucomisd %xmm7, %xmm1
seta %al
subsd %xmm6, %xmm2
xorl %ecx, %ecx
ucomisd %xmm7, %xmm2
seta %cl
ucomisd %xmm8, %xmm0
cmoval %eax, %ecx
cmpb $0x1, %cl
movq 0x10(%rsp), %r13
movq 0x40(%rsp), %rbp
jne 0x1b38b
movsd %xmm4, (%rsp)
cmpb $0x0, 0x588(%r15)
leaq 0x60(%rsp), %r12
jne 0x1b342
movb $0x1, 0x588(%r15)
movsd %xmm1, 0x760(%r15)
movb $0x0, 0x768(%r15)
movq %r12, %rdi
movq %r14, %rsi
callq 0x17bda
movq %r15, %rdi
movq %r12, %rsi
callq 0x1b49e
movq %r12, %rdi
callq 0x7358
incl %ebp
movsd (%rsp), %xmm4
movsd 0x8(%rsp), %xmm5
movsd 0xc9b2(%rip), %xmm7     # 0x27d38
xorpd %xmm8, %xmm8
movapd %xmm4, %xmm0
addsd %xmm5, %xmm0
movsd 0x18(%rsp), %xmm2
movapd %xmm2, %xmm1
subsd %xmm0, %xmm1
subsd %xmm2, %xmm0
xorl %eax, %eax
ucomisd %xmm0, %xmm7
setae %al
xorl %ecx, %ecx
ucomisd %xmm1, %xmm7
setae %cl
ucomisd %xmm8, %xmm5
cmoval %eax, %ecx
testb %cl, %cl
movq 0x50(%rsp), %rsi
movq 0x20(%rsp), %rdi
jne 0x1b0c7
movslq %ebp, %rbp
movq 0x38(%rsp), %rbx
movq 0x30(%rsp), %r14
movq 0x28(%rsp), %r12
movapd %xmm4, %xmm0
subsd %xmm2, %xmm0
xorl %eax, %eax
ucomisd %xmm0, %xmm7
setae %al
subsd %xmm4, %xmm2
xorl %ecx, %ecx
ucomisd %xmm2, %xmm7
setae %cl
ucomisd %xmm8, %xmm5
cmoval %eax, %ecx
cmpb $0x1, %cl
jne 0x1b474
leaq 0x670(%r15), %rax
leaq 0x6e0(%r15), %r9
cmpb $0x0, 0x589(%r15)
movq %r13, %rdx
cmovneq %r12, %rdx
movq %rax, %rcx
cmovneq %r9, %rcx
movsd 0x750(%r15), %xmm2
movsd 0x758(%r15), %xmm1
cmovneq %r13, %r12
cmovneq %rax, %r9
movq %r15, %rdi
movapd %xmm4, %xmm0
movq %r14, %rsi
movq %r12, %r8
movsd %xmm4, (%rsp)
callq 0x1b5f8
movq (%rbx), %rax
movq %rbx, %rdi
movq %r14, %rsi
movsd (%rsp), %xmm0
callq *0x8(%rax)
movq %rbp, %rax
addq $0x1de8, %rsp           # imm = 0x1DE8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x1b48b
movq %rax, %rbx
movq %r12, %rdi
callq 0x7358
movq %rbx, %rdi
callq 0x5650