2022-02-06 23:45:08 +01:00
|
|
|
program movebloubs
|
|
|
|
|
|
|
|
use bloubspace
|
|
|
|
use povstuff
|
2024-02-06 17:03:00 +01:00
|
|
|
use mathstuff2
|
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
|
|
|
|
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
|
|
|
|
2024-02-06 17:03:00 +01:00
|
|
|
call init_random_seed()
|
|
|
|
|
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
|
|
|
|
2024-01-29 05:25:08 +01:00
|
|
|
!-
|
|
|
|
! begin of bigloop
|
|
|
|
!-
|
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)
|
2024-02-06 17:03:00 +01:00
|
|
|
if (bloub%radius .GT. 3.50) then
|
2024-01-29 05:25:08 +01:00
|
|
|
bloub%radius = bloub%radius * 0.999
|
2022-02-18 19:30:10 +01:00
|
|
|
endif
|
2022-03-18 12:21:40 +01:00
|
|
|
|
2024-02-06 17:03:00 +01:00
|
|
|
! if (bloub%radius .LT. 0.00015) then
|
|
|
|
! bloub%alive = .FALSE.
|
|
|
|
! endif
|
|
|
|
|
2024-01-29 05:25:08 +01:00
|
|
|
! XXX call green_soylent (bloub)
|
|
|
|
! XXX if (.NOT. bloub%alive) then
|
|
|
|
! XXX ! write(0, '(A)') " KILL!"
|
|
|
|
! XXX killed = killed + 1
|
|
|
|
! XXX 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"
|
2024-01-29 05:25:08 +01:00
|
|
|
if (killed .GT. 0) then
|
|
|
|
write (0, '(1X,I0,A)') killed, " bloubs killed"
|
|
|
|
endif
|
2022-02-06 23:45:08 +01:00
|
|
|
|
2024-01-29 05:25:08 +01:00
|
|
|
! ok, we have read all the bloubs from the input file
|
2022-02-11 15:26:52 +01:00
|
|
|
|
|
|
|
! insert some fancy conditional here
|
2024-02-06 17:03:00 +01:00
|
|
|
if (compteur .LT. 50) then
|
|
|
|
call add_more_bloubs(outu, 5, 0.046)
|
|
|
|
endif
|
|
|
|
|
|
|
|
rnd = rand()
|
|
|
|
! write(0, *) 'rnd= ', rnd
|
|
|
|
if (rnd .LT. 0.18) then
|
|
|
|
write (0, *) '... random of life ...'
|
|
|
|
call add_more_bloubs(outu, 5, 0.056)
|
2022-02-08 02:53:49 +01:00
|
|
|
endif
|
2022-02-06 23:45:08 +01:00
|
|
|
|
|
|
|
close(inu) ; close(outu)
|
|
|
|
|
2022-02-11 15:26:52 +01:00
|
|
|
! --------------------------------------------------------------
|
|
|
|
contains
|
|
|
|
|
2022-03-18 12:21:40 +01:00
|
|
|
subroutine add_more_bloubs(un, nbre, rayon)
|
2024-02-06 17:03:00 +01:00
|
|
|
implicit none
|
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
|
|
|
|
2024-02-06 17:03:00 +01:00
|
|
|
count = nbre+mod(irand(), 2)
|
|
|
|
write(0, '(1X,A,I0,1X,A)') "movebloubs: 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-02-06 17:03:00 +01:00
|
|
|
call make_a_random_bloub(bloub, 10.00)
|
|
|
|
bloub%radius = rayon + (0.11*rand())
|
2022-02-17 14:10:15 +01:00
|
|
|
bloub%age = 1
|
2024-02-06 17:03:00 +01:00
|
|
|
bloub%agemax = 160 + (count * 4)
|
2022-02-17 14:10:15 +01:00
|
|
|
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
|