Compare commits
No commits in common. "414572133db8ff0d22a0df1d6ec3cb6b5de8a10d" and "101ae7c1e806af289dbc63db18f6d159df285af8" have entirely different histories.
414572133d
...
101ae7c1e8
@ -10,34 +10,26 @@ Lesquelles valeurs peuvent évoluer en fonction du temps.
|
|||||||
|
|
||||||
## Description d'un bloub
|
## Description d'un bloub
|
||||||
|
|
||||||
Attention cette description n'est qu'un exemple, mais les points
|
Attention cette description n'est qu'un exemple !
|
||||||
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
|
type t_bloubs
|
||||||
character(8) :: nick
|
character(8) :: nick
|
||||||
logical :: alive
|
logical :: alive
|
||||||
integer :: state
|
integer :: state
|
||||||
integer :: num ! ???
|
|
||||||
real :: px, py, pz
|
real :: px, py, pz
|
||||||
real :: vx, vy, vz
|
real :: vx, vy, vz
|
||||||
real :: radius
|
real :: radius
|
||||||
integer :: age, agemax
|
integer :: age
|
||||||
end type t_bloubs
|
end type t_bloubs
|
||||||
```
|
```
|
||||||
|
|
||||||
C'est (preseque) simple, en fait.
|
C'est simple, en fait. Le plus compliqué, c'est de savoir quoi en faire.
|
||||||
Le plus compliqué, c'est de savoir quoi faire de ce fatras
|
|
||||||
de *bigdata*.
|
|
||||||
|
|
||||||
On peut fabriquer des gazillions de bloubs, et ensuite
|
On peut en fabriquer des gazillions, et ensuite
|
||||||
les lacher dans un espace clôt, avec des parois
|
les lacher dans un espace clôt, avec des parois
|
||||||
rebondissantes. Chaque choc va un peu les user, et au bout d'un moment,
|
rebondissantes. Chaque choc va un peu les user, et au bout d'un moment,
|
||||||
ils vont mourir. C'est comme ça, c'est la vie des bloubs.
|
ils vont mourir. C'est comme ça.
|
||||||
|
|
||||||
## Comment ça fonctionne ?
|
## Comment ça fonctionne ?
|
||||||
|
|
||||||
@ -51,7 +43,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
|
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.
|
pas optimal, mais c'est un cadre idéal pour les bricolages hasardeux.
|
||||||
|
|
||||||
Ces opérations agissent sur des fichiers de type `.blbs` qui sont,
|
Ces opérations agissent sur des fichiers de type `.blsb` qui sont,
|
||||||
vu du fortran, des dumps séquentiels du type t_bloubs. Un format
|
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.
|
de fichier qui va être modifié assez souvent, ne gardez pas d'archives.
|
||||||
|
|
||||||
@ -59,7 +51,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.
|
Fabrication d'une population de bloubs plus ou moins aléatoires.
|
||||||
Deux paramètres : le nom du fichier et le nombre de bloubs.
|
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
|
### movebloubs
|
||||||
|
|
||||||
@ -76,7 +68,6 @@ juste de passage dans un pipeline.
|
|||||||
Sortie sur `stdout` de certaines propriétes des bloubs, qui seront
|
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
|
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.
|
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.
|
Bon, pour le moment, il n'y a que POVray, mais Gnuplot arrivera en second.
|
||||||
|
|
||||||
|
@ -21,8 +21,6 @@ program genbloubs
|
|||||||
write (0, '(A,I8,A)') &
|
write (0, '(A,I8,A)') &
|
||||||
"*** generating ", nbbloubs, " bloubs to "//trim(filename)
|
"*** generating ", nbbloubs, " bloubs to "//trim(filename)
|
||||||
|
|
||||||
call init_random_seed()
|
|
||||||
|
|
||||||
open(newunit=idu, file=trim(filename), &
|
open(newunit=idu, file=trim(filename), &
|
||||||
form='unformatted', &
|
form='unformatted', &
|
||||||
access="sequential", &
|
access="sequential", &
|
||||||
|
@ -14,7 +14,9 @@ program mergebloubs
|
|||||||
integer :: inu, outu, errcode
|
integer :: inu, outu, errcode
|
||||||
|
|
||||||
type(t_bloubs), dimension(:), allocatable :: les_bloubs
|
type(t_bloubs), dimension(:), allocatable :: les_bloubs
|
||||||
|
integer :: i, idx, nbr_merge
|
||||||
|
real :: rval
|
||||||
|
logical :: merged
|
||||||
|
|
||||||
! --------------- check command line parameters
|
! --------------- check command line parameters
|
||||||
if (IARGC() .ne. 2) then
|
if (IARGC() .ne. 2) then
|
||||||
@ -26,8 +28,118 @@ program mergebloubs
|
|||||||
write(0, '(A, 2A20, I8)') "*** mergebloubs ", &
|
write(0, '(A, 2A20, I8)') "*** mergebloubs ", &
|
||||||
trim(infile), trim(outfile), NB_MAX_BLOUBS
|
trim(infile), trim(outfile), NB_MAX_BLOUBS
|
||||||
|
|
||||||
|
! --------------- allocate memory for the people
|
||||||
|
|
||||||
STOP '[done]'
|
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]"
|
||||||
|
|
||||||
! --------------------------------------------------------------
|
! --------------------------------------------------------------
|
||||||
contains
|
contains
|
||||||
@ -36,7 +148,7 @@ contains
|
|||||||
type(t_bloubs), intent(in) :: bla, blb
|
type(t_bloubs), intent(in) :: bla, blb
|
||||||
type(t_bloubs), intent(out) :: blr
|
type(t_bloubs), intent(out) :: blr
|
||||||
|
|
||||||
blr%nick = "merged "
|
blr%nick = "newbie "
|
||||||
blr%num = 0 ! ???
|
blr%num = 0 ! ???
|
||||||
|
|
||||||
blr%px = (bla%px + blb%px) / 2.0
|
blr%px = (bla%px + blb%px) / 2.0
|
||||||
|
@ -3,26 +3,23 @@ GFOPT = -Wall -Wextra -time -g -Imods/
|
|||||||
|
|
||||||
# ---------------------------------------------
|
# ---------------------------------------------
|
||||||
|
|
||||||
mods/spitpgm.o: mods/spitpgm.f90 Makefile
|
spitpgm.o: spitpgm.f90 Makefile
|
||||||
gfortran $(GFOPT) -c $< -o $@
|
gfortran $(GFOPT) -c $<
|
||||||
|
|
||||||
fraktals.o: fraktals.f90 Makefile
|
fraktals.o: fraktals.f90 Makefile
|
||||||
gfortran $(GFOPT) -c $<
|
gfortran $(GFOPT) -c $<
|
||||||
|
|
||||||
OBJS = mods/spitpgm.o fraktals.o
|
OBJS = spitpgm.o fraktals.o
|
||||||
DOT_O = mods/points3d.o
|
DOT_O = mods/points3d.o
|
||||||
|
|
||||||
# ---------------------------------------------
|
# ---------------------------------------------
|
||||||
|
|
||||||
julia: julia.f90 Makefile $(OBJS)
|
julia: julia.f90 Makefile $(OBJS)
|
||||||
gfortran $(GFOPT) $< $(OBJS) -o $@
|
gfortran $(GFOPT) $< $(OBJS) -o $@
|
||||||
|
|
||||||
pickover: pickover.f90 Makefile $(OBJS) $(DOT_O)
|
pickover: pickover.f90 Makefile $(OBJS)
|
||||||
gfortran $(GFOPT) $< $(OBJS) $(DOT_O) -o $@
|
gfortran $(GFOPT) $< $(OBJS) $(DOT_O) -o $@
|
||||||
|
|
||||||
voxelize: voxelize.f90 Makefile $(OBJS)
|
|
||||||
gfortran $(GFOPT) $< $(OBJS) -o $@
|
|
||||||
|
|
||||||
lorentz: lorentz.f90 Makefile $(OBJS)
|
lorentz: lorentz.f90 Makefile $(OBJS)
|
||||||
gfortran $(GFOPT) $< $(OBJS) -o $@
|
gfortran $(GFOPT) $< $(OBJS) -o $@
|
||||||
|
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
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
|
|
Loading…
Reference in New Issue
Block a user