/*******************************************************************************
*
* McStas, the neutron ray-tracing package
* Maintained by Kristian Nielsen and Kim Lefmann,
* Copyright 1997-2000 Risoe National Laboratory, Roskilde, Denmark
*
* %I
* Written by: Emmanuel Farhi and KL.
* Date: 22 Jan 2001
* Version: 0.1
* Origin: McStas 1.5/ILL (France) (Obsolete)
* Modified by: KN, 1998 from Source_flat.comp
* Modified by: EF, 2000 from Convert_FlatE_2_Maxwell by Thomas hansen
* Modified by: EF, KL, 2001 correct focusing pb with KL method
* Modified by: EF, 2004. Obsoleted as it is not working
*
* Neutron source with Maxwellian wavelength spectrum and
* user-specified flux.
*
* %D
* The routine is a rectangular 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 distributed between lambda_0 - d_lambda and
* lambda_0 + d_lambda with a Maxwellian profile.
* The source flux is specified in neutrons per steradian per square cm for the
* Maxwellian distribution. Source output is in [n/s/cm^2/Angs]
* The flux profile is flat for T=0.
* OBSOLETE: wrong results ! rather use sources/Source_Maxwell_3 or Source_gen
*
* %BUGS
* Produces wrong results
*
* Example:
* COMPONENT Source = Source_Maxwell(
* h = 0.220, w = 0.160,
* dist = 2.33, xw = 0.038, yh = 0.2,
* lambda_0 = 2, d_lambda = 1.5,
* flux = 1e13, T = 315)
* AT (0,0,0) ABSOLUTE
*
* %P
* h: (m) Height of rectangle in (x,y,0) plane where
* neutrons are generated.
* w: (m) Width of rectangle
* 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.
* flux: (1/(cm**2*st)) Source flux
* T: (K) The temperature of the source (293 K)
*
* %E
*******************************************************************************/
DEFINE COMPONENT Source_Maxwell
DEFINITION PARAMETERS ()
SETTING PARAMETERS (h=0.1, w=0.1, dist=2.33, xw=0.05, yh=0.1, lambda_0=2.36, d_lambda=0.1627, flux=1e13, T=315)
OUTPUT PARAMETERS (p_in)
STATE PARAMETERS (x,y,z,vx,vy,vz,t,s1,s2,p)
DECLARE
%{
double p_in;
double lambda0, lambda02, L2P, Lmin, Lmax;
%}
INITIALIZE
%{
double factor, delta_lambda, source_area, k;
source_area = h*w*1e4; /* cm^2 */
p_in = flux/mcget_ncount()*source_area;
k = 1.38066e-23; /* k_B */
if (T > 0)
lambda0 = 1.0e10*sqrt(HBAR*HBAR*4.0*PI*PI/2.0/MNEUTRON/k/T);
else
lambda0 = 0;
lambda02 = lambda0*lambda0;
L2P = 2*lambda02*lambda02;
Lmin = lambda_0 - d_lambda; /* AAngstroem */
Lmax = lambda_0 + d_lambda;
%}
TRACE
%{
double lambda, v;
double E, Maxwell, dE_dl, dE, dE1, dE2;
double lambda2, lambda5;
double rf,xf,yf,dx,dy;
z=0;
x=w*randpm1()/2; /* Choose point on source */
y=h*randpm1()/2; /* with uniform distribution. */
xf = 0.5*xw*randpm1(); /* Choose focusing position uniformly */
yf = 0.5*yh*randpm1();
dx = xf-x;
dy = yf-y;
rf = sqrt(dx*dx+dy*dy+dist*dist);
p = p_in*xw*yh*dist/(rf*rf*rf);
lambda = lambda_0+d_lambda*randpm1();
lambda2 = lambda*lambda;
lambda5 = lambda2*lambda2*lambda;
if (lambda == 0)
{
printf("Source_Maxwell: warning: lambda is 0\n");
ABSORB;
}
v = K2V*(2*PI/lambda);
vz = v*dist/rf;
vy = v*dy/rf;
vx = v*dx/rf;
if (lambda0 != 0)
{
E = VS2E * v*v;
dE1 = 2*PI/(V2K*SE2V*(lambda_0-d_lambda)); dE1 *= dE1;
dE2 = 2*PI/(V2K*SE2V*(lambda_0+d_lambda)); dE2 *= dE2;
dE = fabs(dE1-dE2);
dE_dl = E/lambda*2.0;
Maxwell= L2P/lambda5*exp(-lambda02/lambda2);
p *= Maxwell*dE/d_lambda/dE_dl;
}
SCATTER;
%}
MCDISPLAY
%{
magnify("xy");
multiline(5,
-w/2.0, -h/2.0, 0.0,
w/2.0, -h/2.0, 0.0,
w/2.0, h/2.0, 0.0,
-w/2.0, h/2.0, 0.0,
-w/2.0, -h/2.0, 0.0);
%}
END