Needs["Rayica`Rayica`"]
+++++++++++++++++++++++++
Luneberg lens: A case study in Graded Index Refraction
Written in collaboration between Dr Donald Barnhart, Optica Software and Dr David Hayes, Plasma Antennas Limited, UK.
The Luneberg lens is a sphere with a radially symmetric refractive index profile given by the following formula:
In[17]:=
LunebergIndex[rx_, ry_, rz_, n_, c_, R_] = Sqrt[n - c*(rx^2+ry^2+rz^2)/R^2]
Out[17]=
where n and c are constants and R is the radius of the sphere. Here is a plot as a function of radial position, r, when n = 2, c = 1.0. and R = 50:
In[18]:=
Plot[LunebergIndex[r, 0, 0, 2, 1, 50],{r,-50,50}];
Such a refractive index profile generates an ideal behavior for the Luneberg lens. We can use Rayica's GRINLens function to define a Luneberg lens model. Here is built-in description of GRINLens:
?GRINLens
In addition , we will also define a refractive index model for our Luneberg lens using the Rayica's ModelRefractiveIndex function:
In[24]:=
?ModelRefractiveIndex
All GRINLens refractive models use {RSx, RSy, RSz} within ModelRefractiveIndex to specify the position within the graded-index material: where the default refractive coordinate origin is {RSx, RSy, RSz} = {0,0,0}. Since the GRINLens is created with its center at {R,0,0}, we must first shift the refractive index coordinates by {-R,0,0}. We can now create a lunebergLens subroutine in Mathematica that both defines the refractive index model and creates the GRINLens function.
In[19]:=
Clear[lunebergLens];
lunebergLens[R_,n_,c_,options___] :=(
Unprotect[ModelRefractiveIndex];
ModelRefractiveIndex[LuneIndex] = Function[Sqrt[n-c*((RSx-R)^2+RSy^2+RSz^2)/R^2]/.#];
GRINLens[R,-R,1.999*R,2*R,ComponentMedium->LuneIndex,options]);
We can now use TurboPlot to model our newly defined lunebergLens.
TurboPlot[{Move[LineOfRays[95,NumberOfRays->11,IntrinsicMedium->1],-60],lunebergLens[50,2.,1,PlotPoints->50],Move[Boundary[200],-60]}, PlotType->TopView, Axes->True,ShowArrows->True];
In[18]:=
TurboPlot[{Move[GridOfRays[95, NumberOfRays->11,IntrinsicMedium->1],-60],lunebergLens[50,2.,1,PlotPoints->50],Move[Boundary[200],-60]}];
In this case, the Luneberg lens behaves ideally, by imaging the plane-wave onto a single point at the exit surface of the lens. For other types of sources, however, the lens behavior is far from ideal. Here is such an example that uses a point source instead of a plane wave:
In[19]:=
TurboPlot[{Move[WedgeOfRays[45,NumberOfRays->11,IntrinsicMedium->1],-60],lunebergLens[50,2.,1,PlotPoints->50],Move[Boundary[300,125],-60]}, PlotType->TopView, Axes->True,ShowArrows->True];
As an alternative to TurboPlot, you can also use AnalyzeSystem to model the system. Here is the Luneberg lens with n = 2.5 and c = 1.5
In[27]:=
AnalyzeSystem[{Move[LineOfRays[95,NumberOfRays->11,IntrinsicMedium->1],-60],lunebergLens[50,2.5,1.5,PlotPoints->50,IntrinsicMedium->1],Move[Boundary[200],-60]}, PlotType->TopView, Axes->True];
However, AnalyzeSystem is not compiled in Mathematica and will result in a much slower calculation.
Created by Mathematica (August 30, 2006) | ![]() |