ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/pmapdiag.c
Revision: 2.1
Committed: Tue Feb 24 19:39:26 2015 UTC (9 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Initial check-in of photon map addition by Roland Schregle

File Contents

# User Rev Content
1 greg 2.1 /*
2     ==================================================================
3     Photon map diagnostic output and progress reports
4    
5     Roland Schregle (roland.schregle@{hslu.ch, gmail.com})
6     (c) Fraunhofer Institute for Solar Energy Systems,
7     Lucerne University of Applied Sciences & Arts
8     ==================================================================
9    
10     $Id: pmapdiag.c,v 1.2 2014/09/24 09:42:18 taschreg Exp taschreg $
11     */
12    
13    
14    
15     #include "pmapdiag.h"
16     #include "pmapdata.h"
17     #include "standard.h"
18     #include <signal.h>
19    
20    
21    
22     time_t repStartTime, repLastTime = 0; /* Time at start & last report */
23     unsigned long repProgress, /* Report progress counter */
24     repComplete; /* Report completion count */
25    
26    
27    
28     static char* biasCompStats (const PhotonMap *pmap, PhotonMapType type,
29     char *stats)
30     /* Dump bias compensation statistics */
31     {
32     unsigned avgBwidth;
33     float avgErr;
34    
35     /* Check if photon map is valid and bias compensated */
36     if (pmap && pmap -> maxGather > pmap -> minGather) {
37     avgBwidth = pmap -> numDensity
38     ? pmap -> totalGathered / pmap -> numDensity : 0,
39     avgErr = pmap -> numDensity
40     ? sqrt(pmap -> rmsError / pmap -> numDensity) : 0;
41    
42     sprintf(stats, "%d/%d/%d %s (%.1f/%.1f/%.1f%% error), ",
43     pmap -> minGathered, pmap -> maxGathered, avgBwidth,
44     pmapName [type],
45     100 * pmap -> minError, 100 * pmap -> maxError, 100 * avgErr);
46    
47     return stats;
48     }
49    
50     return NULL;
51     }
52    
53    
54    
55     void pmapBiasCompReport (char *stats)
56     /* Append full bias compensation statistics to stats; interface to rpict's
57     * report() */
58     {
59     char tmp [512];
60     unsigned t;
61    
62     stats [0] = '\0';
63    
64     for (t = 0; t < NUM_PMAP_TYPES; t++)
65     if (biasCompStats(photonMaps [t], t, tmp))
66     strcat(stats, tmp);
67     }
68    
69    
70    
71     #ifndef NON_POSIX
72     void pmapPreCompReport()
73     /* Report global photon precomputation progress */
74     {
75     extern char *myhostname();
76     float u, s;
77     char tmp [512];
78    
79     #ifdef BSD
80     struct rusage rubuf;
81     #else
82     struct tms tbuf;
83     float period;
84     #endif
85    
86     repLastTime = time(NULL);
87    
88     #ifdef BSD
89     getrusage(RUSAGE_SELF, &rubuf);
90     u = rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec / 1e6;
91     s = rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec / 1e6;
92     getrusage(RUSAGE_CHILDREN, &rubuf);
93     u += rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec / 1e6;
94     s += rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec / 1e6;
95     #else
96     times(&tbuf);
97    
98     #ifdef _SC_CLK_TCK
99     period = 1.0 / sysconf(_SC_CLK_TCK);
100     #else
101     period = 1.0 / 60;
102     #endif
103    
104     u = (tbuf.tms_utime + tbuf.tms_cutime) * period;
105     s = (tbuf.tms_stime + tbuf.tms_cstime) * period;
106     #endif
107    
108     sprintf(errmsg, "%lu precomputed, ", repProgress);
109    
110     /* Append bias compensation stats */
111     biasCompStats(preCompPmap, PMAP_TYPE_PRECOMP, tmp);
112     strcat(errmsg, tmp);
113    
114     sprintf(tmp, "%4.2f%% after %.3fu %.3fs %.3fr hours on %s\n",
115     100.0 * repProgress / repComplete, u / 3600, s / 3600,
116     (repLastTime - repStartTime) / 3600.0, myhostname());
117     strcat(errmsg, tmp);
118    
119     eputs(errmsg);
120     fflush(stderr);
121    
122     #ifndef BSD
123     signal(SIGCONT, pmapPreCompReport);
124     #endif
125     }
126    
127    
128    
129     void pmapDistribReport()
130     /* Report photon distribution progress */
131     {
132     extern char *myhostname();
133     float u, s;
134     unsigned t;
135     char tmp [512];
136    
137     #ifdef BSD
138     struct rusage rubuf;
139     #else
140     struct tms tbuf;
141     float period;
142     #endif
143    
144     repLastTime = time(NULL);
145    
146     #ifdef BSD
147     getrusage(RUSAGE_SELF, &rubuf);
148     u = rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec / 1e6;
149     s = rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec / 1e6;
150     getrusage(RUSAGE_CHILDREN, &rubuf);
151     u += rubuf.ru_utime.tv_sec + rubuf.ru_utime.tv_usec / 1e6;
152     s += rubuf.ru_stime.tv_sec + rubuf.ru_stime.tv_usec / 1e6;
153     #else
154     times(&tbuf);
155    
156     #ifdef _SC_CLK_TCK
157     period = 1.0 / sysconf(_SC_CLK_TCK);
158     #else
159     period = 1.0 / 60;
160     #endif
161    
162     u = (tbuf.tms_utime + tbuf.tms_cutime) * period;
163     s = (tbuf.tms_stime + tbuf.tms_cstime) * period;
164     #endif
165    
166     sprintf(errmsg, "%lu emitted, ", repProgress);
167    
168     for (t = 0; t < NUM_PMAP_TYPES; t++)
169     if (photonMaps [t]) {
170     sprintf(tmp, "%lu %s, ",
171     photonMaps [t] -> heapEnd, pmapName [t]);
172     strcat(errmsg, tmp);
173     }
174    
175     sprintf(tmp, "%4.2f%% after %.3fu %.3fs %.3fr hours on %s\n",
176     100.0 * repProgress / repComplete, u / 3600, s / 3600,
177     (repLastTime - repStartTime) / 3600.0, myhostname());
178    
179     strcat(errmsg, tmp);
180     eputs(errmsg);
181     fflush(stderr);
182    
183     #ifndef BSD
184     signal(SIGCONT, pmapDistribReport);
185     #endif
186     }
187    
188     #else /* POSIX */
189    
190     void pmapPreCompReport()
191     /* Report global photon precomputation progress */
192     {
193     repLastTime = time(NULL);
194     sprintf(errmsg, "%lu precomputed, ", repProgress);
195    
196     /* Append bias compensation stats */
197     biasCompStats(preCompPmap, PMAP_TYPE_PRECOMP, tmp);
198     strcat(errmsg, tmp);
199    
200     sprintf(tmp, "%4.2f%% after %5.4f hours\n",
201     100.0 * repProgress / repComplete,
202     (repLastTime - repStartTime) / 3600.0);
203     strcat(errmsg, tmp);
204    
205     eputs(errmsg);
206     fflush(stderr);
207     }
208    
209    
210    
211     void pmapDistribReport()
212     /* Report photon distribution progress */
213     {
214     char tmp [512];
215     unsigned t;
216    
217     repLastTime = time(NULL);
218     sprintf(errmsg, "%lu emitted, ", repProgress);
219    
220     for (t = 0; t < NUM_PMAP_TYPES; t++)
221     if (photonMaps [t]) {
222     sprintf(tmp, "%lu %s, ",
223     photonMaps [t] -> heapEnd, pmapName [t]);
224     strcat(errmsg, tmp);
225     }
226    
227     sprintf(tmp, "%4.2f%% after %5.4f hours\n",
228     100.0 * repProgress / repComplete,
229     (repLastTime - repStartTime) / 3600.0);
230     strcat(errmsg, tmp);
231    
232     eputs(errmsg);
233     fflush(stderr);
234     }
235     #endif
236    
237    
238