Simulatie 1D Carnot cyclus met 1 deeltje

Moderators: jkien, Xilvo

Reageer
Berichten: 555

Simulatie 1D Carnot cyclus met 1 deeltje

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 > L er moet gelden dat in de slag waarin de zuiger van L[i-1] naar L 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
Bijlagen
Out2.txt
(2.74 KiB) 70 keer gedownload
Out.txt
(8.51 KiB) 92 keer gedownload
Deeltje.txt
(6.4 KiB) 119 keer gedownload

Gebruikersavatar
Berichten: 10.560

Re: Simulatie 1D Carnot cyclus met 1 deeltje

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:

Code: Selecteer alles


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:

Code: Selecteer alles


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

Reageer