Page 2 sur 3

Re: Dynamique des Fluides, Simulation

Publié : lun. 16/juin/2014 14:10
par graph100
Merci Fred :D

C'est définitif, j'adore PureBasic ! (en ce moment je tâte le C, alors ça souligne les bons points de PB, mais ça fait aussi ressortir des manques à combler --> templates, pointeurs sur tableaux etc...)

Dans le 1er post, une mise à jour qui améliore l'interface, la stabilité, et ajoute la possibilité de changer de condition limite : soit une boite fermée, soit un espace libre.

Si quelqu'un veut tester d'autres conditions limites, il suffit de modifier FS_SetBoundaryCondition_Libre()
Je ne suis pas sur que ma modif pour l'espace libre fonctionne vraiment comme il faut...


Quelques sélections pratiques du nouveau code :

Stabilisateur de FPS :

Code : Tout sélectionner

Tps_Loop_mini.d = 0.040 ; secondes
Define dt.d


OpenWindow(0, 0, 0, 600, 400, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
CanvasGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), #PB_Canvas_Keyboard)


Repeat
	
	
	Repeat
		event = WindowEvent()
		
		;{ Gestion event
		
		
		;}
		
	Until event = 0 Or event = #PB_Event_CloseWindow
	
	
	;{ mise à jour du delta de temps et stabilisation des FPS
	
	dt = (ElapsedMilliseconds() - time) / 1000
	
	If dt < Tps_Loop_mini
		Delay(1000 * (Tps_Loop_mini - dt)) ; on sauve du Processeur
	EndIf
	
	dt = (ElapsedMilliseconds() - time) / 1000 ; on reprend le temps total de la boucle, delay compris
	time = ElapsedMilliseconds()
	
	;}
	
	
	
	;{ Affichage
	
	If StartDrawing(CanvasOutput(0))
		
		Box(0, 0, OutputWidth(), OutputHeight(), 0)
		
		If dt
			DrawText(10, 10, "FPS = " + StrD(1/dt, 1), $FFFFFF, 0)
		EndIf
		
		StopDrawing()
	EndIf
	
	;}
	
Until event = #PB_Event_CloseWindow
Ce code m'a permis d'enlever l'effet de latence qu'il y avait avec l'utilisation des touches du clavier pour gérer les sources de flux et particules

Il a également stabilisé le FPS à la variable 1/Tps_Loop_mini (ici = 25 FPS)
Et cela rend la simulation plus stable (puisque le dT réel est utilisé pour l'alimenter).


Procédure interchangeable :

Code : Tout sélectionner

Procedure FS_SetBoundaryCondition_Boite(*obj.SIM_FL, MODE.l, Array x.d(2))
	
	; un 1er code
	
EndProcedure

Procedure FS_SetBoundaryCondition_Libre(*obj.SIM_FL, MODE.l, Array x.d(2))
	
	; un autre code
	
EndProcedure

Procedure FS_SetBoundaryCondition_Autre(*obj.SIM_FL, MODE.l, Array x.d(2))
	
	; un autre code
	
EndProcedure


Prototype FS_SetBoundaryCondition(*obj.SIM_FL, MODE.l, Array x.d(2))
Global FS_SetBoundaryCondition.FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Boite()



; utilisation dans le code : 


; BLABLABLA
FS_SetBoundaryCondition(mon_obj, 1, t())
; BLABLABLA



; On change les procedures comme ça :

If FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Boite()
	
	FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Libre()
	
	
ElseIf FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Libre()
	
	FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Autre()
	
	
ElseIf FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Autre()
	
	FS_SetBoundaryCondition = @FS_SetBoundaryCondition_Boite()
	
	
EndIf
C'est vraiment super pratique ! Pour ajouter une autre procédure qui permet de tester un autre comportement je n'ai même pas eu besoin de modifier le reste du code qui utilise la procédure :D


Pointeurs vers tableaux, et Swap

Code : Tout sélectionner

Structure tableau
	Array tab.d(0, 0)
EndStructure



Macro Tableau_init(_adr_, _struct_)
	_adr_ = AllocateMemory(SizeOf(_struct_))
	InitializeStructure(_adr_, _struct_)
EndMacro

Macro Tableau_Free(_adr_, _struct_)
	ClearStructure(_adr_, _struct_)
	FreeMemory(_adr_)
EndMacro




Structure Fluide
	
	; Tableaux des vitesses du fluide
	*u.tableau
	*v.tableau
	
EndStructure


Define Mon_Fluide.Fluide


Tableau_init(Mon_Fluide\u, tableau)
Tableau_init(Mon_Fluide\v, tableau)

Dim Mon_Fluide\u\tab(20, 10)
Dim Mon_Fluide\v\tab(20, 10)


; On échange les tableaux avec un swap
Swap Mon_Fluide\u, Mon_Fluide\v



Tableau_Free(Mon_Fluide\u, tableau)
Tableau_Free(Mon_Fluide\v, tableau)
Depuis quelques version de PB, il n'est plus possible de "Swaper" 2 tableaux... Or c'est super pratique !
Mon alternative est quand même plus compliquée, mais une fois en place, ça fonctionne bien.

Re: Dynamique des Fluides, Simulation

Publié : lun. 16/juin/2014 15:13
par Frenchy Pilou
Ah oui, la touche [C] :oops:
Sinon on dirait presque aussi de la fumée! :D

Re: Dynamique des Fluides, Simulation

Publié : lun. 16/juin/2014 21:07
par venom
Très joli code bravo 8)






@++

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 2:21
par graph100
La V3 du Simulateur de fluide.

Nouveautés : la Couleur !
Au lieu d'un seul canal de particule, il y en a 3 pour le Rouge, le Vert et le Bleu.
L'interface a changé aussi, toujours pas plus ergonomique en revanche :lol:

Autre modification majeure : la taille de la matrice des Particules n'est plus obligée d'être de celle de la matrice de vitesse, les vitesses sont interpolées pour correspondre. Cela permet d’accélérer un peu le calcul en simulant moins de fluide et plus de particules

Le code étant devenue trop long, et surtout avec un intérêt moindre par rapport à la simulation de fluide proprement dite, je laisse la V2 dans le 1er post, et je met le code avec un Exe tout fait dans une archive :

DF_GE_V3.zip

Image

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 8:28
par Torp
Franchement une tuerie ! Bravo !

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 9:43
par SPH
Imbattable :idea:

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 11:13
par Backup
tres joli prg :)

moi c'est ta generation de palette qui me branche :mrgreen:
vais peut etre te piquer du code pour l'integré dans mon Palette_Gadget :mrgreen:

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 12:15
par Mindphazer
Pour une raison qui m'échappe, sur Mac, le compilo me retourne une erreur : structure not found : POINT

:?:

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 12:40
par graph100
@Mindphazer : POINT ??? j'aurais penser que les #white serait plus problématique...

Normalement c'est la classique POINT\x.l et y.l

@Dobro : j'ai fouillé dans mes vieux codes pour ressortir ma palette :D Ca doit être la deuxième fois que je l'utilise depuis que je l'ai codée (sur PB3.xx)
Mais avec le canvas, la mise en pratique est vraiment rapide !

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 13:41
par Frenchy Pilou
Un Verve en français! ;) 8)
Le nom du fichier est ésotérique! :mrgreen:

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 13:46
par Mindphazer
graph100 a écrit :@Mindphazer : POINT ??? j'aurais penser que les #white serait plus problématique...

Normalement c'est la classique POINT\x.l et y.l
Oui
De toute évidence, elle n'existe pas en résident sur OS X !
En ajoutant ça en tout début du listing, ça fonctionne très bien :

Code : Tout sélectionner

Structure POINT
  x.l
  y.l
EndStructure

#red = $0000FF
#white = $FFFFFF
#blue= $FF0000
#green = $00FF00

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 13:49
par Frenchy Pilou
Une disposition des sources au hasard ?
Image

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 14:39
par Fred
Mindphazer a écrit :
graph100 a écrit :@Mindphazer : POINT ??? j'aurais penser que les #white serait plus problématique...

Normalement c'est la classique POINT\x.l et y.l
Oui
De toute évidence, elle n'existe pas en résident sur OS X !
En ajoutant ça en tout début du listing, ça fonctionne très bien :

Code : Tout sélectionner

Structure POINT
  x.l
  y.l
EndStructure

#red = $0000FF
#white = $FFFFFF
#blue= $FF0000
#green = $00FF00
C'est normal, c'est des structures et des constantes de l'API Windows

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 14:43
par Mindphazer
Fred a écrit : C'est normal, c'est des structures et des constantes de l'API Windows
Pour les constantes, je savais déjà, du coup j'ai un fichier include dans lequel elles sont définies que j'inclus presque tout le temps dans mes programmes pour éviter les désagréments
pour la structures, c'est bon à savoir, merci Fred (y'en a t'il d'autres ?)

J'imagine qu'il faudra faire la même chose sous Linux

Re: Dynamique des Fluides, Simulation

Publié : mar. 17/juin/2014 14:45
par graph100
Tu peux modifier la position de chaque source [E], son diamètre [D], sa couleur (il suffit de la sélectionner, puis de changer la couleur)
Et la même chose avec les sources de flux.

Pour en placer de nouvelles, passer en mode édition [N], puis utiliser la souris, enfin, quitter le mode édition [N]


La simulation fonctionne bien lorsque l'ordinateur est assez rapide pour maintenir un temps de calcul assez bas, et stable.
Plus le temps entre deux simulations est élevé, moins elle sera précise (dt doit être petit).

En conséquence, pour éviter des résultats trop disparate sur tous nos ordi, et sachant que je code sur un bon processeur,
le 'dt' utiliser pour la simulation est plafonné à 40ms (si ça calcule plus vite, la vitesse d'animation du fluide est celle calculée, sinon elle sera plus lente)


Si le résultat est vraiment trop lent chez vous, baissez la taille du tableau de vitesse (le "100, 100" ci-dessous) :

Code : Tout sélectionner

Fluide_Init(Var\fluide, 100, 100, 0) : PostEvent(#PB_Event_Gadget, 0, #GD_viscosite)

@Mindphaser : j'ai ajouté tes corrections dans le code, merci

@Frenchy Pilou : le nom "DF_GE_V3" ? c'est l'abréviation de "Dynamique des fluide _ game engine_GDC03_V3"