Reflectivity of "dielectric_dielectric" range

Hi @dsawkey,

I was investigating what effect the reflectivity and transmittance values have on a dielectric_dielectric surface. And specifically what happens at the limits of each; as in at reflectivity = 1, does the surface become mirror like.

From the discussion here it seems as though the dielectric_dielectric surface type will follow the Fresnel equations and/or will cause absorption of the incident photon. Is it correct to assume that there is no way to generate a mirror like surface when using the dielectric_dielectric surface? Is a mirror like surface only possible when using a dielectric_metal surface type? Please correct me if I am wrong.

Thank you so much for all of your help time and consideration.

-Frank

No, it depends on the surface finish. A dielectric_dielectric surface with polishedfrontpainted finish is equivalent to a dielectric_metal surface, according to the diagram in the Book for Application Developers. A dielectric_dielectric surface with polished surface can’t be made to reflect with REFLECTIVITY.

Hi @dsawkey ,

Ah ok, I forgot to look at this flow chart again after this discussion. So a polished or ground finish for a dielectric_dielectric surface will use the Fresnel equations to determine refraction and reflection at the interface. The reflectivity and transmittance variables in this case are used to determine whether the photon is absorbed.

Again please correct me if I am wrong.

Thanks so much.

-Frank

Hi @dsawkey and @John_McFee,

Within the member function “DielectricDielectric” of the “G4OpBoundaryProcess” class (G4OpBoundaryProcess.cc), I found that reflection is selected for simulation, for non TIR cases, (lines 1079-1122), if the “G4BooleanRand” function passed the “TransCoeff” variable as its argument returns false.

The code block in question:

if (theTransmittance > 0.) TransCoeff = theTransmittance;
      else if (cost1 != 0.0) TransCoeff = s2/s1;
      else TransCoeff = 0.0;

      // NOT TIR: REFLECTION
      if (!G4BooleanRand(TransCoeff)) {
        // Simulate reflection

        if (Swap) Swap = !Swap;

        theStatus = FresnelReflection;

        if (!SurfaceRoughnessCriterionPass) theStatus = LambertianReflection;

        if (theModel == unified && theFinish != polished) ChooseReflection();

        if (theStatus == LambertianReflection) {
          DoReflection();
        }
        else if (theStatus == BackScattering) {
          NewMomentum     = -OldMomentum;
          NewPolarization = -OldPolarization;
        }
        else {
          PdotN = OldMomentum * theFacetNormal;
          NewMomentum = OldMomentum - (2.*PdotN)*theFacetNormal;

          if (sint1 > 0.0) {   // incident ray oblique
            E2_parl   = Rindex2*E2_parl/Rindex1 - E1_parl;
            E2_perp   = E2_perp - E1_perp;
            E2_total  = E2_perp*E2_perp + E2_parl*E2_parl;
            A_paral   = NewMomentum.cross(A_trans);
            A_paral   = A_paral.unit();
            E2_abs    = std::sqrt(E2_total);
            C_parl    = E2_parl/E2_abs;
            C_perp    = E2_perp/E2_abs;

            NewPolarization = C_parl*A_paral + C_perp*A_trans;
          }
          else {               // incident ray perpendicular
            if (Rindex2 > Rindex1) {
              NewPolarization = - OldPolarization;
            }
            else {
              NewPolarization =   OldPolarization;
            }
          }
        }
      }

And the “G4BooleanRand” function (from “G4OpBoundaryProcess.hh”):

G4bool G4OpBoundaryProcess::G4BooleanRand(const G4double prob) const
{
  /* Returns a random boolean variable with the specified probability */
  return (G4UniformRand() < prob);
}

If the transmittance is set to zero, then the “G4BooleanRand” function should always return false, from what I can tell in the two code blocks above, which should always simulate reflection.

This seems to be in conflict with what is discussed previously. Please help me see what I am missing.

Thank you again so much for your time and consideration, I know this is probably exhaustive for all of you.

-Frank

Hi Frank,

First, the portion of code from G4OpBoundaryProcess.cc that you have displayed is old. On quick inspection, it looks like it should behave similar to the current code in Geant4 v11.0, but I’d have to spend a lot more time looking at it to be confident.

Second, I am not sure that its logic disagrees with the logic that has been previously discussed in this thread. Execution does not pass to the “Simulate reflection” path whenever Transmittance=0 but rather only when Transmittance=0 AND cost1=0.

John

Hi @John_McFee (John),

Thank you so much for your quick response. I see what you have pointed out and I think the fog is starting to clear. For the three conditional statements before the reflection path:

  1. if (theTransmittance > 0.) TransCoeff = theTransmittance;
  2. else if (cost1 != 0.0) TransCoeff = s2/s1;
  3. else TransCoeff = 0.0;

The first two statements will set the “TransCoeff” variable to either the transmittance (if the transmittance is greater than zero) or to the ratio of s2 and s1. These are then compared against a random number to determine if the Reflection or Transmission path should be taken. And thus the only way to always enter the Reflection path is if the transmittance is 0 (or less than, but that is physically meaningless) and cost1 = 0. Please correct me if this is wrong.

Again, correct me if I am wrong, cost1 = -PdotN, which is the negative of the dot product between the momentum of the photon and the normal of the surface. The only time that cost1 should be zero is when the momentum is orthogonal to the normal. In that case, wouldn’t the photon be traveling parallel to the interface?

Thanks again for all of your help and time.

-Frank

Hi Frank,

Yes, that’s the way I interpret it.

John

@John_McFee and @dsawkey

Thank you both so much for all of your help, I really cannot express how much this helped me.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.