Re: Dynamique des Fluides, Simulation
Publié : lun. 16/juin/2014 14:10
Merci Fred
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 :
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 :
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 
Pointeurs vers tableaux, et Swap
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.

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
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

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)
Mon alternative est quand même plus compliquée, mais une fois en place, ça fonctionne bien.