File: Vitess_ChopperFermi.comp

package info (click to toggle)
mccode 3.5.19%2Bds5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,113,256 kB
  • sloc: ansic: 40,697; python: 25,137; yacc: 8,438; sh: 5,405; javascript: 4,596; lex: 1,632; cpp: 742; perl: 296; lisp: 273; makefile: 226; fortran: 132
file content (246 lines) | stat: -rw-r--r-- 9,320 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
/*******************************************************************************
*
* VITESS and McStas, neutron ray-tracing packages
*         Copyright 1997-2005, All rights reserved
*         Hahn-Meitner-Institut Berlin, Germany
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Component: Vitess_ChopperFermi
*
* %I
* Written by: Geza Zsigmond
* Date: Sep 2004
* Origin: VITESS module 'chopper_fermi'
* Modified by: adapted for McStas by <a href="mailto:lieutena@ill.fr">K. Lieutenant</a>, Mar 2005;
*
* Fermi chopper with absorbing walls using the VITESS module 'chopper_fermi'
*
* %D
* This component simulates a Fermi chopper with absorbing walls. The rotation axis is
* vertical (y-axis), i.e. the path length through the channels is given by the length
* 'depth' along the z-axis.
* The shape of the channels can be straight, curved with circular, or curved with ideal
* (i.e. close to a parabolic) shape. This is determined by the parameter 'GeomOption'.
*
* Geometry for straight and circular channels:
* The geometry of the chopper consists of a rectangular shaped object with a channel
* system. In transmission position, there are 'Nchannels' slits along the x-axis,
* separated by absorbing walls of thickness 'wallwidth' giving a total width 'width'.
* The rectangular channel system is surrounded by a so-called shadowing cylinder
* (cf component manual).
*
* Geometry for parabolic channels:
* In this case, the Fermi chopper is supposed to be a full cylinder, i.e. the central
* channels are longer than those on the edges (cf. figure in the component manual).
* The other features are the same as for the other options.
*
* Apart from the frequency of rotation, the phase of the chopper at t=0 has to be given;
* phase = 0 means transmission orientation.
*
* The option 'zerotime' may be used to reset the time at the chopper position. The
* consequence is that only 1 pulse is generated instead of several.
*
* NOTE: This component must NOT be located at the same position as the previous one.
*       This also stands for monitors and Arms. A non zero distance must be defined.
*
* Examples:
*  straight Fermi chopper, 18000 rpm, 20 channels a 0.9 mm separated by 0.1 mm walls,
*  16 mm channel length, minimal shadowing cylinder, phased to be open at 1 ms,
*  generation of only 1 pulse, normal precision (for short wavelength neutrons)
* Vitess_ChopperFermi(GeomOption=0, zerotime=1,  Nchannels=20,  Ngates=4,
*                     freq=300.0,   height=0.06, width=0.0201,
*                     depth=0.016,  r_curv=0.0,  diameter=0.025691, Phase=-108.0,
*                     wallwidth=0.0001, sGeomFileName="FC_geom_str.dat")
*
*  Fermi chopper with circular channels, 12000 rpm, optimized for 6 Ang, several pulses,
*  highest accuracy (because of long wavelength neutrons used), rest as above
* Vitess_ChopperFermi(GeomOption=2, zerotime=0,    Nchannels=20,  Ngates=8,
*                     freq=200.0,   height=0.06,   width=0.0201,
*                     depth=0.016,  r_curv=0.2623, diameter=0.025691, Phase=-72.0,
*                     wallwidth=0.0001, sGeomFileName="FC_geom_circ.dat")
*
* %VALIDATION
* Apr 2005: extensive external test, most problems solved (cf. 'Bugs' and source header)
* Validated by: K. Lieutenant
*
* limitations: slow (10 times slower than FermiChopper), especially for a high number of channels
*
* %BUGS
* reduction of transmission by a large shadowing cylinder underestimated
*
* %P
* GeomOption: [1]       option: 0:straight 1:parabolic 2:circular
* zerotime: [1]         option: 1:'set time to zero'  0: 'do not'
* Nchannels: [1]        number of channels of the Fermi chopper
* Ngates: [1]           number of gates defining the channel: 4=default, 6 or 8 for long wavelengths
* freq: [Hz]            number of rotations per second
* height: [m]           height of the Fermi chopper
* width: [m]            total width of the Fermi chopper
* depth: [m]            channel length of the Fermi chopper
* r_curv: [m]           radius of curvature of the curved Fermi chopper
* diameter: [m]         diameter of the shadowing cylinder
* Phase: [deg]          dephasing angle at zero time
* wallwidth: [m]        thickness of walls separating the channels
* sGeomFileName: [str]  name of output file for geometry information
*
* CALCULATED PARAMETERS:
* Option: [-]           1: straight FC,  2: curved FC
* CurvGeomOption: [-]   1: ideal shape (nearly parabolic)  2: circular
* TOF: [ms]             TOF of neutron under consideration
* WL: [Ang]             wavelength of neutron
* radius_of_curv: [cm]  radius of curvature (curved FC)
* main_depth: [cm]      max. channel length due to diameter and total_width
* shift_y: [cm]         shift to channel actually written to geometry file
* angle_channel: [rad]  half of the curvature of a curved Fermi chopper
* phase0: [rad]         chopper phase at TOF of neutron to chopper centre
* y_ch: [cm]            position of gates perpendicular to flight direction
* x_ch: [cm]            position of gates along flight direction
* coef_pi: [-]          number of half-rotation to reach identical state
* GeomFilePtr: [-]      pointer to geometry file name
* Pos: [cm]             position of neutron
* Dir: [-]              flight direction of neutron
* Neutrons: [-]         neutron parameter set at end of chopper
* pos_ch: [cm]          centre position of the Fermi chopper
* omega: [1/s]          angular frequency of the chopper
* optimal_wl: [Ang]     wavelength of highest transmission of curved FC
*
*
* %Link
* <a href="http://www.hmi.de/projects/ess/vitess/DOC/chopper_fermi_str.html">straight VITESS Fermi chopper</a>
* %Link
* <a href="http://www.hmi.de/projects/ess/vitess/DOC/chopper_fermi_cur.html">curved VITESS Fermi chopper</a>
*
* %E
*******************************************************************************/

DEFINE COMPONENT Vitess_ChopperFermi

SETTING PARAMETERS (string sGeomFileName=0, int GeomOption=0, int zerotime=0, 
  int Nchannels=20, int Ngates=4,
  freq=300.0, height=0.05, width=0.04,
  depth=0.03, r_curv=0.5, diameter=0.071, Phase=0.0,
  wallwidth=0.0002)

/* Neutron parameters: (x,y,z,vx,vy,vz,t,sx,sy,sz,p) */

SHARE
%{
  %include "general.c"
  %include "intersection.c"
  %include "vitess-lib"
  %include "chopper_fermi"
%}

DECLARE
%{

  double omega;      /* rotation frequency */
  double optimal_wl; /* optimal wavelength */
  VectorType pos_ch; /* centre pos. of the FC in the frame of the exit of the prev. comp. [cm] */

%}

INITIALIZE
%{
omega = 0.0;
optimal_wl = 0.0;

double x,y,z;
coords_get(POS_R_COMP_INDEX(INDEX_CURRENT_COMP), &x, &y, &z);
  pos_ch[0] = -100.0 * z;
  pos_ch[1] = -100.0 * x;
  pos_ch[2] = -100.0 * y;

  McInitVt();

  /* transformation of units */
  height    *= 100.0; /* m -> cm */
  width     *= 100.0;
  depth     *= 100.0;
  diameter  *= 100.0;
  r_curv    *= 100.0;
  wallwidth *= 100.0;
  omega      = freq*2*PI/1000.0;  /* 1/s -> 2pi/ms */
  Phase     *= DEG2RAD;

  /* checks and completion of input data */
  CurvGeomOption = (int) GeomOption;
  if (GeomOption > 0 && omega*r_curv==0)
  { 
    printf("Error: 'omega*r_curv' must not be zero for curved Fermi chopper"); exit(-1);
  }
  switch(GeomOption)
  {
    case 0: Option=1; optimal_wl=0.0;    break;
    case 1: Option=2; optimal_wl=LAMBDA_FROM_V(2.0*omega*r_curv); break;
    case 2: Option=2; optimal_wl=LAMBDA_FROM_V(2.0*omega*r_curv); break;
    default: printf("Wrong option! Good options: 0-straight, 1-parabolic, 2-circular");
  }

  ChopperFermiInit(0, NULL);
%}

TRACE
%{
 int i=0;
 InputNeutrons[i] = mcstas2vitess(x, y, z, vx, vy, vz, t, sx, sy, sz, p);
 #define  MCSTAS_TRACE
 %include "chopper_fermi.c"
 #undef   MCSTAS_TRACE
 vitess2mcstas(Neutrons, &x, &y, &z, &vx, &vy, &vz, &t, &sx, &sy, &sz, &p);
%}

FINALLY
%{
 ChopperFermiCleanup();
 McCleanupVt();
%}

MCDISPLAY
%{
  double index=0;
  double xpos, zpos, ymin, ymax, rad, w_ch;
  Nchannels = (Nchannels > 11 ? 11 : Nchannels);
  w_ch = (width - (Nchannels+1) * wallwidth) / Nchannels/100;
  rad  = diameter/2.0/100;
  ymin = -height/2.0/100;
  ymax =  height/2.0/100;
  
  /* cylinder top/center/bottom  */
  circle("xz", 0,ymax,0,rad);
  circle("xz", 0,0   ,0,rad);
  circle("xz", 0,ymin,0,rad);
  /* vertical lines to make a kind of volume */
  line( 0  ,ymin,-rad, 0  ,ymax,-rad);
  line( 0  ,ymin, rad, 0  ,ymax, rad);
  line(-rad,ymin, 0  ,-rad,ymax, 0  );
  line( rad,ymin, 0  , rad,ymax, 0  );
  /* slit package */
  index = -Nchannels/2;
  zpos  = depth/2/100;
  for (index = -Nchannels/2; index < Nchannels/2; index++) {
    xpos = index*w_ch;
    multiline(5, xpos, ymin, -zpos,
                 xpos, ymax, -zpos,
                 xpos, ymax, +zpos,
                 xpos, ymin, +zpos,
                 xpos, ymin, -zpos);
  }
  /* cylinder inner sides containing slit package */
  xpos = Nchannels*w_ch/2;
  zpos = sqrt(rad*rad - xpos*xpos);
  multiline(5,   xpos, ymin, -zpos,
                 xpos, ymax, -zpos,
                 xpos, ymax, +zpos,
                 xpos, ymin, +zpos,
                 xpos, ymin, -zpos);
  xpos *= -1;
  multiline(5,   xpos, ymin, -zpos,
                 xpos, ymax, -zpos,
                 xpos, ymax, +zpos,
                 xpos, ymin, +zpos,
                 xpos, ymin, -zpos);
%}

END