/*******************************************************************************
*
* McStas, neutron ray-tracing package
* Copyright 1997-2002, All rights reserved
* Risoe National Laboratory, Roskilde, Denmark
* Institut Laue Langevin, Grenoble, France
*
* Component: Filter_graphite
*
* %IDENTIFICATION
*
* Written by: Thomas C Hansen
* Date: 07 March 2000
* Origin: ILL
* Modified by: E. Farhi, uniformize parameter names (Jul 2008)
*
* Pyrolytic graphite filter (analytical model)
*
* %DESCRIPTION
*
* This rectangular pyrolytic graphite filter uses an analytical model
* with linear interpolation on the neutron wavelength
* This type of filter is e.g. used to supress higher harmonics, such as
* the 1.2 AA contribution to the 2.4 AA obtained by a highly oriented
* pyrolytic graphite (HOPG) monochromator.
*
* Example: Filter_graphite(xmin=-.05, xmax=.05, ymin=-.05, ymax=.05, length=1.0)
*
* %PARAMETERS
*
* INPUT PARAMETERS:
*
* xmin: [m] Lower x bound
* xmax: [m] Upper x bound
* ymin: [m] Lower y bound
* ymax: [m] Upper y bound
* length: [m] Thickness of graphite plate
* xwidth: [m] Width of filter. Overrides xmin,xmax.
* yheight: [m] Height of filter. Overrides ymin,ymax.
*
* %END
*
*******************************************************************************/
DEFINE COMPONENT Filter_graphite
DEFINITION PARAMETERS ()
SETTING PARAMETERS (xmin=-0.16, xmax=0.16, ymin=-0.16, ymax=0.16, length=0.05, xwidth=0, yheight=0)
OUTPUT PARAMETERS ()
/* Neutron parameters: (x,y,z,vx,vy,vz,t,sx,sy,sz,p) */
INITIALIZE
%{
if (xwidth > 0) { xmax = xwidth/2; xmin = -xmax; }
if (yheight > 0) { ymax = yheight/2; ymin = -ymax; }
if (xmin == 0 && xmax == 0 && ymin == 0 & ymax == 0)
{ fprintf(stderr,"Filter_graphite: %s: Error: give geometry\n", NAME_CURRENT_COMP); exit(-1); }
%}
TRACE
%{
double L,L1,L0,T1,T0, Filt_T;
double dt;
PROP_Z0;
L = (2*PI/V2K)/sqrt(vx*vx + vy*vy + vz*vz);
if (xxmax || yymax) ABSORB;
dt = length/vz;
PROP_DT(dt);
if (xxmax || yymax) ABSORB;
if (L>2.60) {L1= L ;L0=2.60;T1=0.06;T0=0.06;};
if (L<2.60 && L>=2.40) {L1=2.60;L0=2.40;T1=0.06;T0=0.05;};
if (L<2.40 && L>=2.30) {L1=2.40;L0=2.30;T1=0.05;T0=0.09;};
if (L<2.30 && L>=2.20) {L1=2.30;L0=2.20;T1=0.09;T0=0.22;};
if (L<2.20 && L>=2.00) {L1=2.20;L0=2.00;T1=0.22;T0=0.34;};
if (L<2.00 && L>=1.90) {L1=2.00;L0=1.90;T1=0.34;T0=0.61;};
if (L<1.90 && L>=1.80) {L1=1.90;L0=1.80;T1=0.61;T0=0.23;};
if (L<1.80 && L>=1.60) {L1=1.80;L0=1.60;T1=0.23;T0=0.25;};
if (L<1.60 && L>=1.40) {L1=1.60;L0=1.40;T1=0.25;T0=0.27;};
if (L<1.40 && L>=1.30) {L1=1.40;L0=1.30;T1=0.27;T0=0.53;};
if (L<1.30 && L>=1.20) {L1=1.30;L0=1.20;T1=0.53;T0=0.98;};
if (L<1.20 && L>=1.10) {L1=1.20;L0=1.10;T1=0.98;T0=0.89;};
if (L<1.10 && L>=1.00) {L1=1.10;L0=1.00;T1=0.89;T0=0.52;};
if (L<1.00 && L>=0.87) {L1=1.00;L0=0.87;T1=0.52;T0=0.47;};
if (L<0.87) {L1=0.87;L0= L ;T1=0.47;T0=0.47;};
Filt_T=(T0+(L-L0)/(L1-L0)*(T1-T0))*100.0;
Filt_T = exp(-Filt_T*length);
p*=Filt_T;
SCATTER;
%}
MCDISPLAY
%{
multiline(5, (double)xmin, (double)ymin, 0.0,
(double)xmax, (double)ymin, 0.0,
(double)xmax, (double)ymax, 0.0,
(double)xmin, (double)ymax, 0.0,
(double)xmin, (double)ymin, 0.0);
multiline(5, (double)xmin, (double)ymin, (double)length,
(double)xmax, (double)ymin, (double)length,
(double)xmax, (double)ymax, (double)length,
(double)xmin, (double)ymax, (double)length,
(double)xmin, (double)ymin, (double)length);
line(xmin, ymin, 0.0, xmin, ymin, length);
line(xmax, ymin, 0.0, xmax, ymin, length);
line(xmin, ymax, 0.0, xmin, ymax, length);
line(xmax, ymax, 0.0, xmax, ymax, length);
%}
END