/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright 1997-2002, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Component: Chopper * * %I * Written by: Philipp Bernhardt * Date: Januar 22 1999 * Version: $Revision: 1.20 $ * Origin: Risoe * Release: McStas 1.6 * * Disk chopper. * * %D * Models a disc chopper with n identical slits, which are symmetrically disposed * on the disc. * If the chopper is the 1st chopper of the instrument, it sets t time with phase * * Example: Chopper(R=0.2, w=0.05, f=2500.0, n=3, pha=0, IsFirst=1) First chopper * Chopper(R=0.2, w=0.05, f=2500.0, n=3, pha=0, IsFirst=0) * * %P * INPUT PARAMETERS: * * w: (m) Width of the slits at the bottom side * R: (m) Radius of the disc * f: (rad/s) angular frequency of the Chopper * (algebraic sign defines the direction of rotation) * n: (1) Number of slits * pha: (s) Phase * * Optional parameters: * IsFirst: (0/1) Set it to 1 for the first chopper position in a cw source * (it then spreads the neutron time distribution) * n_pulse: (1) Number of pulses * * %D * Example values: w=0.05 R=0.5 f=2500 n=3 pha=0 n_pulse=1 * * %E *******************************************************************************/ DEFINE COMPONENT Chopper DEFINITION PARAMETERS () SETTING PARAMETERS (R, w=0.05, f=2500.0, n=3, pha=0, IsFirst=0, n_pulse=1) OUTPUT PARAMETERS (Tg, T, To) STATE PARAMETERS (x, y, z, vx, vy, vz, t, s1, s2, p) DECLARE %{ double Tg,To; %} INITIALIZE %{ if (n<=0 || w < 0 || R <=0) { fprintf(stderr,"Chopper: %s: n, w and R must be > 0\n", NAME_CURRENT_COMP); exit(-1); } if (IsFirst && n_pulse <=0) { fprintf(stderr,"Chopper: %s: wrong First chopper pulse number (n_pulse)\n", NAME_CURRENT_COMP); exit(-1); } /* time between two pulses */ Tg=2*PI/fabs(f)/n; /* how long can neutrons pass the Chopper at a single point */ To=2*atan(w/R/2.0)/fabs(f); %} TRACE %{ double toff; PROP_Z0; if (IsFirst) { t=atan2(x,y+R)/f+To*(rand01()-0.5)+pha+floor(n_pulse*rand01())*Tg; p*=n*atan2(w,R)/2/PI; } else { toff=fabs(t-atan2(x,y+R)/f-pha)+To/2.0; /* does neutron hit the slit? */ if (fmod(toff,Tg)>To) ABSORB; } SCATTER; %} MCDISPLAY %{ magnify("xy"); circle("xy", 0, 0, 0, R); %} END