bifacial-radiance 0.5.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. bifacial_radiance/HPCScripts/BasicSimulations/addNewModule.py +15 -0
  2. bifacial_radiance/HPCScripts/BasicSimulations/dask_on_node.sh +11 -0
  3. bifacial_radiance/HPCScripts/BasicSimulations/run_sbatch.sbatch +51 -0
  4. bifacial_radiance/HPCScripts/BasicSimulations/simulate_fixedtilt_gencumsky.py +110 -0
  5. bifacial_radiance/HPCScripts/BasicSimulations/simulate_fixedtilt_gendaylit.py +102 -0
  6. bifacial_radiance/HPCScripts/BasicSimulations/simulate_tracking_gendaylit.py +126 -0
  7. bifacial_radiance/HPCScripts/Other Examples (unorganized)/PuertoRico.py +168 -0
  8. bifacial_radiance/HPCScripts/Other Examples (unorganized)/PuertoRico_2.py +166 -0
  9. bifacial_radiance/HPCScripts/Other Examples (unorganized)/PuertoRico_Original.py +195 -0
  10. bifacial_radiance/HPCScripts/Other Examples (unorganized)/basic_module_sampling.py +154 -0
  11. bifacial_radiance/HPCScripts/Other Examples (unorganized)/compile_B.py +162 -0
  12. bifacial_radiance/HPCScripts/Other Examples (unorganized)/compile_Cases.py +122 -0
  13. bifacial_radiance/HPCScripts/Other Examples (unorganized)/compile_CasesMonth.py +142 -0
  14. bifacial_radiance/HPCScripts/Other Examples (unorganized)/compile_PRNew.py +91 -0
  15. bifacial_radiance/HPCScripts/Other Examples (unorganized)/compile_PRNewP2.py +95 -0
  16. bifacial_radiance/HPCScripts/Other Examples (unorganized)/compile_TreeResults.py +108 -0
  17. bifacial_radiance/HPCScripts/Other Examples (unorganized)/compile_basic_module_sampling.py +103 -0
  18. bifacial_radiance/HPCScripts/Other Examples (unorganized)/simulate_JackHourly.py +160 -0
  19. bifacial_radiance/HPCScripts/Other Examples (unorganized)/simulate_improvedArray_Oct2127.py +623 -0
  20. bifacial_radiance/TEMP/.gitignore +4 -0
  21. bifacial_radiance/__init__.py +24 -0
  22. bifacial_radiance/data/CEC Modules.csv +16860 -0
  23. bifacial_radiance/data/default.ini +65 -0
  24. bifacial_radiance/data/falsecolor.exe +0 -0
  25. bifacial_radiance/data/gencumsky/License.txt +54 -0
  26. bifacial_radiance/data/gencumsky/Makefile +17 -0
  27. bifacial_radiance/data/gencumsky/README.txt +9 -0
  28. bifacial_radiance/data/gencumsky/Solar Irradiation Modelling.doc +0 -0
  29. bifacial_radiance/data/gencumsky/Sun.cpp +118 -0
  30. bifacial_radiance/data/gencumsky/Sun.h +45 -0
  31. bifacial_radiance/data/gencumsky/average_val.awk +3 -0
  32. bifacial_radiance/data/gencumsky/cPerezSkyModel.cpp +238 -0
  33. bifacial_radiance/data/gencumsky/cPerezSkyModel.h +57 -0
  34. bifacial_radiance/data/gencumsky/cSkyVault.cpp +536 -0
  35. bifacial_radiance/data/gencumsky/cSkyVault.h +86 -0
  36. bifacial_radiance/data/gencumsky/climateFile.cpp +312 -0
  37. bifacial_radiance/data/gencumsky/climateFile.h +37 -0
  38. bifacial_radiance/data/gencumsky/cumulative.cal +177 -0
  39. bifacial_radiance/data/gencumsky/cumulative.rad +14 -0
  40. bifacial_radiance/data/gencumsky/cumulativesky_rotated.rad +2 -0
  41. bifacial_radiance/data/gencumsky/gencumulativesky +0 -0
  42. bifacial_radiance/data/gencumsky/gencumulativesky.cpp +269 -0
  43. bifacial_radiance/data/gencumsky/make_gencumskyexe.py +107 -0
  44. bifacial_radiance/data/gencumsky/paths.h +62 -0
  45. bifacial_radiance/data/gencumulativesky +0 -0
  46. bifacial_radiance/data/gencumulativesky.exe +0 -0
  47. bifacial_radiance/data/ground.rad +83 -0
  48. bifacial_radiance/data/module.json +103 -0
  49. bifacial_radiance/gui.py +1696 -0
  50. bifacial_radiance/images/fig1_fixed_small.gif +0 -0
  51. bifacial_radiance/images/fig2_tracked_small.gif +0 -0
  52. bifacial_radiance/load.py +1156 -0
  53. bifacial_radiance/main.py +5673 -0
  54. bifacial_radiance/mismatch.py +461 -0
  55. bifacial_radiance/modelchain.py +299 -0
  56. bifacial_radiance/module.py +1427 -0
  57. bifacial_radiance/performance.py +466 -0
  58. bifacial_radiance/spectral_utils.py +555 -0
  59. bifacial_radiance-0.5.1.dist-info/METADATA +129 -0
  60. bifacial_radiance-0.5.1.dist-info/RECORD +63 -0
  61. bifacial_radiance-0.5.1.dist-info/WHEEL +6 -0
  62. bifacial_radiance-0.5.1.dist-info/licenses/LICENSE +30 -0
  63. bifacial_radiance-0.5.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,312 @@
1
+ #include "climateFile.h"
2
+ #include <stdio.h>
3
+ #include <iostream>
4
+
5
+
6
+ #include "paths.h"
7
+
8
+ cClimateFile::cClimateFile(void)
9
+ {
10
+ // set pointers to point to zero initially
11
+ m_ptIgh=0;
12
+ m_ptIdh=0;
13
+ }
14
+
15
+ cClimateFile::~cClimateFile(void)
16
+ {
17
+ delete[] m_ptIgh;
18
+ delete[] m_ptIdh;
19
+ }
20
+
21
+ bool cClimateFile::ReadClimateFile(char *FileName, int HourConvention, eClimateFileFormat ClimateFileFormat,double StartTime, double EndTime, int StartDay, int EndDay, int StartMonth, int EndMonth)
22
+ {
23
+ FILE *InputFile;
24
+ char *Line = new char[1000];
25
+
26
+ int hour,day;
27
+ int i;
28
+ float n1,n2,n3,n4,n5,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16;
29
+ char line_string[1000]="";
30
+ char s7[1000]="";
31
+
32
+ // open file (checking that you can...)
33
+ if ((InputFile=LoadFile(FileName))==NULL)
34
+ {
35
+ fprintf(stderr,"Error opening: %s\n",FileName);
36
+ return false;
37
+ }
38
+ rewind(InputFile);
39
+ // TODO: Add error checking
40
+
41
+ // get rid of old climate data
42
+ delete[] m_ptIgh;
43
+ delete[] m_ptIdh;
44
+
45
+ //Assume we've got 8760 points
46
+ m_NumPoints=8760;
47
+
48
+ double *Col1 = new double[m_NumPoints];
49
+ double *Col2 = new double[m_NumPoints];
50
+
51
+ // read in points for each hour of each day
52
+ // points are assumed to be at 0:30, 1:30, ... from 1st Jan to 3st Dec
53
+ // The function assumes a full hourly annual data file with 8760 lines.
54
+
55
+ //if EPW file format
56
+ if (ClimateFileFormat==GLOBAL_DIFFUSE_EPW)
57
+ {
58
+ //skip file header:
59
+ for (i=0; i<8; i++)
60
+ {
61
+ fscanf(InputFile,"%*[^\n]");
62
+ fscanf(InputFile,"%*[\n\r]");
63
+ }
64
+ for (day=0; day<365; day++)
65
+ {
66
+ for (hour=0; hour<24; hour++)
67
+ {
68
+
69
+ fscanf(InputFile,"%f,%f,%f,%f,%f,%s",&n1,&n2,&n3,&n4,&n5,&line_string[0]);
70
+ //replace ',' with ' '
71
+ for (i=0;i<1000;i++){
72
+ if(line_string[i] == ',')
73
+ line_string[i] = ' ';
74
+ }
75
+ if (sscanf(line_string,"%s %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
76
+ &s7[0],&n7,&n8,&n9,&n10,&n11,&n12,&n13,&n14,&n15,&n16,&n1,&n1,&n1,&n1,&n1,&n1,&n1,&n1,&n1,&n1,&n1,&n1,&n1,&n1,&n1)== EOF)
77
+ {
78
+ // ran out of file
79
+ fprintf(stderr,"Error processing climate file %s\n",FileName);
80
+ return false;
81
+ }
82
+ // StartDay, EndDay, StartMonth, EndMonth);
83
+ if(hour>= (StartTime) && hour< (EndTime-1))
84
+ {
85
+ if(JulianDate(StartMonth, StartDay)<=JulianDate(EndMonth, EndDay))
86
+ {
87
+ if(day>=JulianDate(StartMonth, StartDay) && day<=JulianDate(EndMonth, EndDay))
88
+ {
89
+ Col1[day*24+hour]=n14;
90
+ Col2[day*24+hour]=n16;
91
+ }
92
+ } else if(JulianDate(StartMonth, StartDay)>JulianDate(EndMonth, EndDay))
93
+ {
94
+ if(day>=JulianDate(StartMonth, StartDay) || day<=JulianDate(EndMonth, EndDay))
95
+ {
96
+ Col1[day*24+hour]=n14;
97
+ Col2[day*24+hour]=n16;
98
+ }
99
+ }
100
+ }
101
+ //printf("%.0f %.0f %.0f %.0f %.0f\n",n2,n3,n4,Col1[day*24+hour],Col2[day*24+hour]);
102
+ }
103
+ }
104
+
105
+
106
+
107
+ }else{
108
+ for (day=0; day<365; day++)
109
+ {
110
+ for (hour=0; hour<24; hour++)
111
+ {
112
+ if (fgets(Line,100,InputFile)==NULL)
113
+ {
114
+ // ran out of file
115
+ fprintf(stderr,"Error processing climate file %s\n",FileName);
116
+ return false;
117
+ }
118
+
119
+ sscanf(Line,"%lf %lf\n",&Col1[day*24+hour],&Col2[day*24+hour]);
120
+
121
+
122
+ }
123
+ }
124
+ }
125
+
126
+ // Now convert data into appropriate form
127
+ if (ClimateFileFormat==GLOBAL_DIFFUSE || ClimateFileFormat==GLOBAL_DIFFUSE_EPW)
128
+ {
129
+ m_ptIgh=Col1;
130
+ m_ptIdh=Col2;
131
+
132
+ }
133
+ else if (ClimateFileFormat == DIRECTHORIZONTAL_DIFFUSE)
134
+ {
135
+ m_ptIdh=Col2;
136
+ for (i=0; i<m_NumPoints; i++)
137
+ {
138
+ Col1[i]=Col1[i]+Col2[i];
139
+ }
140
+ m_ptIgh=Col1;
141
+ }
142
+ else
143
+ {
144
+ // ran out of file
145
+ fprintf(stderr,"Unknown climate file format!\n");
146
+ return false;
147
+ }
148
+
149
+
150
+ if (!ValidateData())
151
+ {
152
+ fprintf(stderr,"Invalid Data!\n");
153
+ return false;
154
+ }
155
+ fclose(InputFile);
156
+ return true;
157
+ }
158
+
159
+
160
+ bool cClimateFile::ValidateData()
161
+ {
162
+ // TODO: Write this function!
163
+ return true;
164
+ }
165
+
166
+ int cClimateFile::JulianDate(int month, int day)
167
+ {
168
+ // calculate julian date
169
+ int jd=0;
170
+ if(month==1)
171
+ jd=day;
172
+ if(month==2)
173
+ jd=31+day;
174
+ if(month==3)
175
+ jd=59+day;
176
+ if(month==4)
177
+ jd=90+day;
178
+ if(month==5)
179
+ jd=120+day;
180
+ if(month==6)
181
+ jd=151+day;
182
+ if(month==7)
183
+ jd=181+day;
184
+ if(month==8)
185
+ jd=212+day;
186
+ if(month==9)
187
+ jd=243+day;
188
+ if(month==10)
189
+ jd=273+day;
190
+ if(month==11)
191
+ jd=304+day;
192
+ if(month==12)
193
+ jd=334+day;
194
+ return (jd-1);
195
+ }
196
+ double cClimateFile::GetDirectRad(double hour, int day)
197
+ {
198
+ // interpolate linearly between two closest hours
199
+ double hourdiff, hour1;
200
+ int pointer;
201
+
202
+ // find the half hour before current time (climate file has data for 0:30, 1:30,2:30, etc...)
203
+ hour1=(int)hour;
204
+ hourdiff=hour-hour1;
205
+ if (hourdiff >= 0.5) hour1+= 0.5;
206
+ else hour1-=0.5;
207
+
208
+ pointer=(day-1)*24+(int)(hour1-0.5);
209
+
210
+ // if pointer < 0, don't have data for specified day
211
+ if (pointer < 0) return -9999;
212
+
213
+ float ratio, diff;
214
+
215
+ ratio=hour-hour1;
216
+ // TODO: CHeck this (first/last hours of day)
217
+ diff=(m_ptIgh[pointer+1]-m_ptIdh[pointer+1])-(m_ptIgh[pointer]-m_ptIdh[pointer]);
218
+
219
+ return (m_ptIgh[pointer]-m_ptIdh[pointer]) + diff*ratio;
220
+ }
221
+
222
+ double cClimateFile::GetDiffuseRad(double hour, int day)
223
+ {
224
+ // interpolate linearly between two closest hours
225
+ float hour1, hourdiff;
226
+ int pointer;
227
+
228
+ // find the half hour before current time (climate file has data for 0:30, 1:30,2:30, etc...)
229
+ hour1=int(hour);
230
+ hourdiff=hour-hour1;
231
+ if (hourdiff >= 0.5) hour1+= 0.5;
232
+ else hour1-=0.5;
233
+
234
+ pointer=(day-1)*24+(int)(hour1-0.5);
235
+
236
+ // if pointer < 0, don't have data for specified day
237
+ if (pointer < 0) return -9999;
238
+
239
+ float ratio, diff;
240
+
241
+ ratio=hour-hour1;
242
+ diff=m_ptIdh[pointer+1]-m_ptIdh[pointer];
243
+
244
+ return m_ptIdh[pointer] + diff*ratio;
245
+ }
246
+
247
+ double cClimateFile::GetGlobalRad(double hour, int day)
248
+ {
249
+ // interpolate linearly between two closest hours
250
+ float hour1, hourdiff;
251
+ int pointer;
252
+
253
+ // find the half hour before current time (climate file has data for 0:30, 1:30,2:30, etc...)
254
+ hour1=int(hour);
255
+ hourdiff=hour-hour1;
256
+ if (hourdiff >= 0.5) hour1+= 0.5;
257
+ else hour1-=0.5;
258
+
259
+ pointer=(day-1)*24+(int)(hour1-0.5);
260
+
261
+ // if pointer < 0, don't have data for specified day
262
+ if (pointer < 0) return -9999;
263
+
264
+ float ratio, diff;
265
+
266
+ ratio=hour-hour1;
267
+ diff=m_ptIgh[pointer+1]-m_ptIgh[pointer];
268
+ return m_ptIgh[pointer] + diff*ratio;
269
+ }
270
+
271
+
272
+ // THIS ROUTINE 'BORROWED' FROM GENDAYLIT
273
+ //FILE* cClimateFile::LoadFile( char *fname) /* find file and open for reading */
274
+ //{
275
+ // FILE *fp;
276
+ // char pname[MAXPATH];
277
+ // char *libpath=NULL;
278
+ // register char *sp, *cp;
279
+
280
+ // if (fname == NULL)
281
+ // return(NULL);
282
+
283
+ // if (ISDIRSEP(fname[0]) || fname[0] == '.') /* absolute path */
284
+ // return(fopen(fname, "r"));
285
+
286
+ // if (libpath == NULL) { /* get search path */
287
+ // libpath = getenv(ULIBVAR);
288
+ // if (libpath == NULL)
289
+ // libpath = DEFPATH;
290
+ // }
291
+ /* check search path */
292
+ // sp = libpath;
293
+ // do {
294
+ // cp = pname;
295
+ // while (*sp && (*cp = *sp++) != PATHSEP)
296
+ // cp++;
297
+ // if (cp > pname && !ISDIRSEP(cp[-1]))
298
+ // *cp++ = DIRSEP;
299
+ // strcpy(cp, fname);
300
+ // if ((fp = fopen(pname, "r")) != NULL)
301
+ // return(fp); /* got it! */
302
+ // } while (*sp);
303
+ // /* not found */
304
+ // return(NULL);
305
+ //}
306
+
307
+ FILE* cClimateFile::LoadFile( char *fname) /*open file for reading*/
308
+ { FILE *Datei;
309
+ Datei = fopen(fname, "r");
310
+ if ( Datei == NULL) fprintf(stderr, "fatal warning FUNCTION LoadFile: open of %s for input failed.\n",fname);
311
+ return Datei;}
312
+
@@ -0,0 +1,37 @@
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+
4
+ class cClimateFile
5
+ {
6
+ public:
7
+ enum eClimateFileFormat { GLOBAL_DIFFUSE, DIRECTHORIZONTAL_DIFFUSE,GLOBAL_DIFFUSE_EPW };
8
+
9
+ cClimateFile(void);
10
+ ~cClimateFile(void);
11
+
12
+ // read in climate file
13
+ // must specify the hour numbering convention -1 = hour beginning, 0 = centered, 1 = hour ending
14
+ bool ReadClimateFile(char *FileName, int HourConvention, eClimateFileFormat ClimateFileFormat,double StartTime, double EndTime, int StartDay, int EndDay, int StartMonth, int EndMonth);
15
+
16
+ // check that the currently stored data is valid
17
+ bool ValidateData();
18
+
19
+ //caclulate julian date
20
+ int JulianDate(int month, int day);
21
+ //int cClimateFile::JulianDate(int month, int day);
22
+
23
+ // return direct radiation for a given day (Ibh=Igh-Idh)
24
+ // day 1 = 1st jan, hour is 0-23
25
+ double GetDirectRad(double hour, int day);
26
+ double GetDiffuseRad(double hour, int day);
27
+ double GetGlobalRad(double hour, int day);
28
+
29
+ private:
30
+ // climate data
31
+ double *m_ptIgh, *m_ptIdh;
32
+ // number of data points (almost certainly = 24*365=8760)
33
+ int m_NumPoints;
34
+
35
+ FILE *LoadFile(char *fname);
36
+
37
+ };
@@ -0,0 +1,177 @@
1
+ { This .cal file was generated automatically by gencumulativesky }
2
+ { a.out +s2 -a 51.5 -h -0. -o 5.32 -G ./cardiff.txt }
3
+
4
+ skybright=row0+row1+row2+row3+row4+row5+row6+row7;
5
+
6
+ row0=if(and(alt-0, 12-alt),select(floor(0.5+az/12.00)+1,
7
+ 147651.992082,
8
+ 148103.246847,
9
+ 150502.848057,
10
+ 155558.154335,
11
+ 164752.750913,
12
+ 180226.864316,
13
+ 197570.397547,
14
+ 212571.942436,
15
+ 222715.516579,
16
+ 229380.244970,
17
+ 234364.512080,
18
+ 238724.153999,
19
+ 241687.185432,
20
+ 243156.625884,
21
+ 244030.858216,
22
+ 245287.056661,
23
+ 247567.996594,
24
+ 250779.009968,
25
+ 253345.247304,
26
+ 253483.003437,
27
+ 251441.577429,
28
+ 248002.276951,
29
+ 241899.370743,
30
+ 231427.225726,
31
+ 213790.778047,
32
+ 191226.997091,
33
+ 171722.489942,
34
+ 159518.523684,
35
+ 152621.012229,
36
+ 149021.950490,
37
+ 147651.992082),0);
38
+
39
+ row1=if(and(alt-12, 24-alt),select(floor(0.5+az/12.00)+1,
40
+ 134651.743021,
41
+ 135053.083596,
42
+ 137437.590856,
43
+ 142420.217077,
44
+ 151274.635553,
45
+ 165867.004901,
46
+ 187839.978362,
47
+ 209363.153328,
48
+ 225731.564198,
49
+ 236851.521055,
50
+ 243759.655986,
51
+ 250020.623769,
52
+ 255473.229880,
53
+ 259620.185535,
54
+ 262936.931112,
55
+ 265882.298494,
56
+ 267908.171928,
57
+ 269448.819016,
58
+ 270151.095768,
59
+ 269505.390092,
60
+ 266983.874338,
61
+ 261333.811133,
62
+ 252929.903479,
63
+ 233597.041538,
64
+ 206371.066468,
65
+ 178675.901426,
66
+ 159135.575806,
67
+ 147001.511408,
68
+ 139925.800854,
69
+ 136142.123374,
70
+ 134651.743021),0);
71
+
72
+ row2=if(and(alt-24, 36-alt),select(floor(0.5+az/15.00)+1,
73
+ 125460.067551,
74
+ 126133.634995,
75
+ 129825.423207,
76
+ 137678.123424,
77
+ 151862.426574,
78
+ 174915.500053,
79
+ 205419.015484,
80
+ 231446.717882,
81
+ 247028.536763,
82
+ 255945.617304,
83
+ 263118.023397,
84
+ 268575.983401,
85
+ 272514.849105,
86
+ 275030.006794,
87
+ 276372.309258,
88
+ 275336.988349,
89
+ 270847.601692,
90
+ 260369.168109,
91
+ 233101.528953,
92
+ 193610.515939,
93
+ 163540.284837,
94
+ 144358.286209,
95
+ 133324.367364,
96
+ 127615.967316,
97
+ 125460.067551),0);
98
+
99
+ row3=if(and(alt-36, 48-alt),select(floor(0.5+az/15.00)+1,
100
+ 120757.784075,
101
+ 121324.947226,
102
+ 124596.806475,
103
+ 131288.409911,
104
+ 142715.794089,
105
+ 160550.960188,
106
+ 185946.724621,
107
+ 216780.394666,
108
+ 240382.834313,
109
+ 257157.830766,
110
+ 264688.413196,
111
+ 270191.252794,
112
+ 275185.652566,
113
+ 277586.860612,
114
+ 276764.236991,
115
+ 274128.718481,
116
+ 266130.058101,
117
+ 240671.534981,
118
+ 206302.822953,
119
+ 175137.206287,
120
+ 152331.985627,
121
+ 137185.051179,
122
+ 127891.996560,
123
+ 122785.088706,
124
+ 120757.784075),0);
125
+
126
+ row4=if(and(alt-48, 60-alt),select(floor(0.5+az/20.00)+1,
127
+ 120553.214945,
128
+ 121701.979622,
129
+ 127264.207825,
130
+ 138523.623777,
131
+ 157362.196532,
132
+ 184812.504009,
133
+ 218174.248601,
134
+ 244754.046815,
135
+ 260098.694850,
136
+ 268529.254096,
137
+ 270470.791981,
138
+ 260536.512623,
139
+ 234959.274998,
140
+ 200472.817437,
141
+ 168938.370311,
142
+ 145955.737209,
143
+ 131451.317663,
144
+ 123544.008800,
145
+ 120553.214945),0);
146
+
147
+ row5=if(and(alt-60, 72-alt),select(floor(0.5+az/30.00)+1,
148
+ 125136.944026,
149
+ 127825.032912,
150
+ 138889.529604,
151
+ 159856.698781,
152
+ 189095.038539,
153
+ 217166.299527,
154
+ 231209.021293,
155
+ 224177.613259,
156
+ 198836.252107,
157
+ 168210.150741,
158
+ 144143.189720,
159
+ 130187.870112,
160
+ 125136.944026),0);
161
+
162
+ row6=if(and(alt-72, 84-alt),select(floor(0.5+az/60.00)+1,
163
+ 135639.142343,
164
+ 143917.146301,
165
+ 168017.896278,
166
+ 185262.329733,
167
+ 172003.700483,
168
+ 146816.867657,
169
+ 135639.142343),0);
170
+
171
+ row7=if(alt-84,154421.194038,0);
172
+
173
+ alt=asin(Dz)*180/PI;
174
+
175
+ az=if(azi,azi,azi+360);
176
+ azi=atan2(Dx,Dy)*180/PI;
177
+
@@ -0,0 +1,14 @@
1
+ void brightfunc skyfunc
2
+ 2 skybright cumulative.cal
3
+ 0
4
+ 0
5
+ skyfunc glow sky_glow
6
+ 0
7
+ 0
8
+ 4 1 1 1 0
9
+ sky_glow source sky
10
+ 0
11
+ 0
12
+ 4 0 0 1 180
13
+
14
+
@@ -0,0 +1,2 @@
1
+ !xform -rz -97 cumulativesky.rad
2
+ !xform -rz -97 SunFile.rad