Springen naar inhoud

Simulatie 1D Carnot cyclus met 1 deeltje


  • Log in om te kunnen reageren

#1

JorisL

    JorisL


  • >250 berichten
  • 555 berichten
  • Ervaren gebruiker

Geplaatst op 02 mei 2013 - 22:41

Hoi allemaal,

Ik ben bezig met het herhalen van de simulaties in dit artikel
Kort samengevat bestaat het (1D) systeem uit een wand en een zuiger (in eerste instantie met constante snelheid).
Daarin zit één deeltje waarvan ik de beweging kan volgen aangezien er geen krachten op werken.

De simulatie doorloopt een cyclus gelijkaardig aan de Carnot cyclus (uit evenwicht).
Tijdens de 'isotherme' processen wordt de warmtebad gesimuleerd door bij een botsing met de wand een nieuwe random snelheid te genereren. Tot hier zijn er geen problemen.

Mijn werkwijze is als volgt,
Ik ken de posities van de zuiger na iedere slag. Deze zitten in de array L.
De volgende stap bestaat erin om de positie van het deeltje na iedere slag te bepalen.
Deze waardes zitten in de array X.

Ik controleer nu op een botsing (met de zuiger) mbv de voorwaarde dat als X[i] > L[i] er moet gelden dat in de slag waarin de zuiger van L[i-1] naar L[i] gaat een botsing optreedt. Daaruit bereken ik dan de tijd waarop gebotst wordt.

Aan de vaste wand is er verder geen enkel probleem.

Het probleem is dat na een bepaald aantal cycli met bijna 100% zekerheid een vreemd effect optreedt waardoor het deeltje op den duur buiten het systeem treedt.
Ik kan zelfs niet de exacte oorzaak van het probleem vaststellen.

De eerste keren dat dit voorkwam was dat omdat na de botsing de nieuwe snelheid zo laag was dat het deeltje tijdens de compressie terug ingehaald werd.
Waarna ik een fout maakte met de nieuwe snelheid ( v = -v+2Ucomp ).
In die uitdrukking moest ik de snelheid v gebruiken, niet -v.
Dat probleem heb ik kunnen oplossen.

Het huidige probleem is nog iets anders, ik heb er nog geen systematiek in kunnen ontdekken buiten het feit dat boven de foutmelding die ik geef, 2 keer dezelfde output gegeven wordt (alsof ik een bepaald geval niet beschouw :S).

Ik heb 2 output bestanden (out.txt en out2.txt) in de bijlage gezet alsook mijn code(Deeltje.txt) (welke nog een rommeltje is).

Als iemand me kan helpen met wat ik over het hoofd zie dan erg veel dank.

Joris

Bijgevoegde Bestanden

  • Bijlage  Deeltje.txt   6,4K   44 maal gedownload
  • Bijlage  Out.txt   8,51K   30 maal gedownload
  • Bijlage  Out2.txt   2,74K   25 maal gedownload

Veranderd door JorisL, 02 mei 2013 - 22:42


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Marko

    Marko


  • >5k berichten
  • 8937 berichten
  • VIP

Geplaatst op 03 mei 2013 - 13:06

Ik heb snel door je code heengelopen, zonder me heel erg te verdiepen in wat er nu precies gebeurt (er missen wat comments die een en ander zouden verduidelijken...)
Daardoor is dit misschien een nutteloze suggestie. Desondanks:

Bij de berekening van de snelheden vallen me 2 dingen op.

Je typt:

if(fmod(tnu,t[4])>t[3]){
                    if(v>0) //controleren in welke richting deeltje beweegt. Naar zuiger toe => snelheid omkeren bij botsing
                        v = -v;

                    v += 2*Ucomp;
                }else{
                    v = -v + 2*Uex;
                }

In beide gevallen verander je dus de richting van de snelheid?!

Verder stel je kennelijk "naar de zuiger toe bewegen" gelijk aan een compressieslag, en van de zuiger af bewegen gelijk aan een expansie. Maar de richting waarin het deeltje beweegt staat los van de beweging van de zuiger; je hebt de richting immers gedefinieerd ten opzichte van de vaststaande wand.

Verder bouw je hier een controle in:


if(x>1.01*l3){ //Buiten systeem
            printf("Unexpected exit:\n Het deeltje is buiten het systeem getreden.\n%.2lf\t%.2lf\t%.2lf\n",tnu,x,v);
            printf("Posities:\t %.2lf \t %.2lf \t %.2lf \t %.2lf \t%.2lf\n",X[0],X[1],X[2],X[3],X[4]);
            printf("Zuiger:\t \t %.2lf \t %.2lf \t %.2lf \t %.2lf \t%.2lf\n",L[0],L[1],L[2],L[3],L[4]);
            printf("Slag in cyclus: %.lf\n",fmod(tnu,t[4]));
            break;
        }

Dat betekent dat je waardes tussen l3 en 1.01*l3 wél toestaat en er ook mee verder rekent. Dat is volgens mij niet juist. Maar dat zal niet de oorzaak zijn. Als ik het goed begrijp mag de waarde sowieso nooit groter worden dan 1, dus als dat wel gebeurt moet ergens een fout zitten.

Cetero censeo Senseo non esse bibendum






0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures