| 6 |  | #       G. Ward | 
| 7 |  | # | 
| 8 |  | use strict; | 
| 9 | + | my $windoz = ($^O eq "MSWin32" or $^O eq "MSWin64"); | 
| 10 |  | use File::Temp qw/ :mktemp  /; | 
| 11 |  | sub userror { | 
| 12 |  | 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"; | 
| 13 |  | exit 1; | 
| 14 |  | } | 
| 15 | < | my $td = mkdtemp("/tmp/genBSDF.XXXXXX"); | 
| 16 | < | chomp $td; | 
| 15 | > | my ($td,$radscn,$mgfscn,$octree,$cnttmp,$rmtmp); | 
| 16 | > | if ($windoz) { | 
| 17 | > | my $tmploc = `echo \%TMP\%`; | 
| 18 | > | chomp($tmploc); | 
| 19 | > | $td = mkdtemp("$tmploc\\genBSDF.XXXXXX"); | 
| 20 | > | $radscn = "$td\\device.rad"; | 
| 21 | > | $mgfscn = "$td\\device.mgf"; | 
| 22 | > | $octree = "$td\\device.oct"; | 
| 23 | > | chomp $td; | 
| 24 | > | $rmtmp = "rmdir /S /Q $td"; | 
| 25 | > | } else{ | 
| 26 | > | $td = mkdtemp("/tmp/genBSDF.XXXXXX"); | 
| 27 | > | chomp $td; | 
| 28 | > | $radscn = "$td/device.rad"; | 
| 29 | > | $mgfscn = "$td/device.mgf"; | 
| 30 | > | $octree = "$td/device.oct"; | 
| 31 | > | $rmtmp = "rm -rf $td"; | 
| 32 | > | } | 
| 33 |  | my @savedARGV = @ARGV; | 
| 34 |  | my $tensortree = 0; | 
| 35 |  | my $ttlog2 = 4; | 
| 88 |  | } | 
| 89 |  | # Check that we're actually being asked to do something | 
| 90 |  | die "Must have at least one of +forward or +backward\n" if (!$doforw && !$doback); | 
| 91 | + | # Issue warning for unhandled reciprocity case | 
| 92 | + | print STDERR "Warning: recommend both +forward and +backward with -t3" if | 
| 93 | + | ($tensortree==3 && !($doforw && $doback)); | 
| 94 |  | # Get scene description and dimensions | 
| 95 | < | my $radscn = "$td/device.rad"; | 
| 76 | < | my $mgfscn = "$td/device.mgf"; | 
| 77 | < | my $octree = "$td/device.oct"; | 
| 95 | > |  | 
| 96 |  | if ( $mgfin ) { | 
| 97 | < | system "mgfilt '#,o,xf,c,cxy,cspec,cmix,m,sides,rd,td,rs,ts,ir,v,p,n,f,fh,sph,cyl,cone,prism,ring,torus' @ARGV > $mgfscn"; | 
| 97 | > | system qq{mgfilt "#,o,xf,c,cxy,cspec,cmix,m,sides,rd,td,rs,ts,ir,v,p,n,f,fh,sph,cyl,cone,prism,ring,torus" @ARGV > $mgfscn}; | 
| 98 |  | die "Could not load MGF input\n" if ( $? ); | 
| 99 |  | system "mgf2rad $mgfscn > $radscn"; | 
| 100 |  | } else { | 
| 133 |  | <Name>Name</Name> | 
| 134 |  | <Manufacturer>Manufacturer</Manufacturer> | 
| 135 |  | '; | 
| 136 | < | printf "\t\t<Thickness unit=\"$gunit\">%.3f</Thickness>\n", $dim[5] - $dim[4]; | 
| 137 | < | printf "\t\t<Width unit=\"$gunit\">%.3f</Width>\n", $dim[1] - $dim[0]; | 
| 138 | < | printf "\t\t<Height unit=\"$gunit\">%.3f</Height>\n", $dim[3] - $dim[2]; | 
| 136 | > | printf qq{\t\t<Thickness unit="$gunit">%.6f</Thickness>\n}, $dim[5] - $dim[4]; | 
| 137 | > | printf qq{\t\t<Width unit="$gunit">%.6f</Width>\n}, $dim[1] - $dim[0]; | 
| 138 | > | printf qq{\t\t<Height unit="$gunit">%.6f</Height>\n}, $dim[3] - $dim[2]; | 
| 139 |  | print "\t\t<DeviceType>Other</DeviceType>\n"; | 
| 140 | < | print " </Material>\n"; | 
| 140 | > | print "\t</Material>\n"; | 
| 141 |  | # Output MGF description if requested | 
| 142 |  | if ( $geout ) { | 
| 143 | < | print "\t<Geometry format=\"MGF\">\n"; | 
| 144 | < | print "<MGFblock unit=\"$gunit\">\n"; | 
| 143 | > | print qq{\t\t<Geometry format="MGF">\n}; | 
| 144 | > | print qq{\t\t<MGFblock unit="$gunit">\n}; | 
| 145 |  | printf "xf -t %.6f %.6f 0\n", -($dim[0]+$dim[1])/2, -($dim[2]+$dim[3])/2; | 
| 146 |  | open(MGFSCN, "< $mgfscn"); | 
| 147 |  | while (<MGFSCN>) { print $_; } | 
| 148 |  | close MGFSCN; | 
| 149 |  | print "xf\n"; | 
| 150 | < | print "\t\t</MGFblock>\n"; | 
| 150 | > | print "</MGFblock>\n"; | 
| 151 |  | print "\t</Geometry>\n"; | 
| 152 |  | } | 
| 153 |  | # Set up surface sampling | 
| 154 | < | my $nx = int(sqrt($nsamp*($dim[1]-$dim[0])/($dim[3]-$dim[2])) + .5); | 
| 155 | < | my $ny = int($nsamp/$nx + .5); | 
| 154 | > | my $nx = int(sqrt($nsamp*($dim[1]-$dim[0])/($dim[3]-$dim[2])) + 1); | 
| 155 | > | my $ny = int($nsamp/$nx + 1); | 
| 156 |  | $nsamp = $nx * $ny; | 
| 157 |  | my $ns = 2**$ttlog2; | 
| 158 |  | my (@pdiv, $disk2sq, $sq2disk, $tcal, $kcal); | 
| 169 |  | </WindowElement> | 
| 170 |  | '; | 
| 171 |  | # Clean up temporary files and exit | 
| 172 | < | exec("rm -rf $td"); | 
| 172 | > | system $rmtmp; | 
| 173 |  |  | 
| 174 |  | #-------------- End of main program segment --------------# | 
| 175 |  |  | 
| 176 |  | #++++++++++++++ Tensor tree BSDF generation ++++++++++++++# | 
| 177 |  | sub do_tree_bsdf { | 
| 178 |  | # Shirley-Chiu mapping from unit square to disk | 
| 179 | < | $sq2disk = ' | 
| 180 | < | in_square_a = 2*in_square_x - 1; | 
| 181 | < | in_square_b = 2*in_square_y - 1; | 
| 182 | < | in_square_rgn = if(in_square_a + in_square_b, | 
| 183 | < | if(in_square_a - in_square_b, 1, 2), | 
| 184 | < | if(in_square_b - in_square_a, 3, 4)); | 
| 185 | < | out_disk_r = .999995*select(in_square_rgn, in_square_a, in_square_b, | 
| 186 | < | -in_square_a, -in_square_b); | 
| 187 | < | out_disk_phi = PI/4 * select(in_square_rgn, | 
| 188 | < | in_square_b/in_square_a, | 
| 189 | < | 2 - in_square_a/in_square_b, | 
| 190 | < | 4 + in_square_b/in_square_a, | 
| 191 | < | if(in_square_b*in_square_b, | 
| 192 | < | 6 - in_square_a/in_square_b, 0)); | 
| 193 | < | Dx = out_disk_r*cos(out_disk_phi); | 
| 194 | < | Dy = out_disk_r*sin(out_disk_phi); | 
| 177 | < | Dz = sqrt(1 - out_disk_r*out_disk_r); | 
| 178 | < | '; | 
| 179 | > | $sq2disk = 'in_square_a = 2*in_square_x - 1; ' . | 
| 180 | > | 'in_square_b = 2*in_square_y - 1; ' . | 
| 181 | > | 'in_square_rgn = if(in_square_a + in_square_b, ' . | 
| 182 | > | 'if(in_square_a - in_square_b, 1, 2), ' . | 
| 183 | > | 'if(in_square_b - in_square_a, 3, 4)); ' . | 
| 184 | > | 'out_disk_r = .999995*select(in_square_rgn, in_square_a, in_square_b, ' . | 
| 185 | > | '-in_square_a, -in_square_b); ' . | 
| 186 | > | 'out_disk_phi = PI/4 * select(in_square_rgn, ' . | 
| 187 | > | 'in_square_b/in_square_a, ' . | 
| 188 | > | '2 - in_square_a/in_square_b, ' . | 
| 189 | > | '4 + in_square_b/in_square_a, ' . | 
| 190 | > | 'if(in_square_b*in_square_b, ' . | 
| 191 | > | '6 - in_square_a/in_square_b, 0)); ' . | 
| 192 | > | 'Dx = out_disk_r*cos(out_disk_phi); ' . | 
| 193 | > | 'Dy = out_disk_r*sin(out_disk_phi); ' . | 
| 194 | > | 'Dz = sqrt(1 - out_disk_r*out_disk_r);' ; | 
| 195 |  | # Shirley-Chiu mapping from unit disk to square | 
| 196 | < | $disk2sq = ' | 
| 197 | < | norm_radians(p) : if(-p - PI/4, p + 2*PI, p); | 
| 198 | < | in_disk_r = .999995*sqrt(Dx*Dx + Dy*Dy); | 
| 199 | < | in_disk_phi = norm_radians(atan2(Dy, Dx)); | 
| 200 | < | in_disk_rgn = floor((in_disk_phi + PI/4)/(PI/2)) + 1; | 
| 201 | < | out_square_a = select(in_disk_rgn, | 
| 202 | < | in_disk_r, | 
| 203 | < | (PI/2 - in_disk_phi)*in_disk_r/(PI/4), | 
| 204 | < | -in_disk_r, | 
| 205 | < | (in_disk_phi - 3*PI/2)*in_disk_r/(PI/4)); | 
| 206 | < | out_square_b = select(in_disk_rgn, | 
| 207 | < | in_disk_phi*in_disk_r/(PI/4), | 
| 208 | < | in_disk_r, | 
| 209 | < | (PI - in_disk_phi)*in_disk_r/(PI/4), | 
| 210 | < | -in_disk_r); | 
| 211 | < | out_square_x = (out_square_a + 1)/2; | 
| 196 | < | out_square_y = (out_square_b + 1)/2; | 
| 197 | < | '; | 
| 196 | > | $disk2sq = 'norm_radians(p) : if(-p - PI/4, p + 2*PI, p); ' . | 
| 197 | > | 'in_disk_r = .999995*sqrt(Dx*Dx + Dy*Dy); ' . | 
| 198 | > | 'in_disk_phi = norm_radians(atan2(Dy, Dx)); ' . | 
| 199 | > | 'in_disk_rgn = floor((.999995*in_disk_phi + PI/4)/(PI/2)) + 1; ' . | 
| 200 | > | 'out_square_a = select(in_disk_rgn, ' . | 
| 201 | > | 'in_disk_r, ' . | 
| 202 | > | '(PI/2 - in_disk_phi)*in_disk_r/(PI/4), ' . | 
| 203 | > | '-in_disk_r, ' . | 
| 204 | > | '(in_disk_phi - 3*PI/2)*in_disk_r/(PI/4)); ' . | 
| 205 | > | 'out_square_b = select(in_disk_rgn, ' . | 
| 206 | > | 'in_disk_phi*in_disk_r/(PI/4), ' . | 
| 207 | > | 'in_disk_r, ' . | 
| 208 | > | '(PI - in_disk_phi)*in_disk_r/(PI/4), ' . | 
| 209 | > | '-in_disk_r); ' . | 
| 210 | > | 'out_square_x = (out_square_a + 1)/2; ' . | 
| 211 | > | 'out_square_y = (out_square_b + 1)/2;'; | 
| 212 |  | # Announce ourselves in XML output | 
| 213 |  | print "\t<DataDefinition>\n"; | 
| 214 |  | print "\t\t<IncidentDataStructure>TensorTree$tensortree</IncidentDataStructure>\n"; | 
| 223 |  | # Run rcontrib process to generate tensor tree samples | 
| 224 |  | sub do_tree_rtcontrib { | 
| 225 |  | my $forw = shift; | 
| 226 | + | my $cmd; | 
| 227 |  | my $matargs = "-m $bmodnm"; | 
| 228 |  | if ( !$forw || !$doback || $tensortree==3 ) { $matargs .= " -m $fmodnm"; } | 
| 229 | < | my $cmd = "rcontrib $rtargs -h -ff -fo -n $nproc -c $nsamp " . | 
| 230 | < | "-e '$disk2sq' -bn '$ns*$ns' " . | 
| 231 | < | "-b '$ns*floor(out_square_x*$ns)+floor(out_square_y*$ns)' " . | 
| 232 | < | "-o $td/%s.flt $matargs $octree"; | 
| 229 | > | if ($windoz) { | 
| 230 | > | $cmd = "rcontrib $rtargs -h -faa -fo -n $nproc -c $nsamp " . | 
| 231 | > | qq{-e "$disk2sq" -bn "$ns*$ns" } . | 
| 232 | > | qq{-b "$ns*floor(out_square_x*$ns)+floor(out_square_y*$ns)" } . | 
| 233 | > | "-o $td/%s.flt $matargs $octree"; | 
| 234 | > | } else { | 
| 235 | > | $cmd = "rcontrib $rtargs -h -fff -fo -n $nproc -c $nsamp " . | 
| 236 | > | qq{-e "$disk2sq" -bn "$ns*$ns" } . | 
| 237 | > | qq{-b "$ns*floor(out_square_x*$ns)+floor(out_square_y*$ns)" } . | 
| 238 | > | "-o $td/%s.flt $matargs $octree"; | 
| 239 | > | } | 
| 240 |  | if ( $tensortree == 3 ) { | 
| 241 |  | # Isotropic BSDF | 
| 242 |  | my $ns2 = $ns / 2; | 
| 243 | < | $cmd = "cnt $ns2 $ny $nx " . | 
| 244 | < | "| rcalc -e 'r1=rand(.8681*recno-.673892)' " . | 
| 245 | < | "-e 'r2=rand(-5.37138*recno+67.1737811)' " . | 
| 246 | < | "-e 'r3=rand(+3.17603772*recno+83.766771)' " . | 
| 247 | < | "-e 'Dx=1-2*(\$1+r1)/$ns;Dy:0;Dz=sqrt(1-Dx*Dx)' " . | 
| 248 | < | "-e 'xp=(\$3+r2)*(($dim[1]-$dim[0])/$nx)+$dim[0]' " . | 
| 249 | < | "-e 'yp=(\$2+r3)*(($dim[3]-$dim[2])/$ny)+$dim[2]' " . | 
| 250 | < | "-e 'zp=$dim[5-$forw]' -e 'myDz=Dz*($forw*2-1)' " . | 
| 251 | < | "-e '\$1=xp-Dx;\$2=yp-Dy;\$3=zp-myDz' " . | 
| 252 | < | "-e '\$4=Dx;\$5=Dy;\$6=myDz' -of " . | 
| 253 | < | "| $cmd"; | 
| 243 | > | if ($windoz) { | 
| 244 | > | $cmd = "cnt $ns2 $ny $nx " . | 
| 245 | > | qq{| rcalc -e "r1=rand(.8681*recno-.673892)" } . | 
| 246 | > | qq{-e "r2=rand(-5.37138*recno+67.1737811)" } . | 
| 247 | > | qq{-e "r3=rand(+3.17603772*recno+83.766771)" } . | 
| 248 | > | qq{-e "Dx=1-2*(\$1+r1)/$ns;Dy:0;Dz=sqrt(1-Dx*Dx)" } . | 
| 249 | > | qq{-e "xp=(\$3+r2)*(($dim[1]-$dim[0])/$nx)+$dim[0]" } . | 
| 250 | > | qq{-e "yp=(\$2+r3)*(($dim[3]-$dim[2])/$ny)+$dim[2]" } . | 
| 251 | > | qq{-e "zp=$dim[5-$forw]" -e "myDz=Dz*($forw*2-1)" } . | 
| 252 | > | qq{-e "\$1=xp-Dx;\$2=yp-Dy;\$3=zp-myDz" } . | 
| 253 | > | qq{-e "\$4=Dx;\$5=Dy;\$6=myDz" } . | 
| 254 | > | "| $cmd"; | 
| 255 | > | } else { | 
| 256 | > | $cmd = "cnt $ns2 $ny $nx " . | 
| 257 | > | qq{| rcalc -e "r1=rand(.8681*recno-.673892)" } . | 
| 258 | > | qq{-e "r2=rand(-5.37138*recno+67.1737811)" } . | 
| 259 | > | qq{-e "r3=rand(+3.17603772*recno+83.766771)" } . | 
| 260 | > | qq{-e "Dx=1-2*(\$1+r1)/$ns;Dy:0;Dz=sqrt(1-Dx*Dx)" } . | 
| 261 | > | qq{-e "xp=(\$3+r2)*(($dim[1]-$dim[0])/$nx)+$dim[0]" } . | 
| 262 | > | qq{-e "yp=(\$2+r3)*(($dim[3]-$dim[2])/$ny)+$dim[2]" } . | 
| 263 | > | qq{-e "zp=$dim[5-$forw]" -e "myDz=Dz*($forw*2-1)" } . | 
| 264 | > | qq{-e '\$1=xp-Dx;\$2=yp-Dy;\$3=zp-myDz' } . | 
| 265 | > | qq{-e '\$4=Dx;\$5=Dy;\$6=myDz' -of } . | 
| 266 | > | "| $cmd"; | 
| 267 | > | } | 
| 268 |  | } else { | 
| 269 |  | # Anisotropic BSDF | 
| 270 |  | # Sample area vertically to improve load balance, since | 
| 271 |  | # shading systems usually have bilateral symmetry (L-R) | 
| 272 | < | $cmd = "cnt $ns $ns $ny $nx " . | 
| 273 | < | "| rcalc -e 'r1=rand(.8681*recno-.673892)' " . | 
| 274 | < | "-e 'r2=rand(-5.37138*recno+67.1737811)' " . | 
| 275 | < | "-e 'r3=rand(3.17603772*recno+83.766771)' " . | 
| 276 | < | "-e 'r4=rand(-2.3857833*recno-964.72738)' " . | 
| 277 | < | "-e 'in_square_x=(\$1+r1)/$ns' " . | 
| 278 | < | "-e 'in_square_y=(\$2+r2)/$ns' -e '$sq2disk' " . | 
| 279 | < | "-e 'xp=(\$4+r3)*(($dim[1]-$dim[0])/$nx)+$dim[0]' " . | 
| 280 | < | "-e 'yp=(\$3+r4)*(($dim[3]-$dim[2])/$ny)+$dim[2]' " . | 
| 281 | < | "-e 'zp=$dim[5-$forw]' -e 'myDz=Dz*($forw*2-1)' " . | 
| 282 | < | "-e '\$1=xp-Dx;\$2=yp-Dy;\$3=zp-myDz' " . | 
| 283 | < | "-e '\$4=Dx;\$5=Dy;\$6=myDz' -of " . | 
| 284 | < | "| $cmd"; | 
| 272 | > | if ($windoz) { | 
| 273 | > | $cmd = "cnt $ns $ns $ny $nx " . | 
| 274 | > | qq{| rcalc -e "r1=rand(.8681*recno-.673892)" } . | 
| 275 | > | qq{-e "r2=rand(-5.37138*recno+67.1737811)" } . | 
| 276 | > | qq{-e "r3=rand(3.17603772*recno+83.766771)" } . | 
| 277 | > | qq{-e "r4=rand(-2.3857833*recno-964.72738)" } . | 
| 278 | > | qq{-e "in_square_x=(\$1+r1)/$ns" } . | 
| 279 | > | qq{-e "in_square_y=(\$2+r2)/$ns" -e "$sq2disk" } . | 
| 280 | > | qq{-e "xp=(\$4+r3)*(($dim[1]-$dim[0])/$nx)+$dim[0]" } . | 
| 281 | > | qq{-e "yp=(\$3+r4)*(($dim[3]-$dim[2])/$ny)+$dim[2]" } . | 
| 282 | > | qq{-e "zp=$dim[5-$forw]" -e "myDz=Dz*($forw*2-1)" } . | 
| 283 | > | qq{-e "\$1=xp-Dx;\$2=yp-Dy;\$3=zp-myDz" } . | 
| 284 | > | qq{-e "\$4=Dx;\$5=Dy;\$6=myDz" } . | 
| 285 | > | "| $cmd"; | 
| 286 | > | } else { | 
| 287 | > | $cmd = "cnt $ns $ns $ny $nx " . | 
| 288 | > | qq{| rcalc -e "r1=rand(.8681*recno-.673892)" } . | 
| 289 | > | qq{-e "r2=rand(-5.37138*recno+67.1737811)" } . | 
| 290 | > | qq{-e "r3=rand(3.17603772*recno+83.766771)" } . | 
| 291 | > | qq{-e "r4=rand(-2.3857833*recno-964.72738)" } . | 
| 292 | > | qq{-e "in_square_x=(\$1+r1)/$ns" } . | 
| 293 | > | qq{-e "in_square_y=(\$2+r2)/$ns" -e "$sq2disk" } . | 
| 294 | > | qq{-e "xp=(\$4+r3)*(($dim[1]-$dim[0])/$nx)+$dim[0]" } . | 
| 295 | > | qq{-e "yp=(\$3+r4)*(($dim[3]-$dim[2])/$ny)+$dim[2]" } . | 
| 296 | > | qq{-e "zp=$dim[5-$forw]" -e "myDz=Dz*($forw*2-1)" } . | 
| 297 | > | qq{-e '\$1=xp-Dx;\$2=yp-Dy;\$3=zp-myDz' } . | 
| 298 | > | qq{-e '\$4=Dx;\$5=Dy;\$6=myDz' -of } . | 
| 299 | > | "| $cmd"; | 
| 300 | > | } | 
| 301 |  | } | 
| 302 |  | # print STDERR "Starting: $cmd\n"; | 
| 303 |  | system "$cmd" || die "Failure running rcontrib"; | 
| 317 |  | <Wavelength unit="Integral">Visible</Wavelength> | 
| 318 |  | <SourceSpectrum>CIE Illuminant D65 1nm.ssp</SourceSpectrum> | 
| 319 |  | <DetectorSpectrum>ASTM E308 1931 Y.dsp</DetectorSpectrum> | 
| 320 | < | <WavelengthDataBlock> | 
| 269 | < | '; | 
| 320 | > | <WavelengthDataBlock>' ; | 
| 321 |  | print "\t\t\t<WavelengthDataDirection>Transmission $side</WavelengthDataDirection>\n"; | 
| 322 |  | print | 
| 323 |  | '                       <AngleBasis>LBNL/Shirley-Chiu</AngleBasis> | 
| 324 |  | <ScatteringDataType>BTDF</ScatteringDataType> | 
| 325 |  | <ScatteringData> | 
| 326 |  | '; | 
| 327 | < | $cmd = "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " . | 
| 328 | < | q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' }; | 
| 327 | > | if ($windoz) { | 
| 328 | > | $cmd = qq{rcalc -e "Omega:PI/($ns*$ns)" } . | 
| 329 | > | q{-e "$1=(0.265*$1+0.670*$2+0.065*$3)/Omega" }; | 
| 330 | > | } else { | 
| 331 | > | $cmd = "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " . | 
| 332 | > | q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' }; | 
| 333 | > | } | 
| 334 |  | if ($pctcull >= 0) { | 
| 335 | < | $cmd .= "-of $td/" . ($bmodnm,$fmodnm)[$forw] . ".flt " . | 
| 336 | < | "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2"; | 
| 335 | > | if ($windoz) { | 
| 336 | > | $cmd = "rcollate -h -oc 1 $td/" . ($bmodnm,$fmodnm)[$forw] . ".flt | " . | 
| 337 | > | $cmd . | 
| 338 | > | "| rttree_reduce -h -fa  -t $pctcull -r $tensortree -g $ttlog2"; | 
| 339 | > | } else { | 
| 340 | > | $cmd .= "-of $td/" . ($bmodnm,$fmodnm)[$forw] . ".flt " . | 
| 341 | > | " | rttree_reduce -h -ff -t $pctcull -r $tensortree -g $ttlog2"; | 
| 342 | > | } | 
| 343 |  | system "$cmd" || die "Failure running rttree_reduce"; | 
| 344 |  | } else { | 
| 345 | < | $cmd .= "$td/" . ($bmodnm,$fmodnm)[$forw] . ".flt"; | 
| 345 | > | if ($windoz) { | 
| 346 | > | $cmd = "rcollate -h -oc 1 $td/" . ($bmodnm,$fmodnm)[$forw] . ".flt | " . | 
| 347 | > | $cmd ; | 
| 348 | > | } else { | 
| 349 | > | $cmd .= "$td/" . ($bmodnm,$fmodnm)[$forw] . ".flt"; | 
| 350 | > | } | 
| 351 |  | print "{\n"; | 
| 352 |  | system "$cmd" || die "Failure running rcalc"; | 
| 353 |  | for (my $i = ($tensortree==3)*$ns*$ns*$ns/2; $i-- > 0; ) { | 
| 376 |  | <ScatteringDataType>BTDF</ScatteringDataType> | 
| 377 |  | <ScatteringData> | 
| 378 |  | '; | 
| 379 | < | $cmd = "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " . | 
| 380 | < | q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' }; | 
| 379 | > | if ($windoz) { | 
| 380 | > | $cmd = qq{rcalc -e "Omega:PI/($ns*$ns)" } . | 
| 381 | > | q{-e "$1=(0.265*$1+0.670*$2+0.065*$3)/Omega" }; | 
| 382 | > | }else { | 
| 383 | > | $cmd = "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " . | 
| 384 | > | q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' }; | 
| 385 | > | } | 
| 386 |  | if ($pctcull >= 0) { | 
| 387 | < | $cmd .= "-of $td/" . ($fmodnm,$bmodnm)[$forw] . ".flt " . | 
| 388 | < | "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2"; | 
| 387 | > | if ($windoz) { | 
| 388 | > | $cmd = "rcollate -h -oc 1 $td/" . ($fmodnm,$bmodnm)[$forw] . ".flt |" . | 
| 389 | > | $cmd . | 
| 390 | > | " | rttree_reduce -a -h -fa -t $pctcull -r $tensortree -g $ttlog2"; | 
| 391 | > |  | 
| 392 | > | } else { | 
| 393 | > | $cmd .= "-of $td/" . ($fmodnm,$bmodnm)[$forw] . ".flt " . | 
| 394 | > | "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2"; | 
| 395 | > | } | 
| 396 |  | system "$cmd" || die "Failure running rttree_reduce"; | 
| 397 |  | } else { | 
| 398 | < | $cmd .= "$td/" . ($fmodnm,$bmodnm)[$forw] . ".flt"; | 
| 398 | > | if ($windoz) { | 
| 399 | > | $cmd = "rcollate -h -oc 1 $td/" . ($fmodnm,$bmodnm)[$forw] . ".flt |" . | 
| 400 | > | $cmd ; | 
| 401 | > | } else { | 
| 402 | > | $cmd .= "$td/" . ($fmodnm,$bmodnm)[$forw] . ".flt"; | 
| 403 | > | } | 
| 404 |  | print "{\n"; | 
| 405 |  | system "$cmd" || die "Failure running rcalc"; | 
| 406 |  | for (my $i = ($tensortree==3)*$ns*$ns*$ns/2; $i-- > 0; ) { | 
| 421 |  | sub do_matrix_bsdf { | 
| 422 |  | # Set up sampling of portal | 
| 423 |  | # Kbin to produce incident direction in full Klems basis with (x1,x2) randoms | 
| 424 | < | $tcal = ' | 
| 425 | < | DEGREE : PI/180; | 
| 426 | < | sq(x) : x*x; | 
| 427 | < | Kpola(r) : select(r+1, 0, 5, 15, 25, 35, 45, 55, 65, 75, 90); | 
| 428 | < | Knaz(r) : select(r, 1, 8, 16, 20, 24, 24, 24, 16, 12); | 
| 429 | < | Kaccum(r) : if(r-.5, Knaz(r) + Kaccum(r-1), 0); | 
| 430 | < | Kmax : Kaccum(Knaz(0)); | 
| 431 | < | Kfindrow(r, rem) : if(rem-Knaz(r)+.5, Kfindrow(r+1, rem-Knaz(r)), r); | 
| 432 | < | Krow = if(Kbin-(Kmax-.5), 0, Kfindrow(1, Kbin)); | 
| 433 | < | Kcol = Kbin - Kaccum(Krow-1); | 
| 434 | < | Kazi = 360*DEGREE * (Kcol + (.5 - x2)) / Knaz(Krow); | 
| 435 | < | Kpol = DEGREE * (x1*Kpola(Krow) + (1-x1)*Kpola(Krow-1)); | 
| 436 | < | sin_kpol = sin(Kpol); | 
| 437 | < | Dx = cos(Kazi)*sin_kpol; | 
| 438 | < | Dy = sin(Kazi)*sin_kpol; | 
| 439 | < | Dz = sqrt(1 - sin_kpol*sin_kpol); | 
| 440 | < | KprojOmega = PI * if(Kbin-.5, | 
| 441 | < | (sq(cos(Kpola(Krow-1)*DEGREE)) - sq(cos(Kpola(Krow)*DEGREE)))/Knaz(Krow), | 
| 358 | < | 1 - sq(cos(Kpola(1)*DEGREE))); | 
| 359 | < | '; | 
| 424 | > | $tcal = 'DEGREE : PI/180; ' . | 
| 425 | > | 'sq(x) : x*x; ' . | 
| 426 | > | 'Kpola(r) : select(r+1, 0, 5, 15, 25, 35, 45, 55, 65, 75, 90); ' . | 
| 427 | > | 'Knaz(r) : select(r, 1, 8, 16, 20, 24, 24, 24, 16, 12); ' . | 
| 428 | > | 'Kaccum(r) : if(r-.5, Knaz(r) + Kaccum(r-1), 0); ' . | 
| 429 | > | 'Kmax : Kaccum(Knaz(0)); ' . | 
| 430 | > | 'Kfindrow(r, rem) : if(rem-Knaz(r)+.5, Kfindrow(r+1, rem-Knaz(r)), r); ' . | 
| 431 | > | 'Krow = if(Kbin-(Kmax-.5), 0, Kfindrow(1, Kbin)); ' . | 
| 432 | > | 'Kcol = Kbin - Kaccum(Krow-1); ' . | 
| 433 | > | 'Kazi = 360*DEGREE * (Kcol + (.5 - x2)) / Knaz(Krow); ' . | 
| 434 | > | 'Kpol = DEGREE * (x1*Kpola(Krow) + (1-x1)*Kpola(Krow-1)); ' . | 
| 435 | > | 'sin_kpol = sin(Kpol); ' . | 
| 436 | > | 'Dx = cos(Kazi)*sin_kpol; ' . | 
| 437 | > | 'Dy = sin(Kazi)*sin_kpol; ' . | 
| 438 | > | 'Dz = sqrt(1 - sin_kpol*sin_kpol); ' . | 
| 439 | > | 'KprojOmega = PI * if(Kbin-.5, ' . | 
| 440 | > | '(sq(cos(Kpola(Krow-1)*DEGREE)) - sq(cos(Kpola(Krow)*DEGREE)))/Knaz(Krow), ' . | 
| 441 | > | '1 - sq(cos(Kpola(1)*DEGREE))); '; | 
| 442 |  | # Compute Klems bin from exiting ray direction (forward or backward) | 
| 443 | < | $kcal = ' | 
| 444 | < | DEGREE : PI/180; | 
| 445 | < | abs(x) : if(x, x, -x); | 
| 446 | < | Acos(x) : if(x-1, 0, if(-1-x, PI, acos(x))) / DEGREE; | 
| 447 | < | posangle(a) : if(-a, a + 2*PI, a); | 
| 448 | < | Atan2(y,x) : posangle(atan2(y,x)) / DEGREE; | 
| 449 | < | kpola(r) : select(r, 5, 15, 25, 35, 45, 55, 65, 75, 90); | 
| 450 | < | knaz(r) : select(r, 1, 8, 16, 20, 24, 24, 24, 16, 12); | 
| 451 | < | kaccum(r) : if(r-.5, knaz(r) + kaccum(r-1), 0); | 
| 452 | < | kfindrow(r, pol) : if(r-kpola(0)+.5, r, | 
| 453 | < | if(pol-kpola(r), kfindrow(r+1, pol), r) ); | 
| 454 | < | kazn(azi,inc) : if((360-.5*inc)-azi, floor((azi+.5*inc)/inc), 0); | 
| 455 | < | kbin2(pol,azi) = select(kfindrow(1, pol), | 
| 456 | < | kazn(azi,360/knaz(1)), | 
| 457 | < | kaccum(1) + kazn(azi,360/knaz(2)), | 
| 458 | < | kaccum(2) + kazn(azi,360/knaz(3)), | 
| 459 | < | kaccum(3) + kazn(azi,360/knaz(4)), | 
| 460 | < | kaccum(4) + kazn(azi,360/knaz(5)), | 
| 461 | < | kaccum(5) + kazn(azi,360/knaz(6)), | 
| 462 | < | kaccum(6) + kazn(azi,360/knaz(7)), | 
| 463 | < | kaccum(7) + kazn(azi,360/knaz(8)), | 
| 464 | < | kaccum(8) + kazn(azi,360/knaz(9)) | 
| 465 | < | ); | 
| 384 | < | kbin = kbin2(Acos(abs(Dz)),Atan2(Dy,Dx)); | 
| 385 | < | '; | 
| 443 | > | $kcal = 'DEGREE : PI/180; ' . | 
| 444 | > | 'abs(x) : if(x, x, -x); ' . | 
| 445 | > | 'Acos(x) : if(x-1, 0, if(-1-x, PI, acos(x)))/DEGREE; ' . | 
| 446 | > | 'posangle(a) : if(-a, a + 2*PI, a); ' . | 
| 447 | > | 'Atan2(y,x) : posangle(atan2(y,x))/DEGREE; ' . | 
| 448 | > | 'kpola(r) : select(r, 5, 15, 25, 35, 45, 55, 65, 75, 90); ' . | 
| 449 | > | 'knaz(r) : select(r, 1, 8, 16, 20, 24, 24, 24, 16, 12); ' . | 
| 450 | > | 'kaccum(r) : if(r-.5, knaz(r) + kaccum(r-1), 0); ' . | 
| 451 | > | 'kfindrow(r, pol) : if(r-kpola(0)+.5, r, ' . | 
| 452 | > | 'if(pol-kpola(r), kfindrow(r+1, pol), r) ); ' . | 
| 453 | > | 'kazn(azi,inc) : if((360-.5*inc)-azi, floor((azi+.5*inc)/inc), 0); ' . | 
| 454 | > | 'kbin2(pol,azi) = select(kfindrow(1, pol), ' . | 
| 455 | > | 'kazn(azi,360/knaz(1)), ' . | 
| 456 | > | 'kaccum(1) + kazn(azi,360/knaz(2)), ' . | 
| 457 | > | 'kaccum(2) + kazn(azi,360/knaz(3)), ' . | 
| 458 | > | 'kaccum(3) + kazn(azi,360/knaz(4)), ' . | 
| 459 | > | 'kaccum(4) + kazn(azi,360/knaz(5)), ' . | 
| 460 | > | 'kaccum(5) + kazn(azi,360/knaz(6)), ' . | 
| 461 | > | 'kaccum(6) + kazn(azi,360/knaz(7)), ' . | 
| 462 | > | 'kaccum(7) + kazn(azi,360/knaz(8)), ' . | 
| 463 | > | 'kaccum(8) + kazn(azi,360/knaz(9)) ' . | 
| 464 | > | '); ' . | 
| 465 | > | 'kbin = kbin2(Acos(abs(Dz)),Atan2(Dy,Dx));'; | 
| 466 |  | my $ndiv = 145; | 
| 467 |  | # Compute scattering data using rcontrib | 
| 468 |  | my @tfarr; | 
| 469 |  | my @rfarr; | 
| 470 |  | my @tbarr; | 
| 471 |  | my @rbarr; | 
| 472 | + | my (@data,@line); # for windows | 
| 473 |  | my $cmd; | 
| 474 | < | my $rtcmd = "rcontrib $rtargs -h -ff -fo -n $nproc -c $nsamp " . | 
| 475 | < | "-e '$kcal' -b kbin -bn $ndiv " . | 
| 476 | < | "-o '$td/%s.flt' -m $fmodnm -m $bmodnm $octree"; | 
| 477 | < | my $rccmd = "rcalc -e '$tcal' " . | 
| 478 | < | "-e 'mod(n,d):n-floor(n/d)*d' -e 'Kbin=mod(recno-.999,$ndiv)' " . | 
| 479 | < | q{-if3 -e '$1=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega' }; | 
| 474 | > | my $rtcmd; | 
| 475 | > | my $rccmd; | 
| 476 | > | if ($windoz) { | 
| 477 | > | $rtcmd = "rcontrib $rtargs -h -fo -n $nproc -c $nsamp " . | 
| 478 | > | qq{-e "$kcal" -b kbin -bn $ndiv } . | 
| 479 | > | qq{-o "$td\\%s.flt" -m $fmodnm -m $bmodnm $octree }; | 
| 480 | > | $rccmd = qq{rcalc -e "$tcal" } . | 
| 481 | > | qq{-e "mod(n,d):n-floor(n/d)*d" -e "Kbin=mod(recno-.999,$ndiv)" } . | 
| 482 | > | q{ -e "$1=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega" }; | 
| 483 | > | } else { | 
| 484 | > | $rtcmd = "rcontrib $rtargs -h -ff -fo -n $nproc -c $nsamp " . | 
| 485 | > | "-e '$kcal' -b kbin -bn $ndiv " . | 
| 486 | > | "-o '$td/%s.flt' -m $fmodnm -m $bmodnm $octree"; | 
| 487 | > | $rccmd = "rcalc -e '$tcal' " . | 
| 488 | > | "-e 'mod(n,d):n-floor(n/d)*d' -e 'Kbin=mod(recno-.999,$ndiv)' " . | 
| 489 | > | q{-if3 -e '$1=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega' }; | 
| 490 | > | } | 
| 491 |  | if ( $doforw ) { | 
| 492 | < | $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " . | 
| 493 | < | "-e 'xp=(\$3+rand(.12*recno+288))*(($dim[1]-$dim[0])/$nx)+$dim[0]' " . | 
| 494 | < | "-e 'yp=(\$2+rand(.37*recno-44))*(($dim[3]-$dim[2])/$ny)+$dim[2]' " . | 
| 495 | < | "-e 'zp:$dim[4]' " . | 
| 496 | < | q{-e 'Kbin=$1;x1=rand(2.75*recno+3.1);x2=rand(-2.01*recno-3.37)' } . | 
| 497 | < | q{-e '$1=xp-Dx;$2=yp-Dy;$3=zp-Dz;$4=Dx;$5=Dy;$6=Dz' } . | 
| 498 | < | "| $rtcmd"; | 
| 492 | > | if ($windoz) { | 
| 493 | > | $cmd = qq{cnt $ndiv $ny $nx | rcalc -e "$tcal" } . | 
| 494 | > | qq{-e "xp=(\$3+rand(.12*recno+288))*(($dim[1]-$dim[0])/$nx)+$dim[0]" } . | 
| 495 | > | qq{-e "yp=(\$2+rand(.37*recno-44))*(($dim[3]-$dim[2])/$ny)+$dim[2]" } . | 
| 496 | > | qq{-e "zp:$dim[4]" } . | 
| 497 | > | q{-e "Kbin=$1;x1=rand(2.75*recno+3.1);x2=rand(-2.01*recno-3.37)" } . | 
| 498 | > | q{-e "$1=xp-Dx;$2=yp-Dy;$3=zp-Dz;$4=Dx;$5=Dy;$6=Dz" } . | 
| 499 | > | "| $rtcmd "; | 
| 500 | > | } else { | 
| 501 | > | $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " . | 
| 502 | > | "-e 'xp=(\$3+rand(.12*recno+288))*(($dim[1]-$dim[0])/$nx)+$dim[0]' " . | 
| 503 | > | "-e 'yp=(\$2+rand(.37*recno-44))*(($dim[3]-$dim[2])/$ny)+$dim[2]' " . | 
| 504 | > | "-e 'zp:$dim[4]' " . | 
| 505 | > | q{-e 'Kbin=$1;x1=rand(2.75*recno+3.1);x2=rand(-2.01*recno-3.37)' } . | 
| 506 | > | q{-e '$1=xp-Dx;$2=yp-Dy;$3=zp-Dz;$4=Dx;$5=Dy;$6=Dz' } . | 
| 507 | > | "| $rtcmd"; | 
| 508 | > | } | 
| 509 |  | system "$cmd" || die "Failure running: $cmd\n"; | 
| 510 | < | @tfarr = `$rccmd $td/$fmodnm.flt`; | 
| 510 | > | if ($windoz) { | 
| 511 | > | @tfarr = `rcollate -h -oc 1 $td\\$fmodnm.flt | $rccmd`; | 
| 512 | > | } else { | 
| 513 | > | @tfarr = `$rccmd $td/$fmodnm.flt`; | 
| 514 | > | } | 
| 515 |  | die "Failure running: $rccmd $td/$fmodnm.flt\n" if ( $? ); | 
| 516 | < | chomp(@tfarr); | 
| 517 | < | @rfarr = `$rccmd $td/$bmodnm.flt`; | 
| 516 | > | if ($windoz) { | 
| 517 | > | @rfarr = `rcollate -h -oc 1 $td\\$bmodnm.flt | $rccmd`; | 
| 518 | > | } else { | 
| 519 | > | @rfarr = `$rccmd $td/$bmodnm.flt`; | 
| 520 | > | } | 
| 521 |  | die "Failure running: $rccmd $td/$bmodnm.flt\n" if ( $? ); | 
| 413 | – | chomp(@rfarr); | 
| 522 |  | } | 
| 523 |  | if ( $doback ) { | 
| 524 | < | $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " . | 
| 525 | < | "-e 'xp=(\$3+rand(.35*recno-15))*(($dim[1]-$dim[0])/$nx)+$dim[0]' " . | 
| 526 | < | "-e 'yp=(\$2+rand(.86*recno+11))*(($dim[3]-$dim[2])/$ny)+$dim[2]' " . | 
| 527 | < | "-e 'zp:$dim[5]' " . | 
| 528 | < | q{-e 'Kbin=$1;x1=rand(1.21*recno+2.75);x2=rand(-3.55*recno-7.57)' } . | 
| 529 | < | q{-e '$1=xp-Dx;$2=yp-Dy;$3=zp+Dz;$4=Dx;$5=Dy;$6=-Dz' } . | 
| 530 | < | "| $rtcmd"; | 
| 524 | > | if ($windoz) { | 
| 525 | > | $cmd = qq{cnt $ndiv $ny $nx | rcalc -e "$tcal" } . | 
| 526 | > | qq{-e "xp=(\$3+rand(.35*recno-15))*(($dim[1]-$dim[0])/$nx)+$dim[0]" } . | 
| 527 | > | qq{-e "yp=(\$2+rand(.86*recno+11))*(($dim[3]-$dim[2])/$ny)+$dim[2]" } . | 
| 528 | > | qq{-e "zp:$dim[5]" } . | 
| 529 | > | q{-e "Kbin=$1;x1=rand(1.21*recno+2.75);x2=rand(-3.55*recno-7.57)" } . | 
| 530 | > | q{-e "$1=xp-Dx;$2=yp-Dy;$3=zp+Dz;$4=Dx;$5=Dy;$6=-Dz" } . | 
| 531 | > | "| $rtcmd"; | 
| 532 | > | } else { | 
| 533 | > | $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " . | 
| 534 | > | "-e 'xp=(\$3+rand(.35*recno-15))*(($dim[1]-$dim[0])/$nx)+$dim[0]' " . | 
| 535 | > | "-e 'yp=(\$2+rand(.86*recno+11))*(($dim[3]-$dim[2])/$ny)+$dim[2]' " . | 
| 536 | > | "-e 'zp:$dim[5]' " . | 
| 537 | > | q{-e 'Kbin=$1;x1=rand(1.21*recno+2.75);x2=rand(-3.55*recno-7.57)' } . | 
| 538 | > | q{-e '$1=xp-Dx;$2=yp-Dy;$3=zp+Dz;$4=Dx;$5=Dy;$6=-Dz' } . | 
| 539 | > | "| $rtcmd"; | 
| 540 | > | } | 
| 541 |  | system "$cmd" || die "Failure running: $cmd\n"; | 
| 542 | < | @tbarr = `$rccmd $td/$bmodnm.flt`; | 
| 542 | > | if ($windoz) { | 
| 543 | > | @tbarr = `rcollate -h -oc 1 $td\\$bmodnm.flt | $rccmd`; | 
| 544 | > | } else { | 
| 545 | > | @tbarr = `$rccmd $td/$bmodnm.flt`; | 
| 546 | > | } | 
| 547 |  | die "Failure running: $rccmd $td/$bmodnm.flt\n" if ( $? ); | 
| 548 |  | chomp(@tbarr); | 
| 549 | < | @rbarr = `$rccmd $td/$fmodnm.flt`; | 
| 549 | > | if ($windoz) { | 
| 550 | > | @rbarr = `rcollate -h -oc 1 $td\\$fmodnm.flt | $rccmd`; | 
| 551 | > | } else { | 
| 552 | > | @rbarr = `$rccmd $td/$fmodnm.flt`; | 
| 553 | > | } | 
| 554 |  | die "Failure running: $rccmd $td/$fmodnm.flt\n" if ( $? ); | 
| 555 |  | chomp(@rbarr); | 
| 556 |  | } | 
| 557 | + |  | 
| 558 |  | # Output angle basis | 
| 559 |  | print | 
| 560 |  | '       <DataDefinition> | 
| 653 |  | # Output front transmission (transposed order) | 
| 654 |  | for (my $od = 0; $od < $ndiv; $od++) { | 
| 655 |  | for (my $id = 0; $id < $ndiv; $id++) { | 
| 656 | < | print $tfarr[$ndiv*$id + $od], ",\n"; | 
| 656 | > | chomp $tfarr[$ndiv*$id + $od]; | 
| 657 | > | print $tfarr[$ndiv*$id + $od], ",\t"; | 
| 658 |  | } | 
| 659 |  | print "\n"; | 
| 660 |  | } | 
| 677 |  | # Output front reflection (transposed order) | 
| 678 |  | for (my $od = 0; $od < $ndiv; $od++) { | 
| 679 |  | for (my $id = 0; $id < $ndiv; $id++) { | 
| 680 | < | print $rfarr[$ndiv*$id + $od], ",\n"; | 
| 680 | > | chomp $rfarr[$ndiv*$id + $od]; | 
| 681 | > | print $rfarr[$ndiv*$id + $od], ",\t"; | 
| 682 |  | } | 
| 683 |  | print "\n"; | 
| 684 |  | } | 
| 705 |  | # Output back transmission (transposed order) | 
| 706 |  | for (my $od = 0; $od < $ndiv; $od++) { | 
| 707 |  | for (my $id = 0; $id < $ndiv; $id++) { | 
| 708 | < | print $tbarr[$ndiv*$id + $od], ",\n"; | 
| 708 | > | chomp $tbarr[$ndiv*$id + $od]; | 
| 709 | > | print $tbarr[$ndiv*$id + $od], ",\t"; | 
| 710 |  | } | 
| 711 |  | print "\n"; | 
| 712 |  | } | 
| 729 |  | # Output back reflection (transposed order) | 
| 730 |  | for (my $od = 0; $od < $ndiv; $od++) { | 
| 731 |  | for (my $id = 0; $id < $ndiv; $id++) { | 
| 732 | < | print $rbarr[$ndiv*$id + $od], ",\n"; | 
| 732 | > | chomp $rbarr[$ndiv*$id + $od]; | 
| 733 | > | print $rbarr[$ndiv*$id + $od], ",\t"; | 
| 734 |  | } | 
| 735 |  | print "\n"; | 
| 736 |  | } |