[Raytrace] Ross Null (Long Post)
John D. Upton
jd-upton@texas.net
Mon, 28 Apr 2003 15:16:07 -0500
Robin,
At 08:35 PM 4/25/2003 -0700, you wrote:
>More confusion over Ross Null test. Using an f/4.2, D= 22.4 mirror, f= 450
>mm, D = 145 mm, t = 15.5 mm lens. I used the software program from Mel
... snip ...
>the source. I need it the same as the object plane for my slitless
>tester. The software from Mel's site gave a max OPD of 0.0692. I tried
>iterating the
Your input seems to be missing a surface in your setup. Here is a
version of your prescription I entered from the data in your two posts. It
has been optimized to minimize the total spherical aberration while
maintaining an image distance as close as possible to the source
distance. For this setup, the best I could do was get them within about
0.6 mm.
This is the same problem I wrestled with in OSLO-LT last month. (See
the thread on user defined optimization set up.) In order to force the
source and image to be (nearly) coincident, you need to define some user
optimization commands. At the bottom of this post, I have appended the
final OSLO-LT lens file and the two CCL files used for the
optimization. If you copy the CCL files to the PRIVATE CCL directory and
recompile the Private CCL commands, you can optimize both spherical
aberration and source-image distance. After playing with this, remember to
rename the two private CCL file to some extension other than CCL and
recompile back to normal operation again. (Note that the file names differ
slightly between different versions of OSLO-LT. You will have to rename
the copies in the Private CCL directory the same as their counterparts in
the Public CCL directory.)
Not having looked at the other information sources you cited, I cannot
say if this is a good solution for your setup.
In the notes for the design, you mention the beam clearing the lens at
an off axis angle of 0.5 degree. Were you by any chance trying to set up a
Dall Null configuration where the return beam doesn't pass through the lens
again? The following data pertains to the Ross Null configuration only.
*LENS DATA
Ross Null, 22.4" f4.2, 450mm len
SRF RADIUS THICKNESS APERTURE RADIUS GLASS SPE NOTE
OBJ -- 289.581931 V 0.000290 AIR
AST -- 15.500000 45.946951 AS BK7 C
2 -238.719031 4.2835e+03 V 47.566304 S AIR
3 -4.7803e+03 -4.2835e+03 P 284.480000 S REFL_HATCH *
4 238.719031 P -15.500000 P 11.566760 S BK7 P
5 -- P -289.581931 S 11.173023 S AIR
IMS -- -0.579194 0.023537 S
*CONIC AND POLYNOMIAL ASPHERIC DATA
SRF CC AD AE AF AG
3 -1.000000 -- -- -- --
The trace results were not as good as you quoted for the software on
Mel's site. The OSLO-LT results were as follows:
*WAVEFRONT RS
WAVELENGTH 1
PKVAL OPD RMS OPD STREHL RATIO RSY RSX RSZ
0.120901 0.023270 0.978992 -- -- --
The Ross Null File:
===== Start of Ross_Null_Palmer.len ================================
// OSLO 6.04 63357 25680 35746
LEN NEW "Ross Null, 22.4\" f4.2, 450mm len" -216.34 6
NAO 0.1567062162182
ANG 0.0000572957795
DES "tw"
UNI 1.0
SNO1 "This file uses a Melles Griot f=300mm, d=66mm, t=6.5mm lens for the
nulling lens"
SNO2 "from their website, cost: $38.00. This lens should clear the return
light"
SNO3 "from the mirror with a 0.5 degree angle off axis."
// SRF 0
AIR
TH 289.5819314985729
AP 0.0002895819314
NXT // SRF 1
GLA BK7
TH 15.5
NXT // SRF 2
AIR
RD -238.7190313248665
TH 4283.4745926101468
NXT // SRF 3
RFH
RD -4780.3000000000002
PK THM -1 0.0
CC -1.0
DT 1
NXT // SRF 4
PK GLA -3
PK CVM -2 0.0
PK THM -3 0.0
NXT // SRF 5
AIR
PK CV -4 0.0
PY 0.0
NXT // SRF 6
AIR
TH -0.5791943000625
WV 0.54607
WW 1.0
END 6
SDAD 100.0
OPDF 1.0e-08
OPOC "opcb_abs"
VAR NEW
V 1 0 0 TH 0.1 10000.0 1.0 0.0045946951357
V 2 2 0 TH 0.1 10000.0 1.0 0.0045946951357
END
OPE NEW
O 1 "OCM20" 1.0 "TOTAL_SPH"
O 2 "OCM23" 0.0 "TH0+TH5"
END
===== End of Ross_Null_Palmer.len ==================================
The optimization call-back functions file:
===== Start of op_callbaks.ccl =====================================
#include "..\..\public\ccl\inc\a_global.h"
cmd opcb_abs(void)
// hlp: <P>Sample
// hlp: <a href="optimization_conditions.htm">command</a> for computation
of a
// hlp: user-defined <a
href="optimization_data_errorfunction_overview.htm">error function</a>
// hlp: through <a
href="optimization_data_errorfunction_operands_components_CCL.htm">CCL
operands</a>.</P>
// hlp: <P>This command calculates system paraxial ray data (PY, PU, PYC,
PUC, EFL),
// hlp: as well as chromatic, 3rd and 5th order aberration coefficients.
// hlp: It serves as an error function callback for the <a
HREF="commands_opabs_template.htm">opabs_template</a> command.</P>
// hlp: <P><I>Note: The <A HREF="optimization_conditions.htm">optimization
condition for CCL operands</A> needs to be set to
// hlp: "opcb_abs" for this command to work correctly.</I></P>
// kwd: sample, operands, aberrations,
// cat: optimization
/***************************************** WARNING
********************************************
* Don't change this command. It is used as a callback for the
opabs_template and may be used
* by several error function generators. Changing it may produce unexpected
results for these
* commands. If you want to use a modified callback, make a copy, rename the
copy to something
* else (e.g. my_opcb_abs) and modify the copy.
**********************************************************************************************/
{
int ssb_row_sav;
set_preference(outp, off);
ssb_row_sav = sbrow;
ssbuf_reset(ssb_row_sav, 6);
paraxial_trace();
Ocm[1] = ssb(1, 1); // py
Ocm[2] = ssb(1, 2); // pu
Ocm[3] = ssb(1, 4); // pyc
Ocm[4] = ssb(1, 5); // puc
chromatic_abers();
Ocm[5] = ssb(2, 1); // pac
Ocm[6] = ssb(2, 3); // plc
Ocm[7] = ssb(2, 2); // sac
Ocm[8] = ssb(2, 4); // slc
seidel_abers();
Ocm[9] = ssb(3, 1); // sa3
Ocm[10] = ssb(3, 2); // cma3
Ocm[11] = ssb(3, 3); // ast3
Ocm[12] = ssb(3, 4); // ptz3
Ocm[13] = ssb(3, 5); // dis3
fifth_order_abers();
Ocm[14] = ssb(4, 1); // sa5
Ocm[15] = ssb(4, 2); // cma5
Ocm[16] = ssb(4, 3); // ast5
Ocm[17] = ssb(4, 4); // ptz5
Ocm[18] = ssb(4, 5); // dis5
Ocm[19] = ssb(4, 6); // sa7
Ocm[20] = Ocm[9] + Ocm[14] + Ocm[19]; // total sph
paraxial_constants();
Ocm[21] = ssb(5, 1); // focal length (ang. mag.)
Ocm[22] = Ocm[1] + Ocm[9]; // PY + SA3 for singlet_erf
Ocm[23] = th[0] + th[5]; // th[0]+th[5]
ssbuf_reset(-ssb_row_sav, 6);
set_preference(output_text, on);
}
cmd opcb_rays(void)
// hlp: <P>Sample
// hlp: <a href="optimization_conditions.htm">command</a> for computation
of a
// hlp: user-defined <a
href="optimization_data_errorfunction_overview.htm">error function</a>
// hlp: through <a
href="optimization_data_errorfunction_operands_components_CCL.htm">CCL
operands</a>.</P>
// hlp: <P>This command calculates system <a
href="analysis_tools_raytracing_paraxial.htm">paraxial parameters</a>
// hlp: (PY, PU, PYC, PUC, EFL), as well as exact ray trace data for on
and off-axis rays. The ray parameters
// hlp: describing the rays used are obtained from system note 6, as set
up by the
// hlp: <a HREF="commands_oprays_template.htm">oprays_template</a>
command.</P>
// hlp: <P><I>Note: The <A HREF="optimization_conditions.htm">optimization
condition for CCL operands</A> needs
// hlp: to be set to "opcb_rays" for this command to work
correctly.</I></P>
// kwd: sample, operands
// cat: optimization
{
int ic,ssb_row_sav,chkap;
double w2d;
char tmpstr[81];
set_preference(outp, off);
ssb_row_sav = sbrow;
ssbuf_reset(ssb_row_sav, 12);
chkap = apck;
apck off;
/* Parse system note 6 to get static OCM's:
OCM1 = "AXIS_FYMAX" On-axis fractional beam radius
OCM2 = "OFAX_FOB" Fractional height of off-axis object point
OCM3 = "OFAX_FYMIN" Lower FY for off-axis object point
OCM4 = "OFAX_FYMAX" Upper FY for off-axis object point
OCM5 = "OFAX_FX" FX for off-axis object point skew ray
*/
get_system_note(6);
strtoken(tmpstr,system_note, " ");
if (!strcmp(tmpstr, "opcb_rays"))
{
for (ic = 1; ic < 6; ic++)
{
strtoken(tmpstr, "", " ");
ocm[ic] = atof(tmpstr);
}
}
ssbuf_reset(1,2,1e20);
// paraxial data
paraxial_trace();
Ocm[6] = ssb(1,1); // py
Ocm[7] = ssb(1,2); // pu
Ocm[8] = ssb(1,4); // pyc
Ocm[9] = ssb(1,5); // puc
paraxial_constants();
Ocm[10] = ssb(2,1); // focal length (ang. mag.)
ssbuf_reset(1,12,1e20);
// on axis
set_object_point(0);
Ocm[11] = ssb(3,3); // axis focus shift
trace_fan(y,all,2,.7*Ocm[1],Ocm[1],0);
Ocm[12] = ssb(5,5); // axis FY zone dy
Ocm[13] = ssb(5,8); // axis FY zone opd
Ocm[14] = ssb(5,9); // axis FY zone dmd
Ocm[15] = ssb(5,10); // axis FY zone osc
Ocm[16] = ssb(4,5); // axis FY edge dy
Ocm[17] = ssb(4,8); // axis FY edge opd
Ocm[18] = ssb(4,9); // axis FY edge dmd
Ocm[19] = ssb(4,10); // axis FY edge osc
// off-axis
set_object_point(Ocm[2]);
Ocm[20] = ssb(8,1); // off-axis FY 0 yc
Ocm[21] = ssb(8,3); // off-axis FY 0 yfs
Ocm[22] = ssb(8,4); // off-axis FY 0 xfs
trace_fan(y,all,2,Ocm[3],Ocm[4],0);
Ocm[23] = ssb(9,5); // off-axis upper FY dy
Ocm[24] = ssb(9,8); // off-axis upper FY opd
Ocm[25] = ssb(9,9); // off-axis upper FY dmd
Ocm[26] = ssb(10,5); // off-axis lower FY dy
Ocm[27] = ssb(10,8); // off-axis lower FY opd
Ocm[28] = ssb(10,9); // off-axis lower FY dmd
trace_fan(x,all,1,Ocm[5],Ocm[5],0);
Ocm[29] = ssb(11,5); // off-axis skew dy
Ocm[30] = ssb(11,6); // off-axis skew dx
//
// insert user defs here
Ocm[31] = 0.5*(Ocm[23] + Ocm[26]); // tangential coma
Ocm[32] = Ocm[20] - Ocm[8]; // distortion
//
if (opdw) // convert wavelengths to distance units
{
w2d = wv[1]/(1000.0*uni);
Ocm[13] *= w2d;
Ocm[14] *= w2d;
Ocm[17] *= w2d;
Ocm[18] *= w2d;
Ocm[24] *= w2d;
Ocm[25] *= w2d;
Ocm[27] *= w2d;
Ocm[28] *= w2d;
}
if (chkap) apck on;
ssbuf_reset(-ssb_row_sav, 12);
set_preference(output_text, on);
}
cmd oprds_spot_size(void)
// hlp: <P>Sample
// hlp: <a href="optimization_conditions.htm">command</a> for computation
of a
// hlp: user-defined <a
href="optimization_data_errorfunction_overview.htm">error function</a>
// hlp: through <a
href="optimization_data_errorfunction_operands_components_CCL.htm">CCL
operands</a>.</P>
// hlp: <P>This command calculates RMS R
// hlp: <a href="analysis_tools_imagequality_spotdiagram.htm">spot
size</a> for wavelength 1 at three
// hlp: <a href="optimization_data_fieldpoints.htm">field points</a>.</P>
// hlp: <P><I>Note: The <A HREF="optimization_conditions.htm">optimization
condition</A> <B>Command for CCL operands</B> needs to be set to
// hlp: "oprds_spot_size" for <a
href="optimization_data_errorfunction_operands_components_CCL.htm">CCL
operands</a>
// hlp: to be computed accurately.</I></P>
// kwd: sample, operands, RMS spot size, field points
// cat: optimization
{
int ssb_row_sav;
set_preference(output_text, off);
ssb_row_sav = sbrow();
ssbuf_reset(ssb_row_sav, 100);
trace_ref_ray(0.0);
spot_diagram(mon, 10.0);
Ocm[0] = c4;
trace_ref_ray(0.7);
ssbuf_reset(-ssb_row_sav, 100);
ssb_row_sav = sbrow();
ssbuf_reset(ssb_row_sav, 100);
spot_diagram(mon, 10.0);
Ocm[1] = c4;
trace_ref_ray(1.0);
ssbuf_reset(-ssb_row_sav, 100);
ssb_row_sav = sbrow();
ssbuf_reset(ssb_row_sav, 100);
spot_diagram(mon, 10.0);
Ocm[2] = c4;
ssbuf_reset(-ssb_row_sav, 100);
set_preference(output_text, on);
}
cmd
geniiops(void)
// geniierf_lt callback function
{
int ic, apchk, ssrow;
double pu, pyht, imht, w2d, fy;
char tmpstr[81];
set_preference(output_text, off);
apchk = apck;
aperture_check(off);
ssrow = sbrow();
ssbuf_reset(ssrow, 0);
/* Parse system note 6 to get static OCM's */
get_system_note(6);
strtoken(tmpstr,system_note, " ");
if (!strcmp(tmpstr, "geniierf_lt"))
{
strtoken(tmpstr, "", " ");
ocm[0] = atof(tmpstr);
strtoken(tmpstr, "", " ");
ocm[1] = 1.0/(6.0*atof(tmpstr));
for (ic = 0; ic < 7; ic++)
{
strtoken(tmpstr, "", " ");
ocm[44 + ic] = atof(tmpstr);
}
strtoken(tmpstr, "", " ");
ocm[14] = atof(tmpstr);
strtoken(tmpstr, "", " ");
ocm[29] = atof(tmpstr);
}
Ocm[2] = 2.1*Ocm[1];
Ocm[3] = 2.8*Ocm[1];
Ocm[4] = 3.0*Ocm[1];
Ocm[5] = 4.0*Ocm[1];
Ocm[6] = Ocm[0]*Ocm[1]/3.0;
Ocm[7] = 3.2*Ocm[0]*Ocm[1];
if (opdw)
{
Ocm[6] *= 1000.0*uni/wv[1];
Ocm[7] *= 1000.0*uni/wv[1];
}
Ocm[8] = 0.0001;
/* paraxial axial ray slope */
paraxial_trace();
/* save u' */
pu = ssb(1, 2);
Ocm[9] = pu + Ocm[0];
/* on-axis reference ray */
ssbuf_reset(1, 0);
trace_ray_derivs(0.0, 0.0, 0.0, 0.0, 0.0);
/* focus shift */
Ocm[10] = ssb(4, 1);
/* paraxial image height */
pyht = ssb(5, 1);
/* On axis DY, OPD, DMD */
ssbuf_reset(1, 0);
trace_fan(y, all, 1, Ocm[44], Ocm[44], 0.0);
Ocm[11] = ssb(1, 5);
Ocm[12] = ssb(1, 8);
Ocm[13] = ssb(1, 9);
/* 0.7 field reference ray */
ssbuf_reset(1, 0);
trace_ray_derivs(0.7, 0.0, 0.0, 0.0, 0.0);
/* distortion */
if (fabs(pyht) < 1.0e-40)
Ocm[15] = 0.0;
else
Ocm[15] = 100.0*(ssb(3, 1)/0.7 - pyht)/pyht;
/* field curvature */
Ocm[17] = ssb(4, 1);
Ocm[18] = ssb(4, 4);
fy = ssb(2, 3);
/* coma */
ssbuf_reset(1, 0);
trace_fan(y, std, 3, fy - 1.0e-4, fy + 1.0e-4, 0.0);
Ocm[19] = 0.3333333e+08*rn[ims - 1][1]*pu*(ssb(3, 5) - 2.0*ssb(2,
5) + ssb(1, 5));
if (opdw)
{
w2d = 1000.0*uni/wv[1];
Ocm[19] *= w2d;
}
/* meridional rays */
ssbuf_reset(1, 0);
trace_fan(y, all, 2, Ocm[45], Ocm[46], 0.0);
Ocm[20] = ssb(1, 5);
Ocm[21] = ssb(1, 8);
Ocm[22] = ssb(1, 9);
Ocm[23] = ssb(2, 5);
Ocm[24] = ssb(2, 8);
Ocm[25] = ssb(2, 9);
/* sagittal ray */
trace_fan(x, all, 1, Ocm[47], Ocm[47], 0.0);
Ocm[26] = ssb(3, 6);
Ocm[27] = ssb(3, 5);
Ocm[28] = ssb(3, 8);
/* 1.0 field reference ray */
ssbuf_reset(1, 0);
trace_ray_derivs(1.0, 0.0, 0.0, 0.0, 0.0);
/* distortion */
if (fabs(pyht) < 1.0e-40)
Ocm[30] = 0.0;
else
Ocm[30] = 100.0*(ssb(3, 1) - pyht)/pyht;
/* field curvature */
Ocm[32] = ssb(4, 1);
Ocm[33] = ssb(4, 4);
fy = ssb(2, 3);
/* coma */
ssbuf_reset(1, 0);
trace_fan(y, std, 3, fy - 1.0e-4, fy + 1.0e-4, 0.0);
Ocm[34] = 0.3333333e+08*rn[ims - 1][1]*pu*(ssb(3, 5) - 2.0*ssb(2,
5) + ssb(1, 5));
if (opdw)
Ocm[34] *= w2d;
/* meridional rays */
ssbuf_reset(1, 0);
trace_fan(y, all, 2, Ocm[48], Ocm[49], 0.0);
Ocm[35] = ssb(1, 5);
Ocm[36] = ssb(1, 8);
Ocm[37] = ssb(1, 9);
Ocm[38] = ssb(2, 5);
Ocm[39] = ssb(2, 8);
Ocm[40] = ssb(2, 9);
/* sagittal ray */
trace_fan(x, all, 1, Ocm[50], Ocm[50], 0.0);
Ocm[41] = ssb(3, 6);
Ocm[42] = ssb(3, 5);
Ocm[43] = ssb(3, 8);
ssbuf_reset(-ssrow, 0);
set_preference(output_text, on);
if (apchk) aperture_check(on);
}
cmd oprds(void)
// hlp: <p>Provided for backward compatibility only. Use "opcb_abs"
instead.</p>
// kwd: operands, callbacks
// cat: optimization
{
int ssb_row_sav;
set_preference(outp, off);
ssb_row_sav = sbrow;
ssbuf_reset(ssb_row_sav, 6);
paraxial_trace();
Ocm[1] = ssb(1, 1); // py
Ocm[2] = ssb(1, 2); // pu
Ocm[3] = ssb(1, 4); // pyc
Ocm[4] = ssb(1, 5); // puc
chromatic_abers();
Ocm[6] = ssb(2, 1); // pac
Ocm[7] = ssb(2, 3); // plc
Ocm[8] = ssb(2, 2); // sac
Ocm[9] = ssb(2, 4); // slc
seidel_abers();
Ocm[11] = ssb(3, 1); // sa3
Ocm[12] = ssb(3, 2); // cma3
Ocm[13] = ssb(3, 3); // ast3
Ocm[14] = ssb(3, 4); // ptz3
Ocm[15] = ssb(3, 5); // dis3
fifth_order_abers();
Ocm[21] = ssb(4, 1); // sa5
Ocm[22] = ssb(4, 2); // cma5
Ocm[23] = ssb(4, 3); // ast5
Ocm[24] = ssb(4, 4); // ptz5
Ocm[25] = ssb(4, 5); // dis5
Ocm[31] = ssb(4, 6); // sa7
Ocm[41] = Ocm[11] + Ocm[21] + Ocm[31]; // total sph
paraxial_constants();
Ocm[0] = ssb(5, 1); // focal length (ang. mag.)
ssbuf_reset(-ssb_row_sav, 6);
set_preference(output_text, on);
}
===== End of op_callbaks.ccl =======================================
The optimization OCM definition template file:
===== Start of op_erfs.ccl =========================================
#include "..\..\public\ccl\inc\a_global.h"
cmd opabs_template(void)
// hlp: <P>Generates an error function containing all the 1st, 3rd, and
5th-order aberrations. The resulting
// hlp: error function can then be edited using the operands spreadsheet
editor to remove unwanted terms.
// hlp: Alternately, this command can be copied, renamed and edited to
make a custom operands generator for
// hlp: a specific type of system. Note that this command just sets up the
error function. The error function
// hlp: is evaluated by the <a href="commands_opcb_abs.htm">opcb_abs</a>
command in op_callbacks.ccl. If you want to add additional terms to your
// hlp: error function, you must also create a new callback command that
will evaluate them.</P>
// hlp: <P>NOTE: This is a <a
href="optimization_data_errorfunction_generators_abtemplate.htm">template</a>
to help you set up an error function, not a working error function. It
// hlp: will not work unless you delete the operands that don't apply to
your system!</P>
// kwd: error function, OCM, optimization, error function generator
// cat: optimization
{
int opnbr;
set_preference(output_text, off);
opt_oprdccl("opcb_abs");
operands(new);
opnbr = 0;
opnbr++;o(opnbr, ins, "OCM1 ", 0.0, "PY"); /* Axial ray height */
opnbr++;o(opnbr, ins, "OCM2 ", 0.0, "PU"); /* Axial ray slope */
opnbr++;o(opnbr, ins, "OCM3 ", 0.0, "PYC"); /* Chief ray height */
opnbr++;o(opnbr, ins, "OCM4 ", 0.0, "PUC"); /* Chief ray slope */
opnbr++;o(opnbr, ins, "OCM5 ", 0.0, "PAC"); /* Primary axial color */
opnbr++;o(opnbr, ins, "OCM6 ", 0.0, "PLC"); /* Primary lateral
color */
opnbr++;o(opnbr, ins, "OCM7 ", 0.0, "SAC"); /* Secondary axial
color */
opnbr++;o(opnbr, ins, "OCM8 ", 0.0, "SLC"); /* Secondary lateral
color */
opnbr++;o(opnbr, ins, "OCM9 ", 0.0, "SA3"); /* 3rd-order spherical */
opnbr++;o(opnbr, ins, "OCM10", 0.0, "CMA3"); /* 3rd-order coma*/
opnbr++;o(opnbr, ins, "OCM11", 0.0, "AST3"); /* 3rd-order
astigmatism*/
opnbr++;o(opnbr, ins, "OCM12", 0.0, "PTZ3"); /* 3rd-order Petzval
blur */
opnbr++;o(opnbr, ins, "OCM13", 0.0, "DIS3"); /* 3rd-order distortion*/
opnbr++;o(opnbr, ins, "OCM14", 0.0, "SA5"); /* 5th-order
spherical aberration*/
opnbr++;o(opnbr, ins, "OCM15", 0.0, "CMA5"); /* 5th-order linear
coma */
opnbr++;o(opnbr, ins, "OCM16", 0.0, "AST5"); /* 5th-order
astigmatism */
opnbr++;o(opnbr, ins, "OCM17", 0.0, "PTZ5"); /* 5th-order Petzval
blur */
opnbr++;o(opnbr, ins, "OCM18", 0.0, "DIS5"); /* 5th-order
distortion */
opnbr++;o(opnbr, ins, "OCM19", 0.0, "SA7"); /* 7th-order
spherical aberration */
opnbr++;o(opnbr, ins, "OCM20", 1.0, "TOTAL_SPH"); /* Total
(3rd+5th+7th) spherical*/
opnbr++;o(opnbr, ins, "OCM21", 0.0, "EFL"); /* Effective focal
length */
opnbr++;o(opnbr, ins, "OCM23", 1.0, "TH0+TH5"); /* Thickness */
end();
set_preference(output_text, on);
}
===== End of op_erfs.ccl ===========================================
Best Regards,
John D. Upton
Georgetown, TX
<http://www.atm-workshop.com/> "The ATM's Workshop Page"
<http://hometown.aol.com/RonWin20/> "Ronchi For Windows Software Page"