PyPO User Manual
 
Loading...
Searching...
No Matches
Gridding And Parameterisations

Introduction

In PyPO, there are two common ways to parameterise the surface of a reflector. On this page, we will explain these two parameterisations in more detail. Also, there is a third parameterisation for PyPO, which we will discuss.

Cartesian Parameterisation

The Cartesian, or "xy", parameterisation is the most straightforward parameterisation in PyPO. For quadric surfaces it consists of selecting a patch of x and y co-ordinates and evaluating the expression for the quadric surface on this patch in the xy-plane. This generates the z co-ordinates corresponding to the x and y co-ordinate in the xy-plane. For planar geometries, it is even simpler as the z co-ordinate for all x,y in the xy-plane is set to zero.

For a general reflector, the "xy" parameterisation is toggled by passing "xy" to the "gmode" field in a reflector dictionary. After setting this, it is important that the following two fields are also set:

  • "lims_x" : A Numpy array of length 2, containing the lower and upper limit of the x-range of the parameterisation.
  • "lims_y" : A Numpy array of length 2, containing the lower and upper limit of the y-range of the parameterisation.

See image below for a paraboloid with "gmode" set to "xy" and "lims_x" and "lims_y" both set to numpy.array([-1, 1]). The "pmode" is "manual", with "coeffs" set to numpy.array([1, 1]).

Polar Parameterisation

The next parameterisation is the polar, or "uv", parameterisation. This parameterisation first takes a (rectangular) patch in the uv-plane, and converts it to a (circular) patch in the xy-plane. The u co-ordinate is the radial part and the v co-ordinate the angular part. Then, the procedure goes along the same lines as for the "xy" parameterisation. This parameterisation is more appropriate for symmetric surfaces of revolution, due to the rotational symmetry present in the parameterisation and reflector.

For a general reflector, the "uv" parameterisation is toggled by passing "uv" to the "gmode" field in a reflector dictionary. After setting this, it is important that the following two fields are also set:

  • "lims_u" : A Numpy array of length 2, containing the lower and upper limit of the u-range of the parameterisation.
  • "lims_v" : A Numpy array of length 2, containing the lower and upper limit of the v-range of the parameterisation. In this context, v is defined w.r.t. the positive x-axis and measured in degrees.

See image below for the same paraboloid with "gmode" set to "uv" and "lims_u" to numpy.array([0, 1]) and "lims_v" set to numpy.array([0, 360]).

Optional Fields For "uv" Parameterisation

When the "uv" parameterisation is selected, three optional fields become available:

  • "ecc_uv" : The eccentricity of the resultant circular patch in the xy-plane. Defaults to 0, i.e. a circular patch. If set to a value between 0 and 1, the patch will become elliptic.
  • "rot_uv" : The position angle of the circular patch in the xy-plane. Obviously, this parameter is only relevant when "ecc_uv" is set to 0. The position angle is defined w.r.t. to positive x-axis.
  • "gcenter" : A Numpy array of length 2, containing the x and y offset for the xy patch generated from the uv patch.

These options are not (yet) available for the "xy" parameterisation.

Of these options, the "gcenter" option plays a special role. Using this field, it is possible to generate off-axis reflectors from a circular xy patch. This is interesting from the perspective of, for example, radio telescope designers, as off-axis designs have the advantage of having less feed/secondary support strut blockage.

See image below for the same paraboloid with "gcenter" set to numpy.array([0.5, 0.5]).

See image below for the same paraboloid with "ecc_uv" set to 0.7 and "rot_uv" set to 45 degrees. The "gcenter" is set to the origin again.

"AoE" (Azimuth Over Elevation) Parameterisation

The final parameterisation type is the Azimuth-over-Elevation, or "AoE", parameterisation. This parameterisation is exclusive to planar geometries. The parameterisation is necessary for defining far-field elements. When a far-field beam pattern is calculated on an "AoE" parameterised surface, PyPO internally converts the Azimuth and Elevation angles to direction cosines on-sky and calculates the far-field.

In order to define a plane in the far-field, set the "gmode" field to "AoE" and make sure the following fields are present in the reflector dictionary:

  • "lims_Az" : A Numpy array of length 2, containing the lower and upper limits on the Azimuthal angle. The angle is in degrees and is defined w.r.t. the x-axis.
  • "lims_El" : A Numpy array of length 2, containing the lower and upper limits on the Elevation angle. The angle is in degrees and is defined w.r.t. the z-axis.

Note that the grid generated by this parameterisation is angular instead of spatial. Translating this grid therefore does not displace it, but rather changes the direction in which the far-field is calculated.

Setting The Gridsizes

Before a reflector dictionary is accepted by the System, one final field needs to be specified: the "gridsizes" field. This field is a Numpy array of length 2 and defines the amount of cells along the x/u/Az and y/v/El axes. This field is therefore very important, as using values that are insufficiently accurate might result in nonsensical results. the best way to find good values for this field is by experimenting a bit and seeing what works through trial-and-error, because finding a rigorous one-stop solution for determining this is relatively hard.

PyPO does contain an aid, however, in the form of the autoConverge() method, present in System. For this method to work, a PO field should be present as well as the target surface onto which the field is to be propagated. This method is still quite experimental, but has shown to work relatively well in the few situations it has been tested. Nevertheless, the "gridsizes" field should be set carefully, and users should investigate the correctness of their simulation by tweaking these values yourself.