• No results found

Filen med parametrarna som ska skrivas in

2. EULUMDAT filens namn med .ldt 3. Företagets namn

4. Typindikatorn, Ityp 5. Symmetri indikator, Isym 6. Mätningnummer

7. Armaturens namn 8. Armaturens nummer 9. Eulumdatfilens namn 10. Datum/användare

11. Armaturens längd/diameter i [mm]

12. Armaturens bredd i [mm]

13. Armaturens höjd i [mm]

14. Armaturens längd/diameter på horisontell lysande yta i [mm]

15. Höjd på vertikala lysande ytan i C0-planet i [mm]

16. Höjd på vertikala lysande ytan i C90-planet i [mm]

17. Höjd på vertikala lysande ytan i C180-planet i [mm]

18. Höjd på vertikala lysande ytan i C270-planet i [mm]

19. Omvandlingsfaktor

20. Armaturens lutning under mätning 21. Antal standarduppsättningar lampor 22. Antal lampor

23. Typ av lampor

24. Lampornas totala ljusflöde 25. Färgtemperatur

26. Färgindex

27. Lampornas effekt i watt inkluderat ballast

Diskussion och Slutsatser

6 Diskussion och Slutsatser

Ur jämförelserna som gjorts med samarbetspartnerns EULUMDAT filer för de analyserade armaturerna framkom det att resultatet som uppnåtts inte är tillräckligt bra. Orsakerna till detta är många och beror främst på förutsättningarna i ljuslabbet.

Under examensarbetets gång har de ljusintensiteter som räknats fram kunnat ritas upp i Matlab för de olika G- vinklarna i specificerade C-plan. Utifrån grafen kan sedan ljusspridningen och intensiteten vid olika G-vinklar läsas av och ur denna kan även armaturens spridningsvinkel uppmätas. Dessa diagram har visat att formlerna som används är rätt då graferna liknar de som går att ta fram utifrån de färdiga EULUMDAT filerna för de analyserade armaturerna. Interpoleringsfunktionen har även den visat sig vara korrekt.

De parametrar i filen som räknats fram är några procent fel då ekvationerna som använts gäller för en punktkälla, men de går att använda om armaturen ligger på ett avstånd minst 5 gånger den största dimensionen på armaturens ljusöppning. Utöver detta finns det blänkande föremål i ljuslabbet som stör ljusbilden och därigenom mätningen. Även hurtsen som armaturerna kan fästas vid har blänkande skenor i taket som ger en stor reflektion av ljuset.

Det största felet torde ligga i sensorns känslighet då hela mätområdet inte går att analysera med bara en känslighet på sensorn eftersom belysningsstyrkorna varierar för mycket. Det är inte möjligt att skapa EULUMDAT filer för alla Nordic Light AB: s armaturer då storleken på mätväggen i ljuslabbet begränsar. 5 gånger regeln måste kunna uppfyllas och en armatur med största dimensionen 30 cm är det maximala som går att mäta för att ett minsta antal mätvinklar ska kunna specificeras i filen.

En ungefärlig uppskattning av ljusintensiteten går att ta fram med hjälp av det framtagna C-programmet samt mätvärden vid 50 mm intervall med den nuvarande utrustningen.

För att i ett ljuslabb kunna göra korrekta mätningar bör alla väggar vara svartmålade eller inklädda med svart tyg för att förhindra reflektioner av ljus. Om det som i Nordic Light AB: s ljuslabb finns hyllor där armaturer förvaras måste dessa gömmas i skåp eller bakom tyg så att reflektioner inte sker. Eftersom mätväggen är vitmålad reflekteras allt infallande ljus mot föremålen i rummet och om dessa blänker reflekteras ljuset tillbaka och koncentreras på vissa punkter på mätytan som då får en felaktig belysningsstyrka. Om de fotometriska filerna ska vara helt korrekta och kunna skickas ut till kunder som ett bevis på armaturernas ljusspridning måste ljuslabbet ackrediteras och detta ansöks hos SWEDAC (Styrelsen för ackreditering och teknisk kontroll) och är en kostnad för företaget.

Nordic Light AB bör köpa in en ny mätutrustning som mäter intensiteten vid alla olika vinklar runt armaturen så att EULUMDAT filen innehåller mätvärden och inte interpolerade värden men detta medför en stor kostnad. I annat fall måste fotometern som används kunna mäta hela ljusområdet på mätytan, men detta kan aldrig ersätta en utrustning som mäter intensiteten vid olika vinklar direkt eftersom beräkningarna inte ger en helt korrekt omvandling utan alltid innehåller några procent fel. Alla vinklar kan inte mätas då mätväggens storlek begränsar och den fotometer som används måste vara mottaglig för snett infallande ljus med stor infallsvinkel.

Nordic Light AB ska inom ett år byta lokaler och ett nytt ljuslabb är därför under uppbyggnad där förutsättningarna för EULUMDAT filers skapande kommer att förbättras.

Referenser

7 Referenser

Böcker

DeCusatis, Casimer (1997). Handbook of Applied Photometry Woodbury, N.Y. : AIP Press. ISBN: 1-56396-416-3

Kaufman, John E & Haynes, Howard (1984). IES Lighting Handbook. 1984, Reference volume. New York: Illuminating Engineering society of North America.

ISBN: 0-87995-015-3

McCluney, William Ross (1994). Introduction to Radiometry and Photometry. Boston;

London: Aritech house, inc. ISBN: 0-89006-678-7

Press, W., Teukolsky, S., Vetterling, W. & Flannery, B. (1992). Numerical Recipes in C, the art of scientific computing (2:a upplagan). Cambridge: Cambridge University press.

ISBN: 0-521-43108-5

Starby, Lars (1983). Handbok i Belysningsteknik. Stockholm: Ljuskultur.

Internet

Ashdown, Ian (2001). Thinking Photometrically Part II

http://www.helios32.com/Thinking%20Photometrically%20II.pdf (2005-05-09) Antal, György (2001). Survey on Luminaires and Photometric Design

http://www.fsz.bme.hu/~szirmay/ikta/Dokumentumok/survey.doc (2005-05-09) Chan, Lok Shun Apple. Lumen method calculations. Division of Building Science &

Technology, City University of Hong Kong.

http://personal.cityu.edu.hk/~bsapplec/lumen.htm (2005-05-09) DIALux http://www.dial.de/ 2005-05-09

Övrigt

Nordic Light AB, Box 86, 93121 Skellefteå

Stockmar, A. W. Eulumdat/2-extended version of a well established luminaire data format LCI Light Consult international, Celle/Berlin

Bilaga 1

Beskrivning av armaturdataformatet EULUMDAT

Föremål Beskrivning Enhet Antal Typ av

tecken Indata

1. Företags-ID, format, version 78/255 skrivs in

2. Typ indikator, Ityp 1 skrivs in

Typ av armatur

1… Punktkälla med symmetri runt vertikala axeln 2… Linjär armatur

3… Punktkälla med någon annan symmetri.

Bara linjära armaturer delas upp i longitudinella och transversella riktningar

3. Symmetri indikator, Isym 1 skrivs in

Armaturens symmetri 0… ingen symmetri

1… symmetri runt vertikala axeln 2… symmetri till planen C0-C180 3… symmetri till planen C90-C270

4… symmetri till planen C0-C180 och till planen C90-C270

4. Antal, Mc, C-plan mellan 0-360º, inte 360º 2 skrivs in (vanligtvis 24, 36 inne, 72 ute)

5. Avstånd, Dc, mellan C plan grader 5 skrivs in

(0 om ojämna avstånd)

6. Antal, Ng, intensiteter per C-plan, dvs. G-plan 2 skrivs in (vanligtvis 19, 37, 73)

7. Avstånd, Dg, mellan intensiteter grader 5 skrivs in

(0 om ojämna avstånd)

8. Mätningsnummer 78/255 skrivs in

9. Armaturens namn 78/24 skrivs in

10. Armaturens nummer 78/24 skrivs in

11. Filnamn/nummer 8/12 skrivs in

12. Datum/användare 78/24 skrivs in

13. Armaturens längd/diameter (mm) 4 skrivs in

14. Armaturens bredd (0 om cirkulär arma tur) (mm) 4 skrivs in

15. Armaturens höjd (mm) 4 skrivs in

16. Längd/diameter på horisontell lysande yta (mm) 4 skrivs in

Bilaga 1

17. Lysande ytans bredd (mm) 4 skrivs in

18. Höjd på vertikala lysande ytan i C0-planet (mm) 4 skrivs in 19. Höjd på vertikala lysande ytan i C90-planet (mm) 4 skrivs in 20. Höjd på vertikala lysande ytan i C180-planet (mm) 4 skrivs in 21. Höjd på vertikala lysande ytan i C270-planet (mm) 4 skrivs in

22. Fraktion av nedåtflöde, DFF (%) 4 beräknas

ner upp

DFF ner

Φ + Φ

= Φ Fner =armaturens ljusflöde nedåt, (lm) Fupp = armaturens ljusflöde uppåt, (lm)

23. Light output ratio luminaire, LORL (%) 4 beräknas

Förhållandet mellan armaturens ljusflöde och lampans ljusflöde[3].

lampa ner

LORL upp

Φ Φ +

= Φ Fupp = armaturens ljusflöde uppåt, (lm)

Fner = armaturens ljusflöde nedåt, (lm)

Flampa= lampans totala ljusflöde, (lm)

24. Omvandlingsfaktor för ljusintensiteter 6 skrivs in

(beror på mätning, oftast 1)

25. Lutning av armaturen under mätning 6 skrivs in

(vägbelysningsarmaturer)

26. Antal n standarduppsättning lampor 4 skrivs in

(0,1,2,3 vanligast)

Om n>0 upprepas sekvensen av 26a-f n gånger

26a Antal lampor n*4 skrivs in

26b Typ av lampor n*24 skrivs in

26c Lampornas totala ljusflöde (lm) n*12 skrivs in

26d Lampans färgtemperatur n*16 skrivs in

26e Färg index (colour rendering group/index) n*6 skrivs in

26f Effekt inkluderat ballast (W) n*8 skrivs in

(Wattage including ballast)

27. Direct ratios, DR for 10 room indices k 10*7 beräknas

k=0.6, 0.8, 1.0, 1.25, 1.5, 2, 2.5, 3, 4, 5

(Direkta förhållandet, andelen av totala nedåtflödet direkt på arbetsplanet , specificerar armaturens flödesfördelning [3])

28. Vinklar C, börja med 0º Mc*6 beräknas

29. Vinklar G, börja med 0º Ng*6 beräknas

30. Ljusintensitetsfördelning per klm installerad i armaturen (cd/klm) Ng*6 beräknas Börja med C-planet Mc1 från vinkel G=0º till vinkel G (Ng)

Och avsluta med C-planet Mc2 från vinkel G=0º till G (Ng)

Bilaga 1

Figur 1. Figuren visar C- och G-planens läge i förhållande till armaturen Ityp= 1… punktkälla med symmetri runt vertikala axeln

2… Linjär armatur

3… Punktkälla med någon annan symmetri. (Bara linjära armaturer delas upp i longitudinella och transversella riktningar)

Isym= 0… ingen symmetri

1… symmetri runt vertikala axeln 2… symmetri till planen C0-C180 3… symmetri till planen C90-C270

4… symmetri till planen C0-C180 och till planen C90-C270 För ekvidistanta C-plan definieras det första och det sista planet som:

• Om Isym=0 ? Mc1=1 och Mc2=Mc………..(Hela C-varvet)

• Om Isym=1 ? Mc1=1 och Mc2=1……….(Bara 1 plan, alla plan lika)

• Om Isym=2 ? Mc1=1 och Mc2=Mc/2+1………..(Halvt varv från C=0 till C=180)

• Om Isym=3 ? Mc1=3*Mc/4+1 och Mc2=Mc1+Mc/2…..(Halvt varv från C=270 till C=90)

• Om Isym=4 ? Mc1=1 och Mc2=Mc/4+1……….…(kvarts varv från C=0 till C=90)

För icke-ekvidistanta C-plan definieras det första och det sista planet som:

• Om Isym=0 ? Mc1=1 och Mc2=Mc………. (Hela C-varvet)

• Om Isym=1 ? Mc1=1 och Mc2=1……… (Bara 1 plan)

• Om Isym=2 ? Mc1=1 och Mc2=nr på planet som representerar C180………(Halvt varv)

• Om Isym=3 ? Mc1=nr på planet som representerar C270 och Mc2=nr på planet som representerar C90……….(Halvt varv)

• Om Isym=4 ? Mc1=1 och Mc2=nr på planet som representerar C90……(kvarts varv 0-90) [1] Lightfair 2001 pre-conference workshop Thinking Photometrically Part II, Ian

Ashdown, P.Eng.,LC,FIES s 27, Appendix B

[2] Eulumdat/2-extended version of a well established luminaire data format.

A.W.Stockmar LCI Light Consult International, Celle/Berlin

[3] Lumen method Calculations http://personal.cityu.edu.hk/~bsapplec/lumen.htm 2005-02-22

Bilaga 2

EULUMDAT filformat exempel

HOF/LUM650/8701+548

Bilaga 2

Bilaga 3

C-kod

/* Programmet räknar ut x och y koordinater för givna mätvinklar. Uppmätta belysningsstyrkor samt dess x och y koordinater läses in från en textfil, (punkter istället för kommatecken).

Ur dessa värden interpoleras luxvärden fram till de beräknade x och y koordinaterna med hjälp av funktionerna bcucof, bcuint och locate. Sedan beräknas alla parametrar som ska in i EULUMDAT filen. De parametrar som inte beräknas skrivs in i programmet vid förfrågan.

Slutligen skapas EULUMDAT filen med alla parametrar. Avståndet mellan väggen och mitten på armaturens reflektor (ljuskällan) är 96 cm (max för vinklar på 50 grader) */

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include "nr.h"

#include "nrutil.h"

#include "nrutil.c"

main() {

void locate(double xx[], int n, double x, int *j);

void bcuint(double y[], double y1[], double y2[], double y12[], double x1l,double x1u, double x2l,double x2u, double x1, double x2, double *ansy, double *ansy1, double *ansy2);

void bcucof(double y[], double y1[], double y2[], double y12[], double d1, double d2,double **c);

FILE *infil,*utfil;

char filnamn_ut[FILENAME_MAX],filnamn_in[FILENAME_MAX];

int i, j, n, m, index_X, index_Y, *index_X_p=&index_X, *index_Y_p=&index_Y;

double jj, Pi = 3.1415926535897, avstand=0.96;

char string1[2500][8], string2[2500][8], string3[2500][8];

double C_vinklar[24], varde, G_vinklar[37], C[21][24], G[21][24];

double Z[21][24], R[504], X[504], Y[504], xx[2500], yy[2500], lux[2500];

double z_lux[50][50], x[50], y[50], X_ny[504], Y_ny[504], lx[504];

double I[504], skalad_I[504], ljusfordelning[37][24],Intensitet_sum;

double fi_N[9], Fi[10], nedljus, medel_Intensitet, uppljus, DFF, LORL;

double deriv_1a[4], deriv_2a[4], deriv_12a[4], funk[4], grad_x, grad_y;

double x_lo, x_up, y_lo, y_up, *grad_x_p=&grad_x, *grad_y_p=&grad_y;

double A_zonal[9] = {0, 0.041, 0.070, 0.100, 0.136, 0.190, 0.315, 0.640, 2.10 };

double B_zonal[9] = {0, 0.98, 1.05, 1.12, 1.16, 1.25, 1.25, 1.25, 0.80};

double K_rumindex[10] = {0.6, 0.8, 1.0, 1.25, 1.5, 2, 2.5, 3, 4, 5};

double fi_ned, RCR[10], DR[10], mult[10], ZM_K[9], lampflode, lutning;

char foremal_1[79], foremal_2[2], foremal_3[2], foremal_8[79], foremal_9[79];

char foremal_10[79], foremal_11[9], foremal_12[79], foremal_13[5], foremal_14[5];

char foremal_15[5], foremal_16[5], foremal_17[5], foremal_18[5], foremal_19[5];

char foremal_20[5], foremal_21[5], foremal_24[7],foremal_25[7], foremal_26[5];

char foremal_26a[5], foremal_26b[25],foremal_26c[13], foremal_26d[17], foremal_26e[7];

char foremal_26f[9],foremal_4[]="24", foremal_5[]="15", foremal_6[]="37",foremal_7[]="2.5";

/*** Data som skrivs in vid prompten, specifika för varje armatur ***/

printf("\nIn-datafilens namn med .txt: \n:");

gets(filnamn_in);

printf("%s\n",filnamn_in);

printf("\nEULUMDAT filens namn med max 78 tecken avsluta med .ldt :\n:");

gets(filnamn_ut);

printf("%s\n",filnamn_ut);

printf("\nForetagets namn, format, version med max 78 tecken :\n:");

gets(foremal_1);

printf("%s\n",foremal_1);

printf("\nAnge typindikator (1, 2 eller 3) med max 1 tecken :\n:");

gets(foremal_2);

printf("%s\n",foremal_2);

Bilaga 3

printf("\nAnge symmetriindikatorn (0, 1, 2, 3 eller 4) med max 1 tecken :\n:");

gets(foremal_3);

printf("%s\n",foremal_3);

printf("\nSkriv in matningsnumret med max 78 tecken : \n:");

gets(foremal_8);

printf("%s\n",foremal_8);

printf("\nSkriv in armaturens namn med max 78 tecken : \n:");

gets(foremal_9);

printf("%s\n",foremal_9);

printf("\nSkriv in armaturens nummer med max 78 tecken :\n:");

gets(foremal_10);

printf("%s\n",foremal_10);

printf("\nSkriv in filnamn/nummer med max 8 tecken :\n:");

gets(foremal_11);

printf("%s\n",foremal_11);

printf("\nSkriv in datum/anvandare med max 78 tecken :\n:");

gets(foremal_12);

printf("%s\n",foremal_12);

printf("\nAnge armaturens langd/diameter i [mm] med max 4 tecken :\n:");

gets(foremal_13);

printf("%s\n",foremal_13);

printf("\nSkriv in armaturens bredd i [mm] med max 4 tecken, (0 om cirkular) :\n:");

gets(foremal_14);

printf("%s\n",foremal_14);

printf("\nSkriv in armaturens hojd i [mm] med max 4 tecken :\n:");

gets(foremal_15);

printf("%s\n",foremal_15);

printf("\nLangd/diameter pa horisontell lysande yta i [mm] med max 4 tecken :\n:");

gets(foremal_16);

printf("%s\n",foremal_16);

printf("\nLysande ytans bredd i [mm] med max 4 tecken (0 om cirkular) :\n:");

gets(foremal_17);

printf("%s\n",foremal_17);

printf("\nHojden pa vertikala lysande ytan i C0-planet i [mm] med max 4 tecken :\n:");

gets(foremal_18);

printf("%s\n",foremal_18);

printf("\nHojden pa vertikala lysande ytan i C90-planet i [mm] med max 4 tecken :\n:");

gets(foremal_19);

printf("%s\n",foremal_19);

printf("\nHojden pa vertikala lysande ytan i C180-planeti [mm] med max 4 tecken :\n:");

gets(foremal_20);

printf("%s\n",foremal_20);

printf("\nHojden pa vertikala lysande ytan i C270-planeti [mm] med max 4 tecken :\n:");

gets(foremal_21);

printf("%s\n",foremal_21);

printf("\nOmvandlingsfaktor for ljusintensiteter (1 oftast) med max 6 tecken :\n:");

gets(foremal_24);

printf("%s\n",foremal_24);

printf("\nSkriv in armaturens lutning under matning (0) med max 6 tecken :\n:");

gets(foremal_25);

lutning=atof(foremal_25);

printf("%.1f\n",lutning);

printf("\nSkriv in antalet standarduppsattningar la mpor med max 4 tecken :\n:");

gets(foremal_26);

printf("%s\n",foremal_26);

printf("\nSkriv in antalet lampor med max 4 tecken :\n:");

gets(foremal_26a);

printf("%s\n",foremal_26a);

printf("\nSkriv in typ av lampor med max 24 tecken :\n:");

gets(foremal_26b);

Bilaga 3

printf("%s\n",foremal_26b);

printf("\nSkriv in lampornas totala ljusflode i [lumen] med max 12 tecken :\n:");

gets(foremal_26c);

lampflode=atof(foremal_26c);

printf("%.1f\n",lampflode);

printf("\nSkriv in lampornas fargtemperatur med max 16 tecken :\n:");

gets(foremal_26d);

printf("%s\n",foremal_26d);

printf("\nSkriv in fargindex med max 6 tecken :\n:");

gets(foremal_26e);

printf("%s\n",foremal_26e);

printf("\nSkriv in lampornas effekt i [watt] inkluderat ballast med max 8 tecken :\n:");

gets(foremal_26f);

printf("%s\n",foremal_26f);

varde=0;

for (i=0;i<=23;++i) { //24 rader

C_vinklar[i]=varde; //Alla C-vinklar tas fram, vinkelavståndet är

varde+=15; //15 grader mellan varje plan

} //Dessa ska skrivas in i EULUMDAT filen

varde=0;

for (j=0;j<=36;++j) { //37 rader

G_vinklar[j]=varde; //Alla G-vinklar tas fram med 5 graders

varde+=2.5; //vinkelavstånd mellan planen

} //Dessa ska skrivas in i EULUMDAT filen

for (i=0;i<=20;++i) { //21 rader

varde=0;

for (j=0;j<=23;++j) { //24 kolumner

C[i][j]=varde; //Alla C vinklar där interpolering ska göras i en matris varde+=15; //Kolumnerna innehåller olika värden rakt ner i matrisen } }

for (j=0;j<=23;++j) { //24 kolumner

varde=0;

for (i=0;i<=20;++i) { //21 rader

G[i][j]=varde; //Alla G vinklar där interpolering ska göras i en matris varde+=2.5; //Raderna innehåller olika värden rakt fram i matrisen } }

for (j=0;j<=23;++j) { //24 kolumner

for (i=0;i<=20;++i) { //21 rader

Z[i][j]=1000*avstand; //Z-värden, avstånd från armatur till vägg, samma

} } //storlek som G och C

n=0;

for (j=0;j<=23;++j) { //24 kolumner

for (i=0;i<=20;++i) { //21 rader

//Räknar fram radier så att X- och Y-koordinater //kan tas fram för de givna C- och G- vinklarna R[n]=(Z[i][j])/(cos((G[i][j])* Pi/180));

X[n]=(R[n]) * cos((C[i][j])* Pi/180) * sin((G[i][j])* Pi/180);

Y[n]=(R[n]) * sin((C[i][j])* Pi/180) * sin((G[i][j])* Pi/180);

X_ny[n]=X[n] + 1250; //Skalar om axlarna Y_ny[n]=Y[n] + 1250; //Skalar om axlarna ++n;

} }

/*** Öppnar textfilen med mätdata för läsning felmeddelande ges om den inte går att öppna ***/

if ((infil=fopen (filnamn_in, "r"))==NULL) printf( "\nCannot open the file!\n");

else { {

for (i=0;i<=2499;++i) { //En loop så att alla rader med x- y- och luxvärden i //filen läses in, 2500 rader

Bilaga 3

fscanf(infil,"%s%s%s",string1[i], string2[i], string3[i] );

xx[i]=atof(string1[i]); //Omvandlar sträng till flyttal med dubbelprecision yy[i]=atof(string2[i]); //Omvandlar sträng till flyttal med dubbelprecision lux[i]=atof(string3[i]); //Omvandlar sträng till flyttal med dubbelprecision }

if (fclose(infil)) //Stänger filen när läsningen är klar printf("Textfilen kunde inte stangas \n");

}

for (i=0;i<=49;++i) { //50 rader

x[i]=xx[i*51]; //Sparar två vektorer med de varierande x och y

y[i]=yy[i]; //koordinaterna, x[1..m],y[1..n]

for (j=0;j<=49;++j) { //50 kolumner

z_lux[i][j]=lux[i*50+j]; //Sparar luxvärdena i en n*n matris,z_lux[1..m][1..n],n=m } }

for (m=0;m<=503;++m) { //504 rader med olika XY par

locate(x - 1, 50, X_ny[m], index_X_p); //Letar fram matrisindex inom vilka de X- och Y- locate(y - 1, 50, Y_ny[m], index_Y_p); //värden som ska interpoleras fram ligger

x_lo=x[index_X-1]; //x-matrisens lägre punkt

x_up=x[index_X]; //x-matrisens övre punkt

y_lo=y[index_Y-1]; //y-matrisens undre punkt

y_up=y[index_Y]; //y-matrisens övre punkt

j=0; //Startvärde

n=index_Y-1;

for (i=index_X-1;i<=index_X;++i) { //Räknar fram funktionsvärdet och derivator //för punkterna med matrisindexen ovan funk[j]=z_lux[i][n];

deriv_1a[j]=(z_lux[i+1][n]-z_lux[i-1][n])/(x[i+1]-x[i-1]);

deriv_2a[j]=(z_lux[i][n+1]-z_lux[i][n-1])/(y[n+1]-y[n-1]);

deriv_12a[j]=(z_lux[i+1][n+1]-z_lux[i+1][n-1]-z_lux[i-1][n+1]+z_lux[i-1][n -1])/((x[i+1]-x[i-1])*(y[n+1]-y[n-1]));

++j;

} n=index_Y;

for (i=index_X;i>=index_X-1;--i) { funk[j]=z_lux[i][n];

deriv_1a[j]=(z_lux[i+1][n]-z_lux[i-1][n])/(x[i+1]-x[i-1]);

deriv_2a[j]=(z_lux[i][n+1]-z_lux[i][n-1])/(y[n+1]-y[n-1]);

deriv_12a[j]=(z_lux[i+1][n+1]-z_lux[i+1][n-1]-z_lux[i-1][n+1]+z_lux[i-1][n -1])/((x[i+1]-x[i-1])*(y[n+1]-y[n-1]));

++j;

}

/*Interolerar fram värdet med bikubisk interpolering */

bcuint(funk -1, deriv_1a -1, deriv_2a -1, deriv_12a -1, x_lo, x_up, y_lo, y_up, X_ny[m], Y_ny[m], &lx[m], grad_x_p, grad_y_p);

}

n=0; //Startvärde

for (j=0;j<=23;++j) { //24 kolumner

for (i=0;i<=20;++i) { //21 rader

/* Intensiteten och intensiteten per klm beräknas */

I[n]=(double) (lx[n]) * (pow(avstand,2))/(pow(cos((double)(G[i][j])* Pi/180),3));

skalad_I[n]=(I[n])*1000/lampflode;

++n;

} }

for (j=0;j<=23;++j) { //24 kolumner

for (i=0;i<=36;++i) //37 rader

Bilaga 3

ljusfordelning[i][j]=0; //Nollmatris för alla vinklar }

n=0;

for (j=0;j<=23;++j) { //24 kolumner

for (i=0;i<=20;++i) { //21 rader

ljusfordelning[i][j]=skalad_I[n]; //Ljusfördelningen som ska in i EULUMDAT filen ++n;

} }

for (n=0;n<=8;++n) //För 9 zoner

fi_N[n]=0;

n=0; //Startvärde

i=1; //Startvärde

nedljus=0; //Startvärde

for (jj=2.5;jj<=50;jj+=5) { //5 loopar med olika vinklar

Intensitet_sum=0; //För varje vinkel blir startvärdet på for (m=i;m<=503;m+=21) { //504 loopar

Intensitet_sum+=I[m]; //Summerar alla intensiteter för några olka G-vinklar }

medel_Intensitet=Intensitet_sum/24; //medelintensitet vid den vinkeln

/* Flödet i den 10 gradiga rymdvinkeln lägger in varje zons ljusflöde i en vektor */

Fi[n]=2*Pi*medel_Intensitet*(cos((double)(jj-2.5)*Pi/180)-cos((double)(jj+2.5)*Pi/180));

nedljus+=Fi[n]; //Summerar ljusflödet i zonerna nedåt

++n;

i+=2;

}

for (n=0;n<=4;++n)

fi_N[n]+=Fi[n*2]+Fi[n*2+1];

uppljus=0; //Inget ljusflöde uppåt i armaturen

DFF=(nedljus/(nedljus+uppljus))*100; //Downward Flux Fraction LORL=((uppljus+nedljus)/lampflode)*100; //Light Output Ratio Luminaire

/*** Beräkning av Direct Ratio ***/

fi_ned=(1/lampflode)*nedljus; //Additional flux funcion nedåt

for (i=0;i<=9;++i) { //För de 10 olika rumsindexen

RCR[i]=5/K_rumindex[i]; //Beräkning av room cavity ratio för rumsindexen

mult[i]=0; //Startvärde, del i DR

for (n=0;n<=8;++n) {

ZM_K[n]= 1/(exp(A_zonal[n]*pow(RCR[i],B_zonal[n]))); //Zonal Multiplier

mult[i]+=ZM_K[n]*fi_N[n]; //Summering av alla ZM_K*fi_N för visst rumsindex }

DR[i]=(1/(fi_ned*lampflode))*mult[i]; //Direct Ratio } }

/***Lägger in alla paramerar som skall in i EULUMDAT filen, rad för rad, föremål efter föremål***/

if ((utfil= fopen(filnamn_ut , "w" ))==NULL) //Öppnar filen för läsning

printf( "\n Kan inte oppna filen!\n"); //Felmeddelande om filen ej går att öppna else {

fprintf(utfil,"%s\n",foremal_1); //Skrive r ut alla parametrar i filen fprintf(utfil,"%s\n",foremal_2);

fprintf(utfil,"%s\n",foremal_3);

fprintf(utfil,"%s\n",foremal_4);

fprintf(utfil,"%s\n",foremal_5);

fprintf(utfil,"%s\n",foremal_6);

fprintf(utfil,"%s\n",foremal_7);

fprintf(utfil,"%s\n",foremal_8);

fprintf(utfil,"%s\n",foremal_9);

fprintf(utfil,"%s\n",foremal_10);

fprintf(utfil,"%s\n",foremal_11);

Bilaga 3

fprintf(utfil,"%s\n",foremal_12);

fprintf(utfil,"%s\n",foremal_13);

fprintf(utfil,"%s\n",foremal_14);

fprintf(utfil,"%s\n",foremal_15);

fprintf(utfil,"%s\n",foremal_16);

fprintf(utfil,"%s\n",foremal_17);

fprintf(utfil,"%s\n",foremal_18);

fprintf(utfil,"%s\n",foremal_19);

fprintf(utfil,"%s\n",foremal_20);

fprintf(utfil,"%s\n",foremal_21);

fprintf(utfil,"%.0f\n",DFF);

fprintf(utfil,"%.1f\n",LORL);

fprintf(utfil,"%s\n",foremal_24);

fprintf(utfil,"%.1f\n",lutning);

fprintf(utfil,"%s\n",foremal_26);

fprintf(utfil,"%s\n",foremal_26a);

fprintf(utfil,"%s\n",foremal_26b);

fprintf(utfil,"%.1f\n",lampflode);

fprintf(utfil,"%s\n",foremal_26d);

fprintf(utfil,"%s\n",foremal_26e);

fprintf(utfil,"%s\n",foremal_26f);

for (i=0;i<=9;++i)

fprintf(utfil,"%.5f\n",DR[i]);

for (i=0;i<=23;++i)

fprintf(utfil,"%.1f\n",C_vinklar[i]);

for (i=0;i<=36;++i)

fprintf(utfil,"%.1f\n",G_vinklar[i]);

/**Beroende på armaturens symmetri skrivs olika C-plans ljusintensiteter ut i EULUMDAT filen **/

if (foremal_3[0]=='0') { for (j=0;j<=23;++j) {

for (i=0;i<=36;++i)

fprintf(utfil,"%.1f\n",ljusfordelning[i][j]);

} }

else if (foremal_3[0]=='1') { j=1;

for (i=0;i<=36;++i)

fprintf(utfil,"%.1f\n",ljusfordelning[i][j]);

}

else if (foremal_3[0]=='2') { for (j=0;j<=12;++j){

for (i=0;i<=36;++i)

fprintf(utfil,"%.1f\n",ljusfordelning[i][j]);

} }

else if (foremal_3[0]=='3') { for (j=12;j<=23;++j) {

for (i=0;i<=36;++i)

fprintf(utfil,"%.1f\n",ljusfordelning[i][j]);

} }

else if (fore mal_3[0]=='4'){

for (j=0;j<=6;++j) { for (i=0;i<=36;++i)

fprintf(utfil,"%.1f\n",ljusfordelning[i][j]);

} }

if (fclose(utfil)) //Stänger filen när skrivningen är klar printf( "Eulumdat filen kunde inte stangas \n" );

printf("Filen har skapats utan problem!\n");

Bilaga 3

} }

/*** Funktioner hittade i boken Numerial Recipes in C ***/

void locate(double xx[], int n, double x, int *j) {

/* Givet en array xx[1..n] och givet ett värde x returneras ett värde j så att x ligger mellan xx[j-1] och xx[j] då det första elementet i vektorn har index 0. xx måste antingen vara monotoniskt ökande eller minskande. j=0 eller j=n returneras för att indikera om x ligger utanför området */

int ju,jm,jl;

int ascnd;

jl=0; //Initialiserar lägre

ju=n+1; //och övre gränser

ascnd=(xx[n] >= xx[1]);

while (ju-jl > 1) { //Om sökningen inte är klar

jm=(ju+jl) >> 1; //beräknas en mittpunkt,

if (x >= xx[jm] == ascnd)

jl=jm; //och sedan ersätts antingen den undre gränsen

else

ju=jm; //eller den övre gränsen

} //repeterar tills sista kravet är uppfyllt

if (x == xx[1]) *j=1; //sedan sätts utdatat

else if(x == xx[n]) *j=n-1;

else *j=jl;

} //och återvänder

void bcucof(double y[], double y1[], double y2[], double y12[], double d1, double d2,double **c) { /* Givet vektorerna y[1..4], y1[1..4], y2[1..4] och y12[1..4] innehållande funktionen,

gradienter och den blandade derivatan vid de fyra rutnätspunkterna i en rutnätscell (numrerade motsols från den lägre vänstra punkten), och givet d1 och d2, längden på rutnätscellen i 1- och 2-riktningen, returnerar denna rutin tabellen c[1..4][1..4] som används av rutinen bcuint för att göra en bikubisk interpolering */

static int wt[16][16]=

{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,0,0,3,0,0,0,0,-2,0,0,-1,0,0,0,0, 2,0,0,-2,0,0,0,0,1,0,0,1,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 0,0,0,0,-3,0,0,3,0,0,0,0,-2,0,0,-1, 0,0,0,0,2,0,0,-2,0,0,0,0,1,0,0,1, -3,3,0,0,-2,-1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,-3,3,0,0,-2,-1,0,0, 9,-9,9,-9,6,3,-3,-6,6,-6,-3,3,4,2,1,2, -6,6,-6,6,-4,-2,2,4,-3,3,3,-3,-2,-1,-1,-2, 2,-2,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,2,-2,0,0,1,1,0,0, -6,6,-6,6,-3,-3,3,3,-4,4,2,-2,-2,-2,-1,-1, 4,-4,4,-4,2,2,-2,-2,2,-2,-2,2,1,1,1,1};

int l,k,j,i;

double xx,d1d2,cl[16],x[16];

d1d2=d1*d2;

for (i=1;i<=4;i++) { //Packar en temporär vektor x

x[i-1]=y[i];

x[i+3]=y1[i]*d1;

x[i+7]=y2[i]*d2;

Bilaga 3

x[i+11]=y12[i]*d1d2;

}

for (i=0;i<=15;i++) { //Matismultiplicerar med den sparade tabellen

xx=0.0;

for (k=0;k<=15;k++) xx += wt[i][k]*x[k];

cl[i]=xx;

} l=0;

for (i=1;i<=4;i++) //Packar upp resultatet i utdata tabellen

for (j=1;j<=4;j++) c[i][j]=cl[l++];

}

void bcuint(double y[], double y1[], double y2[], double y12[], double x1l, double x1u, double x2l, double x2u, double x1, double x2, double *ansy, double *ansy1, double *ansy2) {

/* Bikubisk interpolering inom en rutnätskvadrat. Indataparametrarna är vektorerna y[1..4], y1[1..4], y2[1..4] och y12[1..4] innehållande funktionen, gradienter och den blandade

derivatan vid de fyra rutnätspunkterna i en rutnätscell (numrerade motsols från den lägre vänstra punkten); x1l och x1u är den lägre och övre koordinaten i rutnätskvadraten i 1-riktningen; x2l och x2u samma sak men i 2-riktningen. x1, x2 är koordinatena för punkten som ska interpoleras fram. Det inerpolerade funktionsvärdet returneras som ansy och de interpolerade gradientvärdena är ansy1 och ansy2. Denna rutin kallar på rutinen bcucof. */

void bcucof(double y[], double y1[], double y2[], double y12[], double d1, double d2, double **c);

int i;

double t,u,d1,d2,**c;

c=matrix(1,4,1,4);

d1=x1u-x1l;

d2=x2u-x2l;

bcucof(y,y1,y2,y12,d1,d2,c); //Hämtar c'na

if (x1u == x1l || x2u == x2l) nrerror("Bad input in routine bcuint");

t=(x1-x1l)/d1; //Ekvation (3.28)

u=(x2-x2l)/d2; //Ekvation (3.29)

*ansy=(*ansy2)=(*ansy1)=0.0;

for (i=4;i>=1;i--) { //Ekvation (3.27)

*ansy=t*(*ansy)+((c[i][4]*u+c[i][3])*u+c[i][2])*u+c[i][1];

*ansy2=t*(*ansy2)+(3.0f*c[i][4]*u+2.0f*c[i][3])*u+c[i][2];

*ansy1=u*(*ansy1)+(3.0f*c[4][i]*t+2.0f*c[3][i])*t+c[2][i];

}

*ansy1 /= d1;

*ansy2 /= d2;

free_matrix(c,1,4,1,4);

}

NR.H

#ifndef _NR_H_

#define _NR_H_

#ifndef _FCOMPLEX_DECLARE_T_

typedef struct FCOMPLEX {float r,i;} fcomplex;

#define _FCOMPLEX_DECLARE_T_

#endif /* _FCOMPLEX_DECLARE_T_ */

#ifndef _ARITHCODE_DECLARE_T_

typedef struct {

unsigned long *ilob,*iupb,*ncumfq,jdif,nc,minint,nch,ncum,nrad;

} arithcode;

#define _ARITHCODE_DECLARE_T_

#endif /* _ARITHCODE_DECLARE_T_ */

#ifndef _HUFFCODE_DECLARE_T_

Bilaga 3

typedef struct {

unsigned long *icod,*ncod,*left,*right,nch,nodemax;

} huffcode;

#define _HUFFCODE_DECLARE_T_

#endif /* _HUFFCODE_DECLARE_T_ */

#include <stdio.h>

#if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */

void bcucof(double y[], double y1[], double y2[], double y12[], double d1, double d2, double **c);

void bcuint(double y[], double y1[], double y2[], double y12[], double x1l, double x1u, double x2l, double x2u, double x1, double x2, double *ansy, double *ansy1, double *ansy2);

void locate(double xx[], int n, double x, int *j);

#else /* ANSI */

static float sqrarg;

#define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg) static double dsqrarg;

#define DSQR(a) ((dsqrarg=(a)) == 0.0 ? 0.0 : dsqrarg*dsqrarg) static double dmaxarg1,dmaxarg2;

#define DMAX(a,b) (dmaxarg1=(a),dmaxarg2=(b),(dmaxarg1) > (dmaxarg2) ?\

(dmaxarg1) : (dmaxarg2)) static double dminarg1,dminarg2;

#define DMIN(a,b) (dminarg1=(a),dminarg2=(b),(dminarg1) < (dminarg2) ?\

(dminarg1) : (dminarg2)) static float maxarg1,maxarg2;

#define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\

(maxarg1) : (maxarg2)) static float minarg1,minarg2;

#define FMIN(a,b) (minarg1=(a),minarg2=(b),(minarg1) < (minarg2) ?\

(minarg1) : (minarg2)) static long lmaxarg1,lmaxarg2;

#define LMAX(a,b) (lmaxarg1=(a),lmaxarg2=(b),(lmaxarg1) > (lmaxarg2) ?\

(lmaxarg1) : (lmaxarg2)) static long lminarg1,lminarg2;

#define LMIN(a,b) (lminarg1=(a),lminarg2=(b),(lminarg1) < (lminarg2) ?\

(lminarg1) : (lminarg2)) static int imaxarg1,imaxarg2;

#define IMAX(a,b) (imaxarg1=(a),imaxarg2=(b),(imaxarg1) > (imaxarg2) ?\

(imaxarg1) : (imaxarg2)) static int iminarg1,iminarg2;

#define IMIN(a,b) (iminarg1=(a),iminarg2=(b),(iminarg1) < (iminarg2) ?\

(iminarg1) : (iminarg2))

#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))

#if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */

void nrerror(char error_text[]);

double *vector(int nl, int nh);

double **matrix(int nrl, int nrh, int ncl, int nch);

void free_matrix(double **m, int nrl, int nrh, int ncl, int nch);

#else /* ANSI */

Bilaga 3

/* traditional - K&R */

void nrerror();

double *vector();

double **matrix();

void free_matrix();

#endif /* ANSI */

#endif /* _NR_UTILS_H_ */

NRUTIL.C

#include <stdio.h>

#include <stddef.h>

#include <stdlib.h>

#define NR_END 1

#define FREE_ARG char*

void nrerror(char error_text[]) { // Numerical Recipes standard error handler fprintf(stderr,"Numerical Recipes run-time error...\n");

fprintf(stderr,"%s\n",error_text);

fprintf(stderr,"...now exiting to system...\n");

exit(1);

}

double *vector(int nl, int nh) { // allocate a float vector with subscript range v[nl..nh]

double *v;

v=(double *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double)));

if (!v) nrerror("allocation failure in vector()");

return v-nl+NR_END;

}

double **matrix(int nrl, int nrh, int ncl, int nch) {

// allocate a float matrix with subscript range m[nrl..nrh][ncl..nch]

int i, nrow=nrh-nrl+1,ncol=nch-ncl+1;

double **m;

// allocate pointers to rows

m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));

if (!m) nrerror("allocation failure 1 in matrix()");

m += NR_END;

m -= nrl;

// allocate rows and set pointers to them

m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));

if (!m[nrl]) nrerror("allocation failure 2 in matrix()");

m[nrl] += NR_END;

m[nrl] -= ncl;

for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;

//return pointer to array of pointers to rows return m;

}

void free_vector(double *v, int nl, int nh) { // free a float vector allocated with vector() free((FREE_ARG) (v+nl-NR_END));

}

void free_matrix(double **m, int nrl, int nrh, int ncl, int nch) { // free a float matrix allocated by matrix() free((FREE_ARG) (m[nrl]+ncl-NR_END));

free((FREE_ARG) (m+nrl-NR_END));

}

Related documents