ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/genBSDF.pl
(Generate patch)

Comparing ray/src/util/genBSDF.pl (file contents):
Revision 2.21 by greg, Wed Jun 8 23:16:47 2011 UTC vs.
Revision 2.35 by greg, Wed May 9 17:40:17 2012 UTC

# Line 8 | Line 8
8   use strict;
9   use File::Temp qw/ :mktemp  /;
10   sub userror {
11 <        print STDERR "Usage: genBSDF [-n Nproc][-c Nsamp][-t{3|4} Nlog2][-r \"ropts\"][-dim xmin xmax ymin ymax zmin zmax][{+|-}f][{+|-}b][{+|-}mgf][{+|-}geom] [input ..]\n";
11 >        print STDERR "Usage: genBSDF [-n Nproc][-c Nsamp][-t{3|4} Nlog2][-r \"ropts\"][-dim xmin xmax ymin ymax zmin zmax][{+|-}f][{+|-}b][{+|-}mgf][{+|-}geom units] [input ..]\n";
12          exit 1;
13   }
14   my $td = mkdtemp("/tmp/genBSDF.XXXXXX");
# Line 16 | Line 16 | chomp $td;
16   my @savedARGV = @ARGV;
17   my $tensortree = 0;
18   my $ttlog2 = 4;
19 < my $nsamp = 1000;
19 > my $nsamp = 2000;
20   my $rtargs = "-w -ab 5 -ad 700 -lw 3e-6";
21   my $mgfin = 0;
22   my $geout = 1;
23   my $nproc = 1;
24   my $doforw = 0;
25   my $doback = 1;
26 + my $pctcull = 90;
27 + my $gunit = "Meter";
28   my @dim;
29   # Get options
30   while ($#ARGV >= 0) {
# Line 33 | Line 35 | while ($#ARGV >= 0) {
35                  shift @ARGV;
36          } elsif ("$ARGV[0]" =~ /^[-+]g/) {
37                  $geout = ("$ARGV[0]" =~ /^\+/);
38 +                $gunit = $ARGV[1];
39 +                if ($gunit !~ /^(?i)(meter|foot|inch|centimeter|millimeter)$/) {
40 +                        die "Illegal geometry unit '$gunit': must be meter, foot, inch, centimeter, or millimeter\n";
41 +                }
42 +                shift @ARGV;
43          } elsif ("$ARGV[0]" =~ /^[-+]f/) {
44                  $doforw = ("$ARGV[0]" =~ /^\+/);
45          } elsif ("$ARGV[0]" =~ /^[-+]b/) {
46                  $doback = ("$ARGV[0]" =~ /^\+/);
47 +        } elsif ("$ARGV[0]" eq "-t") {
48 +                # Use value < 0 for rttree_reduce bypass
49 +                $pctcull = $ARGV[1];
50 +                shift @ARGV;
51          } elsif ("$ARGV[0]" =~ /^-t[34]$/) {
52                  $tensortree = substr($ARGV[0], 2, 1);
53                  $ttlog2 = $ARGV[1];
# Line 109 | Line 120 | print
120                  <Name>Name</Name>
121                  <Manufacturer>Manufacturer</Manufacturer>
122   ';
123 < printf "\t\t<Thickness unit=\"Meter\">%.3f</Thickness>\n", $dim[5] - $dim[4];
124 < printf "\t\t<Width unit=\"Meter\">%.3f</Width>\n", $dim[1] - $dim[0];
125 < printf "\t\t<Height unit=\"Meter\">%.3f</Height>\n", $dim[3] - $dim[2];
123 > printf "\t\t<Thickness unit=\"$gunit\">%.3f</Thickness>\n", $dim[5] - $dim[4];
124 > printf "\t\t<Width unit=\"$gunit\">%.3f</Width>\n", $dim[1] - $dim[0];
125 > printf "\t\t<Height unit=\"$gunit\">%.3f</Height>\n", $dim[3] - $dim[2];
126   print "\t\t<DeviceType>Integral</DeviceType>\n";
127   # Output MGF description if requested
128   if ( $geout ) {
129 <        print "\t\t<Geometry format=\"MGF\" unit=\"Meter\">\n";
129 >        print "\t\t<Geometry format=\"MGF\" unit=\"$gunit\">\n";
130          printf "xf -t %.6f %.6f 0\n", -($dim[0]+$dim[1])/2, -($dim[2]+$dim[3])/2;
131          open(MGFSCN, "< $mgfscn");
132          while (<MGFSCN>) { print $_; }
# Line 143 | Line 154 | print
154   </WindowElement>
155   ';
156   # Clean up temporary files and exit
146 if ( $persistfile && open(PFI, "< $persistfile") ) {
147        while (<PFI>) {
148                s/^[^ ]* //;
149                kill('ALRM', $_);
150                last;
151        }
152        close PFI;
153 }
157   exec("rm -rf $td");
158  
159   #-------------- End of main program segment --------------#
160  
161 + #++++++++++++++ Kill persistent rtrace +++++++++++++++++++#
162 + sub persist_end {
163 +        if ( $persistfile && open(PFI, "< $persistfile") ) {
164 +                while (<PFI>) {
165 +                        s/^[^ ]* //;
166 +                        kill('ALRM', $_);
167 +                        last;
168 +                }
169 +                close PFI;
170 +        }
171 + }
172 +
173   #++++++++++++++ Tensor tree BSDF generation ++++++++++++++#
174   sub do_tree_bsdf {
175   # Get sampling rate and subdivide task
176   my $ns2 = $ns;
177   $ns2 /= 2 if ( $tensortree == 3 );
178 < @pdiv = (0, int($ns2/$nproc));
179 < my $nrem = $ns2 % $nproc;
180 < for (my $i = 1; $i < $nproc; $i++) {
178 > my $nsplice = $nproc;
179 > $nsplice *= 10 if ($nproc > 1);
180 > $nsplice = $ns2 if ($nsplice > $ns2);
181 > $nsplice = 999 if ($nsplice > 999);
182 > @pdiv = (0, int($ns2/$nsplice));
183 > my $nrem = $ns2 % $nsplice;
184 > for (my $i = 1; $i < $nsplice; $i++) {
185          my $nv = $pdiv[$i] + $pdiv[1];
186          ++$nv if ( $nrem-- > 0 );
187          push @pdiv, $nv;
# Line 211 | Line 230 | print "\t<DataDefinition>\n";
230   print "\t\t<IncidentDataStructure>TensorTree$tensortree</IncidentDataStructure>\n";
231   print "\t</DataDefinition>\n";
232   # Fork parallel rtcontrib processes to compute each side
233 + my $npleft = $nproc;
234   if ( $doback ) {
235 <        for (my $proc = 0; $proc < $nproc; $proc++) {
236 <                bg_tree_rtcontrib(0, $proc);
235 >        for (my $splice = 0; $splice < $nsplice; $splice++) {
236 >                if (! $npleft ) {
237 >                        wait();
238 >                        die "rtcontrib process reported error" if ( $? );
239 >                        $npleft++;
240 >                }
241 >                bg_tree_rtcontrib(0, $splice);
242 >                $npleft--;
243          }
244          while (wait() >= 0) {
245                  die "rtcontrib process reported error" if ( $? );
246 +                $npleft++;
247          }
248 +        persist_end();
249          ttree_out(0);
250   }
251   if ( $doforw ) {
252 <        for (my $proc = 0; $proc < $nproc; $proc++) {
253 <                bg_tree_rtcontrib(1, $proc);
252 >        for (my $splice = 0; $splice < $nsplice; $splice++) {
253 >                if (! $npleft ) {
254 >                        wait();
255 >                        die "rtcontrib process reported error" if ( $? );
256 >                        $npleft++;
257 >                }
258 >                bg_tree_rtcontrib(1, $splice);
259 >                $npleft--;
260          }
261          while (wait() >= 0) {
262                  die "rtcontrib process reported error" if ( $? );
263 +                $npleft++;
264          }
265 +        persist_end();
266          ttree_out(1);
267   }
268   }       # end of sub do_tree_bsdf()
269  
270 < # Run i'th rtcontrib process for generating tensor tree samples
270 > # Run rtcontrib process in background to generate tensor tree samples
271   sub bg_tree_rtcontrib {
272          my $pid = fork();
273          die "Cannot fork new process" unless defined $pid;
# Line 286 | Line 322 | sub bg_tree_rtcontrib {
322   sub ttree_out {
323          my $forw = shift;
324          my $side = ("Back","Front")[$forw];
325 +        my $cmd;
326   # Only output one transmitted distribution, preferring backwards
327   if ( !$forw || !$doback ) {
328   print
# Line 300 | Line 337 | print
337                          <ScatteringDataType>BTDF</ScatteringDataType>
338                          <ScatteringData>
339   ';
340 < system "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " .
341 <        q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' -of } .
342 <        "$td/" . ($bmodnm,$fmodnm)[$forw] . "_???.flt " .
343 <        "| rttree_reduce -h -ff -r $tensortree -g $ttlog2";
344 < die "Failure running rttree_reduce" if ( $? );
340 > $cmd = "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " .
341 >        q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' };
342 > if ($pctcull >= 0) {
343 >        $cmd .= "-of $td/" . ($bmodnm,$fmodnm)[$forw] . "_???.flt " .
344 >        "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2";
345 >        system "$cmd" || die "Failure running rttree_reduce";
346 > } else {
347 >        $cmd .= "$td/" . ($bmodnm,$fmodnm)[$forw] . "_???.flt";
348 >        print "{\n";
349 >        system "$cmd" || die "Failure running rcalc";
350 >        for (my $i = ($tensortree==3)*$ns*$ns*$ns/2; $i-- > 0; ) {
351 >                print "0\n";
352 >        }
353 >        print "}\n";
354 > }
355   print
356   '                       </ScatteringData>
357                  </WavelengthDataBlock>
# Line 326 | Line 373 | print
373                          <ScatteringDataType>BRDF</ScatteringDataType>
374                          <ScatteringData>
375   ';
376 < system "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " .
377 <        q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' -of } .
378 <        "$td/" . ($fmodnm,$bmodnm)[$forw] . "_???.flt " .
379 <        "| rttree_reduce -h -ff -r $tensortree -g $ttlog2";
380 < die "Failure running rttree_reduce" if ( $? );
376 > $cmd = "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " .
377 >        q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' };
378 > if ($pctcull >= 0) {
379 >        $cmd .= "-of $td/" . ($fmodnm,$bmodnm)[$forw] . "_???.flt " .
380 >        "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2";
381 >        system "$cmd" || die "Failure running rttree_reduce";
382 > } else {
383 >        $cmd .= "$td/" . ($fmodnm,$bmodnm)[$forw] . "_???.flt";
384 >        print "{\n";
385 >        system "$cmd" || die "Failure running rcalc";
386 >        for (my $i = ($tensortree==3)*$ns*$ns*$ns/2; $i-- > 0; ) {
387 >                print "0\n";
388 >        }
389 >        print "}\n";
390 > }
391   print
392   '                       </ScatteringData>
393                  </WavelengthDataBlock>
# Line 347 | Line 404 | sub do_matrix_bsdf {
404   $tcal = '
405   DEGREE : PI/180;
406   sq(x) : x*x;
407 < Kpola(r) : select(r+1, -5, 5, 15, 25, 35, 45, 55, 65, 75, 90);
407 > Kpola(r) : select(r+1, 0, 5, 15, 25, 35, 45, 55, 65, 75, 90);
408   Knaz(r) : select(r, 1, 8, 16, 20, 24, 24, 24, 16, 12);
409   Kaccum(r) : if(r-.5, Knaz(r) + Kaccum(r-1), 0);
410   Kmax : Kaccum(Knaz(0));
# Line 368 | Line 425 | KprojOmega = PI * if(Kbin-.5,
425   $kcal = '
426   DEGREE : PI/180;
427   abs(x) : if(x, x, -x);
428 < Acos(x) : 1/DEGREE * if(x-1, 0, if(-1-x, 0, acos(x)));
428 > Acos(x) : if(x-1, 0, if(-1-x, PI, acos(x))) / DEGREE;
429   posangle(a) : if(-a, a + 2*PI, a);
430 < Atan2(y,x) : 1/DEGREE * posangle(atan2(y,x));
430 > Atan2(y,x) : posangle(atan2(y,x)) / DEGREE;
431   kpola(r) : select(r, 5, 15, 25, 35, 45, 55, 65, 75, 90);
432   knaz(r) : select(r, 1, 8, 16, 20, 24, 24, 24, 16, 12);
433   kaccum(r) : if(r-.5, knaz(r) + kaccum(r-1), 0);
# Line 402 | Line 459 | my $rtcmd = "rtcontrib $rtargs -h -ff -fo -n $nproc -c
459          "-o '$td/%s.flt' -m $fmodnm -m $bmodnm $octree";
460   my $rccmd = "rcalc -e '$tcal' " .
461          "-e 'mod(n,d):n-floor(n/d)*d' -e 'Kbin=mod(recno-.999,$ndiv)' " .
462 <        q{-if3 -e 'oval=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega' } .
406 <        q[-o '${  oval  },'];
462 >        q{-if3 -e '$1=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega' };
463   if ( $doforw ) {
464   $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " .
465          "-e 'xp=(\$3+rand(.12*recno+288))*(($dim[1]-$dim[0])/$nx)+$dim[0]' " .
# Line 429 | Line 485 | $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " .
485   system "$cmd" || die "Failure running: $cmd\n";
486   @tbarr = `$rccmd $td/$bmodnm.flt`;
487   die "Failure running: $rccmd $td/$bmodnm.flt\n" if ( $? );
488 + chomp(@tbarr);
489   @rbarr = `$rccmd $td/$fmodnm.flt`;
490   die "Failure running: $rccmd $td/$fmodnm.flt\n" if ( $? );
491 + chomp(@rbarr);
492   }
493   # Output angle basis
494   print
# Line 439 | Line 497 | print
497                  <AngleBasis>
498                          <AngleBasisName>LBNL/Klems Full</AngleBasisName>
499                          <AngleBasisBlock>
500 <                                <Theta>0</Theta>
501 <                                <nPhis>1</nPhis>
502 <                                <ThetaBounds>
503 <                                        <LowerTheta>0</LowerTheta>
504 <                                        <UpperTheta>5</UpperTheta>
505 <                                </ThetaBounds>
448 <                                </AngleBasisBlock>
449 <                                <AngleBasisBlock>
450 <                                <Theta>10</Theta>
451 <                                <nPhis>8</nPhis>
452 <                                <ThetaBounds>
453 <                                        <LowerTheta>5</LowerTheta>
454 <                                        <UpperTheta>15</UpperTheta>
455 <                                </ThetaBounds>
456 <                                </AngleBasisBlock>
457 <                                <AngleBasisBlock>
458 <                                <Theta>20</Theta>
459 <                                <nPhis>16</nPhis>
460 <                                <ThetaBounds>
461 <                                        <LowerTheta>15</LowerTheta>
462 <                                        <UpperTheta>25</UpperTheta>
463 <                                </ThetaBounds>
464 <                                </AngleBasisBlock>
465 <                                <AngleBasisBlock>
466 <                                <Theta>30</Theta>
467 <                                <nPhis>20</nPhis>
468 <                                <ThetaBounds>
469 <                                        <LowerTheta>25</LowerTheta>
470 <                                        <UpperTheta>35</UpperTheta>
471 <                                </ThetaBounds>
472 <                                </AngleBasisBlock>
473 <                                <AngleBasisBlock>
474 <                                <Theta>40</Theta>
475 <                                <nPhis>24</nPhis>
476 <                                <ThetaBounds>
477 <                                        <LowerTheta>35</LowerTheta>
478 <                                        <UpperTheta>45</UpperTheta>
479 <                                </ThetaBounds>
480 <                                </AngleBasisBlock>
481 <                                <AngleBasisBlock>
482 <                                <Theta>50</Theta>
483 <                                <nPhis>24</nPhis>
484 <                                <ThetaBounds>
485 <                                        <LowerTheta>45</LowerTheta>
486 <                                        <UpperTheta>55</UpperTheta>
487 <                                </ThetaBounds>
488 <                                </AngleBasisBlock>
489 <                                <AngleBasisBlock>
490 <                                <Theta>60</Theta>
491 <                                <nPhis>24</nPhis>
492 <                                <ThetaBounds>
493 <                                        <LowerTheta>55</LowerTheta>
494 <                                        <UpperTheta>65</UpperTheta>
495 <                                </ThetaBounds>
496 <                                </AngleBasisBlock>
497 <                                <AngleBasisBlock>
498 <                                <Theta>70</Theta>
499 <                                <nPhis>16</nPhis>
500 <                                <ThetaBounds>
501 <                                        <LowerTheta>65</LowerTheta>
502 <                                        <UpperTheta>75</UpperTheta>
503 <                                </ThetaBounds>
504 <                                </AngleBasisBlock>
505 <                                <AngleBasisBlock>
506 <                                <Theta>82.5</Theta>
507 <                                <nPhis>12</nPhis>
508 <                                <ThetaBounds>
509 <                                        <LowerTheta>75</LowerTheta>
510 <                                        <UpperTheta>90</UpperTheta>
511 <                                </ThetaBounds>
500 >                        <Theta>0</Theta>
501 >                        <nPhis>1</nPhis>
502 >                        <ThetaBounds>
503 >                                <LowerTheta>0</LowerTheta>
504 >                                <UpperTheta>5</UpperTheta>
505 >                        </ThetaBounds>
506                          </AngleBasisBlock>
507 +                        <AngleBasisBlock>
508 +                        <Theta>10</Theta>
509 +                        <nPhis>8</nPhis>
510 +                        <ThetaBounds>
511 +                                <LowerTheta>5</LowerTheta>
512 +                                <UpperTheta>15</UpperTheta>
513 +                        </ThetaBounds>
514 +                        </AngleBasisBlock>
515 +                        <AngleBasisBlock>
516 +                        <Theta>20</Theta>
517 +                        <nPhis>16</nPhis>
518 +                        <ThetaBounds>
519 +                                <LowerTheta>15</LowerTheta>
520 +                                <UpperTheta>25</UpperTheta>
521 +                        </ThetaBounds>
522 +                        </AngleBasisBlock>
523 +                        <AngleBasisBlock>
524 +                        <Theta>30</Theta>
525 +                        <nPhis>20</nPhis>
526 +                        <ThetaBounds>
527 +                                <LowerTheta>25</LowerTheta>
528 +                                <UpperTheta>35</UpperTheta>
529 +                        </ThetaBounds>
530 +                        </AngleBasisBlock>
531 +                        <AngleBasisBlock>
532 +                        <Theta>40</Theta>
533 +                        <nPhis>24</nPhis>
534 +                        <ThetaBounds>
535 +                                <LowerTheta>35</LowerTheta>
536 +                                <UpperTheta>45</UpperTheta>
537 +                        </ThetaBounds>
538 +                        </AngleBasisBlock>
539 +                        <AngleBasisBlock>
540 +                        <Theta>50</Theta>
541 +                        <nPhis>24</nPhis>
542 +                        <ThetaBounds>
543 +                                <LowerTheta>45</LowerTheta>
544 +                                <UpperTheta>55</UpperTheta>
545 +                        </ThetaBounds>
546 +                        </AngleBasisBlock>
547 +                        <AngleBasisBlock>
548 +                        <Theta>60</Theta>
549 +                        <nPhis>24</nPhis>
550 +                        <ThetaBounds>
551 +                                <LowerTheta>55</LowerTheta>
552 +                                <UpperTheta>65</UpperTheta>
553 +                        </ThetaBounds>
554 +                        </AngleBasisBlock>
555 +                        <AngleBasisBlock>
556 +                        <Theta>70</Theta>
557 +                        <nPhis>16</nPhis>
558 +                        <ThetaBounds>
559 +                                <LowerTheta>65</LowerTheta>
560 +                                <UpperTheta>75</UpperTheta>
561 +                        </ThetaBounds>
562 +                        </AngleBasisBlock>
563 +                        <AngleBasisBlock>
564 +                        <Theta>82.5</Theta>
565 +                        <nPhis>12</nPhis>
566 +                        <ThetaBounds>
567 +                                <LowerTheta>75</LowerTheta>
568 +                                <UpperTheta>90</UpperTheta>
569 +                        </ThetaBounds>
570 +                        </AngleBasisBlock>
571                  </AngleBasis>
572          </DataDefinition>
573   ';
# Line 530 | Line 588 | print
588   # Output front transmission (transposed order)
589   for (my $od = 0; $od < $ndiv; $od++) {
590          for (my $id = 0; $id < $ndiv; $id++) {
591 <                print $tfarr[$ndiv*$id + $od];
591 >                print $tfarr[$ndiv*$id + $od], ",\n";
592          }
593          print "\n";
594   }
# Line 553 | Line 611 | print
611   # Output front reflection (transposed order)
612   for (my $od = 0; $od < $ndiv; $od++) {
613          for (my $id = 0; $id < $ndiv; $id++) {
614 <                print $rfarr[$ndiv*$id + $od];
614 >                print $rfarr[$ndiv*$id + $od], ",\n";
615          }
616          print "\n";
617   }
# Line 580 | Line 638 | print
638   # Output back transmission (transposed order)
639   for (my $od = 0; $od < $ndiv; $od++) {
640          for (my $id = 0; $id < $ndiv; $id++) {
641 <                print $tbarr[$ndiv*$id + $od];
641 >                print $tbarr[$ndiv*$id + $od], ",\n";
642          }
643          print "\n";
644   }
# Line 603 | Line 661 | print
661   # Output back reflection (transposed order)
662   for (my $od = 0; $od < $ndiv; $od++) {
663          for (my $id = 0; $id < $ndiv; $id++) {
664 <                print $rbarr[$ndiv*$id + $od];
664 >                print $rbarr[$ndiv*$id + $od], ",\n";
665          }
666          print "\n";
667   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines