Compare commits

...

3 Commits

Author SHA1 Message Date
tTh 60dac4d948 pimping the bloubworld 2024-01-25 21:44:49 +01:00
tTh bf487c389c renaming a func 2024-01-25 19:13:45 +01:00
tTh 34da09281e bloubworld: better doc 2024-01-25 19:05:23 +01:00
9 changed files with 86 additions and 76 deletions

View File

@ -7,36 +7,15 @@ dans lequel se déplacent des **bloubs**, lesquels sont
des sortes de particule des sortes de particule
munie de certaines propriétés (age, grosseur, vitesses, etc...). munie de certaines propriétés (age, grosseur, vitesses, etc...).
Lesquelles valeurs peuvent évoluer en fonction du temps. Lesquelles valeurs peuvent évoluer en fonction du temps.
Tout est expliqué dans ce [document](doc/what-is-a-bloub.md).
## Description d'un bloub la structure d'un bloub est (presque) simple, en fait.
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, agemax
end type t_bloubs
```
C'est (preseque) simple, en fait.
Le plus compliqué, c'est de savoir quoi faire de ce fatras Le plus compliqué, c'est de savoir quoi faire de ce fatras
de *bigdata*. de *bigdata*.
On peut fabriquer des gazillions de bloubs, et ensuite On peut fabriquer des gazillions de bloubs, 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, c'est la vie des bloubs.
## Comment ça fonctionne ? ## Comment ça fonctionne ?
@ -45,8 +24,6 @@ Pas trop mal pour un premier jet. Il suffit de lire
le script `runme.sh` pour avoir une idée de l'enchainement le script `runme.sh` pour avoir une idée de l'enchainement
des opérations. Lequel enchainement est décrit plus bas. 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 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.
@ -55,11 +32,16 @@ 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 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.
## Les logiciels
### genbloubs ### genbloubs
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 (extention `.blbs`)
et le nombre de bloubs désirés.
Les règles de génération *devraient* être paramétrables. Les règles de génération *devraient* être paramétrables.
[source](genbloubs.f90)
### movebloubs ### movebloubs
@ -67,9 +49,9 @@ 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 les bloubs, gérer les rebonds avec la boudary-box, éliminer les
bloubs usés par les chocs, et faire naitre de nouveaux bloubs bloubs usés par les chocs, et faire naitre de nouveaux bloubs
si le besoin s'en fait sentir. 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.
[source](movebloubs.f90)
Seul problème, il n'a pas de notion directe du temps, parce qu'il est
juste de passage dans un pipeline.
### exportbloubs ### exportbloubs
@ -77,13 +59,16 @@ 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.** **Le format de sortie est susceptible de changer sans préavis.**
Bon, pour le moment, dans les formats il n'y a que POVray,
mais Gnuplot et/ou Rdata arriveront bien un de ces jours.[source](exportbloubs.f90)
Bon, pour le moment, il n'y a que POVray, mais Gnuplot arrivera en second.
### mergebloubs ### mergebloubs
Alors, celui-ci, il n'est pas vraiment au point. Il faut tout ré-écrire Alors, celui-ci, il n'est pas vraiment au point. Il faut tout ré-écrire
et faire gaffe à l'explosion quadratique. et faire gaffe à l'explosion quadratique.
[source](mergebloubs.f90)
## TODO ## TODO

View File

@ -17,6 +17,7 @@ module bloubspace
real :: vx, vy, vz real :: vx, vy, vz
real :: radius real :: radius
integer :: age, agemax integer :: age, agemax
integer :: red, green, blue
end type t_bloubs end type t_bloubs
type t_boundingbox type t_boundingbox
@ -37,7 +38,7 @@ module bloubspace
integer :: fd, errcode integer :: fd, errcode
character(200) :: message character(200) :: message
print *, "try to load ", infile print *, "try to load ", infile, " name ", name
! put some default values ! put some default values
where%id = "default" where%id = "default"
@ -68,7 +69,7 @@ module bloubspace
! ---------------------------------------------------------------- ! ----------------------------------------------------------------
subroutine random_pv (blb) subroutine make_a_random_bloub(blb)
type(t_bloubs), intent (out) :: blb type(t_bloubs), intent (out) :: blb
blb%px = 3.57 * (rand() - 0.50) blb%px = 3.57 * (rand() - 0.50)

View File

@ -2,14 +2,24 @@
## Philosophie ## Philosophie
Bonne question, mais nous n'avons pas le temps, point suivant ? Bonne question, mais nous n'avons pas le temps, point
suivant ? En fait, si, il est tard, mais j'ai envie de
raconter des conneries.
En fait, si, il est tard, mais j'ai envie de raconter des Un bloub est une entité mathématique qui vit
conneries. dans un espace cartésien abstrait, bien que normé.
Il peut aussi être borné, soit en mode "boite", soit
en mode "tore". La notion de champ de gravité est
ignoré, parce qu'un bloub se moque d'avoir une masse.
Par contre les bloubs peuvent interagir entre eux
de divers manières : rebond (genre billard), échange
de données, fusion volumique...
## Technique ## Technique
Voici la version du _Sat 19 Feb 2022 12:37:42 AM CET_ Voici la version du _Sat 19 Feb 2022 12:37:42 AM CET_,
c'est à dire complètement différente de l'état actuel
du logiciel.
``` ```
type t_bloubs type t_bloubs
@ -23,17 +33,28 @@ Voici la version du _Sat 19 Feb 2022 12:37:42 AM CET_
end type t_bloubs end type t_bloubs
``` ```
Certains champs sont assez explicites, comme le nick, la position Certains champs sont assez explicites, comme le *nick*,
dans l'espace, le rayon (pour nous, un bloub est la position dans l'espace, le rayon (pour nous, un bloub est
une entité abstraite assimilable à une bubulle) une entité abstraite assimilable à une bubulle) ou la vitesse
ou la vitesse sur les trois axes. sur les trois directions de l'espace bloubeux.
D'autres, comme `alive`, sont D'autres, comme `alive`, sont plus délicates à expliquer,
plus délicates à expliquer, sauf si l'on considère que les sauf si l'on considère que les bloubs sont zombifiables.
bloubs sont zombifiables.
D'autres, comme l'age, sont bien plus sujettes à de diverses D'autres, comme l'age, sont bien plus sujettes à de diverses
interprétations. doit-on incrémenter l'age à chaque tick d'horloge interprétations. doit-on incrémenter l'age à chaque tick d'horloge
ou à chaque évènement discret ? Et à quel age un bloub devient-il ou à chaque évènement discret ? Et à quel age un bloub devient-il
trop vieux, à quel age va-t-il mourir ? trop vieux, à quel age va-t-il mourir ?
## Et pour la suite ?
Au fil du temps, le bloub évolue et se complexifie.
La prochaine itération sera dotée d'un attribut de couleur et
d'amusantes fonctions pour mixer ces couleurs si deux bloubs
se trouvent à fusionner.
On peut aussi envisager de les munir d'un spin non entier
dans le but assumé d'augmenter la complexité des rencontres
interbloubs.

View File

@ -39,7 +39,7 @@ program exportbloubs
endif endif
enddo enddo
write(0, '(1X, I8, A)') compte, " bloubs exported" write(0, '(1X, I0, A)') compte, " bloubs exported"
close(idu) close(idu)

View File

@ -33,7 +33,7 @@ program genbloubs
bloub%nick = 'noname ' bloub%nick = 'noname '
bloub%num = i + 41 bloub%num = i + 41
call random_pv(bloub) call make_a_random_bloub(bloub)
bloub%radius = 0.035 + (0.03*rand()) bloub%radius = 0.035 + (0.03*rand())
write(idu) bloub ! no error control ? write(idu) bloub ! no error control ?

View File

@ -54,7 +54,7 @@ program mergebloubs
enddo enddo
call spit_bloubs_to_file (outfile, bloubs, nbgot) call spit_bloubs_to_file (outfile, bloubs, nbgot)
print *, contacts, "contacts pour ", nbgot, "bloubs" ! print *, contacts, "contacts pour ", nbgot, "bloubs"
! STOP 'mergebloubs [done]' ! STOP 'mergebloubs [done]'

View File

@ -83,28 +83,28 @@ program movebloubs
enddo ! end of main loop enddo ! end of main loop
write(0, '(I5,1X,A)') compteur, "bloubs processed" write(0, '(1X,I0,1X,A)') compteur, "bloubs processed"
! ok, we have read all the bloubs in the input file ! ok, we have read all the bloubs in the input file
! insert some fancy conditional here ! insert some fancy conditional here
if (compteur .LT. 200) then if (compteur .LT. 200) then
call add_more_bloubs(outu, 4, 0.1056) call add_more_bloubs(outu, 4, 0.026)
endif endif
! insert some very fancy conditional here ! insert some very fancy conditional here
if (compteur .LT. 800) then if (compteur .LT. 800) then
rnd = rand() rnd = rand()
write (0, '(A,1X,F9.6)') "try to add bloubs, rnd is", rnd ! write (0, '(A,1X,F9.6)') "try to add bloubs, rnd is", rnd
if (rnd .LT. 0.0604) then if (rnd .LT. 0.0604) then
call add_more_bloubs(outu, 11, 0.099) call add_more_bloubs(outu, 11, 0.019)
endif endif
endif endif
close(inu) ; close(outu) close(inu) ; close(outu)
if (killed .GT. 0) then if (killed .GT. 0) then
write (0, '(I5,A)') killed, " bloubs killed" write (0, '(1X,I0,A)') killed, " bloubs killed"
endif endif
bx = bx / dble(compteur) bx = bx / dble(compteur)
@ -127,8 +127,8 @@ contains
do foo=1, count do foo=1, count
bloub%nick = 'newbie ' bloub%nick = 'newbie '
call random_pv(bloub) call make_a_random_bloub(bloub)
bloub%radius = rayon + (0.15*rand()) bloub%radius = rayon + (0.05*rand())
bloub%age = 1 bloub%age = 1
bloub%alive = .TRUE. bloub%alive = .TRUE.
bloub%num = mod(irand(), 42) bloub%num = mod(irand(), 42)

View File

@ -7,16 +7,16 @@
INCFILE="WS/bloubs.inc" INCFILE="WS/bloubs.inc"
TMPPNG="/dev/shm/bloubs7.png" TMPPNG="/dev/shm/bloubs7.png"
POVOPT="+Q9 +a -v -d -W1600 -H1200 -WT2" POVOPT="+Q9 -a -v -d -W1600 -H1200 -WT2"
DDIR="frames/a" DDIR="frames/a"
LOGERR="log.error" LOGERR="log.error"
TXTCOLOR="GreenYellow" TXTCOLOR="#db7000"
# --- put the work file in ramdisk # --- put the work file in ramdisk
BLBS_IN="/dev/shm/in.blbs" BLBS_IN="/dev/shm/in.blbs"
BLBS_OUT="/dev/shm/out.blbs" BLBS_OUT="/dev/shm/out.blbs"
NBIMG=3000 NBIMG=120
make all make all
err=$? err=$?
@ -31,7 +31,7 @@ printf "\n#declare NbImg = %d;\n" $NBIMG > WS/nbimg.inc
# first, we have to make a seminal buch of bloubs # first, we have to make a seminal buch of bloubs
# --> this function need to be parametrizable # --> this function need to be parametrizable
# #
./genbloubs ${BLBS_IN} 3 ./genbloubs ${BLBS_IN} 50
for idx in $(seq 0 $((NBIMG-1)) ) for idx in $(seq 0 $((NBIMG-1)) )
do do
@ -43,11 +43,11 @@ do
povray -Iscene.pov -K${idx} -O${TMPPNG} ${POVOPT} 2> $LOGERR povray -Iscene.pov -K${idx} -O${TMPPNG} ${POVOPT} 2> $LOGERR
if [ 0 -ne $? ] ; then if [ 0 -ne $? ] ; then
tail -15 $LOGERR tail -15 $LOGERR
sleep 30 sleep 90
fi fi
td=$(date +'%F %R:%S') td=$(date -u +'%F %R:%S' | tr '01' 'ol')
hi=$(printf "#%05d" $idx) hi=$(printf "#%05d" $idx | tr '01' 'ol')
count=$(tail -1 "WS/log.nb_bloubs") count=$(tail -1 "WS/log.nb_bloubs")
PNG=$(printf "%s/%05d.png" ${DDIR} $idx) PNG=$(printf "%s/%05d.png" ${DDIR} $idx)

View File

@ -29,20 +29,23 @@ object {
finish { phong 0.57 specular 0.57 } finish { phong 0.57 specular 0.57 }
} }
object { #declare La_Boite = object
union { {
plane { <1, 0, 0>, -37 } union {
plane { <1, 0, 0>, 37 } plane { <1, 0, 0>, -37 }
plane { <0, 1, 0>, -27 } plane { <1, 0, 0>, 37 }
plane { <0, 1, 0>, 27 } plane { <0, 1, 0>, -27 }
plane { <0, 0, 1>, 69 } plane { <0, 1, 0>, 27 }
plane { <0, 0, 1>, 69 }
texture { texture {
pigment { color srgb <0.125, 0.144, 0.111> } pigment { color srgb <0.225, 0.244, 0.211> }
finish { phong 0.18 metallic 0.25 reflection 0.35 } finish { phong 0.18 metallic 0.25 reflection 0.35 }
}
} }
} }
}
plane { y, 0 pigment { color White } translate -4.20*y}
// object { cylinder { <0, 0, 0>, <10, 0, 0>, 0.05 pigment { color Cyan } } } // object { cylinder { <0, 0, 0>, <10, 0, 0>, 0.05 pigment { color Cyan } } }
@ -56,7 +59,7 @@ object {
{ {
merge { merge {
cylinder { <0, BV, 0>, <0, -BV, 0>, BR } cylinder { <0, BV, 0>, <0, -BV, 0>, BR }
cylinder { <0, 0.014, 0>, <0, -0.014, 0>, BR*4 } cylinder { <0, 0.018, 0>, <0, -0.018, 0>, BR*3 }
} }
} }
@ -109,8 +112,8 @@ union {
} }
// ---------------------------------------------------------- // ----------------------------------------------------------
light_source { <19, -12+NormClock, -17> color Gray80 } light_source { <19, 12+NormClock, -17> color Gray80 }
light_source { <11, 14-NormClock, 9> color Gray60 } light_source { <11, 10-NormClock, -29> color Gray60 }
#declare XCAM = 8 - ( 15 * NormClock); #declare XCAM = 8 - ( 15 * NormClock);
#declare YCAM = -1.1 + (0.95 * NormClock); #declare YCAM = -1.1 + (0.95 * NormClock);