BRTDfunc Materials from Optics/IGDB for use in Radiance-based simulations in HoneybeePlus


I am trying to get a realistic estimate for the concentration of solar radiation resulting from a curved glass facade.

There are a number of points in my process where there is potential for error, so I am going to be pretty detailed, but I’ll use headings so it’s easy to navigate this entry.

Worst case scenario

I used forward ray-tracing to figure out that radiation is concentrated most intensely during Feb/March and October/November, at around 10:00 in the morning. Worst case Diffuse normal radiation is 135 w/m2 at that time, and the worst case direct radiation is 825w/m2 at that time, so I made a custom sky to reflect this. I have been able to replicate the radiation-concentration phenomenon with a point-in-time simulation using a mirror material in Honeybee Legacy (woohoo!):

The problem is that this doesn’t really represent a realistic worst-case scenario. (2500 W/m2 will give a person a sunburn in 30 seconds, so the 3600w/m2 here is quite serious if it is true.)

How can I use Radiance to get a more realistic measure for glass?

I tried with a glass material, a metal material, and a custom BRTDfunc material based on outputs from the IGDB.

Here is my process, any input you have would be super helpful.

Creating Radiance Material from the IGDB

The glass is a laminate, so I built it up in Optics 6.0 Maintenence Pack 1 and imported to and exported a Radiance file. I have not yet managed to get a single Radiance material for two laminates separated by an airgap, so this could be the problem.

The glass is in the International Glazing Database (IGDB), but the exact Polyvinyl Butyral (PVB) that binds the two panes of glass together wasn’t listed, so I substituted something that seemed reasonable.

Here are the entries in the laminate I’ve created in Optics:
081_XIR_7241_3Clr.usr (This is the substitute PVB mentioned above, NFRCID 30006)

This results in the following Radiance file. This was done on a computer in Copenhagen, so it spits out a Radiance File that uses commas instead of periods (super annoying):

# FileName= PAN_TestLaminate.usr
# Product Name= 
# NFRC ID= 30005
# Manufacturer Name= User
# Glazing Type= Laminate
# Coated Side= Back
# Transmittance= 0,630
# Front Reflectance= 0,134
# Back Reflectance= 0,162
# Thickness(mm)= 12,810
# Appearance= 

void  glass       TestLaminate_glass
3     0,649     0,709     0,607

void  BRTDfunc    TestLaminate_front
      0,113     0,139     0,163
      0,596     0,651     0,557
      0 0 0
9 0 0 0 0 0 0 0 0 0

void  BRTDfunc    TestLaminate_back
      0,148     0,161     0,223
      0,596     0,651     0,557
      0 0 0
9 0 0 0 0 0 0 0 0 0

To interpret this file, I refer to the Radiance documentation on a BRTDfunc material: (it’s not code, this is just an easy way to refer to the text here).

The material BRTDfunc gives the maximum flexibility over surface reflectance and transmittance, providing for spectrally-dependent specular rays and reflectance and transmittance distribution functions.
        mod BRTDfunc id
        10+  rrefl  grefl  brefl
             rtrns  gtrns  btrns
             rbrtd  gbrtd  bbrtd
             funcfile  transform
        9+   rfdif gfdif bfdif
             rbdif gbdif bbdif
             rtdif gtdif btdif
             A10 ..
The variables rrefl, grefl and brefl specify the color coefficients for the ideal specular (mirror) reflection of the surface. The variables rtrns, gtrns and btrns specify the color coefficients for the ideal specular transmission. The functions rbrtd, gbrtd and bbrtd take the direction to the incident light (and its solid angle) and compute the color coefficients for the directional diffuse part of reflection and transmission. As a special case, three identical values of '0' may be given in place of these function names to indicate no directional diffuse component.
Unlike most other material types, the surface normal is not altered to face the incoming ray. Thus, functions and variables must pay attention to the orientation of the surface and make adjustments appropriately. However, the special variables for the perturbed dot product and surface normal, RdotP, NxP, NyP and NzP are reoriented as if the ray hit the front surface for convenience.

A diffuse reflection component may be given for the front side with rfdif, gfdif and bfdif for the front side of the surface or rbdif, gbdif and bbdif for the back side. The diffuse transmittance (must be the same for both sides by physical law) is given by rtdif, gtdif and btdif. A pattern will modify these diffuse scattering values, and will be available through the special variables CrP, CgP and CbP.

Care must be taken when using this material type to produce a physically valid reflection model. The reflectance functions should be bidirectional, and under no circumstances should the sum of reflected diffuse, transmitted diffuse, reflected specular, transmitted specular and the integrated directional diffuse component be greater than one.

So, it looks like many of the values coming out of Optics are zero, so perhaps there is a problem with the way I am building the laminate up. @sarith any ideas?

Using the Radiance Material in Honeybee Legacy

All the following images are rendered using the following Radiance paramters:

pt = 0.05
ds = 0.05
aa = 0.15
pj = 0.9
dt = 0.15
ad = 1000
dj = 0.7
dp = 512
lw = 1e-06
xScale = 6
yScale = 6
ar = 128
as = 1000
dc = 0.75
av = 0
lr = 1
ps = 2
st = 0.15
sj = 1
dr = 3
ab = 9

I am aware that the radiance output from Optics contains three materials. My first instinct was to use the glass material directly, but this did not produce the effect of concentrating radiation that I expected, here is the resulting image:

As I understand from This post from Marija Cvetkovic and Jack de Valpine this is because the glass material only represents the correct transmittance for the exported glazing system, not the reflectance.

Then I tried to see if I could create the phenomenon of concentrating solar radiation with a metal material. This also failed even though all reflectances were set to 1:

Finally, I tried a BRTD function material, defined as follows (from Optics output):

void  BRTDfunc    TestLaminate_front
     0.113     0.139     0.163
     0.596     0.651     0.557
     0 0 0
9 0 0 0 0 0 0 0 0 0

This yields the following result, which also fails to reproduce the concentration phenomenon:

Here are my grasshopper and Rhino files, the grasshopper file contains all of the materials I’ve been using: (512.4 KB)
CurvedGlass.3dm (66.9 KB)

…and the Radiance files for the run using the BRTDfunc material (214.5 KB)

Precedent Study

Page 3676 of this study on the Walkie Talkie in London seems to have figured this out, the method they used for estimating the quantity of radiation is described as follows:

" With RADIANCE tool Rtcontrib and
dctimestep, irradiance received at each critical
position is calculated at hourly time-step. An
interface was developed in GRASSHOPPER which
sent information of the geometry and material
properties to the server and collect simulation results
for further analysis. "

I don’t know if this is what Honeybee is already doing, or if this is a different approach. Perhaps I should be doing this with a Daylight Coefficient analysis?

Testing in Honeybee Plus

I thought it might be a problem with support for BRTDfunc in legacy components, so I rebuilt the definition in HBPlus, but no luck here.

I used [On Material definitions (Trans,BRTDfunc…)in Honeybee +)(Material definition (Trans, BRTDfunc..) in Honeybee +) (Nov '17) and Import a material from Radiance library in Honeybee [+] and BRTDfunc material (Jun '18), to write a custom material class based on the output from Optics:

from honeybee.radiance.material.brtdfunc import BRTDfunc

values = {
0: ['0.113','0.139', '0.163', '0.596', '0.651', '0.557', '0', '0', '0', '.'],
1: [],
2: ['0', '0', '0', '0', '0', '0', '0', '0', '0']

material = BRTDfunc('TestLaminate_front', values=values)


This is included in the following Grasshopper and Rhino files: (502.4 KB)
CurvedGlass.3dm (69.3 KB)

Hi @amjacobson, I would suggest posting your query on the Radiance forum. There are quite few active people in the Radiance community who’ve tackled such projects before. Lars Grobe, from the same group that published the IBPSA paper, had posted an update about some of their recent projects on light redirecting material. A few years ago, Stephen Wasilewski had presented a study on solar convergence at the Radiance workshop which dealt with similar themes.

1 Like

Thank you @sarith, these leads are really helpful. I am only now realizing the importance of forward ray-tracing, as backwards ray-tracing creates problems measuring radiation intensity.

@amjacobson, by the way, what do you mean by the numbers from Optics are zero? Do you mean the numbers 9 0 0 0 0 0 0 0 0 0? If so, that is not an issue. Those numbers are meant for the funcfile anyway (which, in your case is a . ie nothing). With regards to using the definition, you should either use glass or use the BRTDfunc definitions. In case you haven’t seen this already, here is an excellent discussion on this matter.

The zero’s I refer to are the ones in the BRTDfunc material, as you mentioned— so everything is in order there. Thanks for the clarification.

After reading through the material you pointed me toward, it seems like I’ll have to learn some more Radiance in order to be able to use the BRTDfunc to simulate this. I have just created a post on the Radiance forum so I suppose the discussion will continue there.

Hi Alexander, thanks for the detailed run through. Roland Schegle did a similar(ish) study where he looked on glare from solar cells. He modeled the solar cell material based on measurements. I can’t remember the method though. But it was shared in the 2018 radiance workshop.

But in terms of reflectance, have you tried 15% direct/specular reflectance as much glass is roughly that value unless it’s super coated energy?
I guess the PVB behind matters, but again not that much. Perhaps you can also model the material in the Calumen Live website including their coating and get specular reflectance (which I guess is the only parameter that matters for you). I can’t remember if calumet provides radiance materials.

And for the Copenhagen commas - change your regional settings on the pc to use . as decimal separator. Otherwise you may also get problems for instance with the urban daylighting tool Timur did.
/ Mathias Sønderskov

Has anybody tried this with Honeybee 1.3 or 1.4. With the new updates, workflows seem a bit different? Does anybody have a script to try? Thanks

You should be able to do the same with the latest LBT plugin but the method for creating the BRTDfunc modifier has changed a little. This is what it would look like using the Ladybug Tools SDK of the LBT 1.4 plugin:

from honeybee_radiance.modifier.material.brtdfunc import BRTDfunc

brtd_modifier_str = """
void  BRTDfunc    TestLaminate_front
     0.113     0.139     0.163
     0.596     0.651     0.557
     0 0 0
9 0 0 0 0 0 0 0 0 0

brtd_modifier = BRTDfunc.from_string(brtd_modifier_str )

Then you can assign that brtd_modifier object to whatever honeybee object you want (Face, Aperture, Door Shade).

Hi All,
I keep getting error adding the brtd_modifier below?

Does anyone recognize what is wrong in the code above?

Hi @mfa1995,

Try to write it out line by line instead. See the attached file. (9.1 KB)