Compare commits

..

No commits in common. "cfc8ea6b63c0bfcef96a4f48fae3af95c5de1968" and "355d61df23ff45b0f7046bf026af15c82eefea4f" have entirely different histories.

12 changed files with 42 additions and 151 deletions

View File

@ -5,7 +5,6 @@ nbimg.inc
*.gif
*.blbs
*.mp4
*.lst
frames/*
log.*
@ -13,6 +12,4 @@ exportbloubs
genbloubs
movebloubs
mergebloubs
essai
core

View File

@ -2,34 +2,25 @@
all: genbloubs movebloubs exportbloubs mergebloubs
# ------------------------------------------------------------
GFOPT = -Wall -Wextra -g -time
OBJS = bloubspace.o povstuff.o mathstuff.o
# ------------------------------------------------------------
essai: essai.f90 Makefile mathstuff.o
gfortran $(GFOPT) $< mathstuff.o -o $@
# ------------------------------------------------------------
initial.blbs: genbloubs Makefile
./genbloubs $@ 1000
in.blbs: genbloubs Makefile
./genbloubs $@ 30000
./genbloubs $@ 300
out.blbs: in.blbs mergebloubs Makefile
./mergebloubs $< $@
out.lst: out.blbs exportbloubs Makefile
./exportbloubs $< > $@
# ------------------------------------------------------------
bloubspace.o: bloubspace.f90 Makefile
gfortran $(GFOPT) -pg -c $<
gfortran $(GFOPT) -c $<
povstuff.o: povstuff.f90 Makefile
gfortran $(GFOPT) -c $<

View File

@ -5,7 +5,7 @@ C'est quoi ?
Le BloubWorld (que l'on appelle aussi BloubSpace) est un espace borné
dans lequel se déplacent des **bloubs**, lesquels sont
des sortes de particule
munie de certaines propriétés (age, grosseur, vitesses, etc...).
munie de certaines propriétés.
Lesquelles évoluent en fonction du temps.
## Description d'un bloub
@ -18,60 +18,17 @@ Lesquelles évoluent en fonction du temps.
real :: px, py, pz
real :: vx, vy, vz
real :: radius
integer :: age
integer :: seq
end type t_bloubs
```
C'est simple, en fait. Le plus compliqué, c'est de savoir quoi en faire.
On peut en fabriquer des gazillions, 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.
## Comment ça fonctionne ?
Pas trop mal pour un premier jet. Il suffit de lire
le script `runme.sh` pour avoir une idée de l'enchainement
des opérations. Lequel enchainement est décrit plus bas.
## Les logiciels
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,
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.
### genbloubs
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.
### movebloubs
Le cœur actif du système : c'est lui qui, à chaque tick, va déplacer
les bloubs, gérer les rebonds avec la boudary-box, éliminer les
bloubs usés par les chocs, et faire naitre de nouveaux bloubs
si le besoin s'en fait sentir.
Seul problème, il n'a pas de notion directe du temps, parce qu'il est
juste de passage dans un pipeline.
### exportbloubs
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.
Bon, pour le moment, il n'y a que POVray :)
### mergebloubs
Alors, celui-ci, il n'est pas vraiment au point.
des opérations.
## TODO

View File

@ -88,10 +88,10 @@ module bloubspace
blb%py = 0.0
blb%age = blb%age + 1
endif
if (4.99 .lt. blb%py) then !!
if (5.0 .lt. blb%py) then
blb%vy = -1.0 * blb%vy
blb%age = blb%age + 1
blb%py = 4.99 !!
blb%py = 5.0
endif
if (5.0 .lt. blb%pz) then

View File

@ -1,19 +0,0 @@
program essai
use mathstuff
implicit none
integer :: foo
real :: quux
double precision :: somme
call init_random_seed()
somme = 0.0
do foo=1, 200000
quux = rand()
somme = somme + quux
print *, foo, quux, somme/foo
enddo
end program

View File

@ -32,7 +32,7 @@ program genbloubs
if (0 .ne. errcode) then
exit
endif
print *, bloub%px, bloub%py, bloub%pz, bloub%radius, bloub%age
print *, bloub%px, bloub%py, bloub%pz, bloub%radius
compte = compte + 1
enddo

View File

@ -1,6 +1,7 @@
module mathstuff
implicit none
contains
! ----------------------------------------------------------------
@ -12,8 +13,8 @@ module mathstuff
integer t3
call itime(tarray)
t3 = 3600*tarray(1) + 60*tarray(2) + tarray(3)
write(0, '(A,3I3,A,I6)') "sranding: ", tarray, " --> ", t3
t3 = 200*tarray(1) + 20*tarray(2) + tarray(3)
print *, tarray, ' --> ', t3
call srand(t3)
end subroutine

View File

@ -70,11 +70,6 @@ program mergebloubs
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
@ -94,7 +89,9 @@ program mergebloubs
! 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)
@ -102,21 +99,16 @@ program mergebloubs
nbr_merge = nbr_merge + 1
merged = .TRUE.
endif
enddo
enddo
if (merged) then
! put new bloub in the list
les_bloubs(idx) = newbloub
bloub = newbloub
else
! put old bloub in the list
les_bloubs(idx) = bloub
endif
write(outu, iostat=errcode) bloub ! no error control ?
if (0 .ne. errcode) then
STOP " : WRITE ERROR TO " // trim(outfile)
endif
idx = idx + 1
! print *, "idx = ", idx

View File

@ -54,7 +54,7 @@ program movebloubs
endif
! moving and boundingboxing
call move_bloub (bloub, 0.14)
call move_bloub (bloub, 0.15)
call bound_a_blob (bloub)
call green_soylent (bloub)
if (.NOT. bloub%alive) then
@ -78,10 +78,10 @@ program movebloubs
! ok, we have read all the bloubs in the input file
! insert some fancy conditional here
if (compteur .LT. 1600) then
if (rand() .LT. 0.05) then
call add_more_bloubs(outu, 8, 0.052)
endif
if (compteur .LT. 1500) then
call add_more_bloubs(outu, 8, 0.075)
endif
close(inu) ; close(outu)
@ -104,15 +104,13 @@ contains
type(t_bloubs) :: bloub
integer :: foo
write(0, '(A,I4,1X,A)') "adding", nbre, "bloubs"
do foo=1, nbre
bloub%nick = 'newbie '
bloub%alive = .TRUE.
call random_pv(bloub)
bloub%radius = wtf
bloub%age = 1
bloub%alive = .TRUE.
bloub%age = foo
! call display_bloub (bloub, "new bloub")
write(un) bloub ! no error control ?

View File

@ -7,7 +7,7 @@
INCFILE="bloubs.inc"
TMPPNG="/dev/shm/bloubs7.png"
POVOPT="+Q9 +a -v -d -W960 -H640 -WT2"
POVOPT="+Q5 -a -v -d -W920 -H600 -WT2"
DDIR="frames"
LOGERR="log.error"
@ -15,7 +15,7 @@ LOGERR="log.error"
BLBS_IN="/dev/shm/in.blbs"
BLBS_OUT="/dev/shm/out.blbs"
NBIMG=1200
NBIMG=600
make all
err=$?
@ -67,7 +67,7 @@ do
mv ${BLBS_OUT} ${BLBS_IN}
echo
sleep 9
sleep 33
done

View File

@ -21,7 +21,10 @@ global_settings {
object {
Bloubs
finish { phong 0.33 specular 0.95 }
texture {
pigment { color Gray60 }
finish { phong 0.58 specular 0.45 }
}
}
plane {
@ -36,7 +39,7 @@ plane {
#declare BH = 5; // H = taille en horizontal
#declare BV = 5; // V = taille en vertical
#declare BR = 0.035;
#declare BR = 0.028;
#declare Une_Borne = object
{
@ -46,24 +49,21 @@ merge {
}
}
#declare Un_Cadre = object
#declare Cadre_Haut = object
{
merge {
#local Ruc = BR * 0.78;
cylinder { <-BH, 0, -BH>, <-BH, 0, BH>, Ruc }
cylinder { <-BH, 0, -BH>, <-BH, 0, BH>, BR }
cylinder { < BH, 0, -BH>, < BH, 0, BH>, BR }
cylinder { < BH, 0, -BH>, <-BH, 0, -BH>, BR }
cylinder { < BH, 0, BH>, <-BH, 0, BH>, Ruc }
cylinder { < BH, 0, BH>, <-BH, 0, BH>, BR }
}
pigment { color Gray40 }
pigment { color Gray50 }
}
#declare Les_Bornes = object
{
union {
#local E = 0.02;
object { Un_Cadre translate y*(BV-E) }
object { Un_Cadre translate y*E }
object { Cadre_Haut translate y*(BV-0.05) }
object { Une_Borne translate <-BH, 0, -BH> pigment { color Blue } }
object { Une_Borne translate < BH, 0, -BH> pigment { color Green } }
@ -75,41 +75,19 @@ union {
object { Les_Bornes }
// ----------------------------------------------------------
#local D = 0.016;
#declare Fleche = object
{
merge {
sphere { <-0.05, 0, 0>, D }
cylinder { <1, 0, 0>, <-0.05, 0, 0>, D }
cone { <1, 0, 0>, D*3.1, <1.10, 0, 0>, 0.0001 }
}
}
#declare Repere = object
{
union {
object { Fleche pigment { color Red }}
object { Fleche rotate z*90 pigment { color Green }}
object { Fleche rotate y*270 pigment { color Blue }}
}
}
// ----------------------------------------------------------
// object { Repere scale 2+(1.9*NormClock) translate y*2.5 }
light_source { <9, 22, -17> color Gray80 }
light_source { <11, 19, 9> color Gray60 }
#declare XCAM = 8 -( NormClock*3 );
#declare YCAM = 5 + (11 * NormClock);
#declare HCAM = 5 + (11 * NormClock);
#fopen LC "log.camera" append
#write (LC, clock, " ", NormClock, " ", YCAM, "\n")
#write (LC, clock, " ", NormClock, " ", HCAM, "\n")
#fclose LC
camera {
location <XCAM, YCAM, -16>
location <7, HCAM, -16>
look_at <0, 1, 0>
right x*image_width/image_height
angle 48
angle 50
}

View File

@ -11,12 +11,8 @@ BEGIN {
}
{
if ($5 > 4) color = "Magenta"
else color = "Cyan"
pigment = "pigment { color " color " }"
printf "\t\tsphere { <%f, %f, %f>, %f %s }\n", \
$1, $2, $3, $4, pigment
printf "\t\tsphere { <%f, %f, %f>, %f }\n", \
$1, $2, $3, $4
count++
}