File: Test_Fermi.instr

package info (click to toggle)
mccode 3.5.19%2Bds5-2
  • links: PTS, VCS
  • area: main
  • in suites: 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 (146 lines) | stat: -rw-r--r-- 5,074 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
/*******************************************************************************
*         McStas instrument definition URL=http://www.mcstas.org
*
* Instrument: Test_Fermi
*
* %Identification
* Written by: E. Farhi [farhi@ill.fr]
* Date: Sept 1st, 2008
* Origin: ILL
* %INSTRUMENT_SITE: Tests_optics
*
* Cross comparison of Fermi Chopper components
*
* %Description
* Cross comparison of Fermi Chopper components, using McStas and
* contributed components, as well as rotating collimator approximations. It
* shows that all implementations are equivalent. However, approximating rotating
* guide are 30% faster than McStas Fermi chopper.
*
* %Example: Fermi=1 Detector: Monitor2_xt_I=0.00051256
* %Example: Fermi=3 Detector: Monitor2_xt_I=0.00051377
* %Example: Fermi=4 Detector: Monitor2_xt_I=0.000572427
* %Example: Fermi=5 Detector: Monitor2_xt_I=0.00058003
*
* %Parameters
* Fermi: [1]      Choice of Fermi chopper component to test, with 1=FermiChopper, 3=FermiChopper_ILL, 4=rotating Guide_gravity, 5=rotating Guide_channeled
* width_FC: [m]   total slit pack width
* height_FC: [m]  height of FC slit pack
* length_FC: [m]  length of FC slit pack
* FC_Hz: [Hz]     rotation speed. Omega=2*PI*nu in rad/s, nu*60 in rpm
* d_SF: [m]       distance from Source to FC center
* d_FD: [m]       distance from FC center to Detector
* phase: [deg]    FC phase. Use -0 for automatic
* lambda: [AA]    Mean wavelength from source
* Nslit_FC: []    Number of slits in FC slit package
* time_to_arrival:  
*
* %End
*******************************************************************************/
DEFINE INSTRUMENT Test_Fermi(int Fermi=1, lambda=3.39, width_FC=0.044, height_FC=0.064,length_FC=0.012, FC_Hz=100, Nslit_FC=120,d_SF=3, d_FD=3, phase=271.92, time_to_arrival=0, time_window_width=0)

DECLARE %{
  double Time_window_width;
  #pragma acc declare create(Time_window_width)
%}

INITIALIZE
%{
  printf("\nTest_Fermi: ");
  switch (Fermi) {
  case 1:
    printf("Using FermiChopper\n"); break;
  case 2:
    printf("Using Vitess_ChopperFermi - unsupported.\n"); exit(0);
  case 3:
    printf("Using FermiChopper_ILL\n"); break;
  case 4:
    printf("Using rotating Guide_gravity\n"); break;
  case 5:
    printf("Using rotating Guide_channeled\n"); break;
  }

  double w = width_FC/Nslit_FC;
  double v = 3956/lambda;

  printf("\nTheor: Lambda=%g [Angs]\n",
    3956*w/2/PI/FC_Hz/length_FC/length_FC/2);

  printf("Theor: Time from source  t=%g [s]\n", d_SF/v);
  printf("Theor: Time to detection t=%g [s]\n", d_FD/v);
  printf("       Time period      dt=%g [s]\n", 1/FC_Hz);
  printf("       Slit pack div       %g [deg] (full width)\n", 2*atan2(w,length_FC)/PI*180);
  printf("       Time window width  =%g [s] (pulse width)\n",
    atan2(w,length_FC)/PI/FC_Hz);
  printf("       Phase           phi=%g [deg]\n", (d_SF/v)/(1/FC_Hz)*360);

  time_to_arrival  = (d_SF/v);
  time_window_width = atan2(w,length_FC)/PI/FC_Hz;
  if (phase == -0) phase=(d_SF/v)/(1/FC_Hz)*360; /* assumes time at source is centered on 0 */
  Time_window_width = time_window_width;
  #pragma acc update device(Time_window_width)
%}

TRACE

COMPONENT Origin = Progress_bar()
  AT (0,0,0) ABSOLUTE


COMPONENT Source = Source_gen(
   focus_xw = width_FC, focus_yh = height_FC, lambda0 = lambda, dlambda = 0.3,
   yheight = height_FC, xwidth = width_FC)
  AT (0, 0, 0) RELATIVE PREVIOUS
EXTEND %{
  /* 1 ms triangle time window */
  // t = randtriangle()*1e-3;  /* trianglular distribution */
  // t = randpm1()*time_window_width-time_to_arrival;          /* rectangular distribution */
  t = randpm1()*Time_window_width;
  vx=vy=0;
%}

COMPONENT Monitor1_xt = Monitor_nD(
    options = "multiple x y time limits=[2.1e-3 2.8e-3] bins=40 ", xwidth = width_FC, yheight = height_FC)
  AT (0, 0, d_SF-0.1) RELATIVE PREVIOUS

COMPONENT FC_Position = Arm( )
  AT (0, 0, 0.1) RELATIVE PREVIOUS

COMPONENT FC_GuideG = Guide_gravity(
    w1 = width_FC, h1 = height_FC, l = length_FC, R0 = 0.0, nslit=Nslit_FC, d=0, nu=FC_Hz,phase=phase)
  WHEN (Fermi == 4)
  AT (0, 0, -length_FC/2.0) RELATIVE FC_Position
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT FC_GuideC = Guide_channeled(
    w1 = width_FC, h1 = height_FC, l = length_FC, R0 = 0.0, nslit=Nslit_FC, d=0, nu=FC_Hz,phase=phase)
  WHEN (Fermi == 5)
  AT (0, 0, -length_FC/2.0) RELATIVE FC_Position
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT FC_McStas = FermiChopper(
    radius = 0.1, nu = FC_Hz, xwidth = width_FC, yheight = height_FC, nslit=Nslit_FC, length=length_FC,
    verbose=1, phase=phase)
  WHEN (Fermi == 1)
  AT (0, 0, 0) RELATIVE FC_Position

COMPONENT FC_ILL = FermiChopper_ILL(
    radius = 0.1, nu = FC_Hz, yheight = height_FC,
    nslit = Nslit_FC, length = length_FC, xwidth = width_FC,phase=phase)
  WHEN (Fermi ==3)
  AT (0, 0, 0) RELATIVE FC_Position

COMPONENT Fake_Origin = Arm()
  AT (0,0,0) ABSOLUTE

COMPONENT Monitor2_xt = Monitor_nD(
    options = "multiple x y time limits=[4.7e-3 5.1e-3] bins=40",
    restore_neutron=1,
    xwidth = width_FC, yheight = height_FC)
  AT (0, 0, d_FD) RELATIVE FC_Position

END