Refraction on the Lambertian surface

Hi, GEANT’ers

My question is a half physical question.

I want to simulate ground surfaces of a crystal. I am using the UNIFIED model for it.
However, I see that despite the value of Lambertian coefficient (up to 1) the refraction on the surface isn’t affected by this value. I could overcome it by the setting value of sigmaAlpha greater than zero but then I would also change the reflection, wouldn’t I?

So my question is what should I do in this situation? I don’t consider that optical photons are absorbed on the surface.

Thanks in advance,


Please refer to the diagram:

For ground surfaces the sigmaAlpha parameter specifies the roughness. And Lambertian etc. are only used for reflection.

Yes sigmaAlpha affects the reflection. Isn’t that what is expected physically? If not what are you trying to simulate?

Yes, I though so but wasn’t sure.
Another question. Here is my piece of code responsible for the boundary simulation:

ProjectConstants.h file:

//simulation of the side faces of the crystal
namespace side
    //Probabilities for each wavelength must add to 1
    static G4double specularSpike[]     = { 0.200, 0.200 };
    static G4double specularLobe[]      = { 0.000, 0.000 };
    static G4double backScattering[]    = { 0.000, 0.000 };
    //the remaining is LAMBERTIAN reflection = 1 - specularSpike - specularLobe - backScattering 
    const G4double sigmaAlpha           = 0.5*radian;
    const G4double polishValue          = 0.0;//isn't used for the UNIFIED model


//Border surface between side faces of crystal and air
G4MaterialPropertiesTable* sideSurfMPT = new G4MaterialPropertiesTable();
    sideSurfMPT->AddProperty( "REFLECTIVITY", cs::crystal::photonEnergy, cs::wrapper::side::reflectivity, 2 )->SetSpline( true );
    sideSurfMPT->AddProperty( "SPECULARSPIKECONSTANT", cs::crystal::photonEnergy, cs::wrapper::side::specularSpike, 2 )->SetSpline( true );
    sideSurfMPT->AddProperty( "SPECULARLOBECONSTANT", cs::crystal::photonEnergy, cs::wrapper::side::specularLobe, 2 )->SetSpline( true );
    sideSurfMPT->AddProperty( "BACKSCATTERCONSTANT", cs::crystal::photonEnergy, cs::wrapper::side::backScattering, 2 )->SetSpline( true );

fCrystalSideSurface = new G4OpticalSurface( "crystalSurface" );
    fCrystalSideSurface->SetModel( G4OpticalSurfaceModel::unified );
    fCrystalSideSurface->SetType( G4SurfaceType::dielectric_dielectric );
    fCrystalSideSurface->SetFinish( G4OpticalSurfaceFinish::ground );
    fCrystalSideSurface->SetSigmaAlpha( cs::wrapper::side::sigmaAlpha );

    fCrystalSideSurface->SetMaterialPropertiesTable( sideSurfMPT );

The question is the following:
Provided that only LAMBERTIAN and SPECULAR SPIKE constants are non-zero for the reflection, and SIGMA ALPHA is also set to non-zero value is the following correct?

When a photon reaches the boundary the normal of a microfacet is randomly picked from a gaussian distribution (here the SIGMA ALPHA is used). Then if Snell’s law results in reflection either specular reflection is performed about the average normal (not about the normal of a microfacet) or diffuse reflection about the normal of a microfacet. If Snell’s law results in refraction then the usual refraction (according to the indices of refraction) about the normal of a microfacet is performed.

Ah, OK. I have read the original article. The lambertian is also about the average normal.