ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/gensky.c
Revision: 2.10
Committed: Fri Jun 4 14:30:24 1993 UTC (30 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.9: +0 -3 lines
Log Message:
Removed unnecessary declaration of atof()

File Contents

# Content
1 /* Copyright (c) 1992 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * gensky.c - program to generate sky functions.
9 * Our zenith is along the Z-axis, the X-axis
10 * points east, and the Y-axis points north.
11 * Radiance is in watts/steradian/sq. meter.
12 *
13 * 3/26/86
14 */
15
16 #include <stdio.h>
17
18 #include <math.h>
19
20 #include "color.h"
21
22 extern char *strcpy(), *strcat(), *malloc();
23 extern double stadj(), sdec(), sazi(), salt();
24
25 #define PI 3.141592654
26
27 #define DOT(v1,v2) (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])
28
29 double normsc();
30 /* sun calculation constants */
31 extern double s_latitude;
32 extern double s_longitude;
33 extern double s_meridian;
34 /* required values */
35 int month, day; /* date */
36 double hour; /* time */
37 int tsolar; /* 0=standard, 1=solar */
38 double altitude, azimuth; /* or solar angles */
39 /* default values */
40 int cloudy = 0; /* 1=standard, 2=uniform */
41 int dosun = 1;
42 double zenithbr = -1.0;
43 double turbidity = 2.75;
44 double gprefl = 0.2;
45 /* computed values */
46 double sundir[3];
47 double groundbr;
48 double F2;
49 double solarbr = -1.0;
50
51 char *progname;
52 char errmsg[128];
53
54
55 main(argc, argv)
56 int argc;
57 char *argv[];
58 {
59 int i;
60
61 progname = argv[0];
62 if (argc == 2 && !strcmp(argv[1], "-defaults")) {
63 printdefaults();
64 exit(0);
65 }
66 if (argc < 4)
67 userror("arg count");
68 if (!strcmp(argv[1], "-ang")) {
69 altitude = atof(argv[2]) * (PI/180);
70 azimuth = atof(argv[3]) * (PI/180);
71 month = 0;
72 } else {
73 month = atoi(argv[1]);
74 if (month < 1 || month > 12)
75 userror("bad month");
76 day = atoi(argv[2]);
77 if (day < 1 || day > 31)
78 userror("bad day");
79 hour = atof(argv[3]);
80 if (hour < 0 || hour >= 24)
81 userror("bad hour");
82 tsolar = argv[3][0] == '+';
83 }
84 for (i = 4; i < argc; i++)
85 if (argv[i][0] == '-' || argv[i][0] == '+')
86 switch (argv[i][1]) {
87 case 's':
88 cloudy = 0;
89 dosun = argv[i][0] == '+';
90 break;
91 case 'r':
92 solarbr = atof(argv[++i]);
93 break;
94 case 'c':
95 cloudy = argv[i][0] == '+' ? 2 : 1;
96 dosun = 0;
97 break;
98 case 't':
99 turbidity = atof(argv[++i]);
100 break;
101 case 'b':
102 zenithbr = atof(argv[++i]);
103 break;
104 case 'g':
105 gprefl = atof(argv[++i]);
106 break;
107 case 'a':
108 s_latitude = atof(argv[++i]) * (PI/180);
109 break;
110 case 'o':
111 s_longitude = atof(argv[++i]) * (PI/180);
112 break;
113 case 'm':
114 s_meridian = atof(argv[++i]) * (PI/180);
115 break;
116 default:
117 sprintf(errmsg, "unknown option: %s", argv[i]);
118 userror(errmsg);
119 }
120 else
121 userror("bad option");
122
123 if (fabs(s_meridian-s_longitude) > 30*PI/180)
124 fprintf(stderr,
125 "%s: warning: %.1f hours btwn. standard meridian and longitude\n",
126 progname, (s_longitude-s_meridian)*12/PI);
127
128 printhead(argc, argv);
129
130 computesky();
131 printsky();
132 }
133
134
135 computesky() /* compute sky parameters */
136 {
137 /* compute solar direction */
138 if (month) { /* from date and time */
139 int jd;
140 double sd, st;
141
142 jd = jdate(month, day); /* Julian date */
143 sd = sdec(jd); /* solar declination */
144 if (tsolar) /* solar time */
145 st = hour;
146 else
147 st = hour + stadj(jd);
148 altitude = salt(sd, st);
149 azimuth = sazi(sd, st);
150 }
151 if (!cloudy && altitude > 87.*PI/180.) {
152 fprintf(stderr,
153 "%s: warning - sun too close to zenith, reducing altitude to 87 degrees\n",
154 progname);
155 printf(
156 "# warning - sun too close to zenith, reducing altitude to 87 degrees\n");
157 altitude = 87.*PI/180.;
158 }
159 sundir[0] = -sin(azimuth)*cos(altitude);
160 sundir[1] = -cos(azimuth)*cos(altitude);
161 sundir[2] = sin(altitude);
162
163 /* Compute zenith brightness */
164 if (zenithbr <= 0.0)
165 if (cloudy) {
166 zenithbr = 8.6*sundir[2] + .123;
167 zenithbr *= 1000.0/WHTEFFICACY;
168 } else {
169 zenithbr = (1.376*turbidity-1.81)*tan(altitude)+0.38;
170 zenithbr *= 1000.0/SKYEFFICACY;
171 }
172 if (zenithbr < 0.0)
173 zenithbr = 0.0;
174 /* Compute horizontal radiance */
175 if (cloudy) {
176 if (cloudy == 2)
177 groundbr = zenithbr;
178 else
179 groundbr = zenithbr*0.777778;
180 printf("# Ground ambient level: %f\n", groundbr);
181 } else {
182 F2 = 0.274*(0.91 + 10.0*exp(-3.0*(PI/2.0-altitude)) +
183 0.45*sundir[2]*sundir[2]);
184 groundbr = zenithbr*normsc(altitude)/F2/PI;
185 printf("# Ground ambient level: %f\n", groundbr);
186 if (sundir[2] > 0.0 && solarbr != 0.0) {
187 if (solarbr < 0.0)
188 solarbr = 1.5e9/SUNEFFICACY *
189 (1.147 - .147/(sundir[2]>.16?sundir[2]:.16));
190 groundbr += solarbr*6e-5*sundir[2]/PI;
191 } else
192 dosun = 0;
193 }
194 groundbr *= gprefl;
195 }
196
197
198 printsky() /* print out sky */
199 {
200 if (dosun) {
201 printf("\nvoid light solar\n");
202 printf("0\n0\n");
203 printf("3 %.2e %.2e %.2e\n", solarbr, solarbr, solarbr);
204 printf("\nsolar source sun\n");
205 printf("0\n0\n");
206 printf("4 %f %f %f 0.5\n", sundir[0], sundir[1], sundir[2]);
207 }
208
209 printf("\nvoid brightfunc skyfunc\n");
210 printf("2 skybright skybright.cal\n");
211 printf("0\n");
212 if (cloudy)
213 printf("3 %d %.2e %.2e\n", cloudy, zenithbr, groundbr);
214 else
215 printf("7 -1 %.2e %.2e %.2e %f %f %f\n", zenithbr, groundbr,
216 F2, sundir[0], sundir[1], sundir[2]);
217 }
218
219
220 printdefaults() /* print default values */
221 {
222 if (cloudy == 1)
223 printf("-c\t\t\t\t# Cloudy sky\n");
224 else if (cloudy == 2)
225 printf("+c\t\t\t\t# Uniform cloudy sky\n");
226 else if (dosun)
227 printf("+s\t\t\t\t# Sunny sky with sun\n");
228 else
229 printf("-s\t\t\t\t# Sunny sky without sun\n");
230 printf("-g %f\t\t\t# Ground plane reflectance\n", gprefl);
231 if (zenithbr > 0.0)
232 printf("-b %f\t\t\t# Zenith radiance (watts/ster/m2\n", zenithbr);
233 else
234 printf("-t %f\t\t\t# Atmospheric turbidity\n", turbidity);
235 printf("-a %f\t\t\t# Site latitude (degrees)\n", s_latitude*(180/PI));
236 printf("-o %f\t\t\t# Site longitude (degrees)\n", s_longitude*(180/PI));
237 printf("-m %f\t\t\t# Standard meridian (degrees)\n", s_meridian*(180/PI));
238 }
239
240
241 userror(msg) /* print usage error and quit */
242 char *msg;
243 {
244 if (msg != NULL)
245 fprintf(stderr, "%s: Use error - %s\n", progname, msg);
246 fprintf(stderr, "Usage: %s month day hour [options]\n", progname);
247 fprintf(stderr, " Or: %s -ang altitude azimuth [options]\n", progname);
248 fprintf(stderr, " Or: %s -defaults\n", progname);
249 exit(1);
250 }
251
252
253 double
254 normsc(theta) /* compute normalization factor (E0*F2/L0) */
255 double theta;
256 {
257 static double nf[5] = {2.766521, 0.547665,
258 -0.369832, 0.009237, 0.059229};
259 double x, nsc;
260 register int i;
261 /* polynomial approximation */
262 x = (theta - PI/4.0)/(PI/4.0);
263 nsc = nf[4];
264 for (i = 3; i >= 0; i--)
265 nsc = nsc*x + nf[i];
266
267 return(nsc);
268 }
269
270
271 printhead(ac, av) /* print command header */
272 register int ac;
273 register char **av;
274 {
275 putchar('#');
276 while (ac--) {
277 putchar(' ');
278 fputs(*av++, stdout);
279 }
280 putchar('\n');
281 }