/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright 1997-2002, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Component: Pol_FieldBox * * %I * * Written by: Erik B Knudsen and P Willendrup * Date: 2013 * Version: $Revision$ * Release: McStas 2.0 * Origin: Risoe * * Box containing a constant magnetic field * * %D * * * %P * xwidth: [m] Width of the box containing the field. * yheight: [m] Height of the box containing the field. * zdepth: [m] Depth of the box containing the field. * Bx: [T] Magnetic field strength along the x-axis. * By: [T] Magnetic field strength along the y-axis. * Bz: [T] Magnetic field strength along the z-axis. * filename: [text] Name of file containing the magnetic field. * * %E *******************************************************************************/ DEFINE COMPONENT Pol_FieldBox DEFINITION PARAMETERS () SETTING PARAMETERS (xwidth,yheight,zdepth, Bx=0,By=1e-3,Bz=0) OUTPUT PARAMETERS () /* Neutron parameters: (x,y,z,vx,vy,vz,t,sx,sy,sz,p) */ SHARE %{ %include "pol-lib" %} DECLARE %{ double Bprms[3]; %} INITIALIZE %{ /*constant magnetic field in the box*/ Bprms[0]=Bx;Bprms[1]=By;Bprms[2]=Bz; %} TRACE %{ int hit; double t0,t1; if (hit=box_intersect(&t0,&t1,x,y,z,vx,vy,vz,xwidth,yheight,zdepth)){ if(t0>0) PROP_DT(t0); double phi_prec; if(t1-t0>0){ PROP_DT(t1-t0); /*do the precession "manually"*/ phi_prec= fmod(sqrt(Bx*Bx+ By*By+ Bz*Bz) * (t1-t0)*mc_pol_omegaL, 2*PI); double sx_i,sy_i,sz_i; sx_i=sx;sy_i=sy;sz_i=sz; rotate(sx, sy, sz, sx_i,sy_i,sz_i, phi_prec, Bx, By, Bz); } } %} MCDISPLAY %{ const int nDash = 10; double xw_2,yh_2,zd_2; xw_2=xwidth/2.0;yh_2=yheight/2.0;zd_2=zdepth/2.0; /*entrance*/ dashed_line(-xw_2, -yh_2, +zd_2, xw_2, -yh_2, -zd_2, nDash); dashed_line(-xw_2, -yh_2, +zd_2, -xw_2, yh_2, +zd_2, nDash); dashed_line( xw_2, yh_2, -zd_2, -xw_2, yh_2, +zd_2, nDash); dashed_line( xw_2, yh_2, -zd_2, xw_2, -yh_2, -zd_2, nDash); /*exit*/ dashed_line(-xw_2, -yh_2, zdepth+zd_2, xw_2, -yh_2, zdepth-zd_2, nDash); dashed_line(-xw_2, -yh_2, zdepth+zd_2, -xw_2, yh_2, zdepth+zd_2, nDash); dashed_line( xw_2, yh_2, zdepth-zd_2, -xw_2, yh_2, zdepth+zd_2, nDash); dashed_line( xw_2, yh_2, zdepth-zd_2, xw_2, -yh_2, zdepth-zd_2, nDash); /*4 lines to make a box*/ dashed_line(-xw_2, -yh_2, +zd_2, -xw_2, -yh_2, zdepth+zd_2, nDash); dashed_line(-xw_2, yh_2, +zd_2, -xw_2, yh_2, zdepth+zd_2, nDash); dashed_line( xw_2, -yh_2, -zd_2, xw_2, -yh_2, zdepth-zd_2, nDash); dashed_line( xw_2, yh_2, -zd_2, xw_2, yh_2, zdepth-zd_2, nDash); %} END