Transform a position (and optionally velocity) vector from IJK to a specified relative frame.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(in) | :: | mu |
gravitational parameter [km^3/s^2] |
||
| procedure(frame_transform_func) | :: | from_ijk_to_frame |
function to compute the transformation matrices |
|||
| real(kind=wp), | intent(in), | dimension(3) | :: | rt_ijk |
Target IJK absolute position vector [km] |
|
| real(kind=wp), | intent(in), | dimension(3) | :: | vt_ijk |
Target IJK absolute position vector [km] |
|
| real(kind=wp), | intent(in), | dimension(3) | :: | r_ijk |
Chaser IJK absolute position vector [km] |
|
| real(kind=wp), | intent(in), | dimension(3) | :: | v_ijk |
Chaser IJK absolute position vector [km] |
|
| real(kind=wp), | intent(out), | dimension(3) | :: | dr_frame |
Chaser frame position vector relative to target [km] |
|
| real(kind=wp), | intent(out), | optional, | dimension(3) | :: | dv_frame |
Chaser frame position vector relative to target [km] |
subroutine from_ijk_to_frame_rv(mu,from_ijk_to_frame,rt_ijk,vt_ijk,r_ijk,v_ijk,dr_frame,dv_frame) implicit none real(wp),intent(in) :: mu !! gravitational parameter [km^3/s^2] procedure(frame_transform_func) :: from_ijk_to_frame !! function to compute the transformation matrices real(wp),dimension(3),intent(in) :: rt_ijk !! Target IJK absolute position vector [km] real(wp),dimension(3),intent(in) :: vt_ijk !! Target IJK absolute position vector [km] real(wp),dimension(3),intent(in) :: r_ijk !! Chaser IJK absolute position vector [km] real(wp),dimension(3),intent(in) :: v_ijk !! Chaser IJK absolute position vector [km] real(wp),dimension(3),intent(out) :: dr_frame !! Chaser frame position vector relative to target [km] real(wp),dimension(3),intent(out),optional :: dv_frame !! Chaser frame position vector relative to target [km] real(wp),dimension(3,3) :: c real(wp),dimension(3,3) :: cdot real(wp),dimension(3) :: dr_ijk, dv_ijk !IJK state of chaser relative to target: dr_ijk = r_ijk - rt_ijk ! [target + delta = chaser] if (present(dv_frame)) then dv_ijk = v_ijk - vt_ijk ! [target + delta = chaser] call from_ijk_to_frame(mu,rt_ijk,vt_ijk,c=c,cdot=cdot) dr_frame = matmul( c, dr_ijk ) dv_frame = matmul( cdot, dr_ijk ) + matmul( c, dv_ijk ) else call from_ijk_to_frame(mu,r_ijk,v_ijk,c=c) dr_frame = matmul( c, dr_ijk ) end if end subroutine from_ijk_to_frame_rv