Implementing angular dependence to normal of mesh surface

Hi everyone,

Currently I have a 3D .msh file that I have produced in Salome and I am using it in a finite element simulation to simulate reflection and absorption from a metal surface. To accurately simulate this, I need to account for the angle of incidence of the incoming light relative to the normal of the mesh surface, via this:

\begin{equation} \sin{\theta_t} = \frac{1}{2} \sin{\theta_i} \end{equation}

Where \theta_i is the angle of incidence relative to the normal of the surface, and \theta_t is the transmission angle that I want to fine across my entire domain. I have assumed that my light source is a simple Gaussian function of the form:

F = Expression('exp(-pow((x[0] - 0), 2)-pow((x[1]-0), 2))',degree=2) 

My question is this: If I assume all the light is directed along the -z axis (see attached image), how to I find \theta_i across the surface of my mesh that is directly exposed to the source. Do I have to somehow account for the normal vector when I make the mesh, or can this be done in Fenics.

Note: Since this relies on importing a 3D mesh, I think having some example code would not fully capture my problem. Plus, given that this question is quite general, hopefully there will be a fairly general answer).

Thanks in advance.