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));
}