Compare commits

...

4 Commits

Author SHA1 Message Date
tth
414572133d un peu de bla en plus 2022-03-22 23:53:30 +01:00
tth
152a3d5511 using random random seed 2022-03-22 16:21:36 +01:00
tth
e4afd2777d moving a file 2022-03-21 18:28:42 +01:00
tth
ac284a5764 REDO FROM START 2022-03-20 22:05:06 +01:00
5 changed files with 102 additions and 127 deletions

View File

@ -10,26 +10,34 @@ Lesquelles valeurs peuvent évoluer en fonction du temps.
## Description d'un bloub
Attention cette description n'est qu'un exemple !
Attention cette description n'est qu'un exemple, mais les points
essentiels de la première étape sont là.
Les caractériques dynamiques : position et vélocités.
Coté physique : l'age en bloubcycle (avec un maximum), la taille,
un petit nom, et un état (coucou la FSM).
```
type t_bloubs
character(8) :: nick
logical :: alive
integer :: state
integer :: num ! ???
real :: px, py, pz
real :: vx, vy, vz
real :: radius
integer :: age
integer :: age, agemax
end type t_bloubs
```
C'est simple, en fait. Le plus compliqué, c'est de savoir quoi en faire.
C'est (preseque) simple, en fait.
Le plus compliqué, c'est de savoir quoi faire de ce fatras
de *bigdata*.
On peut en fabriquer des gazillions, et ensuite
On peut fabriquer des gazillions de bloubs, et ensuite
les lacher dans un espace clôt, avec des parois
rebondissantes. Chaque choc va un peu les user, et au bout d'un moment,
ils vont mourir. C'est comme ça.
ils vont mourir. C'est comme ça, c'est la vie des bloubs.
## Comment ça fonctionne ?
@ -43,7 +51,7 @@ Pour le moment, l'ensemble des opérations est gérée par un script shell
qui enchaine des opérations plus élémentaires. Oui, je sais, ce n'est
pas optimal, mais c'est un cadre idéal pour les bricolages hasardeux.
Ces opérations agissent sur des fichiers de type `.blsb` qui sont,
Ces opérations agissent sur des fichiers de type `.blbs` qui sont,
vu du fortran, des dumps séquentiels du type t_bloubs. Un format
de fichier qui va être modifié assez souvent, ne gardez pas d'archives.
@ -51,7 +59,7 @@ de fichier qui va être modifié assez souvent, ne gardez pas d'archives.
Fabrication d'une population de bloubs plus ou moins aléatoires.
Deux paramètres : le nom du fichier et le nombre de bloubs.
Les règles de génération devraient être paramétrables.
Les règles de génération *devraient* être paramétrables.
### movebloubs
@ -68,6 +76,7 @@ juste de passage dans un pipeline.
Sortie sur `stdout` de certaines propriétes des bloubs, qui seront
reprise par un (ou des) scripts écrits en `awk`, afin de générer
ce qu'il faut pour les différents moteurs de rendu.
**Le format de sortie est susceptible de changer sans préavis.**
Bon, pour le moment, il n'y a que POVray, mais Gnuplot arrivera en second.

View File

@ -21,6 +21,8 @@ program genbloubs
write (0, '(A,I8,A)') &
"*** generating ", nbbloubs, " bloubs to "//trim(filename)
call init_random_seed()
open(newunit=idu, file=trim(filename), &
form='unformatted', &
access="sequential", &

View File

@ -14,9 +14,7 @@ program mergebloubs
integer :: inu, outu, errcode
type(t_bloubs), dimension(:), allocatable :: les_bloubs
integer :: i, idx, nbr_merge
real :: rval
logical :: merged
! --------------- check command line parameters
if (IARGC() .ne. 2) then
@ -28,118 +26,8 @@ program mergebloubs
write(0, '(A, 2A20, I8)') "*** mergebloubs ", &
trim(infile), trim(outfile), NB_MAX_BLOUBS
! --------------- allocate memory for the people
allocate (les_bloubs(NB_MAX_BLOUBS), stat=errcode)
if (0 .NE. errcode) then
STOP " : NO ENOUGH MEMORY"
endif
do i = 1, NB_MAX_BLOUBS
les_bloubs(i)%alive = .FALSE.
enddo
! --------------- open / creat the files
open(newunit=inu, &
file=trim(infile), form='unformatted', &
iostat=errcode, &
action='read', status='old')
if (0 .ne. errcode) then
STOP " : CAN'T OPEN FILE " // trim(infile)
endif
open(newunit=outu, &
file=trim(outfile), form='unformatted', &
iostat=errcode, &
action='write', status='replace')
if (0 .ne. errcode) then
STOP " : CAN'T OPEN " // trim(outfile) // "FOR WRITE"
endif
! --------------- read the first bloub
idx = 1
read (unit=inu, iostat=errcode) bloub
if (0 .ne. errcode) then
STOP " : ERR READING FIRST BLOUB"
endif
call display_bloub (bloub, "first bloub")
write(outu, iostat=errcode) bloub
if (0 .ne. errcode) then
STOP " : FIRST BLOUB, WRITE ERROR TO " // trim(outfile)
endif
les_bloubs(idx) = bloub
idx = idx + 1
! --------------- loop over the other bloubs
nbr_merge = 0
do ! infinite loop
! print *, "============ PASS ", idx
if (idx .EQ. NB_MAX_BLOUBS) then
write(0, '(I8, A)') idx, " max number of bloubs reached"
exit
endif
! read the next bloub from input file
read (unit=inu, iostat=errcode) bloub
if (0 .ne. errcode) then
exit
endif
!! call display_bloub (bloub, "next bloub")
if (.NOT. bloub%alive) then
STOP " : I HAVE READ A DEAD BLOUB"
endif
! check with all the previuous blobs
merged = .FALSE.
do i = 1, idx-1
if (.NOT. les_bloubs(i)%alive) then
! print *, "dead bloub at ", i, " on ", idx
! call display_bloub(les_bloubs(i), "DEAD ? WTF ?")
cycle
endif
rval = distance_of_bloubs(les_bloubs(i), bloub)
if (rval .LT. (les_bloubs(i)%radius + bloub%radius)) then
print *, "contact : ", i, idx, rval
call merge_two_bloubs(les_bloubs(i), bloub, newbloub)
les_bloubs(i)%alive = .FALSE.
nbr_merge = nbr_merge + 1
merged = .TRUE.
endif
enddo
if (merged) then
les_bloubs(idx) = newbloub
bloub = newbloub
else
! put old bloub in the list
les_bloubs(idx) = bloub
endif
write(outu, iostat=errcode) bloub
if (0 .ne. errcode) then
STOP " : WRITE ERROR TO " // trim(outfile)
endif
idx = idx + 1
! print *, "idx = ", idx
enddo ! end of infinit... WHAT?
! --------------- is the job done ?
close(inu) ; close(outu)
write(0, '()')
write(0, '(I5, A)') nbr_merge, " merges"
write(0, '(A)') "--- mergebloubs . . . . . . . [done]"
STOP '[done]'
! --------------------------------------------------------------
contains
@ -148,7 +36,7 @@ contains
type(t_bloubs), intent(in) :: bla, blb
type(t_bloubs), intent(out) :: blr
blr%nick = "newbie "
blr%nick = "merged "
blr%num = 0 ! ???
blr%px = (bla%px + blb%px) / 2.0

View File

@ -3,23 +3,26 @@ GFOPT = -Wall -Wextra -time -g -Imods/
# ---------------------------------------------
spitpgm.o: spitpgm.f90 Makefile
gfortran $(GFOPT) -c $<
mods/spitpgm.o: mods/spitpgm.f90 Makefile
gfortran $(GFOPT) -c $< -o $@
fraktals.o: fraktals.f90 Makefile
gfortran $(GFOPT) -c $<
OBJS = spitpgm.o fraktals.o
DOT_O = mods/points3d.o
OBJS = mods/spitpgm.o fraktals.o
DOT_O = mods/points3d.o
# ---------------------------------------------
julia: julia.f90 Makefile $(OBJS)
gfortran $(GFOPT) $< $(OBJS) -o $@
pickover: pickover.f90 Makefile $(OBJS)
pickover: pickover.f90 Makefile $(OBJS) $(DOT_O)
gfortran $(GFOPT) $< $(OBJS) $(DOT_O) -o $@
voxelize: voxelize.f90 Makefile $(OBJS)
gfortran $(GFOPT) $< $(OBJS) -o $@
lorentz: lorentz.f90 Makefile $(OBJS)
gfortran $(GFOPT) $< $(OBJS) -o $@

View File

@ -0,0 +1,73 @@
module spitpgm
implicit none
contains
!-----------------------------------------------------
subroutine spit_as_pgm(pic, fname)
integer, intent(in), dimension (:,:) :: pic
character (len=*), intent(in) :: fname
integer :: io, foo
integer :: ix, iy
real :: fk, fpix
write(0, '(1X, A)') "> spit_as_pgm to " // trim(fname)
open(newunit=io, file=fname)
write (io, '(a2)') "P2"
write (io, '(i0," ",i0)') size(pic, 1), size(pic, 2)
write (io, '(i0)') 65535
foo = MAXVAL(pic)
if (foo .EQ. 0) then
print *, " IS SOMETHING WRONG GOING TO HAPPEN ?"
do ix = 1, size(pic)
write (io, "(i0)") 0
enddo
else
fk = float(foo) / 65535.0
print *, " max pix value", foo, " fk = ", fk
do iy = 1, ubound(pic, 2)
do ix = 1, ubound(pic, 1)
fpix = float(pic(ix, iy)) / fk
write (io, "(i0)") int(fpix)
end do
end do
endif
close(io)
end subroutine
!-----------------------------------------------------
subroutine spit_as_pgm_8(pic, fname)
integer, intent(in), dimension (:,:) :: pic
character (len=*), intent(in) :: fname
integer :: io, foo
integer :: ix, iy
! XXX print *, "> spit_as_pgm_8 to ", fname
foo = MAXVAL(pic)
! XXX print *, " max = ", foo
open(newunit=io, file=fname)
write (io, '(a2)') "P2"
write (io, '(i0," ",i0)') size(pic, 1), size(pic, 2)
write (io, '(i0)') 255
do iy=1,ubound(pic, 2)
do ix=1, ubound(pic, 1)
foo = pic(ix, iy)
if (foo .GT. 255) foo = 255
write(io, "(i3)") foo
enddo
enddo
close(io)
end subroutine
!-----------------------------------------------------
end module spitpgm