2022-11-30 12:52:16 +11:00
|
|
|
!-----------------------------------------------------------------------
|
2022-11-28 23:47:44 +11:00
|
|
|
!
|
|
|
|
! project "gravity field"
|
|
|
|
!
|
2022-11-30 12:52:16 +11:00
|
|
|
!-----------------------------------------------------------------------
|
2022-11-24 10:52:13 +11:00
|
|
|
program essai
|
2022-11-28 23:47:44 +11:00
|
|
|
use realfield
|
2022-11-30 12:52:16 +11:00
|
|
|
use spitpgm ! XXX
|
|
|
|
|
2022-11-24 10:52:13 +11:00
|
|
|
implicit none
|
|
|
|
|
2022-11-28 23:47:44 +11:00
|
|
|
type(massbody) :: planet
|
|
|
|
integer :: foo
|
2022-11-30 12:52:16 +11:00
|
|
|
character (len=100) :: filename
|
|
|
|
|
|
|
|
planet%posx = 337.314
|
|
|
|
planet%posy = 164.666
|
|
|
|
planet%mass = 1e8
|
|
|
|
planet%serial = 42
|
2022-11-24 10:52:13 +11:00
|
|
|
|
2022-11-30 12:52:16 +11:00
|
|
|
do foo=0, 48
|
|
|
|
write (filename, "(a, i5.5, a)") 'WS/', foo, '.pgm'
|
|
|
|
call build_and_write_a_field(800, 600, planet, filename)
|
|
|
|
planet%posx = planet%posx + 6.99
|
|
|
|
planet%posy = planet%posy + 2.55
|
2022-11-28 23:47:44 +11:00
|
|
|
enddo
|
|
|
|
|
|
|
|
STOP 'YOLO'
|
2022-11-24 10:52:13 +11:00
|
|
|
|
2022-11-30 12:52:16 +11:00
|
|
|
contains
|
|
|
|
!-----------------------------------------------------------------------
|
|
|
|
!-
|
|
|
|
! compute a field with only one body; and write pic file
|
|
|
|
!-
|
|
|
|
subroutine build_and_write_a_field(szx, szy, moon, fname)
|
2022-11-28 23:47:44 +11:00
|
|
|
integer, intent(in) :: szx, szy
|
|
|
|
type(massbody), intent(in) :: moon
|
2022-11-30 12:52:16 +11:00
|
|
|
character (len=*), intent(in) :: fname
|
2022-11-28 23:47:44 +11:00
|
|
|
|
2022-11-30 12:52:16 +11:00
|
|
|
real :: maxi, mini
|
2022-11-28 23:47:44 +11:00
|
|
|
integer :: errcode
|
2022-11-30 12:52:16 +11:00
|
|
|
real, dimension(:,:), allocatable :: field
|
|
|
|
integer, dimension(:,:), allocatable :: greymap
|
2022-11-28 23:47:44 +11:00
|
|
|
|
|
|
|
allocate(field(szx, szy), stat=errcode)
|
2022-11-24 10:52:13 +11:00
|
|
|
|
2022-11-30 12:52:16 +11:00
|
|
|
call compute_a_field(field, moon)
|
2022-11-28 23:47:44 +11:00
|
|
|
maxi = maxval(field)
|
|
|
|
mini = minval(field)
|
|
|
|
print *, "field: ", mini, maxi, maxi-mini
|
2022-11-24 10:52:13 +11:00
|
|
|
|
2022-11-30 12:52:16 +11:00
|
|
|
allocate(greymap(szx, szy), stat=errcode)
|
|
|
|
greymap = 65535
|
|
|
|
! convert from real value to 16 bits int values
|
|
|
|
where (field < 65530.0)
|
|
|
|
greymap = int(field)
|
|
|
|
end where
|
|
|
|
|
|
|
|
call spit_as_pgm_16(greymap, trim(fname))
|
|
|
|
|
|
|
|
! make valgrind happy
|
2022-11-28 23:47:44 +11:00
|
|
|
deallocate(field)
|
2022-11-30 12:52:16 +11:00
|
|
|
deallocate(greymap)
|
2022-11-24 10:52:13 +11:00
|
|
|
|
2022-11-28 23:47:44 +11:00
|
|
|
end subroutine
|
2022-11-24 10:52:13 +11:00
|
|
|
|
2022-11-30 12:52:16 +11:00
|
|
|
!-----------------------------------------------------------------------
|
|
|
|
!-
|
|
|
|
! Compute the gravity field in a pre-allocated array relative
|
|
|
|
! to the massbody 'moon'. Nobody know where the magic number
|
|
|
|
! come from, sorry.
|
|
|
|
!-
|
|
|
|
subroutine compute_a_field(field, moon)
|
|
|
|
real, dimension(:,:), intent(out) :: field
|
|
|
|
type(massbody), intent(in) :: moon
|
|
|
|
|
|
|
|
integer :: ix, iy
|
|
|
|
real :: fx, fy
|
|
|
|
real :: grav
|
|
|
|
|
|
|
|
! print *, "pic size ", ubound(field, 1), "W", ubound(field, 2), "H"
|
|
|
|
! print *, "mass body ", moon
|
|
|
|
|
|
|
|
do ix=1, ubound(field, 1)
|
|
|
|
fx = real(ix)
|
|
|
|
do iy=1, ubound(field, 2)
|
|
|
|
fy = real(iy)
|
|
|
|
grav = compute_gravity(fx, fy, moon)
|
|
|
|
field(ix,iy) = grav
|
|
|
|
enddo
|
|
|
|
enddo
|
|
|
|
|
|
|
|
end subroutine
|
|
|
|
!-----------------------------------------------------------------------
|
|
|
|
!-----------------------------------------------------------------------
|
2022-11-24 10:52:13 +11:00
|
|
|
|
|
|
|
end program
|