Fortraneries/BloubWorld/movebloubs.f90

144 lines
3.6 KiB
Fortran
Raw Normal View History

2022-02-06 23:45:08 +01:00
program movebloubs
use bloubspace
use povstuff
2022-02-08 18:56:51 +01:00
use mathstuff
2022-02-06 23:45:08 +01:00
implicit none
character(200) :: infile, outfile
integer :: inu, outu, errcode, i
2022-02-08 18:56:51 +01:00
integer :: compteur, killed
2022-02-06 23:45:08 +01:00
type(t_bloubs) :: bloub
double precision :: bx, by, bz
2022-02-16 15:59:42 +01:00
! logical :: add_new_bloub = .TRUE.
2022-02-18 19:30:10 +01:00
real :: rnd
2022-02-08 18:56:51 +01:00
call init_random_seed()
2022-02-06 23:45:08 +01:00
i = IARGC()
if (i .ne. 2) then
STOP ": BAD ARGS ON COMMAND LINE"
endif
call getarg(1, infile)
call getarg(2, outfile)
write (0, '(A)') &
2022-03-25 22:42:15 +01:00
"### moving bloubs from "//trim(infile)//" to "//trim(outfile)
2022-02-06 23:45:08 +01:00
2022-02-08 18:56:51 +01:00
open(newunit=inu, &
file=trim(infile), form='unformatted', &
2022-02-06 23:45:08 +01:00
iostat=errcode, &
action='read', status='old')
if (0 .ne. errcode) then
STOP " : CAN'T OPEN FILE " // trim(infile)
endif
2022-02-08 18:56:51 +01:00
open(newunit=outu, &
file=trim(outfile), form='unformatted', &
iostat=errcode, &
2022-02-06 23:45:08 +01:00
action='write', status='replace')
if (0 .ne. errcode) then
2022-02-08 02:53:49 +01:00
STOP " : CAN'T OPEN " // trim(outfile) // "FOR WRITE"
2022-02-06 23:45:08 +01:00
endif
2022-03-18 12:21:40 +01:00
! write(0, '("Units: ", 2I5)') inu, outu
2022-02-06 23:45:08 +01:00
bx = 0.0; by = 0.0; bz = 0.0
2022-02-08 18:56:51 +01:00
compteur = 0
killed = 0
2022-02-06 23:45:08 +01:00
do
read (unit=inu, iostat=errcode) bloub
if (0 .ne. errcode) then
2022-02-08 18:56:51 +01:00
! may be we got an EOF ?
2022-02-06 23:45:08 +01:00
exit
endif
2022-03-18 12:21:40 +01:00
! moving, morphing and boundingboxing
2022-03-25 22:42:15 +01:00
call move_bloub (bloub, 0.185)
call bound_a_bloub (bloub)
if (bloub%radius .GT. 0.0238) then
bloub%radius = bloub%radius * 0.996
2022-02-18 19:30:10 +01:00
endif
2022-03-18 12:21:40 +01:00
2022-02-08 18:56:51 +01:00
call green_soylent (bloub)
if (.NOT. bloub%alive) then
2022-02-09 00:42:32 +01:00
! write(0, '(A)') " KILL!"
2022-02-08 18:56:51 +01:00
killed = killed + 1
endif
2022-03-18 12:21:40 +01:00
2022-02-08 02:53:49 +01:00
! calcul du barycentre
2022-02-08 18:56:51 +01:00
bx = bx + dble(bloub%px)
by = by + dble(bloub%py)
bz = bz + dble(bloub%pz)
2022-02-06 23:45:08 +01:00
2022-03-25 22:42:15 +01:00
if (bloub%alive) then
write(outu, iostat=errcode) bloub
if (0 .ne. errcode) then
STOP " : WRITE ERROR TO " // trim(outfile)
endif
compteur = compteur + 1
2022-02-07 02:08:17 +01:00
endif
2022-02-06 23:45:08 +01:00
2022-02-18 19:30:10 +01:00
enddo ! end of main loop
2024-01-25 21:44:49 +01:00
write(0, '(1X,I0,1X,A)') compteur, "bloubs processed"
2022-02-06 23:45:08 +01:00
2022-02-11 15:26:52 +01:00
! ok, we have read all the bloubs in the input file
! insert some fancy conditional here
2022-03-18 23:41:42 +01:00
if (compteur .LT. 200) then
2024-01-25 21:44:49 +01:00
call add_more_bloubs(outu, 4, 0.026)
2022-03-18 23:41:42 +01:00
endif
! insert some very fancy conditional here
2022-03-25 22:42:15 +01:00
if (compteur .LT. 800) then
2022-02-18 19:30:10 +01:00
rnd = rand()
2024-01-25 21:44:49 +01:00
! write (0, '(A,1X,F9.6)') "try to add bloubs, rnd is", rnd
2022-03-25 22:42:15 +01:00
if (rnd .LT. 0.0604) then
2024-01-25 21:44:49 +01:00
call add_more_bloubs(outu, 11, 0.019)
2022-02-17 14:10:15 +01:00
endif
2022-02-08 02:53:49 +01:00
endif
2022-02-06 23:45:08 +01:00
close(inu) ; close(outu)
2022-02-09 00:42:32 +01:00
if (killed .GT. 0) then
2024-01-25 21:44:49 +01:00
write (0, '(1X,I0,A)') killed, " bloubs killed"
2022-02-09 00:42:32 +01:00
endif
2022-02-08 18:56:51 +01:00
bx = bx / dble(compteur)
by = by / dble(compteur)
bz = bz / dble(compteur)
write (0, '(A,3(F12.6,3X))') "barycentre : ", bx, by, bz
2022-02-11 15:26:52 +01:00
! --------------------------------------------------------------
contains
2022-03-18 12:21:40 +01:00
subroutine add_more_bloubs(un, nbre, rayon)
2022-02-11 15:26:52 +01:00
integer, intent(in) :: un, nbre
2022-03-18 12:21:40 +01:00
real, intent(in) :: rayon
2022-02-11 15:26:52 +01:00
type(t_bloubs) :: bloub
2022-03-18 12:21:40 +01:00
integer :: foo, count
2022-02-11 15:26:52 +01:00
2022-03-25 22:42:15 +01:00
count = nbre+mod(irand(), 6)
2022-03-18 12:21:40 +01:00
write(0, '(A,I4,1X,A)') "adding", count, "bloubs"
2022-02-17 14:10:15 +01:00
2022-03-18 12:21:40 +01:00
do foo=1, count
2022-02-11 15:26:52 +01:00
bloub%nick = 'newbie '
2024-01-25 19:13:45 +01:00
call make_a_random_bloub(bloub)
2024-01-25 21:44:49 +01:00
bloub%radius = rayon + (0.05*rand())
2022-02-17 14:10:15 +01:00
bloub%age = 1
bloub%alive = .TRUE.
2022-03-18 12:21:40 +01:00
bloub%num = mod(irand(), 42)
2022-02-11 15:26:52 +01:00
write(un) bloub ! no error control ?
enddo
end subroutine
! --------------------------------------------------------------
2022-02-08 18:56:51 +01:00
2022-02-11 15:26:52 +01:00
end program movebloubs