61
UPTEC F 18063 Examensarbete 30 hp Februari 2019 Modernisering och utveckling av befintligt beräkningsprogram för prestandauppföljning av ång- generatorer Adam Mårtenson

Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

UPTEC F 18063

Examensarbete 30 hpFebruari 2019

Modernisering och utveckling av befintligt beräkningsprogram för prestandauppföljning av ång- generatorer

Adam Mårtenson

Page 2: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

Teknisk- naturvetenskaplig fakultet UTH-enheten Besöksadress: Ångströmlaboratoriet Lägerhyddsvägen 1 Hus 4, Plan 0 Postadress: Box 536 751 21 Uppsala Telefon: 018 – 471 30 03 Telefax: 018 – 471 30 00 Hemsida: http://www.teknat.uu.se/student

Abstract

Modernizing and Development of Existing CalculationProgram for Performance Monitoring of SteamGeneratorsAdam Mårtenson

This thesis is centered around the computional program PASGO.PASGO is used for calculations for making performance monitoring of thesteam generators in Ringhals reactor 3 and 4, especially concerningfouling of the steam generator tubes. The main goal of this thesisproject was to convert the program code from the programming languageTurbo Pascal 6.0 into a more modern language that works with thecurrent Windows operative systems. Apart from a straight conversion ofthe code, a function to make automatic input from an Excel-file tothe program was also requested. The thesis also includes analyzingthe correlations used for heat transfer in PASGO, to determine ifthese can be replaced with more exact correlations. The Dittus-Boeltercorrelation was used in the original program, and while it was not abad correlation, studies show that the more modern Gnielinskicorrelation has a smaller margin of error. The program code wasconverted successfully into C++ in Visual Studio, which was theprogramming language of choice. A function to enable automatic inputof data from Excel-files was successfully implemented as well. Thisfunction allows the user to run performance calculations regardingtube fouling and pressure correction values for hundreds ofperformance tests at the same time. Versions of PASGO using theGnielinski correlation were also created. These versions arerecommended for future tests, while the version using the DittusBoelter correlation is recommended for tests which will be comparedto studies made white the previous version of PASGO.

ISSN: 1401-5757, UPTEC F 18063Examinator: Tomas NybergÄmnesgranskare: Marcus BergHandledare: Anders Surén

Page 3: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

iii

Populärvetenskaplig sammanfattning

Kärnkraften är en av de energikällor som står för störst elproduktion i Sverige. Även om antalet kärnreaktorer i drift kommer att minska de kommande åren, så kommer vi fortfa-rande använda kärnkraft under de kommande decennierna, och då är det viktigt att den kan skötas på ett effektivt och säkert sätt.

Vattenfall AB har tagit fram ett beräkningsprogram som kallas PASGO (Performance Analysis and Steam Generator Optimization). PASGO används för att utföra detaljerade prestandauppföljningar på ånggeneratorer i reaktor 3 och 4 i Ringhals’ trycksatta kärn-kraftsreaktoranläggning, med hjälp av beräkningar angående tryckfall och värmeöverfö-ring. Bland annat kan försmutsningen av tuberna i ånggeneratorerna, vilket påverkar värmeöverföringen och effekten, beräknas.

PASGOs programkod är dock skriven för många år sedan i programspråket Turbo Pa-scal 6.0, vilket är ett gammalt programspråk som inte enkelt kan köras på moderna Windows-operativsystem. Detta i kombination med att dokumentationen angående pro-grammet är bristfällig, gör att det finns ett behov av att konvertera PASGO till ett mo-dernare programspråk, samt att mer utförligt dokumentera hur programkoden fungerar.

Målet med projektet var att konvertera PASGOs programkod till ett modernare pro-gramspråk som förutspås kunna fungera på den senaste versionen av Windows under en lång framtid. Utöver en rak konvertering skulle även en del förbättringar av koden göras, vilket inkluderade införandet av en funktion som möjliggör automatisk inläsning av indata till programmet från en Excel-fil. Projektet innefattade även att analysera korre-lationerna för värmeöverföring som PASGO använder, för att bestämma huruvida dessa fortfarande är aktuella, eller om de kan bytas ut mot mer exakta sådana. Allt detta skulle också dokumenteras i form av en manual som gör det enklare för nya användare av pro-grammet att både förstå hur man kör programmet, och hur programkoden är uppbyggd. Slutligen finns det en avsikt att integrera PASGO i Ringhals’ processövervakningssy-stem PIS. Detta skulle tas hänsyn till vid val av programspråk.

Värmöverföring mellan en yta och en turbulent strömmande fluid är ett komplext feno-men, och samband utgörs av empiriskt framtagna korrelationer. Dittus-Boelters korre-lation är en av de mest använda korrelationerna för detta, och är den korrelation som PASGO använder för att göra beräkningar av värmeövergångstal för värmeöverföring mellan tuberna och vattnet i ånggeneratorn. Den modernare Gnielinskis korrelation an-ses dock vara mer exakt, och gäller även för lägre Reynolds’ tal än vad Dittus-Boelters korrelation gör.

Page 4: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

iv

Försmutsning av dessa tuber kan försämra värmeöverföringsförmågan, och PASGO gör beräkningar av αsmuts som ett mått på detta. Ett högt värde på αsmuts betyder att det finns lite smuts på tuberna, och därmed erhålls bra värmeöverföring. En jämförelse mellan körningar där de två olika korrelationerna har använts visar att Gnielinskis korrelation ger ett större värde på αsmuts än vad Dittus-Boelters korrelation ger, men att trenderna när många körningar observeras är desamma.

C++ valdes till det programspråk som PASGO skulle konverteras till. Först gjordes en direkt konvertering utan ändringar av själva funktionerna i programmet. Sedan infördes en funktion som, utöver att manuellt skriva in data, låter PASGO automatiskt läsa in data från Excel-filer innehållandes data från Ringhals’ prestandatester. Denna automa-tiska funktion gör en körning av alla prestandatester som finns i Excel-filen, och skriver endast de viktigaste data för varje test till resultatfilen. Både den direkt konverterade versionen av PASGO, och versionen med automatisk inläsning av data från Excel-fil verifierades genom att jämföra körningar med originalversionen av PASGO som är skriven i Turbo Pascal 6.0. Båda versionerna gav resultat som var näst intill exakt över-ensstämmande med originalversionen av programmet, och bedömdes därmed vara kor-rekta.

En till version, som använder Gnielinskis korrelation istället för Dittus-Boelters korre-lation, skapades också. Värdena för αsmuts skiljer sig från dem från originalversionen av PASGO, men trenderna när många värden observeras stämmer överens. Vid analyser av dessa data används trenderna över lång sikt för att bedöma utvecklingen av tubernas försmutsning över tid, vilket betyder att båda versionerna av programmet kan användas. Teori tyder på att Gnielinskis korrelation ger de mer exakta resultaten, men mer experi-mentell data att jämföra korrelationerna med skulle behövas för att kunna bekräfta detta. Versionen som använder Gnielinskis korrelation rekommenderas för användning då det exakta värdet på αsmuts söks, samt för framtida analyser. Versionen som använder Dittus-Boelters korrelation rekommenderas istället för användning då resultaten ska jämföras med resultat från körningar gjorda med den tidigare versionen av PASGO.

Page 5: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

v

Förord

Detta examensarbete har utförts åt Vattenfall AB. Arbetet har gjorts på avdelningen Projects & Services i Solna, även om en resa till Ringhals för diskussion också har gjorts. Rapporten är inte sekretessbelagd, men viss information, främst angående ång-generator-specifika data, är det. Av denna anledning har inte den fulla programkoden, som har varit en stor del av arbetet, inkluderats i denna rapport. Indata och resultat från programmet har, i den mån det går, inte heller inkluderats. I de fall då det är nödvändigt så är indata och resultat som skrivs i rapporten endast exempel, och stämmer inte över-ens med indata och resultat för Ringhals’ kärnkraftverk.

Jag vill först och främst tacka min handledare Anders Surén, för att du alltid har varit tillgänglig för att svara på mina frågor, och hjälpt mig under hela examensarbetets gång.

Jag vill också tacka enhetscheferna Erik Dandanell, för allmän support under den första halvan av mitt examensarbete, och Lennart Säterberg, för detsamma under den andra halvan.

Jag vill även tacka alla andra på Vattenfall Project & Services för att ni har varit väldigt inkluderande och vänliga. Ett extra tack till Derin för all hjälp och pepp i gymmet, Ga-briel för alla diskussioner om PASGO, Henrik för allt sportsnack, och Joel för alla möj-liga olika roliga konversationer.

Slutligen vill jag rikta ett stort tack till min ämnesgranskare Marcus Berg för dina goda råd under arbetet, och dina synpunkter som har hjälpt mig förbättra min rapport.

Page 6: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

vi

Förkortningar och definitioner

PWR – Pressurized water reactor (tryckvattenreaktor)

BWR – Boiling water reactor (kokvattenreaktor)

PASGO – Performance Analysis and Steam Generator Optimization

PIS – Ringhals’ processövervakningssystem

DP – Differential pressure (tryckskillnad mellan två punkter)

DPkorr – Korrektionsfaktor för DP på primärsidan

αsmuts – Storhet för försmutsning av rör

α – Värmeövergångstal

Rf – Den globala fouling-faktorn

R – Värmeresistans

Re – Reynolds’ tal

Pr – Prandtls tal

Nu – Nusselts tal

– Dynamisk viskositet

– Kinematisk viskositet

L – Karakteristisk längd

u – Karakteristisk hastighet

a – Temperaturledningstal (thermal diffusivity)

cp – Specifik värmekapacitet per massenhet vid konstant tryck

– Värmeledningsförmåga

t – Temperatur

Qq – Yteffekt

Q – Effekt

K – Motståndstal

V – Volymitet (= 1/densitet)

ρ – Densitet

R3 – Kärnreaktorn Ringhals 3

R4 – Kärnreaktorn Ringhals 4

Varma benet – Röranslutning från reaktortanken till ånggeneratorn

Page 7: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

vii

Kalla benet – Röranslutning från reaktorkylpumpen till reaktortanken

ÅG – Ånggenerator

Riser – Utrymme runt tuberna i ånggeneratorn

Procedure – Subrutin, alltså en funktion i Turbo Pascal 6.0 som inte returnerar ett värde

Void-funktion – Funktion i C++ som inte returnerar ett värde

Page 8: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

Innehållsförteckning Abstract .......................................................................................................................... ii

Populärvetenskaplig sammanfattning ........................................................................ iii

Förord .............................................................................................................................. v

Förkortningar och definitioner ................................................................................... vi

1. Inledning ...................................................................................................................... 1

1.1 Bakgrund .................................................................................................................. 1

1.2 Projektbeskrivning .................................................................................................. 1

1.3 Mål ........................................................................................................................... 2

2. Teori .............................................................................................................................. 2

2.1 Kärnkraft .................................................................................................................. 2

2.2 Tryckvattenreaktor ................................................................................................... 3

2.3 Den globala fouling-faktorn och αsmuts .................................................................... 5

2.4 Reynolds’ och Prandtls tal ....................................................................................... 7

2.5 Turbulenta flöden i trycksatta kärnkraftverk ........................................................... 8

2.6 Nusselts tal och värmeövergångstalet ...................................................................... 9

3. Värmeöverföringskorrelationer ............................................................................... 11

3.1 Dittus-Boelters korrelation ..................................................................................... 13

3.2 Petukhov-Kirillov-Popovs korrelation och Gnielinskis korrelation ...................... 14

4. PASGOs uppbyggnad ............................................................................................... 17

4.1 Skillnader mellan R3 och R4 ................................................................................. 18

4.2 Huvudprogrammet ................................................................................................. 19

4.3 Filhantering ............................................................................................................ 20

4.4 Input till PASGO .................................................................................................... 20

4.5 Start ........................................................................................................................ 21

4.6 HLoop .................................................................................................................... 21

4.7 Pr_Ka ..................................................................................................................... 22

4.8 Tryckfallsberäkningar i HLoop .............................................................................. 25

4.9 Stoppvillkor ............................................................................................................ 27

4.10 Iteration av de sökta storheterna .......................................................................... 28

4.11 DP ........................................................................................................................ 29

5. Konvertering av programkod .................................................................................. 30

Page 9: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

5.1 Val av programspråk .............................................................................................. 30

5.2 Konvertering till C++ ............................................................................................. 31

5.3 Inläsning av data från Excel-fil .............................................................................. 33

5.4 Möjlighet att ändra indata ...................................................................................... 36

5.5 Köra PASGO med automatisk inläsning av indata ................................................ 37

5.6 Verifiering av den nya koden ................................................................................. 39

5.7 Version med uppdaterade värmeöverföringskorrelationer .................................... 40

6. Diskussion ................................................................................................................... 43

6.1 Slutsatser ................................................................................................................ 45

7. Referenslista ............................................................................................................... 47

Appendix A ..................................................................................................................... 49

Appendix B ..................................................................................................................... 50

Appendix C ..................................................................................................................... 52

Page 10: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

1

1. Inledning

1.1 Bakgrund

Kärnkraften är en viktig energikälla och står för 40% av Sveriges produktion av elektri-

citet. Det är ungefär lika mycket som vattenkraften som också står för cirka 40%, och

flera gånger mer än vindkraften som kommer på tredje plats med 11% (2017). [1] Sve-

rige har idag åtta kärnreaktorer i drift, och även om det är beslutat att två av dessa ska

stängas inom de kommande åren så kommer Sverige fortfarande ha kärnreaktorer i drift

i åtminstone 20 år till. [2] Så länge vi har kärnreaktorer i drift så är det viktigt att dessa

körs på ett säkert och effektivt sätt.

Vattenfall AB har tagit fram PASGO (Performance Analysis and Steam Generator

Optimization), ett beräkningsprogram som används för att utföra detaljerade prestanda-

uppföljningar på ånggeneratorer i reaktor 3 (R3) och reaktor 4 (R4) i Ringhals’ tryck-

satta kärnkraftsreaktoranläggning. Programmet kan också användas för att optimera

driftparametrar för nya ånggeneratorer etc. Det är ett endimensionellt beräkningspro-

gram för stationära förhållanden, och är skrivet i programspråket Turbo Pascal 6.0.

Turbo Pascal 6.0 är dock ett gammalt programspråk som inte kan köras på moderna

operativsystem som exempelvis Windows 10, vilket gör PASGO besvärligt att använda.

Dokumentation angående exakt hur PASGO fungerar och hur det ska användas är också

bristfällig. Dessa anledningar gör att det finns ett behov av att konvertera programkoden

till ett modernare programspråk så att PASGO kan användas på moderna operativsy-

stem, samt av att dokumentera hur PASGO används i en mer utförligt skriven manual

än den som nu finns tillgänglig. Konverteringen av programkoden till ett annat pro-

gramspråk ska även möjliggöra att programmet kan integreras i Ringhals’ processdata-

system, PIS, för att underlätta regelbundna prestandatester.

1.2 Projektbeskrivning

Inom detta projekt ska koden till PASGO konverteras från Turbo Pascal 6.0 till ett annat

programspråk som fungerar med moderna operativsystem såsom exempelvis Windows

10. Vid valet av programspråk ska hänsyn tas till Ringhals’ processdatasystem, PIS, för

att säkerställa att det valda programspråket kan integreras i detta. Utöver en rak konver-

Page 11: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

2

tering av programkoden, ska även automatisk inläsning av indata från Excel-fil möjlig-

göras, då resultaten från Ringhals’ regelbundna prestandatester sparas i .xls-format.

Detta, i kombination med att koden även kommer att modifieras en del för att bli mer

lättförståelig, har syftet att göra PASGO mer användarvänligt. Den nya programkoden

ska också verifieras och dokumenteras mot den gamla programkoden för att säkerställa

att konverteringen är korrekt utförd.

Utöver själva programmeringen ska även beräkningsprocedurerna, och de däri använda

korrelationerna för värmeöverföring, analyseras för att avgöra om det finns nya förbätt-

rade korrelationer som kan ersätta de nuvarande. Slutligen ska manualen för PASGO

uppdateras så att den på ett lättförståeligt sätt beskriver hur PASGO används och funge-

rar. Detta inkluderar att förklara hur de olika beräkningsoptionerna fungerar, hur korre-

lationerna för värmeöverföring är utformade, samt vad de olika funktionerna och variab-

lerna i programmet har för roll i programmet.

1.3 Mål

Målen med detta projekt är att göra en lyckad konvertering av PASGOs programkod så

att programmet går att använda på operativsystem som exempelvis Windows 7 och

Windows 10, och att göra programmet mer användarvänligt. Målen innefattar även att

jämföra olika korrelationer för värmeöverföring, för att kunna avgöra om det finns ett

behov av att uppdatera de korrelationerna som används för tillfället. Om det visar sig att

det finns nya korrelationer som låter programmet göra noggrannare beräkningar angå-

ende framför allt försmutsning på tuberna i ånggeneratorn, så ska de gamla korrelation-

erna bytas ut mot dessa nya korrelationer.

2. Teori

2.1 Kärnkraft

Kärnkraft använder radioaktiva ämnen, ofta Uran-isotopen U-235 (235U), som bränsle.

Uran-atomerna genomgår en process kallad fission, där atomkärnorna klyvs av neutro-

ner, vilket gör att rörelseenergi samt fler neutroner frigörs. Dessa neutroner kan i sin tur

klyva andra atomkärnor. Kedjereaktionen som då uppstår gör att en mängd energi fri-

görs i processen. Den frigjorda energin används för att värma upp vatten som finns i

Page 12: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

3

kärnkraftreaktorer, vilket gör att ånga produceras. Ångan leds vidare till en turbin som

är kopplad till en elektrisk generator. Ångan får turbinbladen att rotera, vilket i sin tur

leder till att generatorn producerar elektrisk effekt. Efter det kyls ångan ned så att den

kondenserar till vatten, som sedan leds tillbaka för att kunna kokas igen. Fissionsreakt-

ionen kontrolleras med hjälp av styrstavar som består av neutronabsorberande ämnen.

Stavarna kan sänkas eller höjas för att kontrollera hur många fria neutroner som finns i

reaktorn, och på så sätt reglera fissionsreaktionen. [3-4]

2.2 Tryckvattenreaktor

En tryckvattenreaktor, härefter kallad PWR (från engelskans ”Pressurized Water Re-

actor”), är en sorts kärnreaktor. Den utgör tillsammans med kokvattenreaktor, härefter

kallad BWR (från engelskans ”Boiling Water Reactor”), de två vanligaste reaktortyper-

na. Tre av de åtta kärnreaktorer som Sverige har i kommersiell drift för tillfället är PWR.

Både Ringhals 3 och Ringhals 4, som PASGO är avsett för, är PWR.

Figur 1 En överblicksbild av en tryckvattenreaktor. De röda delarna tillhör primärloopen medan de gula delarna

tillhör sekundärloopen. Ref. [3]

En PWR är uppbyggd av en primärloop och en sekundärloop (-slinga). En överblicks-

bild av en PWR kan ses i Figur 1 ovan. I primärloopen finns reaktorn som innehåller

kärnbränslet, medan sekundärloopen bland annat består av ånggeneratorn, turbinen, och

kondensatorn. Hela primärloopen är fylld med vatten och trycksatt till runt 15 MPa,

Page 13: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

4

vilket är tillräckligt högt för att hindra vattnet från att koka när kärnbränslet i rektorn

värmer upp vattnet till cirka 325 ºC. Det uppvärmda vattnet flödar ut ur reaktorn genom

det så kallade ”varma benet”. Det varma benet delas upp i tusentals mindre rör när det

övergår till det så kallade tubpaketet. Tubpaketet är den del av primärloopen som leds

genom ånggeneratorn. När det varma vattnet flödar genom tubpaketet överförs värmen

genom rörväggarna till vattnet i ånggeneratorn. Att tubpaketet består av många små rör

istället för ett stort rör gör att arean där värmeöverföring kan blir större. Vattnet leds

sedan vidare från tubpaketet till det ”kalla benet”, varifrån det sedan pumpas tillbaka till

reaktorn där det kan värmas upp igen, och därmed sluta primärloopen. Delen som är till

höger om tryckkärlet i Figur 1 är tryckhållaren, vars uppgift är att reglera reaktortrycket.

En mer detaljerad bild av en ånggenerator i ett PWR kan ses i Figur 2. I sekundärloopen

är trycket lägre än i primärloopen. Vattnet i ånggeneratorns riser värms upp av primär-

loopens vatten och börjar koka. Ångan som bildas stiger upp i separatorerna högst upp i

ånggeneratorn, där vattnet separeras från ångan. Därefter leds ångan in i turbinen där

den roterar turbinbladen. Turbinens axel driver en generator, vilken i sin tur genererar

elektrisk effekt. Vattnet från separatorerna faller ner i fallspalterna (”downcomer annu-

lus”) som leder det på sidan om risern till botten av ånggeneratorn, där det leds in i ri-

sern igen. Ångan i turbinen fortsätter genom en kondensator där den kyls ned och över-

går till vatten igen. Vattnet pumpas sedan in i ånggeneratorn som matarvatten, där det i

fallspalten blandas med vattnet från separatorerna, innan det leds in i risern där det kan

värmas upp igen, vilket sluter sekundärloopen.

Page 14: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

5

Figur 2 En ånggenerator i ett PWR sett från sidan. Ref. [16]

I kontrast till PWR så har BWR bara en loop där trycket är lägre än i primärloopen i

PWR. Reaktorn och ånggeneratorn är då kombinerade, vilket betyder att kärnbränslet

värmer upp vattnet i reaktorn så det börjar koka, och den producerade ångan leds genom

separatorerna till turbinen. De roterande turbinbladen gör så att generatorn genererar el,

varefter ångan kyls ned och kondenserar till vatten i kondensatorn, innan vattnet slutlig-

en pumpas tillbaka till reaktorn igen. [3-4]

2.3 Den globala fouling-faktorn och αsmuts

Prestandan för kärnkraftverk förändras allt eftersom det är i drift. En PWR som har varit

i bruk i 20 år kan ha tydliga skillnader i prestanda jämfört med en nybyggd PWR. En

bidragande faktor till detta är försmutsning av rören, vilket också kallas för fouling. Ett

mått på fouling är den globala fouling-faktorn som anges i [m2K/kW]. Korrosionspro-

dukter, till exempel järn, transporteras på sekundärsidan med matarvattnet till ånggene-

ratorn där de samlas som en beläggning på tubernas ytor. Över lång tid byggs dessa la-

ger på och blir tjockare. Korrosionen sker främst i vatten på utsidan av dessa tuber. Att

fouling byggs upp på utsidan av tuberna kan påverka värmeöverföringsförmågan från

primärloopens vatten i tubpaketet till vattnet i ånggeneratorns tank på sekundärsidan,

vilket i sin tur påverkar hur mycket ånga som bildas, vilken effekt reaktorn har, och

därmed också den elektriska effekten. [5-7]

Page 15: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

6

De första åren efter att en ny reaktor har tagits i drift så kan foulingen ge en ökad vär-

meöverföring. Detta beror på att en måttlig fouling gör att antalet platser för nukleation,

det vill säga platser där ångbubblor kan bildas, ökar. Ett ökat antal ångbubblor som

lossnar från tubernas yta ökar turbulensen i vattnet omkring tuberna, vilket förbättrar

värmeöverföringen. I takt med att lagret av fouling på tuberna blir tjockare och tjockare

(det kan i värsta fall bli millimetertjocka lager) under en längre tid, så blir värmeöverfö-

ringsförmågan gradvis sämre. En typisk utveckling av den globala fouling-faktorn kan

ses i Figur 3. När värmeöverföringsförmågan försämras minskar även ångtrycket i ång-

generatorn, vilket kan observeras i Figur 4. Blir ångtrycket för lågt finns det en risk att

den termiska effekten inte kan hållas vid 100 %. Det är värt att nämna att de kemiska

förhållandena i vattnet också kan påverka den globala fouling-faktorn mycket. [6-8]

Figur 3 Typisk utveckling av den globala fouling-faktorn i en ånggenerator beroende på antal år den har varit i drift.

Ref. [8]

Page 16: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

7

Figur 4 Typisk utveckling av ångtrycket i en ånggenerator beroende på fouling. Refueling Outage är samma sak som

revisionavställning, det vill säga när en reaktor är avstängd under några veckor för underhåll. Under denna tiden

byts även delar av bränslet ut. Ref. [7]

I PASGO används αsmuts (”alfa-smuts”) [kW/(m2K)] istället för den globala fouling-

faktorn som ett mått på försmutsning av tuberna, även om den globala fouling-faktorn

används vid beräkningar i programmet. αsmuts är definierat som inversen av den globala

fouling-faktorn, det vill säga 1/Rf, där Rf är den globala fouling-faktorn. Denna omdefi-

niering beror antagligen på att den globala fouling-faktorn för försmutsning av tuber i

PWR oftast har ett värde strax över 10-2, vilket betyder att αsmuts oftast har ett värde strax

under 100, vilket kan anses vara enklare att skriva ut och läsa. Ett högt värde på αsmuts

betyder att värmeöverföringsförmågan är bra jämfört med ett lågt värde på αsmuts, vilket

är motsatsen till den globala fouling-faktorn, där ett högt värde betyder en sämre vär-

meöverföringsförmåga än ett lågt värde.

2.4 Reynolds’ och Prandtls tal Reynolds’ tal (Re) är en dimensionslös storhet inom fluidmekaniken som används för

att förutse mönster för fluiders flöden. Reynolds’ tal kan beskrivas som en kvot av trög-

hetskrafter och viskösa krafter i en fluid som utsätts för relativ inre rörelse, och är defi-

nierat enligt Ekvation 1, där ρ är fluidens densitet (kg/m3), är fluidens dynamiska vis-

kositet (kg/(m∙s)), är fluidens kinematiska viskositet (m2/s), L är en karaktäristisk

längdenhet (m), och u är en karakteristisk hastighet (m/s), som väljs olika beroende på

Page 17: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

8

tillämpning. För ett rör är u ofta vald som fluidens medelhastighet i rörtvärsnittet (röret

antas vara stilla). [9-10]

= � = Ekvation 1

Prandtls tal (Pr) är också en dimensionslös storhet, som kan beskrivas som en kvot av

diffusionshastigheten för rörelsemängd och diffusionshastigheten för värme. Detta be-

tyder att för en fluid med ett lågt Prandtls tal, Pr<<1, så dominerar spridningen av värme

över spridningen av rörelsemängd. Det motsatta gäller för fluider med ett stort Prandtls

tal, Pr>>1, då spridningen av rörelsemängd dominerar. Prandtls tal definieras enligt

Ekvation 2, där a är fluidens temperaturledningstal (thermal diffusivity) (m2/s), cp

(J/(kg∙K)) är fluidens specifika värmekapacitet per massenhet vid konstant tryck, och

(W/(m∙K)) är fluidens värmeledningsförmåga. [9,11]

= � = Ekvation 2

2.5 Turbulenta flöden i trycksatta kärnkraftverk

I fluidmekanik gör man skillnad på laminära och turbulenta flöden. Laminära flöden

kännetecknas av att vätskepartiklarna flödar fram lugnt längs regelbundna linjer. Lami-

nära flöden är vanliga vid låg hastighet och hög viskositet. De beror också på Reynolds’

tal, och i exempelvis rör uppstår laminära flöden vanligtvis när Reynolds’ tal är mindre

än ett kritiskt värde som ligger mellan ungefär 2000 och 2300. För laminära flöden i rör

förflyttar sig vätskepartiklarna i mitten av röret snabbare än partiklarna närmare rörets

yta, vilket beror på friktionen mot den fasta ytan. Turbulenta flöden, däremot, känne-

tecknas av att vätskepartiklarna i flödet förflyttar sig oregelbundet. Även om flödet går i

en specifik riktning så kan individuella partiklar röra sig åt olika håll, och följer inte de

regelbundna linjerna så som vätskepartiklar i laminära flöden tenderar att göra. Turbu-

lens kan börja uppstå i flöden redan vid det kritiska värdet på Reynolds tal mellan 2000

och 2300, men fullt utvecklade turbulenta flöden brukar uppstå först vid Reynolds tal

över 4000 till 5000. I Figur 5 kan ett exempel på laminärt flöde (undre halvan) respektive

turbulent flöde (övre halvan) runt en cylinder ses. [10,12]

Page 18: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

9

Figur 5 Turbulent flöde (övre halvan) och laminärt flöde (undre halvan) runt en cylinder. Ref. [12]

Under vanliga reaktorförhållanden är flöden i och runt tuberna i PWR väldigt turbulenta.

[13] Eftersom turbulenta flöden är mycket mer komplexa än laminära flöden, betyder

detta att uttryck för värmeöverföring med mera bygger mer på empiriskt

tagna ”korrelationer” istället för teoretiskt framtagna relationer.

2.6 Nusselts tal och värmeövergångstalet

Värmeövergångstalet, α (W/(m2K)), används för att beräkna värmeutbytet mellan en

fast yta och ett omgivande, strömmande medium. Värmeövergångstalet är definierat

enligt Ekvation 3, där (W) är värmeutbytet som kan skrivas enligt Ekvation 4, med / � � som (normalkomponenten av) temperaturgradienten vid väggen (indexet �

står för ”vägg”), A som arean (m2) hos ytan, och υ som temperaturdifferensen mellan

den fasta ytan och fluiden (K). Ett exempel på en temperaturgradient för en fluid

mellan två ytor kan ses i Figur 6. Ekvation 3 och Ekvation 4 ger tillsammans ut-

trycket för värmeövergångstalet i Ekvation 5, där minustecknet för derivatan har

tagits bort och absolutbeloppet istället används då värmeövergångstalet och tem-

peraturdifferensen alltid brukar räknas positiva.

= ��� Ekvation 3 = −�� / � � Ekvation 4

Page 19: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

10

� = � | / |�� Ekvation 5

Figur 6 Temperaturfördelning hos en strömmande fluid mellan två ytor, som båda har samma (lägre) temperatur.

Den lokala temperaturgradienten / � � visas vid den ena ytan. Ref. [9]

Temperaturgradienten vid en yta beror på strömningsförhållanden, ytans geometri, och

ämneskonstanter för mediet, vilket betyder att värmeövergångstalet är en funktion av

många parametrar. Med hjälp av de så kallade likformighetslagarna kan antalet variabler

minskas genom att storheter som påverkar värmeövergången sammanförs till grupper

som bildar dimensionslösa tal. För värmeövergångstalet får vi därmed Ekvation 6, där L

är en karakteristisk längd (lämpligt vald). I derivatan finns nu två dimensionslösa vari-

abler, t/υ som ”temperaturvariabel” och x/L som ”lägesvariabel”. Efter omskrivning fås

det dimensionslösa uttrycket för Nusselts tal (Nu), se Ekvation 7 nedan. Nusselts tal är

en dimensionslös storhet som representerar temperaturgradienten vid en yta.

� = � | / |�� = | /�/ |� Ekvation 6

� = | /�/ |� = � Ekvation 7

Page 20: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

11

För geometriskt likformiga system ger grundekvationerna för beskrivning av tempera-

turfält (Fouriers differentialekvation) och hastighetsfält (Navier Stokes’ ekvationer) vid

påtryckt strömning att den dimensionslösa formen av temperaturfältet (bland annat)

beror av Reynolds’ och Prandtls tal. Värmeövergångstalet för temperaturfältet utanför

en yta kan därmed beskrivas av ett funktionssamband på formen i Ekvation 8. Funkt-

ionen f( ) gäller för geometriskt likformiga system.

� = ; Ekvation 8

Funktionssambandet bestäms empiriskt genom modellprov, och kan sedan användas

tillsammans med Ekvation 7 för att bestämma värmeövergångstalet. [9]

3. Värmeöverföringskorrelationer

Vattnet, som värms upp i reaktorn på primärsidan och flödar genom tubpaketet, överför

värme genom tubernas väggar till sekundärsidans vatten i ånggeneratorns tank. Vattnet

som flödar in i tubpaketet har temperaturen Thot (ºC), medan vattnet som flödar ut ur

tubpaketet har temperaturen Tcold (ºC). Temperaturskillnaden mellan vattnet som flödar

in i och ut ur tubpaketet betecknas ΔT (ºC), se Ekvation 9.

�� = �ℎ − � Ekvation 9

Ett större värde på ΔT betyder att mer värme överförs från primärsidan till sekundärsi-

dan. I PASGO beräknas effekten (W) för värmeöverföringen genom en liten area A

(m2) av en tub enligt Ekvation 10, där Rtot (m2K/W) är den totala värmeresistansen per

areaenhet hos tubens vägg.

= ��� Ekvation 10

Den totala värmeresistansen är summan av tre delar; värmeresistansen för tubens inre

yta (Ri), tubens yttre yta (Ry), och tubväggen själv (Rv), vilket kan ses i Ekvation 11. Om

en tub efter att reaktorn har varit i drift en tid också har fouling på tubens yta så uppstår

det även värmeresistans på grund av det, vilket resulterar i Ekvation 12 där Rf1 och Rf2

Page 21: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

12

är värmeresistanserna för foulingen på tubens insida respektive utsida. Dessa två värme-

resistanser kan ersättas med en total värmeresistans för fouling, Rf, då man oftast beräk-

nar foulingens värmeresistans genom att jämföra värmeöverföring genom tubväggen för

en tub med fouling, med teoretiska värden för en tub utan fouling. De båda fallen kan

observeras i Figur 7. [6]

= � + + Ekvation 11 = � + + + + Ekvation 12

Figur 7 Värmeresistans för en ånggeneratortub som är ren (a) och en som har fouling på ytan (b). Ref. [6]

I PASGO hänförs Rtot till tubernas yttre diameter enligt Ekvation 13, där Di (m) är tu-

bernas innerdiameter, Dy (m) är tubernas ytterdiameter, och v (W/(m∙K)) är tubernas

värmeledningsförmåga. Den första termen motsvarar Ri, den andra termen motsvarar Rv,

Page 22: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

13

och den tredje termen motsvarar Ry i Ekvation 11. αi (W/(m2K)) och αy (W/(m2K)) ges i

enlighet med Ekvation 7 av Ekvation 14 respektive Ekvation 15, där (W/(m∙K)) är

värmeledningsförmågan för fluiden och Ds (m) är den hydrauliska diametern för ut-

rymmet som vattnet på utsidan av tuberna strömmar i. Uttrycket för den hydrauliska

diametern kan ses i Ekvation 16, där Ay (m2) är den våta tvärsnittsarean och P (m) är

den våta omkretsen av tvärsnittet hos utrymmet som vattnet på utsidan av tuberna

strömmar i. Dessa parametrar beror på hur stödplåtarna som håller fast tuberna är ut-

formade. Det ska noteras att den hydrauliska diametern också används för tubernas insi-

das värmeövergångstal, men att den hydrauliska diametern för insidan av ett vattenfyllt

runt rör är densamma som rörets diameter, vilket är varför Ekvation 14 ser ut som den

gör. [6,14]

= �� ��� + � (� /��) + � + Ekvation 13

�� = ��� � � Ekvation 14

� = � � Ekvation 15 = � Ekvation 16

Mängden värme som kan överföras från primärsidan till sekundärsidan beror alltså till

stor del på Nusselts tal. Som tidigare har nämnts, beror Nusselts tal i sin tur på Reynolds’

och Prandtls tal. Nusselts tal beskrivs av empiriskt framtagna korrelationer som lämpar

sig olika väl beroende på diverse förhållanden såsom storlek på Reynolds’ och Prandtls

tal, förhållandet mellan tubens längd och diameter etc. Dittus-Boelters är en av de mest

använda korrelationerna för värmeöverföring i PWR, och är även den som används i

PASGO. Den ska dock, tillsammans med ett antal andra korrelationer, analyseras för att

bedöma om det finns ett behov av att byta ut den eller inte.

3.1 Dittus-Boelters korrelation

Dittus-Boelters korrelation är den mest använda korrelationen för att ta fram Nusselts tal

för vattens turbulenta strömning i rör med slät yta. Den används även ofta för att ta fram

Nusselts tal för vattens turbulenta strömning längs med tubpaketet i ånggeneratorn på

PWR. Detta gör denna korrelation lämplig för användning i värmeöverföringsberäk-

Page 23: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

14

ningar i PWR eftersom tuberna har slät yta, och flödena tenderar att vara turbulenta un-

der normala driftförhållanden. Dittus-Boelters korrelation används därmed för att be-

räkna Nusselts tal för insidan och utsidan av tubpaketets tuber vid enfasströmning. Dit-

tus-Boelters korrelation kan ses i Ekvation 17, där n = 0,4 för uppvärmning (tubväggens

temperatur är större än fluidens temperatur) och n = 0,3 för nedkylning (tubväggens

temperatur är mindre än fluidens temperatur). I PASGO används n = 0,4 för både insi-

dan och utsidan av tuberna, vilket resulterar i Ekvation 18.

� = , , Ekvation 17 � = , , , Ekvation 18

Dittus-Boelters korrelation har experimentellt fastställts gälla för , ≤ ≤ , ≳ , och � ≳ , där L (m) är tubens längd och D (m) är tubens diameter.

Temperaturskillnaden mellan fluiden och tubväggen bör dessutom vara liten eller me-

delstor för att resultaten ska anses vara exakta. Detta är villkor som uppfylls i PWR un-

der normala driftförhållanden. Det finns experimentell data som tyder på att konstanten

0,023 i Ekvation 17 och Ekvation 18 är lite i det minsta laget för strömning utanför tub-

paketet, och att den skulle kunna modifieras en aning baserat på tubpaketets stödplåtars

geometri och tubernas diameter. Detta är dock något som inte har använts till ekvation-

erna i PASGO. [11,13]

3.2 Petukhov-Kirillov-Popovs korrelation och Gnielinskis korrelation

Dittus-Boelters korrelation är enkel att använda, och är tillräckligt noggrann i de flesta

sammanhang. Den kan dock ge fel på upp till 25% i vissa fall. Användning av en mo-

dernare och mer komplex korrelation, som Petukhov-Kirillovs korrelation, kan minska

dessa fel till under 10%. Petukhov-Kirillov-Popovs korrelation ges av Ekvation 19, där

det dimensionslösa talet ”f” är en friktionsfaktor för tuber med slät yta, och ges av Ek-

vation 20. [11]

� = /, + , / / / − Ekvation 19 = , � − , − Ekvation 20

Page 24: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

15

Petukhov-Kirillov-Popovs korrelation gäller för , < < , och < <∗ . Gnielinski modifierade sedan denna korrelation och skapade sin egen korrelat-

ion som gäller även för lägre Reynolds’ tal. Gnielinskis korrelation ges av Ekvation 21,

där f återigen är en friktionsfaktor för tuber med slät yta, som ges av Ekvation 22.

� = / −+ , / / / − Ekvation 21 = , � − , − Ekvation 22

Gnielinskis korrelation gäller för , < < , och < < ∗ . Detta

betyder att Gnielinskis korrelation, utöver att vara mer exakt än Dittus-Boelters korrelat-

ion, även gäller för ett större spann för Prandtls tal. Dessutom gäller Gnielinskis korre-

lation för lägre Reynolds’ tal, som motsvarar flöden i övergångsområdet mellan lamin-

ärt och turbulent flöde, medan Dittus-Boelters korrelation och Petukhov-Kirillov-

Popovs korrelation bara gäller för fullt utvecklat turbulent flöde [11]. I Figur 8 jämförs

Dittus-Boelters korrelation och Gnielinskis korrelation med experimentellt framtagna

data för hur Nusselts tal beror av Reynolds tal. Experimentella data avser luft med

Prandtls tal Pr = 0,71. Dessa data kan ses i tabell 1 i appendix A.

Page 25: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

16

Figur 8 Nusselts tal beräknat med Dittus-Boelters korrelation samt med Gnielinskis korrelation, jämfört med

experimentellt framtagna värden.

I Figur 8 kan man notera att både Dittus-Boelters korrelation och Gnielinskis korrelation

stämmer väl överens med de experimentella data för Reynolds’ tal över cirka 5000, vil-

ket motsvarar den fullt turbulenta regionen och delar av den delvis turbulenta regionen.

För Reynolds’ tal på cirka 2000-5000 kan man dock tydligt se hur Gnielinskis korrelat-

ion stämmer mycket mer väl överens med de experimentella data än vad Dittus-Boelters

korrelation gör. För Reynolds’ tal under 2000, vilket motsvarar laminärt flöde, stämmer

ingen av de två korrelationerna överens med de experimentella data. I Figur 9 kan man

sedan också notera ett liknande mönster, där Petukhov-Kirillov-Popovs korrelation ver-

kar stämma väl överens med de experimentella data för den fullt turbulenta regionen,

men inte för lägre Reynolds’ tal.

Page 26: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

17

Figur 9 Nusselts tal beräknat med Petukhov-Kirillov-Popovs korrelation samt med Gnielinskis korrelation, jämfört

med experimentellt framtagna värden.

4. PASGOs uppbyggnad

PASGO (Performance Analysis and Steam Generator Optimization) är ett beräknings-

program skrivet i programspråket Turbo Pascal 6.0. Det utför diverse värmeöverförings-

och tryckfallsberäkningar för att göra prestandauppföljningar för ånggeneratorerna i

Ringhals’ reaktor 3 och 4. PASGO har fem olika optioner där olika utdata beräknas ite-

rativt. Opt 1 beräknar ånggeneratortrycket (ÅG-trycket), opt 2 beräknar αsmuts, opt 3

beräknar den termiska effekten, opt 4 beräknar αsmuts samt DPkorr, vilket är en korrek-

tionsfaktor för primärtrycket, och opt 5 beräknar ÅG-trycket fast med möjlighet att mo-

difera turbineffekten. Det ska noteras att opt 2 är överflödig och inte används, eftersom

opt 4 också beräknar αsmuts, och dessutom gör det mer effektivt.

Page 27: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

18

4.1 Skillnader mellan R3 och R4

PASGO är utvecklat både för Ringhals 3 och 4. Dessa två reaktorer är båda PWR, men

utformningen av ånggeneratorerna skiljer sig en del från varandra. Detta gör att det

finns två versioner av PASGO, en som är anpassad för Ringhals 3 och en som är anpas-

sad för Ringhals 4. De två versionerna av PASGO har en rad skillnader, men de är upp-

byggda näst intill identiskt.

En del av skillnaderna beror på att R3 och R4 är geometriskt olika. Detta gör att de två

versionerna av PASGO använder olika värden för längder, areor, volymer, tryckfallsko-

efficienter med mera för ånggeneratorn i programkoden.

Den andra väsentliga skillnaden mellan R3 och R4 är att ånggeneratorn i R4 är av en så

kallad ”economizer-typ”, se Figur 10 nedan. Notera att den övre delen av ånggeneratorn,

där bland annat separatorerna sitter, inte är inkluderad i figuren. R3 är av en konvent-

ionell matarvattenringstyp, se Figur 2 ovan. I en ånggenerator av matarvattenringstyp

fördelas mattarvattenflödet jämnt i en fallspalt som löper 360º runt risern (sett ovani-

från) i ånggeneratorn. Detta innebär att matarvattnet fördelas jämnt mellan den kalla och

den varma halvan av risern. Även recirkulationsflödet som kommer tillbaka från separa-

torerna ned till fallspalten delas upp jämnt mellan den varma och kalla halvan av risern.

Figur 10 En ånggenerator av economizer-typ, likt den som finns i Ringhals 4.

Page 28: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

19

I en ånggenerator med economizer, som R4, finns två fallspalter som löper 180º var runt

risern. I den ena fallspalten förs allt matarvatten (högra halvan av Figur 10), samt unge-

fär 10% av recirkulationsflödet till den kalla halvan av risern, medan i den andra falls-

palten (vänstra halvan av Figur 10) leds ungefär 90% av recirkulationsflödet och ingen

del av matarvattenflödet ned till inloppet till den varma halvan av risern. R4 har också

en skiljeplåt som sträcker sig några meter upp från tubplattan, vilket hindrar att vattnet i

den varma och den kalla halvan blandas. R3 har ingen delningsplåt alls.

Recirkulationsflödet kommer från vatten som är separerat från ånga, vilket betyder att

det är väldigt hett, medan matarvattenflödet är relativt svalt jämfört med vattnet i risern.

Att den största delen av recirkulationsflödet leds till den varma halvan av risern, och

matarvattenflödet leds till den kalla halvan, betyder att den varma halvan kommer bli

ännu varmare medan den kalla halvan blir kallare jämfört med i R3. På den varma sidan

låter den högre temperaturen ångbildning ske längre ner i risern. På den kalla sidan blir

temperaturskillnaden jämfört med vattnet i tuberna större än för R3, vilket ger möjlighet

till större värmeöverföring. Ångbildning för den kalla sidan sker först ovanför skiljeplå-

ten, där vattnet från den varma och kalla sidan blandas. Denna design ger ånggeneratorn

en större effekt jämfört med designen i R3, och ger möjligheten att även öka ångtrycket.

Av dessa anledningar kommer också αsmuts att ha ett högre värde i R4 än i R3. [15]

4.2 Huvudprogrammet

PASGO är till största delen uppbyggt av så kallade ”procedures”, det vill säga subruti-

ner, funktioner i Turbo Pascal 6.0 som inte returnerar något värde. Om en subrutin an-

ropas med argument i form av variabler som indata kommer dock argumentet att ändras

i den anropande subrutinen, om det ändras i den anropade subrutinen. Det gör att pro-

grammet kan anropa en subrutin för att göra diverse beräkningar som ändrar flera vari-

ablers värden samtidigt.

Programmet är uppbyggt så att det först deklarerar ett antal globala variabler och arrayer,

samt definierar ett par konstanter, som exempelvis pi. Sedan definieras alla subrutiner

som används i programmet, innan huvudprogrammet startar. Huvudprogrammet är kort,

och består endast av några få anrop till olika subrutiner. Först skapas och namnges filen

Page 29: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

20

som resultaten skrivs till, sedan sätts alla globala variabler och arrayer lika med noll,

innan en subrutin vid namn ”Pr_Pr” anropas för att hantera alla anrop rörande beräk-

ningar och liknande. Ett flödesschema för programmets opt 4 visas i appendix B. Där

kan läsaren enklare förstå programmets uppbyggnad när den förklaras i de kommande

styckena. Även om vissa detaljer skiljer sig mellan de fem optionerna så är de så pass

lika varandra att flödesschemat ger en bra överblick av alla fem optioner.

4.3 Filhantering

Programmet låter användaren mata in huruvida resultaten ska skrivas till en ny textfil

eller till slutet av en gammal textfil, samt vad denna textfil ska heta. Sedan kontrollerar

programmet om det redan finns en textfil med det angivna namnet sparad på den platsen

i datorn som är angiven i koden. Om användaren vill skapa en ny textfil med samma

namn som en textfil som redan finns så får användaren välja om denna fil ska skrivas

över eller inte. Väljer användaren att inte skriva över den redan befintliga filen, alterna-

tivt om användaren har valt att skriva resultaten till en gammal textfil som inte finns, så

bes användaren att välja ett nytt namn för resultatfilen. Det valda filnamnet och filens

plats på datorn sparas till globala variabler av typ ”string”, för att programmet enkelt

ska kunna öppna textfilen senare när resultat ska skrivas till den.

4.4 Input till PASGO

När PASGO anropar subrutinen Pr_Pr, så definierar den först diverse variabler, samt

skriver datum och programversion till resultatfilen. Efter detta anropas en subrutin som

läser in ångtabelldata från dat-filer till arrayer i PASGO. Dessa data kommer senare att

användas vid beräkningar av entalpier, tryck, viskositeter, volymiteter etc.

Efter detta anropas en subrutin som låter användaren välja vilken option som ska köras,

samt skriva in värden för diverse parametrar som används som indata. Vilka indata som

efterfrågas varierar med vilken option som har valts, men exempel på efterfrågade pa-

rametrar är temperaturer för varma och kalla benen, ÅG-tryck, olika vatten- och ångflö-

den, αsmuts med mera. Användaren har möjligheten att mata in ”0” som indata till flera

av parametrarna, vilket låter dessa parametrar anta standardvärden som definieras i pro-

gramkoden. Mängder av reaktorspecifika geometriska värden överförs till sina respek-

Page 30: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

21

tive variabler och arrayer. Dessa värden varierar givetvis mellan koden för R3 och ko-

den för R4. Till sist skrivs information om körningens indata till resultatfilen.

4.5 Start

Den resterande delen av Pr_Pr är en stor loop som körs tills stoppvilloren, som förklaras

i detalj senare i rapporten, uppfylls. Först anropas en subrutin vid namn ”Start”. Här

beräknas många olika flöden, bland annat flödet upp genom risern av ånggeneratorn,

flödet som kommer från separatorerna till fallspalten, fallspaltsflödet etc. Dessa flöden

är bland annat viktiga för att tryckfallet (även kallat DP från ”delta pressure”) som upp-

står på grund av friktion i fallspalten ska kunna beräknas. Summan av detta DP och

tryckfallet som uppstår i fallspalten på grund av elevationsskillnader i den flera meter

höga fallspalten, ger det totala fallspalts-DP, det vill säga skillnaden i tryck mellan top-

pen och botten av fallspalten.

4.6 HLoop

Nästa subrutin som anropas i Pr_Pr kallas för ”HLoop”. I HLoop görs främst beräk-

ningar av värmeöverföring från primärsidan till sekundärsidan genom tubpaketet, samt

DP för risern av ånggeneratorn. PASGO delar in risern, och därmed även tubpaketet,

axiellt (dvs. i höjdled) i tolv delar där varje del separeras av en stödplåt för tuberna.

Varje del, förutom den första delen som är under den första stödplåten, delas sedan in i

fyra mindre delar så att risern och tubpaketet är indelade i totalt 45 höjdelement. HLoop

består av en stor for-loop med 45 iterationer så att alla beräkningar görs för varje höjd-

element. Bidragen från ett höjdelement adderas i slutet av varje iteration så att man får

den totala effekten för värmeöverföringen och det totala DP för risern när beräkningarna

för alla 45 höjdelement har slutförts. I varje iteration beräknas även nya lokala värden

för vattnets (och eventuellt även ångans) temperatur i risern och i tuberna. Dessa värden

används sedan i det nästkommande höjdelementet. Detta är viktigt, eftersom vattnet i

tuberna för över värme till vattnet i risern, vilket betyder att dessa temperaturer föränd-

ras när man observerar olika delar av ånggeneratorn. Det 45:e och sista höjdelementet

motsvarar den översta delen av tubpaketet, där tuberna böjs i en U-form för att sedan gå

nedåt igen. Figur 11 visar en ånggenerator från en PWR. ”Tube supports” är stödplå-

tar, ”tube bundle” är tubpaketet, ”primary inlet” och ”primary outlet” är inloppet och

utloppet av primärsidans varma och kalla ben, ”downcomer annulus” är den övre delen

Page 31: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

22

av fallspalten, och ”steam outlet” är utloppet, genom vilket ångan lämnar ÅG för att

föras vidare till turbinen. Man kan tydligt se hur tuberna i tubpaketet är böjda till en U-

form. Vattnet är givetvis varmare i tuberna på den vänstra sidan än på den högra sidan

eftersom det har hunnit överföra en stor mängd värme innan det kommer till den högra

sidan.

Figur 11 En ånggenerator i ett PWR sett från sidan. Ref. [16]

4.7 Pr_Ka

HLoop anropar en subrutin vid namn ”Pr_Ka” två gånger för varje höjdelement, en

gång för den varma halvan av risern och en gång för den kalla halvan. Det är här som

beräkningarna för värmeöverföringen från primärsidan till sekundärsidan sker. Här de-

las uttrycket för den totala värmeresistansen från Ekvation 13 upp i två delar. Den ena

delen är värmeresistansen för utsidan av tuberna, Ry, och ges av Ekvation 23, medan den

andra delen är resten av den totala värmeresistansen, R, och ges av Ekvation 24.

= � Ekvation 23

Page 32: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

23

= �� ��� + � (� /��) + Ekvation 24

PASGO använder sedan Newton-Raphsons metod tillsammans med en omskriven kor-

relation som beskriver värmeövergångstalet, för att skapa en iterationsloop som beräk-

nar yteffekten, Qq (W/m2), och som avslutas när resultatet är tillräckligt exakt. Denna

iterationsloop skiljer sig beroende på om det bara finns vatten utanför tuberna eller om

det finns en blandning av vatten och ånga. För fallet när det bara finns vatten utanför

tuberna gäller uttrycken i Ekvation 25 och Ekvation 26. I Ekvation 25 utgör Fq skillna-

den mellan Dt, som är temperaturskillnaden mellan vattnet i tuberna och koktemperatu-

ren för vattnet utanför tuberna, med samma temperaturskillnad beräknad med värmere-

sistansen och det aktuella värdet för yteffekten. Sedan itereras ett nytt värde på yteffek-

ten fram i Ekvation 26 med hjälp av Fq. Detta värde stoppas sedan in i Ekvation 25 igen.

Denna iterationsloop håller på tills Fq är mindre än 10-5 ºC. Hjälpvariabeln E ges av

uttrycket i Ekvation 27, där Py är sekundärtrycket utanför tubpaketet.

= + , , − Ekvation 25

, = − , / + , − , Ekvation 26 = � − , ∙ − ∗ Ekvation 27

Då det har börjat uppstå ånga på grund av kokning så används på samma sätt Ekvation

28 till Ekvation 30 istället. Båda dessa iterationsloopar brukar konvergera, men om in-

datan skiljer sig mycket från standardvärden kan det hända att iterationen inte konverge-

rar. Iterqq är en iterationskonstant som påverkar hur exakt resultatet blir. Den har stan-

dardvärdet 0,1 men kan specificeras av användaren om så önskas.

= + , − Ekvation 28

, = − � ∙ / + , − , Ekvation 29 = − , Ekvation 30

För fallet då det endast är vatten utanför tuberna beräknas sedan ett nytt värde för Ry

enligt Ekvation 31, där Ti (ºC) är temperaturen hos vattnet i tuberna och Ty (ºC) är tem-

Page 33: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

24

peraturen hos vattnet utanför tuberna. Om detta värde på Ry är större än det värde som

beräknades med hjälp av korrelationer i början av Pr_Ka så ersätter det här värdet det

gamla värdet, och yteffekten som beräknades iterativt används för fortsatta beräkningar.

Om det nya värdet däremot är mindre än det gamla så används det gamla värdet, och

yteffekten beräknas enligt Ekvation 32, där Ry är värmeresistansen för utsidan av tuber-

na som beräknades med hjälp av korrelationer i början av Pr_Ka, och R ges av Ekvation

24. Detta görs för att yteffekten tycks konvergera mot ett orimligt lågt värde när det

itereras fram för den kalla sidan av risern. Detta steg görs inte överhuvudtaget för de

höjdelement då vattnet utanför tuberna redan har börjat koka. Detta beror på att vattnet

utanför tuberna har konstant temperatur då det kokar.

= ��−� − Ekvation 31

= ��−�+ Ekvation 32

Härnäst beräknas temperaturen för insidan av tubväggen (Twi), utsidan av tubväggen

(Twy), och för mitten av tubväggen (Tm), i Ekvation 33 till Ekvation 35, där Ri ges av den

första termen i Ekvation 24.

� � = �� − � Ekvation 33 � = � � − � (� /��) Ekvation 34 � = , � � + � Ekvation 35

Alla dessa steg, från det att Qq itereras fram till att Tm beräknas, upprepas sedan tills

skillnaden mellan två efterföljande Tm är mindre än 0,5 ºC. Initialvärdet för Tm beräknas

enligt Ekvation 36, medan det andra värdet alltid beräknas med Ekvation 33, Ekvation

34 och Ekvation 35. Härnäst beräknas yteffekten, också den iterativt. Ct (dimensions-

lös) är en parameter som beräknas i slutet av det föregående höjdelementet enligt Ekvat-

ion 37. För det första höjdelementet används ett förbestämt värde.

� , = �� − �� − � Ekvation 36 = ��−���−� Ekvation 37

Page 34: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

25

Slutligen beräknas effekten för det aktuella höjdelementet. Detta görs enligt Ekvation 38,

där Q (W) är effekten, Dz (m) är höjden för det aktuella höjdelementet, och Na (dimens-

ionslös) är antalet ej pluggade tuber i tubpaketet. Effekten summeras efter varje höjd-

element för att få den totala effekten när alla höjdelement har genomförts.

= ��� Ekvation 38

Eftersom varje höjdelement inte är oändligt litet, kommer det att övergå från att vara

endast vatten till att vara en blandning av vatten och ånga i ett av höjdelementen. Detta

höjdelement identifieras genom att i slutet av beräkningarna även beräkna entalpin för

vattnet utanför tuberna, och jämföra denna med entalpin för kokande vatten vid samma

tryck. Om den beräknade entalpin är större än entalpin för kokande vatten vid samma

tryck så vet programmet att kokning har uppstått i toppen av höjdelementet, trots att

kokning inte hade uppstått i botten av höjdelementet. För det specifika höjdelementet

görs då alla beräkningar igen, fast med ekvationerna som gäller för när det finns en

blandning av vatten och ånga utanför tuberna. Den beräknade entalpin används sedan

för att avgöra hur stor del av den effektberäkningen för det aktuella höjdelementet som

ska komma från beräkningarna gjorda för fallet då endast vatten finns utanför tuberna,

och hur stor del som ska komma från beräkningarna då en blandning av vatten och ånga

finns utanför tuberna. Från och med höjdelementet efter detta så används enbart ekvat-

ionerna för fallet då en blandning av vatten och ånga finns utanför tuberna.

4.8 Tryckfallsberäkningar i HLoop

I HLoop beräknas DP för varje höjdelement i risern. Detta DP uppstår av flera olika

orsaker, och beror på det aktuella höjdelementet samt huruvida det har börjat uppstå

kokning på sekundärsidan eller inte. För vart fjärde höjdelement finns det en stödplåt

som skapar ett engångs-DP (Pa) på grund av att den gör det trängre för vattnet och even-

tuell ånga att flöda fram. Uttrycket är detsamma, oavsett om ånga finns i det aktuella

höjdelementet eller inte, och ges av Ekvation 39, där Ms (kg/s) är vattenflödet för ena

halvan av risern, As (m2) är arean för halva risern (med tubernas areor borträknade), K

(dimensionslös) är motståndstalet för den aktuella stödplåten, och V (m3/kg) är volymi-

teten för vattnet (och eventuell ånga) i risern.

Page 35: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

26

= , � � ∙ � Ekvation 39

För de höjdelement där det inte finns någon stödplåt skapas det istället ett friktions-DP

på grund av friktionen mellan tuberna och vattnet som flödar upp genom risern, samt ett

elevations-DP på grund av att tyngdkraften verkar olika mycket på vattnet beroende på

hur mycket vatten som finns ovanför det aktuella höjdelementet. Friktions-DP (Pa) ges

av Ekvation 40, där Ds (m) är den hydrauliska diametern för utrymmet mellan tuberna,

Dz (m) är höjden för det aktuella höjdelementet, och Y (dimensionslös) är en friktions-

faktor som itereras fram med hjälp av tubernas ytråhet och vattnets Reynolds’ tal för det

aktuella höjdelementet. När temperaturen har blivit så pass hög att ånga börjar bildas

förändras dock friktions-DP på grund av att vi har en blandning av ånga och vatten i det

aktuella höjdelementet. Detta tvåfas-DP (DPtf) är ett modifierat uttryck av friktions-DP i

Ekvation 40, och kan observeras i Ekvation 41. X (dimensionslös) är ånghalten, medan

pcr=2,21∙107 (Pa) är det kritiska trycket för vatten och p (Pa) är trycket för det aktuella

höjdelementet. Kvoten � (dimensionslös) är det så kallade reducerade trycket, och

används när fluiden är under så pass extremt tryck och temperatur att det inte finns nå-

gon klar övergång mellan vätskeform och gasform.

Elevations-DP (Pa) ges av Ekvation 42, där g (m/s2) är tyngdaccelerationen. Det ska

noteras att volymiteten varierar en del beroende på bland annat om det har bildats ånga i

risern för det aktuella höjdelementet eller inte.

= ,� � ∙ � ∙ Ekvation 40

= ( + , � , ) Ekvation 41 = �� Ekvation 42

Slutligen uppstår det också ett accelerations-DP för de höjdelement där det har börjat

koka. Detta beror på att volymiteten för vattnet ökar när andelen ånga ökar, vilket skap-

ar en acceleration eftersom tubernas diameter, och därmed tubernas volym, inte ökar.

Ett uttryck för accelerations-DP kan ses i Ekvation 43, där V1 (m3/kg) är volymiteten för

Page 36: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

27

vattnet för det föregående höjdelementet och V2 (m3/kg) är volymiteten för det aktuella

höjdelementet. Det totala DP för hela risern kan fås genom att summera dessa fem DP

(DPf för de höjdelement med bara vatten, och DPtf för de höjdelement där det finns en

blandning av vatten och ånga) från Ekvation 39-43 över alla 45 höjdelement, vilket kan

ses i Ekvation 44.

� = � � − � Ekvation 43 = ∑ ,� + ,� + ,� + ,� + �,��= Ekvation 44

4.9 Stoppvillkor

PASGO har två stoppvillkor som måste uppfyllas för att de uträknade storheterna i pro-

grammet ska anses vara korrekta. En stor del av programmet loopas tills båda dessa

villkor är uppfyllda. Se gärna flödesschemat i appendix B. Det första stoppvillkoret är

att skillnaden i temperatur mellan vattnet i tuberna på den kalla sidan och den varma

sidan av risern måste vara mindre än 0,001 ºC för det sista höjdelementet. Se Ekvation

45, där Tph (ºC) och Tpc (ºC) är temperaturen för det varma respektive det kalla benet.

Detta är logiskt eftersom det sista, och därmed översta, höjdelementet är där vattnet i

den varma och kalla sidan av tubpaketet möts. Det är helt enkelt samma vatten i både

den varma och kalla sidan i det höjdelementet, och skillnaden i temperatur bör därför

vara så nära noll som möjligt. Eftersom temperaturen i tubernas varma och kalla sidor

beräknas i varje höjdelement, och det översta steget är det sista, så beräknar PASGO

enkelt denna temperaturskillnad efter hela HLoop har avslutats.

|� ℎ − � | < , Ekvation 45

Det andra stoppvillkoret säger att det ska finnas en tryckbalans i ånggeneratorn, det vill

säga att summan av alla DP i ånggeneratorn ska vara så nära noll som möjligt. Detta är

också ett rimligt villkor. Eftersom PASGO behandlar stationära förhållanden så är ång-

flödet ut till turbinen, matarvattenflödet in till ÅG, och reaktorns effekt konstant. Det är

då logiskt att trycket på en punkt i ånggeneratorn är detsamma hela tiden då ånggenera-

torn är ett slutet system, och vatten och ånga flödar runt i en slinga. För att se om stopp-

villkoret uppnås summerar PASGO fallspalts-DP (DPdc) som har beräknats i ”Start”, det

Page 37: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

28

totala DP för hela risern (DPst) som har beräknats i ”HLoop”, och DP för separatorerna

(DPsep) som beräknas i ”Pr_Pr” precis innan stoppvillkoret testas. Absolutbeloppet av

summan av dessa DP ska vara mindre än 10 Pa, se Ekvation 46.

| + + | < Ekvation 46

4.10 Iteration av de sökta storheterna

Varje gång programmet loopas så görs även en iteration för beräkning av den sökta

storheten, vilket är ÅG-trycket för option 1 och 5, αsmuts för option 2 och 4, och den ter-

miska effekten för option 3. Den sökta storheten får ett initialt värde i början av pro-

grammet (x0 i Ekvation 47), och den första iterationen görs enligt Ekvation 47 för att få

ett andra värde (x1 i Ekvation 47). Sedan sker en iteration enligt Ekvation 48 varje gång

programmet loopas, för att ta fram nästa värde för den sökta storheten. I Ekvation 48 är

xn+1, xn, och xn-1 värdet på den sökta storheten för den kommande loopen, den nuvarande

loopen, respektive den föregående loopen, medan ΔTn och ΔTn-1 är temperaturskillnaden

som finns beskriven i vänsterledet av Ekvation 45, för den nuvarande respektive den

föregående loopen. Iterf är en iterationsfaktor som användaren kan anpassa i koden be-

roende på hur noggrann lösning man vill ha. PASGO pausar en körning och skriver ut

en varning i kommandoprompten om Δ� − Δ� − < − , eftersom det uttrycket står

i nämnaren i Ekvation 48, och den termen kan bli extremt stor om nämnaren blir väldigt

liten. Händer detta så är det ofta ett tecken på att lösningen inte verkar konvergera.

� = . � Ekvation 47 � + = � − �� ∙ � − −�� −�� − Ekvation 48

PASGO beräknar alltså inte den sökta storheten direkt. Istället används den sökta stor-

heten för att göra beräkningar i PASGO som sedan ger värden för stoppvillkoren. Den

sökta storheten anpassas sedan med hjälp av temperaturskillnaden från det första stopp-

villkoret i varje loop. När den sökta storheten har ett korrekt värde så kommer den att ge

en temperaturskillnad som gör att stoppvillkoret har uppfyllts. När stoppvillkoret när-

mar sig att uppfyllas blir även förändringen av den sökta storheten inför nästa steg

också mindre, eftersom temperaturskillnaden finns med som en del av Ekvation 48.

Page 38: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

29

Detta är logiskt eftersom den sökta storhetens värde närmar sig sitt korrekta värde när

stoppvillkoret närmar sig att uppfyllas.

4.11 DP

När stoppvillkoret har uppfyllts körs subrutinen ”Start” en sista gång. Den här gången

beräknas en mängd olika tryckskillnader för primärsidan med hjälp av vattenflödet på

primärsidan och geometriska storheter som är specificerade i programkoden. De DP

som beräknas är trycket som byggs upp av cirkulationspumpen (DPpump), elevations-DP

för tubplattan till härdens underkant (DPe1), tubernas höjd (DPe2), härdens höjd (DPe3),

härdens överkant till tubplattan (DPe4), engångs-DP för reaktortanken (DPrt), varma

benet (DPh), kalla benet (DPc), primärloopens ”loop-seal” (DP1s), ånggeneratorinlopp

(DPsgi), ånggeneratorutloop (DPsgu), tubinlopp (DPsgti), tubutlopp (DPsgtu), samt frikt-

ions-DP för tuberna (DPsgt). Alla DP för delar som är vid ånggeneratorn kan summeras

till en parameter, DPsgf för att förenkla kommande uttryck något, se Ekvation 49. På

samma sätt kan alla tryckfall för resterande flöden på primärsidan summeras till DPrc

enligt Ekvation 50, och alla elevations-DP summeras till DPe enligt Ekvation 51. En

tryckfallsbalans, DPL, kan beräknas enligt Ekvation 52. Denna bör vara lika med noll då

primärloopen är ett slutet system.

= � + � + + + Ekvation 49 = + ℎ + + Ekvation 50 = + + + Ekvation 51 = − − − Ekvation 52

PASGO beräknar till slut en korrektionsfaktor för tryckfallet på primärsidan som kallas

DPkorr (dimensionslös), vilken kan ses i Ekvation 53. Detta är en faktor som måste

multipliceras med för att bli lika med − − , och därmed låta primär-

loopen uppnå tryckbalans, för de aktuella in-parametrarna. Storleken på beror

alltså på förändringar i tryckfallet på primärsidan, och förändringar av den kan bero på

olika faktorer som exempelvis nya bränsletyper, korrosion i primärloopen, och degrade-

ring av primärloopens huvudpump med mera. = motsvarar en exakt tryckba-

lans i primärloopen, medan en högre motsvarar ett ökat tryckfall, och ett lägre

Page 39: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

30

motsvarar ett lägre primärflöde. Även mindre beräkningsfel på grund av brist

på noggrannhet i beräkningarna blir inkluderade i .

= � −� −�� � Ekvation 53

5. Konvertering av programkod

5.1 Val av programspråk

PASGO är, som tidigare nämnt, skrivet i Turbo Pascal 6.0. Det fanns ett antal olika al-

ternativ för programspråk att konvertera PASGOs programkod till, varje med olika för-

delar och nackdelar. Det valda programspråket var tvunget att fungera på Windows 10,

och vara så pass etablerat att det förutspås få uppdateringar och liknande kontinuerligt,

så att det kan användas under en lång tid framöver. Det valda programspråket skulle

också gärna möjliggöra enkel integrering i Ringhals’ processdatasystem PIS. Till en

början övervägdes Matlab, mycket på grund av dess styrkor inom beräkningsvetenskap

och det faktum att det är det program jag har haft mest erfarenhet av under min studietid.

Sedan övervägdes även Free Pascal länge, och till viss del även Delphi. Free Pascal är

ett användarutvecklat programspråk som skapades efter att Turbo Pascals utvecklare

Borland lade ner framtida utveckling av Pascal-programspråken. Det är användarut-

vecklat och strävar efter att vara så likt Pascal som möjligt. Detta betyder att Free Pascal

skulle kunna möjliggöra en så enkel konvertering av PASGOs programkod som möjligt,

eftersom syntax och funktioner liknar de i Turbo Pascal 6.0 väldigt mycket. Free Pascal

har även fördelen att det är kostnadsfritt. Delphi är det programspråk som Borland valde

att utveckla efter de gav upp Pascal, och det har därför också syntax som liknar den som

Turbo Pascal 6.0 använder, även om den inte är lika lik Free Pascals syntax.

Efter en hel del övervägande valdes dock C++ i Visual Studio. C++ har fördelarna att

det är ett väl etablerat programspråk som inte förutspås försvinna inom en överskådlig

framtid. C++ använder syntax och funktioner som givetvis skiljer sig mer från Turbo

Pascal 6.0 än vad Free Pascal gör, men syntax och den allmänna programstrukturen är

ändå förhållandevis lik. Visual Studio är utgivet av Microsoft och fungerar därmed utan

problem med moderna Windows-operativsystem. Efter möte med folk på Ringhals där

Page 40: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

31

valet av programspråk diskuterades så framkom det också att Visual Studio skulle möj-

liggöra för enklaste möjliga integrering i PIS. Av dessa anledningar ansågs C++ i Visual

Studio vara det mest lämpliga programspråket att konvertera PASGOs programkod till,

och valdes därför för detta projekt.

5.2 Konvertering till C++

Inför konverteringen av koden planerades att först göra en så exakt konvertering som

möjligt av PASGOs programkod till C++, utan att förändra själva innehållet i koden.

Sedan planerades det att göra en nyare version av koden med eventuella modifikationer

och förbättringar, när den första versionen av koden hade verifierats. Denna strategi

antogs för att göra konverteringen så enkel som möjligt och därmed minska risken för

att nya buggar och i programkoden uppstår, och förenkla felsökning när nya funktioner

och förbättringar sedan implementeras. PASGO finns i två snarlika versioner, där den

ena är anpassad för reaktor 3 och den andra för reaktor 4. Båda versionerna har konver-

terats till C++. Delar av koden kommer att visas, och bli hänvisade till, för att göra rap-

porten mer lättförstådd, men hela koden kommer inte att finnas med i denna rapport av

sekretesskäl.

PASGOs programkod består till största delen av en mängd subrutiner, vilka motsvaras

av void-funktioner i C++. De flesta av dessa void-funktioner i PASGO har argument i

form av variabler. Dessa modifieras av void-funktionen, trots att void-funktionen i sig

inte returnerar något värde. Det finns även vissa argument i form av parametrar som då

kan ändras i den kallade funktionen utan att dess värde i den första funktionen ändras.

Ett exempel på en void-funktion med variabler som argument som anropas i Turbo Pa-

scal 6.0 respektive C++ kan ses i Figur 12 nedan. Den nya programkoden behåller den

gamla stilen och är därmed uppbyggd till största delen av void-funktioner med variabler

som argument. Det är värt att nämna att Turbo Pascal 6.0 inte gör skillnad på versaler

och gemener i variabel- och funktionsnamn, medan C++ gör det.

Page 41: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

32

Figur 12 Exempel på hur en subrutin/void-funktion med variabler som argument anropas i Turbo Pascal 6.0

respektive i C++.

Programkoden har sedan översatts direkt till den syntax som C++ använder, till största

delen utan nämnvärda förändringar. Det finns dock ett par ställen där kodens struktur

har ändrats något, vilket är relaterat till filhantering. I Turbo Pascal-versionen av PAS-

GO används två miljövariabler, till vilka text från en separat fil läses. Denna fil är av

env-typ (en förkortning av environment) och innehåller två rader text. Den första raden

anger vilken katalog i datorns hårddisk som resultatfilen ska lagras i. Den andra raden

anger i vilken katalog i datorns hårddisk som ett antal dat-filer med polynomkoefficien-

ter till ångtabeller, materialdata med mera, finns. Vid konverteringen till C++ valdes det

att istället ta bort denna env-fil för att göra programkoden mer lättförståelig, och för att

minska beroendet av externa filer. Sökvägen till katalogen som resultatfilerna ska sparas

i har istället skrivits explicit i programkoden. Innehållet från dat-filerna har också skri-

vits explicit i PASGOs programkod, och anges nu direkt till de arrayer som de ska spa-

ras i. Detta sker i samma void-funktion som tidigare skötte inläsningen från dat-filer till

dessa arrayer.

När en direkt konvertering av hela koden var slutförd och verifierad så gjordes en del

förbättringar av diverse detaljer i koden. Variabler som aldrig användes i koden togs

bort, många variabler tilldelades initialvärden i samband med deklarering istället för vid

ett senare tillfälle, och kodens struktur gjordes aningen mer lättläst. Även kommentarer

Page 42: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

33

för varje funktion lades till för att ytterligare göra programkoden mer lättförstådd. Alla

dessa ändringar, tillsammans med det faktum att C++ har en mer kompakt syntax än

Turbo Pascal 6.0, gjorde att koden krympte från ungefär 2300 rader till ungefär 1900

rader.

Ett stort problem med koden var att den var väldigt beroende av så kallade ”goto-satser”.

Dessa satser kan användas för att kontrollera i vilken ordning programmet arbetar, ge-

nom att välja att programmet ska ”hoppa” till en annan rad inom samma funktion när

programmet kommer till goto-satsen. Detta kan tyckas vara en smart lösning för att få

programmet att gå den väg man vill i sin kod, men avråds i de flesta situationer från att

användas eftersom det gör koden svår att läsa och sätta sig in i, och kan skapa problem

om man senare vill göra förändringar i koden. En mängd av dessa goto-satser elimine-

rades under projektets gång, genom att byta ut dem mot if-satser, while-loopar, eller

genom att omstrukturera koden, beroende på vad som passade bäst för varje situation.

Visa funktioner var dock uppbyggda på ett sådant sätt att de var helt beroende av dessa

goto-satser, och kunde därmed tyvärr inte elimineras inom spannet av detta projekt.

5.3 Inläsning av data från Excel-fil

En av de större modifieringarna av programmet var en funktion som möjliggör automa-

tisk inläsning av indata till programmet, så det inte är nödvändigt att alltid skriva in alla

indata manuellt. Detta visade sig vara svårare att lösa än förväntat, då det inte fanns

några användbara bibliotek för att läsa in data från celler i Excel-filer till variabler i C++.

Excel-filerna som data ska läsas in från innehåller en mängd olika data från Ringhals’

reaktorers prestandatester. Den ena filen innehåller data från Ringhals reaktor 3 och den

andra filen från reaktor 4. De två filerna är strukturerade så att varje vågrät rad motsva-

rar ett specifikt mätvärde (exempelvis varma eller kalla benets temperatur för en speci-

fik ånggenerator-loop), medan varje lodrät kolumn motsvarar ett specifikt datum som

prestandatestet är utfört på. I varje Excel-fil är det runt 20 rader med olika data som är

av intresse som indata till PASGO.

För att förenkla inläsningen av data sparas Excel-filen i csv-format. Detta är ett fil-

format som endast består av text, där cellvärden från Excel-filen separeras med semiko-

lon. Hur data sedan läses in till PASGO beskrivs i de kommande styckena. Själva struk-

Page 43: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

34

turen för denna del av koden ses i Figur 13, för att underlätta förståelsen av denna be-

skrivning. Den tar endast med inläsningen av två av de runt 20 raderna som läses in.

Diverse siffror i koden är också ändrade, men det påverkar inte kodens struktur. Pro-

blemet löstes genom att låta PASGO läsa in en rad åt gången som en textsträng, det vill

säga en data-typ för text, med hjälp av kommandot ”getline”. Detta sker i en while-loop

som körs tills det inte längre finns fler rader i csv-filen. En räknarvariabel som uppdate-

ras i varje iteration håller reda på vilken rad man är på. Sedan används ytterligare en

while-loop som körs i varje iteration av den tidigare while-loopen tills det inte finns

några kommatecken kvar. I varje iteration läses text fram tills ett kommatecken hittas

och läggs till i slutet av en vektor som skapades i början av funktionen, med hjälp av

kommandot ”push_back”. Det gör att den inlästa raden delas upp i en mängd olika pa-

rametrar av typ string och läggs in i en vektor. På så sätt sparas texten från varje cell i en

rad i Excel-filen till ett element (teckensträng) i vektorn. En vektor är lik en array, fast

den är mer dynamisk. Den kan ändra storlek allt eftersom man lägger till data till den,

och passar därmed bra för våra ändamål.

När alla element från en rad har lagts in i vektorn fortsätter programmet till en mängd if-

satser. Dessa if-satser testar om radräknarens värde svarar mot någon av de rader som

har data som ska anges som indata till PASGO. Det finns en if-sats för varje rad i Excel-

filen som har relevanta data. När if-satsen för en sådan rad blir sann så läses data från

vektorn till en ny vektor där de sparas. Detta sker genom en for-loop som körs från den

första till den sista kolumnen där data för kalenderdatum finns. PASGO förstår vilken

den sista kolumnen med data är genom att subtrahera antalet element som finns på en

rad efter den sista kolumnen med data, från vektorns storlek. If-satser inuti for-loopen

gör att data inte kopieras till den nya vektorn för datum som man vet inte har fullstän-

diga data i Excel-filen. På detta sätt kopieras all data för en sorts mätvärde (exempelvis

matarvattentemperaturen) till en ny vektor.

Denna kod kommer även att fungera om data från nya prestandatester läggs till, ef-

tersom nya element läggs till i slutet av vektorn. Det viktiga då är att data från det nya

prestandatestet läggs till i kolumnen direkt till höger om det senaste datumet i den

gamla Excel-filen, och att den nya Excel-filen sparas som en csv-fil på samma plats och

med samma namn som den gamla filen. Efter att data från en rad har kopierats till en ny

vektor, eller efter att alla if-satser var falska eftersom det var en rad i Excel-filen med

Page 44: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

35

mätvärden som inte används som indata till PASGO, så raderas alla element i den första

vektorn och räknarens värde ökas med ett. Detta gör att en ny rad från csv-filen kan

läsas in i vektorn och räknaren kan hålla reda på vilken rad i filen som behandlas för

tillfället. När alla rader har körts igenom är den yttersta while-loopen avslutad, och data

för alla kalenderdatum från ungefär 20 av raderna i Excel-filen finns nu sparade till lika

många vektorer. Det är värt att notera att motsvarande data för olika kalenderdatum

finns sparade i samma element i varje vektor, vilket kommer göra det enklare att hantera

dessa vektorer senare.

Figur 13 Kodexempel som visar strukturen för inläsning från Excel-fil till vektorer.

Alla dessa vektorer som innehåller värden på data är dock bara text i data-typen string.

För att kunna använda dessa vid beräkningar i PASGO måste de konverteras till data-

typen double (flyttal). Det enda undantaget är vektorn som innehåller kalenderdatum för

varje prestandatest, då dessa endast används för utskrift till resultatfilen och inte för

Page 45: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

36

några beräkningar. Detta görs med en funktion som använder klassen ”istringstream”

som finns i C++. Koden för denna funktion kan ses i Figur 14. Klassen ”BadConversion”

används för att ge användaren en varning om konverteringen inte lyckades. Denna

funktion används tillsammans med en for-loop för att konvertera alla element i alla vek-

torer med relevanta data (förutom vektorn med datum) från string till double. Koden för

denna for-loop kan observeras i Figur 15. Även denna gång finns endast koden för ett par

av de runt 20 vektorerna med. For-loopen körs från det första elementet i varje vektor

till det sista. I varje iteration konverteras ett element för varje vektor, och läggs sedan

till i en ny vektor som är definierad i början av funktionen, med hjälp av komman-

dot ”push_back”. Alla vektorer är lika stora, vilket betyder att antalet iterationer i for-

loopen stämmer överens med alla vektorer. När for-loopen är avslutad finns runt 20 nya

vektorer med värden av datatypen double.

Figur 14 Kod som konverterar en parameter av typ string till en parameter av typ double.

Figur 15 Del av kod som använder funktionen i figur 14 för att konvertera alla numeriska element i alla vektorer från

string till double.

5.4 Möjlighet att ändra indata

I versionen av PASGO som är skriven i C++ har det lagts in möjligheten för användaren

att välja om denne vill ange indata manuellt, eller använda automatisk inläsning av in-

data från Excel-fil. En if-sats gör att PASGO kör Pr_Pr som vanligt om användaren väl-

jer att mata in data manuellt. Användaren väljer då även vilken option som ska köras.

Om automatisk inläsning av indata väljs, så körs den tidigare beskrivna funktionen som

läser in data från Excel-fil till vektorer för alla datum. Option 4 (beräkna αsmuts och

Page 46: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

37

DPkorr) kommer sedan att väljas automatiskt. Sedan anropas en funktion som ger använ-

daren möjlighet att ändra vissa data om så önskas. Dessa data är matarvattenflödet,

varma benets temperatur och kalla benets temperatur. För matarvattenflödet finns endast

möjligheten att inte göra några förändringar, eller att göra kompenseringar för miss-

tänkta fel i prestandadatan i Excel-filen. Dessa kompenseringar är explicit kodade till

vissa värden för vissa specifika datum, och skiljer sig givetvis mellan koderna för reak-

tor 3 och 4. För varma och kalla benens temperaturer får användaren själv välja med hur

många grader som värdena i respektive vektorer ska ändras. Alla värden i den vektorn

ändras då med det gradantalet med hjälp av en for-loop. Denna funktion kan vara an-

vändbar om man vill testa alla data med en något annorlunda temperatur för det varma

och/eller det kalla benet. Detta kan också vara användbart om man misstänker att någon

av dessa temperaturer systematiskt uppmäts aningen fel.

5.5 Körning av PASGO med automatisk inläsning av indata

Om användaren väljer att PASGO ska använda automatisk inläsning av indata från Ex-

cel-fil, så kommer programmet att köra option 4 för att ta fram αsmuts och DPkorr för alla

datum i Excel-filen. Detta kommer dessutom att göras tre gånger för varje datum ef-

tersom Ringhals’ reaktor 3 och 4 har tre ånggeneratorer vardera kopplade till sig. Efter

att data har lästs in till vektorer från Excel-fil, och eventuella ändringar av indata har

gjorts, så startas en for-loop som kommer att genomlöpas lika många gånger som pro-

dukten av 3 och antalet kalenderdatum. I for-loopen finns dessutom två räknare. Den

ena håller reda på vilken ånggenerator för det aktuella datumet som beräkningar sker för,

och börjar på ett för att sedan uppdateras efter varje ånggeneratorn tills den har nått vär-

det tre, då den sätts tillbaka till ett igen. Den andra räknaren startar på noll, och uppdate-

ras sedan var tredje loop. Den håller reda på vilket datum i ordningen som beräkningar

sker för, och börjar på noll eftersom det är indexet för det första elementet i varje vektor.

Varje iteration börjar med att PASGOs variabler sätts lika med noll. Sedan läses data till

variabler från vektorer som innehåller data som är lika för alla ånggeneratorer för ett

visst datum. Räknaren för datum gör att rätt element kan anges från vektorn till varia-

beln. Vissa data, exempelvis ånggeneratortrycket, samt varma och kalla benens tempe-

raturer, skiljer sig mellan de tre ånggeneratorerna, och är därför uppdelade i tre olika

vektorer. Det finns tre if-satser, varav en blir sann för varje genomgång av for-loopen,

Page 47: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

38

med hjälp av räknaren som håller reda på vilken ånggenerator som beräkningarna sker

för. När en if-sats blir sann så läses data in till variabler från de vektorer som motsvarar

den specifika if-satsens ånggenerator. Räknaren för datum gör att data läses från rätt

element i vektorerna på samma sätt som tidigare.

När indata har lästs in så anropas Pr_Pr för att göra en körning med indata från det aktu-

ella datumet och den aktuella ånggeneratorn. Pr_Pr körs på samma sätt som med manu-

ell inmatning av data, fast med två skillnader. Funktionen som hanterar användarens

inmatning av data är ändrad till att endast ange förutbestämda parametervärden för ång-

generatorn och liknande. Aktuell option och värden för indata har redan lästs till variab-

lerna så det behöver inte göras igen. Den andra skillnaden är att resultaten skrivs an-

norlunda till resultatfilen. I PASGO med manuell inmatning av data skrivs mer än 50

olika värden för både in- och utdata till resultatfilen. Detta kan vara bra när man bara

kör en körning, men eftersom PASGO körs hundratals gånger när automatisk inläsning

av indata görs så kan resultatfiler med så många värden bli opraktiska att läsa. Istället

skapas två resultatfiler som fokuserar på resultaten för αsmuts och DPkorr. Den första re-

sultatfilen innehåller värden för αsmuts och DPkorr för alla körningar, samt information om

datum, nummer på ånggenerator, eventuella korrigeringar av indata, och slutligen me-

delvärden för αsmuts och DPkorr för varje datum. Den andra resultatfilen är lite mer avska-

lad, och strukturerar värden på αsmuts och DPkorr för varje ånggenerator och medelvärden

på en rad för varje datum. På så sätt är alla resultat för en specifik storhet för alla kalen-

derdatum samlade i samma kolumn. Detta gör det enklare att kopiera data om man vill

göra diagram för att undersöka trender över lång tid. Två förkortade exempel på resul-

tatfiler kan ses i appendix C. Alla värden är i dessa resultatfiler är helt påhittade och

kommer inte från riktiga körningar med riktiga indata.

När Pr_Pr har körts en gång så uppdateras till slut räknarna innan en iteration av for-

loopen är avslutad. Sedan startar nästa iteration där alla variabler sätts lika med noll

igen, och nya värden från nästa element i vektorerna läses in till sina respektive variab-

ler. I varje iteration skrivs det ut till kommandotolken vilken iteration i for-loopen som

körs. Detta gör det enklare att felsöka om programmet kraschar, eller om lösningen för

en viss kombination av indata inte konvergerar. När alla ånggenerator-iterationer för

alla datum har körts, så skriver PASGO ut var resultatfilerna sparas, och pausar pro-

grammet tills användaren avslutar PASGO genom att klicka på enter-knappen.

Page 48: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

39

5.6 Verifiering av den nya koden

Koden skriven i C++ verifierades allteftersom ändringar gjordes, genom att jämföra

resultatfiler från körningar av den nya koden med resultatfiler från körningar av origi-

nalprogrammet skrivet i Turbo Pascal 6.0, för att snabbt upptäcka nya fel. Den slutliga

versionen av koden verifierades sedan både för manuell inläsning av data, och för auto-

matisk inläsning av data.

För att verifiera att PASGO fungerar för manuell inläsning av data, gjordes körningar

för alla optioner (utom option 2 som ej används och som inte fungerar korrekt i origi-

nalversionen av PASGO) med koden för Ringhals 3 och 4, och med alla olika val av

indata för både originalversionen av PASGO i Turbo Pascal 6.0 och för den nya vers-

ionen i C++. Samma indata användes i både den gamla och den nya versionen av koden

för samma körningar. I resultatfilerna skrivs varje värde ut med upp till sex värdesiffror.

Alla utskrivna värden i resultatfilerna från dessa körningar var exakt lika. Detta tyder på

att den nya programkoden fungerar lika bra som originalkoden för manuell inläsning av

data.

För att testa om automatisk inläsning av indata fungerar korrekt så gjordes ett antal kör-

ningar av den nya koden med och utan korrigering av matarvattenflödet respektive

varma och kalla benens temperatur. Ett antal kalenderdatum valdes sedan ut slumpmäss-

igt, och jämfördes sen med resultaten från körningar gjorda med option 4 i den gamla

koden med motsvarande indata. Eftersom αsmuts och DPkorr är de enda utdata som skrivs

till resultatfilen vid körningar med automatisk inläsning av indata så var dessa de enda

resultaten som jämfördes. I de flesta fallen var resultaten från körningarna med den

gamla och den nya koden exakt lika för det utskrivna antalet värdesiffror. För ett par

enstaka körningar var den sista utskrivna värdesiffran avrundad annorlunda för de två

olika koderna, när den efterföljande värdesiffran var nära fem. Detta kan bero på att vid

automatisk inläsning av data används division för att ta fram ett fåtal parametrar, medan

för manuell inmatning av data angavs dessa parametrar med decimaltal. Om den sista

värdesiffran är väldigt nära att ändras så kan avrundningsfel som detta uppstå. En sådan

liten skillnad i resultaten spelar ingen roll för programmets ändamål.

Page 49: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

40

5.7 Version med uppdaterade värmeöverföringskorrelationer

Slutligen skapades en andra version av programkoden för både reaktor 3 och 4. I denna

version har Dittus-Boelters korrelation, som finns med i originalversionen av PASGO

för beräkning av Nusselts tal för tuberna, bytts ut mot den modernare Gnielinskis korre-

lation, som kan ses i Ekvation 21. Denna version av koden testades: alla optioner, inklu-

sive den automatiska inläsningen av data kunde köras utan att krascha. För option 4

jämfördes resultaten för αsmuts och DPkorr från den första versionen av koden respektive

den nya versionen av koden. Det visade sig att resultaten för DPkorr var nästan exakt lika

för de båda versionerna, medan αsmuts antog högre värden för den nya versionen av ko-

den.

Om man observerar många körningar kan man dock se att båda versionerna visar

samma mönster för samma indata. I Figur 16 och Figur 17 kan man se en jämförelse av

αsmuts för körningar med de båda versionerna av programkoden. Sex körningar gjordes

för koderna för både reaktor 3 och reaktor 4. Alla körningar gjordes med olika exem-

pelvärden som indata och har ingen speciell relation till varandra. De visar dock ett ex-

empel på hur man kan observera trender för körningar gjorda vid olika tidpunkter. Det

ska noteras hur versionen som använder Gnielinskis korrelation har större absolutvärden,

men att de båda versionerna följer samma mönster, vilket betyder att programmet ska

kunna användas för att observera trender över tid. I Figur 18 och Figur 19 kan en jämfö-

relse av DPkorr för samma körningar med de båda versionerna observeras. Även denna

gång visas sex körningar för reaktor 3 och lika många för reaktor 4. Graferna är så lika i

det här fallen att de gömmer varandra.

Snarlika indata har använts för både reaktor 3 och 4, vilket är varför graferna för reaktor

3 liknar de för reaktor 4. De är dock inte exakt lika, och graferna bör därför inte använ-

das för att göra jämförelser mellan de två programkoderna.

Page 50: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

41

Figur 16 Jämförelse av αsmuts för Dittus-Boelters korrelation och Gnielinskis korrelation, för sex körningar med

påhittade data. Programkoderna för reaktor 3 används.

Figur 17 Jämförelse av αsmuts för Dittus-Boelters korrelation och Gnielinskis korrelation, för sex körningar med

påhittade data. Programkoderna för reaktor 4 används.

Page 51: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

42

Figur 18 Jämförelse av DPkorr för Dittus-Boelters korrelation och Gnielinskis korrelation, för sex körningar med

påhittade data. Programkoderna för reaktor 3 används.

Figur 19 Jämförelse av DPkorr för Dittus-Boelters korrelation och Gnielinskis korrelation, för sex körningar med

påhittade data. Programkoderna för reaktor 4 används.

Page 52: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

43

6. Diskussion

I originalversionen av PASGO används Dittus-Boelters korrelation (se Ekvation 17)

med n = 0,4 för beräkningar av Nusselts tal vid både insidan och utsidan av tuberna.

Dock säger teorin om korrelationen att n = 0,4 endast ska användas vid uppvärmning,

det vill säga när tubväggens temperatur är större än fluidens temperatur. Vid nedkylning

däremot, det vill säga när tubväggens temperatur är mindre än fluidens temperatur, ska

istället n = 0,3 användas. Vid tubernas utsida är tubväggens temperatur större än den

omgivande fluidens temperatur, vilket betyder att n = 0,4 ska användas i korrelationen.

Vid tubernas insida är dock tubväggens temperatur klart kallare än fluiden i tuberna,

vilket betyder att n = 0,3 borde användas för dessa beräkningar istället för n = 0,4. Det

är oklart varför n = 0,3 inte har använts här i originalkoden, och jag antar att det är ett

misstag. Jämförelse mellan originalkoden och en version som ändrar värdet till n = 0,3

för detta fall ger dock endast små skillnader. Det har valts att inte göra några ändringar

till korrelationen för den version av den nya programkoden i C++ som använder Dittus-

Boelters korrelation. Programmets främsta användningsområde är för att beräkna αsmuts

många gånger över lång tid för att kunna se hur försmutsning av tuberna utvecklas med

tiden. Det är då trender för resultaten som är det viktiga och inte att beloppet för αsmuts

har exakt korrekt storlek. Av den anledningen behåller denna version av programkoden

exakt samma korrelationer som tidigare för att möjliggöra jämförelser av nya körningar

med äldre studier gjorda med den tidigare versionen av PASGO. Om man vill använda

PASGO för att göra beräkningar med mindre osäkerhet så är versionen av PASGO som

använder Gnielinskis korrelation att rekommendera istället.

Jämförelserna mellan versionen av PASGO som använder Dittus-Boelters korrelation

och versionen som använder Gnielinskis korrelation visade att Gnielinskis korrelation

resulterade i ett större värde på αsmuts. Detta kan ses i Figur 16 och Figur 17, där körningar

med exempeldata kördes för båda versionerna av PASGO. Det är svårt för mig person-

ligen att bekräfta att Gnielinskis korrelation är den korrelation som ger de mer korrekta

värdena på αsmuts, utan att ha en mycket större mängd av experimentella data att jämföra

de två korrelationerna med. Gnielinskis korrelation har dock experimentellt fastställts ge

mer korrekta värden. Versionen som använder Gnielinskis korrelation rekommenderas

därför att användas. Även beräkningsprogrammet TRACE, som bland annat kan använ-

das för att göra säkerhetsanalyser i både BWR och PWR, har tidigare bytt ut Dittus-

Page 53: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

44

Boelters korrelation mot Gnielinskis korrelation. [17] Detta kan också ses som ett teck-

en på att Gnielinskis korrelation är den mer korrekta korrelationen att använda.

Som tidigare nämnt så är det viktigaste användningsområdet för programmet att beräkna

αsmuts för att se utvecklingen av tubernas försmutsning. Man observerar då trender, alltså

hur αsmuts förändras över tid. I Figur 16 och Figur 17 kan man se att trenderna för αsmuts är

snarlika för de båda versionerna av PASGO, även om själva beloppet skiljer sig. Detta

gör att versionen av PASGO som använder Dittus-Boelters korrelation fortfarande har

sina användningsområden, exempelvis om man vill göra jämförelser med tidigare stu-

dier gjorda med den gamla versionen av PASGO. Flödena i och utanför tuberna har

typiska Reynolds tal som är klart över 104 (turbulent strömning), vilket uppfyller villko-

ren för att Dittus-Boelters korrelation ska kunna användas. Dittus-Boelters korrelation

är alltså inte nödvändigtvis en dålig korrelation att använda i sammanhanget, även om

det mesta tyder på att Gnielinskis korrelation är bättre.

C++ valdes till det programspråk som PASGOs programkod skulle konverteras till. C++

är ett modernt programspråk som förutspås finnas kvar över en lång tid framöver. Det

finns tillgängligt som en del av Microsoft Visual Studio, som Ringhals ansåg vara ett

bra alternativ då det skulle underlätta integreringen i deras processövervakningssystem

PIS. I och med detta har C++ i Visual Studio varit ett bra val som programspråk för

projektet. Konverteringen från Turbo Pascal 6.0 har också gått relativt smärtfritt, även

om skapandet av en funktion som möjliggör automatisk inläsning av data från Excel-fil

var krångligare. I efterhand har diskussioner med andra anställda mynnat ut i att ett an-

nat bra alternativ skulle kunna ha varit C#. C# ska vara anpassat för att möjliggöra enkel

kommunikation med andra Microsoft-applikationer, såsom Excel och Word. Om C#

hade valts istället för C++ är det möjligt att skapandet av en funktion som läser in data

från en Excel-fil skulle kunna göras på ett enklare sätt, även om detta inte är bekräftat.

C# finns också tillgängligt i Visual Studio, så att det skulle vara enklare att integrera i

PIS gäller även för C#.

Konverteringen av koden till C++ får anses vara lyckad då de nya versionerna av PAS-

GO bedöms fungera bra. Den första versionen av koden för både R3 och för R4 ger re-

sultat som stämmer överens med den gamla koden på sex värdesiffror. Den nya vers-

ionen som använder Gnielinskis korrelation ger resultat som skiljer sig en del på vissa

Page 54: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

45

ställen, men det är att förvänta sig när man gör beräkningar på ett annat sätt. Funktionen

som läser in data automatiskt från Excel-fil till PASGO fungerar även den bra, även om

koden inte är helt lättförstådd. Det var svårt att komma fram till ett enkelt och effektivt

sätt att hantera Excel-filer med C++, men det är möjligt att det finns enklare sätt att

skriva funktionen på än hur den ursprungligen skrevs. Att det nu finns möjlighet att göra

körningar för att ta fram αsmuts och DPkorr för alla tidigare prestandatester för en reaktor i

en och samma körning är också en användbar förbättring av PASGO, speciellt när man

studerar hur αsmuts utvecklas över lång tid. Manuell inmatning av data för alla dessa pre-

standatester innebar att man fick lägga ner dagar, om inte veckor, av arbete, samtidigt

som man riskerade att råka skriva fel någonstans. Sedan var man tvungen att lägga ner

lika mycket tid om man ville göra en förändring av en parameter, exempelvis varma

eller kalla benets temperatur. Nu kan man göra alla dessa körningar på bara några minu-

ter. Utöver ovanstående har diverse allmänna förbättringar har gjorts till programkoden

även om det fortfarande finns en hel del kvar att göra, som att exempelvis förbättra läs-

barheten genom att eliminera de resterande goto-satserna.

6.1 Slutsatser

Programkoden har konverterats från Turbo Pascal 6.0 till ett modernare programspråk

(C++), vilket gör att programmet nu kan köras utan problem på modernare operativsy-

stem som exempelvis Windows 7 och 10. Programmet har även gjorts mer användar-

vänligt genom att möjliggöra automatisk inläsning av data från Excel-fil. Detta minskar

tiden som läggs på att manuellt mata in data till programmet, och låter användaren göra

hundratals körningar på bara ett par minuter. Programkodens struktur har också förbätt-

rats på många ställen.

Värmeöverföringskorrelationerna som originalversionen av programmet använder har

jämförts med två modernare korrelationer. Jämförelser med experimentella data tyder

på att en av dessa, Gnielinskis korrelation, ger noggrannare resultat än den tidigare an-

vända Dittus-Boelters korrelation, även om det är svårt att fastställa med säkerhet. Av

den anledningen har två versioner av programkoderna för Ringhals 3 respektive Ring-

hals 4 skapats, en som använder Dittus-Boelters korrelation och en som använder Gni-

elinskis korrelation.

Page 55: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

46

I och med detta dras slutsatserna att målen med examensarbetet, det vill säga att konver-

tera PASGOs programkod så att programmet går att använda på Windows 7 och 10, att

göra PASGO mer användarvänligt, samt att analysera och jämföra korrelationer för

värmeöverföring som kan användas i programmet, har uppfyllts.

Page 56: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

47

7. Referenslista

[1] Energiläget 2017. [webbsida]. Eskilstuna: Energimyndigheten. [uppdaterad 2018-

02-19; läst 2018-11-21]. Tillgänglig via: http://www.energimyndigheten.se/aret-

2017/nast-hogsta-elproduktionen-nagonsin/

[2] Framtiden för R1 och R2. [webbsida]. Solna: Vattenfall AB. [uppdaterad 2018-07-

17; läst 2018-11-21]. Tillgänglig via: https://corporate.vattenfall.se/om-oss/var-

verksamhet/var-elproduktion/ringhals/produktion-och-driftlage/framtiden-for-r1-och-r2/

[3] Så fungerar kärnkraft. [webbsida]. Solna: Vattenfall AB. [uppdaterad: 2014-05-09;

läst 2018-11-21]. Tillgänglig via: https://corporate.vattenfall.se/om-energi/el-och-

varmeproduktion/karnkraft/sa-fungerar-karnkraft/

[4] Så fungerar en tryckvattenreaktor. [webbsida]. Katrineholm: Strålsäkerhetsmyndig-

heten. [uppdaterad 2017-07-25; läst 2018-11-21]. Tillgänglig via:

https://www.stralsakerhetsmyndigheten.se/omraden/karnkraft/sa-fungerar-ett-

karnkraftverk/sa-fungerar-en-tryckvattenreaktor/

[5] Turner C W. Fouling of Nuclear Steam Generators: Fundamental Studies, Operating

Experience and Remedial Measures Using Chemical Additives. AECL Nuclear Review.

Juni 2013;2(1):63-67.

[6] Lovett J T, Dow B L. Steam Generator Performance Degradation. EPRI, Palo Alto,

CA: 1991. NP-7524.

[7] Kreider M A, White G A, Varrin R D Jr. Steam Generator Thermal Performance

Degradation Case Studies, EPRI, Palo Alto, CA: 1998. TR-110018.

[8] Dominon Engineering. Steam Generator Thermal Performance Transients. Presenta-

tion at; 2014; EPRI SG Secondary Side Management Conference, Baltimore.

[9] Ekroth I, Granryd E. Tillämpad termodynamik. Stockholm: Institutionen för Meka-

nisk värmeteori och kylteknik, Kungl Tekniska Högskolan; 1990.

[10] Pavlenko V, Rosenqvist L, Kochukhov O. Fluid mechanics Compendium. 10. uppl.

Uppsala: Department of Physics and Astronomy Uppsala University; 2015.

[11] Incropera F P, De Witt D P. Fundamentals of Heat and Mass Transfer. 3. uppl.

New York: John Wiley & Sons Inc; 1990.

[12] Laminar vs Turbulent Flow. [webbsida]. Nuclear Power for Everybody. [läst 2018-

11-22]. Tillgänglig via: https://www.nuclear-power.net/nuclear-engineering/fluid-

dynamics/flow-regime/laminar-turbulent-flow/

Page 57: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

48

[13] Tong L S, Weisman J. Thermal Analysis of Pressurized Water Reactors. 3. uppl.

New York: American Nuclear Society; 1996.

[14] Kreith F, Bohn M S. Principles of Heat Transfer. 4. uppl. New York: Harper-

Collins Publishers; 1986.

[15] ÅG-system Ringhals 3/4. [företagsinternt utbildningsmaterial]. Kärnkraftssäkerhet och Utbildning AB; 2005.

[16] Steam Generator. [webbsida]. Nuclear Power for Everybody. [last 2018-11-22]. Tillgänglig via: https://www.nuclear-power.net/steam-generator/

[17] TRACE V5.0 Theory Manual Field Equations, Solution Methods, and Physical Models. Washington DC: U.S. Nuclear Regulatory Commission; 2017.

Page 58: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

49

Appendix A

Tabell 1 Experimentella värden på Nusselts och Reynolds' tal, för luft med Prandtls tal lika med 0,71. Dessa värden

används i diagrammen i Figur 8 och Figur 9.

Nusselts tal (Nu) Reynolds’ tal (Re)

2,5 242

2,83 272

2,47 303

2,85 340

3,16 418

3,04 560

3,91 850

3,24 882

4,0 1235

4,5 1700

5,53 1940

6,05 2400

8,07 2750

11,55 3135

12,98 4000

24,1 5550

20,58 7100

29,2 7950

34,27 11600

47,4 15500

57,28 18350

58,9 23500

84,55 33100

88,75 41800

106,5 49500

188,7 82900

Page 59: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

50

Appendix B

Flödesschema för opt 4

Globala variabler definieras (huvudprogrammet)

↓ Skapar/väljer en fil som resultaten ska skrivas till (”Ass_files”)

↓ Globala variabler sätts lika med noll (”Init_var_To_Zero”)

↓ Ångtabelldata läses in från dat-filer till AX-vektorerna (”Fdat”)

↓ Indata matas in, såsom Th, Tc, matarvattenflöde, ÅG-tryck, ångflöde med mera. ÅG-

specifika indata matas in (mestadels geometriska data för ÅGn). Indata skrivs till resul-tatfilen. (”Pr_Input”)

↓ Diverse flöden för sekundärkretsen beräknas, samt primärflödet. Beräknar också diverse

värden vid fallspalten, inklusive fallspalts-DP (friktion och elevation). (”Start”) ↓

Beräknar entalpin för varma och kalla delen av sekundärsidan med hjälp av temperatu-rerna som beräknades i ”Start”. Beräknar också entalpin för varma och kalla benet på

primärsidan. (”HLoop”) ↓

Beräknar diverse värden för varma och kalla benen på primärsidan och för varma och kalla delen av risern på sekundärsidan, såsom viskositeter, värmeledningsförmågor,

volymiteter, Reynolds tal, Prandtls tal etc. (”HLoop”) ↓

Beräknar effekten för värmeöverföringen mellan primärkretsen och sekundärkretsen genom tuberna, samt yteffekten. (”Pr_Ka”)

↓ Beräknar nya entalpier och temperaturer för sekundärsidan. Beräknar DP för hela höjd-elementet i ÅG. Beräknar nya entalpier och temperaturer för primärsidan. Beräknar och summerar elevations- och friktions-DP för tuberna för primärsidan för alla höjdelement. Beräknar nya tryck för primärsidan. Summerar effekten för alla höjdelement. Summerar

DP för risern över alla höjdelement. (”HLoop”) Loopen till höger körs lika många gånger som antalet höjdelement: Ni=45 gånger

↓ Beräknar ånghalten vid riser-utlopp (”HLoop”)

↓ Om temperaturskillnaden mellan det varma och kalla benen på primärsidan är större än

0,001: Beräknar Alfa-smuts (”Iter”) ↓

Beräknar DP för separatorerna. Summerar det totala DP för hela sekundärsidan (riser, separatorer och fallspalt). (”Pr_Pr”)

Page 60: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

51

Loopen ovan avslutas och programmet fortsätter nedan när temperaturskillnaden (ab-solutbeloppet) mellan varma och kalla benen för det sista höjdelementet på primärsidan är mindre än 0,001 ºC och när det totala DP för hela sekundärsidan (absolutbeloppet) är

mindre än 10 Pa. ↓

Beräknar pumptryck och tryckfall för hela primärsidan. Beräknar DP-korr. (”Pr_Prfl”) ↓

Beräknar ångflödet till turbinen och till mellanöverhettaren, samt med hur många pro-cent som turbinkonstanten behöver ändras. (”Pr_Tmch”)

↓ Skriver resultaten till resultatfilen. (”Prnt2”)

↓ Om användaren väljer detμ Skriver extra körningsdata till resultatfilen. (”Prnt3”)

Page 61: Adam Mårtenson - DiVA portal1292664/FULLTEXT01.pdf · converted successfully into C++ in Visual Studio, which was the programming language of choice. A function to enable automatic

52

Appendix C

Exempel på resultatfil 1:

ALFAS (kW/m2K) DP-CORR (dimensionslös)

92-11-06 Korrigeringar för Mavaflöde: 0.0000 kg/s Thot: 0.0000 C Tcold: 0.0000 C

Loop 1: 30.0000 1.0000

Loop 2: 31.0000 1.1111

Loop 3: 29.0000 0.8889

Medel: 30.0000 1.0000

95-12-24 Korrigeringar för Mavaflöde: 0.0000 kg/s Thot: 0.0000 C Tcold: 0.0000 C

Loop 1: 35.1250 0.8888

Loop 2: 32.5555 0.7777

Loop 3: 33.1543 0.6666

Medel: 33.5432 0.7878

01-01-01 Korrigeringar för Mavaflöde: 0.0000 kg/s Thot: 0.0000 C Tcold: 0.0000 C

Loop 1: 25.7891 0.9999

Loop 2: 26.3456 0.9191

Loop 3: 26.2345 1.1010

Medel: 26.0123 0.9876

02-02-02 Korrigeringar för Mavaflöde: 0.0000 kg/s Thot: 0.0000 C Tcold: 0.0000 C

Loop 1: 32.2222 0.7770

Loop 2: 31.9187 0.7990

Loop 3: 31.3457 0.8124

Medel: 31.8765 0.8001

12-04-30 Korrigeringar för Mavaflöde: 0.0000 kg/s Thot: 0.0000 C Tcold: 0.0000 C

Loop 1: 38.1234 0.8945

Loop 2: 39.4321 0.9104

Loop 3: 40.1137 0.8729

Medel: 39.5531 0.8899

18-11-16 Korrigeringar för Mavaflöde: 0.0000 kg/s Thot: 0.0000 C Tcold: 0.0000 C

Loop 1: 33.4512 0.8781

Loop 2: 33.9100 0.8978

Loop 3: 35.6319 0.7632

Medel: 34.2105 0.8367

Exempel på resultatfil 2:

ALFAS (kW/m2K) DP-CORR (dimensionslös)

Loop 1 Loop 2 Loop 3 Medel Loop 1 Loop 2 Loop 3 Medel

92-11-06 30.0000 31.0000 29.0000 30.0000 1.0000 1.1111 0.8889 1.0000

95-12-24 35.1250 32.5555 33.1543 33.5432 0.8888 0.7777 0.6666 0.7878

01-01-01 25.7891 26.3456 26.2345 26.0123 0.9999 0.9191 1.1010 0.9876

02-02-02 32.2222 31.9187 31.3457 31.8765 0.7770 0.7990 0.8124 0.8001

12-04-30 38.1234 39.4321 40.1137 39.5531 0.8945 0.9104 0.8729 0.8899

18-11-16 33.4512 33.9100 35.6319 34.2105 0.8781 0.8978 0.7632 0.8367