Einfache Simulation CO2 Reflexion. (erledigt - das geht so nicht!)

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Einfache Simulation CO2 Reflexion. (erledigt - das geht so nicht!)

Beitrag von SMaag »

Ich hab mit ein paar Gedanken über eine Simulation zur Strahlungsreflexion von CO2 gemacht. Eine extrem vereinfachte Klimasimulation also!

Ich würde hier gerne ein paar Vorschläge und Code sammeln wie man das in PureBasic umsetzen kann.

Die wichtigsten notwendigen physikalischen Daten hab ich bereits zusammengestellt

Code: Alles auswählen

; CO2 Reflection Simulation

;       R * T
; Vm = --------
;         p

; Vm : Volumen pro 1mol Stoffmenge
; R  : allgemeine Gaskonstante = 8,314472 J/(K*mol)  : K: Kelvin
; T  : absolute Temperatur in Kelvin

; 1mol = 6,022141 * 10²³ Teilchen (Gasmolkühle)

; CO2 Gehalt der Atmosphäre ~ 420ppm = 420 Teilchen auf 1 Mio Teilchen Luftgemisch => rund 4 CO2 Molekühle auf 10.000 Teilchen Luftgemisch
; oder 0,042% Anteil CO2

; -----------------------------
; weitere CO2 Daten
; -----------------------------
; Molares Normvolumen (Vmn) 	    : 22,263 m3/kmol     (Kubikmeter pro Kilomol)
; Spezielle Gaskonstante (RCO2) 	: 0,1889 kJ/(kg · K)
; Normdichte (ρn) 	              : 1,977 kg/m3
; Dichteverhältnis CO2/Luft (d) 	: 1,529
; Durchmesser (Kovol. Durchmesser) : 2,76 Angström  (1 Angström = 0,1nm = 10e-10m)

; Kinetischer Durchmesser - das ist der pyhsikalische Wirkdruchmesser für Kollissionen
; (dieser ist etwas höher als der Durchmesser der Elektronenhülle). Das ist in etwa sowas wie die Bounding Box als Kugel!
; https://www.rhetos.de/html/lex/kinetischer_durchmesser.htm

; O2  = 0,346 nm = 346 pm (Sauerstoff)
; CO2 = 0,330 nm = 330 pm (Kohlendixide)
; H2O = 0,265 nm = 265 pm (Wasser, Wasserdampf)
; N2  = 0.364 nm = 364 pm (Stickstoff)
; Ar  = 0,340 nm = 340 pm (Argon)

; man beachte Argon kommt als einziges Gas (Edelgas) in Atomform vor. Alle anderen immer in der Molekühlform aus mindestens 2 Atomen.
; Das ist wichtig für Sauerstoff als O2 und Stickstoff als N2

; --------------------------------
; Zusammensetzung der Atmosphäre
; --------------------------------
; https://de.wikipedia.org/wiki/Erdatmosph%C3%A4re

; Was als Luft bezeichnet wird, besteht im Wesentlichen bei Außerachtlassen des wechselnden Wasserdampfgehalts
; (d. h. in Volumenprozent trockener, wasserdampffreier Luft)

; 78,08 % Stickstoff (N2) d.h. 78% aus N-N Teilchen
; 20,95 % Sauerstoff (O2) d.h. 20.95% aus O-O Teilchen
; 0,93 % Argon (Ar)
; dazu Aerosole und Spurengase, darunter Kohlenstoffdioxid %
; 0,04% CO2  d.h. 0,04% O-C-O Teilchen

; -----------------------------
; Die Herausforderung
; -----------------------------

; Diese Daten so runterrechnen, dass man auf dem Bildschirm vernüftig große Kügelchen bekommt.
; Dann schießt man von aussen (oben) Strahlen in die Gaskügelchen und kuckt wieviel davon die Kugeln treffen und absorbiert werden.
; Ein Treffer ist eine Absorbtion, egal welches Molekühl man trifft
; alle Strahlen die durchkommen werden unten von der Erdoberfläche reflektiert und nehmen den Weg zurück durch die Kügelchen.
; Ein Treffer ist wieder eine Absorption.
; Statistik führen, welches Gas wieviel Strahlen absorbiert getrennt in einfallend und ausghend.

; -----------------------------
; nächster Schritt:
; -----------------------------

; nun lässt man nur noch CO2 Teilchen absorbieren, alle anderen Gasmolkühle lassen praktisch 100% durch.
; Das ist praktisch der "Worst Case" CO2 ist der alleingie Verursacher von Absorption. Das ist natürlich Quatsch!
; Es ist aber eine praktische Abschätzung wieviel max. von CO2 absorbiert werden kann.

; -----------------------------
; der finale Schritt:
; -----------------------------

; jetzt nimmt man noch Wasserdampf mit hinzu und lässt nur CO2 und Wasserdampf absorbieren.
; der Wasserdampfgehalt der Atmosphäre bewegt sich zwischen 0 %vol bei eisiger Kälte bis 4 %vol bei tropischer Hitze
; jetzt spielt man etwas mit den Wasserdampfgehalten und schaut wie groß dessen Anteil im Vergleich zu CO2 ist

; ----------------------------------------------------------------
; Ich habe keine Ahnung was dabei rauskommt, 
; bin aber extrem gespannt auf ein Ergebnis!

; mit Purebasic sollte sich das relativ einfach mit schöner Grafik siumlieren lassen!
Zuletzt geändert von SMaag am 29.09.2024 21:11, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Einfache Simulation CO2 Reflexion

Beitrag von Kiffi »

hast Du diesbezüglich schon mal eine KI gefragt? Ich habe absolut keine Ahnung von der Materie, aber ChatGPT schreibt mir einen Code, der viele bunte Bällchen auf den Screen zaubert :lol:

Code: Alles auswählen

; PureBasic Beispiel: CO2-Reflexionssimulation

InitKeyboard()

; Fenster initialisieren
OpenWindow(0, 0, 0, 800, 600, "CO2-Reflexionssimulation", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
InitSprite()
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)

Global AnzahlMolekuele = 200
Global Dim MolekueleX.f(AnzahlMolekuele)
Global Dim MolekueleY.f(AnzahlMolekuele)
Global Dim MolekuelTyp(AnzahlMolekuele) ; 0=N2, 1=O2, 2=CO2, 3=H2O
Global Dim Absorbiert(AnzahlMolekuele)
Global AnzahlStrahlen = 100
Global Dim StrahlX.f(AnzahlStrahlen)
Global Dim StrahlY.f(AnzahlStrahlen)
Global Treffer_CO2 = 0
Global Treffer_H2O = 0

; Moleküle zufällig platzieren
Procedure InitMolekuele()
  For i = 0 To AnzahlMolekuele - 1
    MolekueleX(i) = Random(800)
    MolekueleY(i) = Random(600)
    MolekuelTyp(i) = Random(3) ; 0 = N2, 1 = O2, 2 = CO2, 3 = H2O
    Absorbiert(i) = 0
  Next
EndProcedure

; Strahlen zufällig initialisieren
Procedure InitStrahlen()
  For i = 0 To AnzahlStrahlen - 1
    StrahlX(i) = Random(800)
    StrahlY(i) = 0
  Next
EndProcedure

; Strahlen durch die Moleküle bewegen und Absorption berechnen
Procedure UpdateStrahlen()
  For i = 0 To AnzahlStrahlen - 1
    StrahlY(i) + 5
    
    ; Checke Kollision mit Molekülen
    For j = 0 To AnzahlMolekuele - 1
      If Absorbiert(j) = 0 And StrahlX(i) >= MolekueleX(j) - 10 And StrahlX(i) <= MolekueleX(j) + 10 And StrahlY(i) >= MolekueleY(j) - 10 And StrahlY(i) <= MolekueleY(j) + 10
        If MolekuelTyp(j) = 2 ; CO2
          Treffer_CO2 + 1
          Absorbiert(j) = 1 ; Molekül absorbiert Strahl
        ElseIf MolekuelTyp(j) = 3 ; H2O
          Treffer_H2O + 1
          Absorbiert(j) = 1
        EndIf
      EndIf
    Next
    
    ; Strahl zurücksetzen, wenn er den Bildschirm verlässt
    If StrahlY(i) > 600
      StrahlX(i) = Random(800)
      StrahlY(i) = 0
    EndIf
  Next
EndProcedure

; Zeichne die Moleküle
Procedure ZeichneMolekuele()
  StartDrawing(ScreenOutput()) ; Zeichnen auf den Bildschirm starten
  
  For i = 0 To AnzahlMolekuele - 1
    Select MolekuelTyp(i)
      Case 0
        Color = RGB(0, 0, 255) ; N2 - Blau
      Case 1
        Color = RGB(0, 255, 0) ; O2 - Grün
      Case 2
        Color = RGB(255, 0, 0) ; CO2 - Rot
      Case 3
        Color = RGB(0, 255, 255) ; H2O - Cyan
    EndSelect
    
    If Absorbiert(i) = 1
      Color = RGB(128, 128, 128) ; Absorbiertes Molekül wird grau dargestellt
    EndIf
    
    Circle(MolekueleX(i), MolekueleY(i), 10, Color)
  Next
  
  StopDrawing() ; Zeichnen beenden
EndProcedure

; Zeichne die Strahlen
Procedure ZeichneStrahlen()
  StartDrawing(ScreenOutput()) ; Zeichnen auf den Bildschirm starten
  
  For i = 0 To AnzahlStrahlen - 1
    Line(StrahlX(i), StrahlY(i), 0, 5, RGB(255, 255, 0)) ; Gelbe Strahlen
  Next
  
  StopDrawing() ; Zeichnen beenden
EndProcedure

; Initialisiere Moleküle und Strahlen
InitMolekuele()
InitStrahlen()

Repeat
  ExamineKeyboard()
  
  ClearScreen(RGB(0, 0, 0)) ; Bildschirm löschen (schwarz)
  
  UpdateStrahlen()
  
  ; Zeichne alle Moleküle und Strahlen
  ZeichneMolekuele()
  ZeichneStrahlen()
  
  ; Zeige Trefferstatistik
  StartDrawing(ScreenOutput())
  DrawText(10, 10, "CO2 Treffer: " + Str(Treffer_CO2), RGB(255, 255, 255))
  DrawText(10, 30, "H2O Treffer: " + Str(Treffer_H2O), RGB(255, 255, 255))
  StopDrawing()
  
  FlipBuffers() ; Bildschirm puffern, um das Zeichnen flüssig anzuzeigen
  
  Delay(16) ; Kleine Pause für bessere CPU-Nutzung
Until KeyboardPushed(#PB_Key_Escape)

End
Erklärung des Codes:
Fenster und Bildschirminitialisierung:
Öffnet ein Fenster und setzt eine grafische Oberfläche für die Simulation.

Molekül-Initialisierung:
Die Moleküle werden zufällig auf dem Bildschirm verteilt. Die Typen der Moleküle sind:

0 = N2 (Stickstoff)
1 = O2 (Sauerstoff)
2 = CO2
3 = H2O
CO2 und H2O sind die einzigen Moleküle, die Strahlen absorbieren können.

Strahlenbewegung und Kollision:
Strahlen bewegen sich von oben nach unten. Wenn sie ein CO2- oder H2O-Molekül treffen, wird der Strahl absorbiert, und das Molekül wird grau gefärbt. Bei N2 und O2 passiert nichts, der Strahl wird durchgelassen.

Zeichnen von Molekülen und Strahlen:
Moleküle werden als farbige Kreise dargestellt: CO2 (rot), H2O (cyan), N2 (blau), O2 (grün). Strahlen sind gelbe Linien.

Statistik:
Die Anzahl der Treffer (Absorptionen) von CO2 und H2O wird oben links im Fenster angezeigt.

Weiterführende Ideen:
Du könntest die Simulation erweitern, indem du den Strahlen Rückstrahlung hinzufügst, nachdem sie die Erde erreicht haben.
Spiele mit den Konzentrationen der verschiedenen Moleküle, um deren Einfluss auf die Strahlungsabsorption zu testen.
Optimiere die Simulation, indem du den Anteil von Wasserdampf variabel machst und diesen Einfluss auf die Simulation prüfst.
Dieser Code sollte dir eine erste Version einer atmosphärischen Strahlungsabsorption bieten!
a²+b²=mc²
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: Einfache Simulation CO2 Reflexion

Beitrag von SMaag »

Das hat sich erstmal erledigt!
Man kann das so nicht mal ansatzweise machen!

Es ist auch kein wirklicher Leerraum zwischen den Molekühlen, so wie ich das angenommen hatte!
Antworten