Skip to content

Commit 3256811

Browse files
committed
made j2000_to_frame a function
also added frame_to_j2000
1 parent bb57f7e commit 3256811

File tree

3 files changed

+19
-9
lines changed

3 files changed

+19
-9
lines changed

src/moon_frame_module.F90

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ module moon_frame_module
3434
procedure,public :: initialize => initialize_moon_frame_interpolater
3535
procedure,public :: destroy => destroy_moon_frame_interpolater
3636
procedure,public :: j2000_to_frame
37+
procedure,public :: frame_to_j2000
3738
end type moon_frame_interpolater
3839

3940
contains
@@ -96,10 +97,11 @@ subroutine initialize_moon_frame_interpolater(me, filename, k, extrapolate)
9697

9798
end subroutine initialize_moon_frame_interpolater
9899

99-
subroutine j2000_to_frame(me, et, rot)
100+
function j2000_to_frame(me, et) result(rot)
101+
!! rotation matrix from J2000 to the frame
100102
class(moon_frame_interpolater), intent(inout) :: me
101103
real(wp), intent(in) :: et
102-
real(wp), intent(out) :: rot(3, 3)
104+
real(wp) :: rot(3, 3)
103105

104106
real(wp) :: roll, pitch, yaw_x, yaw_y, yaw
105107
integer :: iflag
@@ -113,7 +115,15 @@ subroutine j2000_to_frame(me, et, rot)
113115
! convert to rotation matrix:
114116
call rpy_to_rot(roll, pitch, yaw, rot)
115117

116-
end subroutine j2000_to_frame
118+
end function j2000_to_frame
119+
120+
function frame_to_j2000(me, et) result(rot)
121+
!! rotation matrix from the frame to j2000
122+
class(moon_frame_interpolater), intent(inout) :: me
123+
real(wp), intent(in) :: et
124+
real(wp) :: rot(3, 3)
125+
rot = transpose(me%j2000_to_frame(et))
126+
end function frame_to_j2000
117127

118128
pure subroutine rpy_to_rot(roll, pitch, yaw, r)
119129
!! roll, patch, yaw to rotation matrix

test/interp_test.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ program interp_test
1111
call moon_pa%initialize('data/moon_pa_2000_2100.csv')
1212

1313
et = 0.0_wp
14-
call moon_pa%j2000_to_frame(et, rot)
14+
rot = moon_pa%j2000_to_frame(et)
1515

1616
write(*,*) ''
1717
write(*,*) 'rot at et=0.0:'

test/test.f90

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ program test
3232
r(:,1) = 1737.4_wp * unit([1000.0_wp, 1000.0_wp, 1000.0_wp]) ! point on surface of moon
3333

3434
et = 0.0_wp
35-
call moon_pa%j2000_to_frame(et, rot)
35+
rot = moon_pa%j2000_to_frame(et)
3636
call from_j2000_to_moon_pa(real(et, real64), rot_true)
3737
write(*,*) ''
3838
write(*,*) 'rot error at et=0', rot_true - rot
3939
write(*,*) 'pos error: ', norm2(matmul(rot_true, r) - matmul(rot, r))
4040

4141
et = 21600.0_wp ! halfway between first two points
42-
call moon_pa%j2000_to_frame(et, rot)
42+
rot = moon_pa%j2000_to_frame(et)
4343
call from_j2000_to_moon_pa(real(et, real64), rot_true)
4444
write(*,*) ''
4545
write(*,*) 'rot error at et=21600', rot_true - rot
@@ -49,7 +49,7 @@ program test
4949
! quintic: -1.0719543411141785E-004 8.4190997773703202E-004 -1.9197702022211161E-004
5050

5151
et = (129600.0_wp + 86400.0_wp) / 2.0_wp
52-
call moon_pa%j2000_to_frame(et, rot)
52+
rot = moon_pa%j2000_to_frame(et)
5353
call from_j2000_to_moon_pa(real(et, real64), rot_true)
5454
write(*,*) ''
5555
write(*,*) 'rot error at et', rot_true - rot
@@ -66,7 +66,7 @@ program test
6666
do
6767
et = et + 6.0_wp *3600.0_wp
6868
if (et > 3187296000.0_wp) exit
69-
call moon_pa%j2000_to_frame(et, rot) ! splined version
69+
rot = moon_pa%j2000_to_frame(et) ! splined version
7070
call from_j2000_to_moon_pa(real(et, real64), rot_true) ! true version from spice : max error: 5.5664815594496319E-004 km
7171
! call from_j2000_to_iau_moon(et, rot_true) ! compare to iau_moon : max error: 0.98148100150030848 km
7272
r_error = norm2(matmul(rot_true, r) - matmul(rot, r))
@@ -94,7 +94,7 @@ program test
9494
do
9595
et = et + 6.0_wp *3600.0_wp
9696
if (et > 3187296000.0_wp) exit
97-
call moon_pa%j2000_to_frame(et, rot)
97+
rot = moon_pa%j2000_to_frame(et)
9898
end do
9999
call cpu_time(tend)
100100
write(*,'(A,F6.3,A)') 'spline time: ', (tend-tstart), 'sec'

0 commit comments

Comments
 (0)