/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright 1997-2002, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Component: Source_flat_lambda * * %I * Written by: Kristian Nielsen and Kim Lefmann * Date: 1999 * Version: $Revision: 1.2 $ * Origin: Risoe * Release: McStas 1.6 * Modified by: KN, 1999 from Source_flat.comp * Modified by: KL, October 8, 2001 * Modified by: Emmanuel Farhi, October 30, 2001 * Modified by: KL, April, 10, 2005. Upgraded to Source_simple * * Neutron source with flat wavelength spectrum and arbitrary flux. * * %D * The routine is a circular neutron source, which aims at a square target * centered at the beam (in order to improve MC-acceptance rate). The angular * divergence is then given by the dimensions of the target. The neutron * wavelength is uniformly distributed between lambda_0 - d_lambda and * lambda_0 + d_lambda. * OBSOLETE: rather use sources/Source_simple * * Example: Source_flat_lambda(radius=0.1, dist=2, xw=.1, yh=.1, * lambda_0=2.36, d_lambda=.3) * * %P * radius: (m) Radius of circle in (x,y,0) plane where neutrons * are generated. * dist: (m) Distance to target along z axis. * xw: (m) Width(x) of target * yh: (m) Height(y) of target * lambda_0: (AA) Mean wavelength of neutrons. * d_lambda: (AA) Wavelength spread of neutrons. * * %E *******************************************************************************/ DEFINE COMPONENT Source_flat_lambda DEFINITION PARAMETERS () SETTING PARAMETERS (radius, dist, xw, yh, lambda_0, d_lambda) OUTPUT PARAMETERS (pmul) STATE PARAMETERS (x,y,z,vx,vy,vz,t,s1,s2,p) DECLARE %{ double pmul,pdir; %} INITIALIZE %{ pmul=1.0/(mcget_ncount()*4*PI); %} TRACE %{ double chi,lambda,v,r,xf,yf,rf,dx,dy; t=0; z=0; chi=2*PI*rand01(); /* Choose point on source */ r=sqrt(rand01())*radius; /* with uniform distribution. */ x=r*cos(chi); y=r*sin(chi); randvec_target_rect(&xf, &yf, &rf, &pdir, 0, 0, dist, xw, yh, ROT_A_CURRENT_COMP); dx = xf-x; dy = yf-y; rf = sqrt(dx*dx+dy*dy+dist*dist); p = pdir*pmul; lambda = lambda_0+d_lambda*randpm1(); v = K2V*(2*PI/lambda); vz=v*dist/rf; vy=v*dy/rf; vx=v*dx/rf; %} MCDISPLAY %{ magnify("xy"); circle("xy",0,0,0,radius); %} END