File: He3_cell.comp

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 (144 lines) | stat: -rw-r--r-- 4,650 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
/***************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2002, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Component: He3_cell
*
* %Identification
* Written by: Trefor Roberts & Erik B Knudsen
* Date: March 1999
* Origin: ILL/DTU Physics
* version: $Revision$
*
* Polarised 3He cell
*
* %Description
* Simple cylindrical polarised 3He neutron spin filter cell.
* The glass container for the cell is not included in the model.
*
* This component has been validated against:
* Batz, M, Baessler, S, Heil, W, et al., J Res Natl Inst Stand Technol. 2005;110(3):293–298.
*
* Example: He3_cell(radius=0.1,length=.2,pressure=3,p3he=0.7,bx=0,by=1e-3,bz=0)
*
* %Parameters
* Input parameters:
*
* radius: [m]      radius of the cylinder 
* length: [m]      length of the cylinder 
* pressure: [bar]  pressure of the gas in the cell 
* p3he:      polarisation of the 3He gas [-1 to +1]
* bx: [tesla]      x component of field at the cell 
* by: [tesla]      y component of field at the cell 
* bz: [tesla]      z component of field at the cell 
*
* %End
***************************************************************************/

DEFINE COMPONENT He3_cell

SETTING PARAMETERS (radius,length,pressure=3,p3he=0.7,bx=0,by=1e-3,bz=0)

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

DECLARE
%{
%}

INITIALIZE
%{
%}

TRACE
%{

  double t0,t1;        /* time that neutron enters and leaves gas (s) */
  double v,lambda;      /* neutron velocity and wavelength (ms-1, Anstroms) */
  double l_full;       /* path length of neutron through gas (m) */
  double dt0;          /* time neutron spends in the gas (s) */
  double opacity;      /* opacity of the gas for this neutron (dimless) */
  double omega;        /* angle through which polarisation precesses
                          over the path through the cell (radians) */
  double px,py,pz;     /* auxilliary vector polarisation (-1 to +1) */
  double bnx,bny,bnz;  /* normal vector parallel to the magnetic field*/

  const double gyro = 1.832e8; /*absolute value of the gyromagnetic ratio of the neutron (1/(s.T))*/
  const double opac_cnv = 7.33; /*opacity conversion factor to express opacity in (bar.m.angstrom)*/


  /* calculate the intersection times with the volume of gas, if the neutron
     goes through the cell, continue with calculation otherwise all done.
     Note that y and z are swapped - this is because the cylindrical axis of
     a 3He cell lies along the beam. */

  if(cylinder_intersect(&t0,&t1,x,z,y,vx,vz,vy,radius,length))
  {
    /* Calculate the neutron velocity and wavelength */
    v=sqrt(vx*vx+vy*vy+vz*vz);
    lambda=2*PI/(V2K*v);

    /* Calculate the path length of the neutron through the gas */
    dt0=t1-t0;
    l_full=v*dt0;

    /* Calculate the opacity of the cell for the path length travelled */
    opacity=pressure*l_full*lambda*opac_cnv;

    /* propagate the polarisation accross the cell (assuming a constant
       magnetic field).  The actual interaction point is not taken into account
       as only the parallel and perpendicular components are important. */

    omega=dt0*gyro*sqrt(bx*bx+by*by+bz*bz);
    rotate(px,py,pz,sx,sy,sz,omega,bx,by,bz);
    sx=px;
    sy=py;
    sz=pz;

    /* adjust the neutron weight according to spin state relative to the
       3He nuclei - antiparallel spins are as good as absorbed, whereas parallel
       spins are transmitted (depending upon degree of polarisation of gas */
    bnx=bx;bny=by;bnz=bz;
    NORM(bnx,bny,bnz);
    double pm1=scalar_prod(sx,sy,sz,bnx,bny,bnz);
    double phiu,phid,T, Tup,Tdown;

    phiu=((pm1)+1)/2.0;
    phid=(1-(pm1))/2.0;
    Tup=exp(-opacity*(1.0-p3he));
    Tdown=exp(-opacity*(1.0+p3he));

    p*=phiu*Tup + phid*Tdown;

    /*set the outgoing polarization vector without touching the part perpendicular
      to the polarisation of the gas .
      Perpendicular comp: P_=S - P// = S - (S.b_n)b_n
      Parallel comp: P// = Pn bn, where Pn is the polarisation efficiency.*/
    px=sx - pm1*bnx;
    py=sy - pm1*bny;
    pz=sz - pm1*bnz;


    double Pn=(Tup-Tdown)/(Tup+Tdown);
    sx=px + Pn*bnx;
    sy=py + Pn*bny;
    sz=pz + Pn*bnz;

    SCATTER;
  }
%}

MCDISPLAY
%{
  
  circle("xy",0.0,0.0,-length/2.0,radius);
  circle("xy",0.0,0.0,length/2.0,radius);
  line(0.0,radius,-length/2.0,0.0,radius,length/2.0);
  line(radius,0.0,-length/2.0,radius,0.0,length/2.0);
  line(0.0,-radius,-length/2.0,0.0,-radius,length/2.0);
  line(-radius,0.0,-length/2.0,-radius,0.0,length/2.0);
%}

END