-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Included component made for unit test that lacks these sections and h…
…as dependency.
- Loading branch information
1 parent
8d6c829
commit 2755c77
Showing
1 changed file
with
184 additions
and
0 deletions.
There are no files selected for viewing
184 changes: 184 additions & 0 deletions
184
mcstasscript/tests/dummy_mcstas/misc/test_for_skipped_sections.comp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
/******************************************************************************* | ||
* | ||
* McStas, neutron ray-tracing package | ||
* Copyright 1997-2002, All rights reserved | ||
* Risoe National Laboratory, Roskilde, Denmark | ||
* Institut Laue Langevin, Grenoble, France | ||
* | ||
* Component: Source_simple | ||
* | ||
* %I | ||
* Written by: Kim Lefmann | ||
* Date: October 30, 1997 | ||
* Modified by: KL, October 4, 2001 | ||
* Modified by: Emmanuel Farhi, October 30, 2001. Serious bug corrected. | ||
* Origin: Risoe | ||
* | ||
* A circular neutron source with flat energy 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 energy is uniformly distributed between lambda0-dlambda and | ||
* lambda0+dlambda or between E0-dE and E0+dE. | ||
* The flux unit is specified in n/cm2/s/st/energy unit (meV or Angs). | ||
* | ||
* This component replaces Source_flat, Source_flat_lambda, | ||
* Source_flux and Source_flux_lambda. | ||
* | ||
* Example: Source_simple(radius=0.1, dist=2, focus_xw=.1, focus_yh=.1, E0=14, dE=2) | ||
* | ||
* %P | ||
* radius: [m] Radius of circle in (x,y,0) plane where neutrons are generated. | ||
* yheight: [m] Height of rectangle in (x,y,0) plane where neutrons are generated. | ||
* xwidth: [m] Width of rectangle in (x,y,0) plane where neutrons are generated. | ||
* target_index: [1] relative index of component to focus at, e.g. next is +1 this is used to compute 'dist' automatically. | ||
* dist: [m] Distance to target along z axis. | ||
* focus_xw: [m] Width of target | ||
* focus_yh: [m] Height of target | ||
* E0: [meV] Mean energy of neutrons. | ||
* dE: [meV] Energy half spread of neutrons (flat or gaussian sigma). | ||
* lambda0: [AA] Mean wavelength of neutrons. | ||
* dlambda: [AA] Wavelength half spread of neutrons. | ||
* flux: [1/(s*cm**2*st*energy unit)] flux per energy unit, Angs or meV if flux=0, the source emits 1 in 4*PI whole space. | ||
* gauss: [1] Gaussian (1) or Flat (0) energy/wavelength distribution | ||
* packing_factor: [1] Comment to be found and read | ||
* | ||
* %E | ||
*******************************************************************************/ | ||
|
||
DEFINE COMPONENT Source_simple | ||
SETTING PARAMETERS(string cfg = "", packing_factor=1, interact_fraction=-1, string init="init") | ||
DEPENDENCY "-Wl,-rpath,CMD(ncrystal-config --show libdir) -Wl,CMD(ncrystal-config --show libpath) -ICMD(ncrystal-config --show includedir)" | ||
|
||
DECLARE | ||
%{ | ||
double pmul, srcArea; | ||
int square; | ||
double tx,ty,tz; | ||
%} | ||
INITIALIZE | ||
%{ | ||
square = 0; | ||
/* Determine source area */ | ||
if (radius && !yheight && !xwidth ) { | ||
square = 0; | ||
srcArea = PI*radius*radius; | ||
} else if(yheight && xwidth) { | ||
square = 1; | ||
srcArea = xwidth * yheight; | ||
} | ||
|
||
if (flux) { | ||
pmul=flux*1e4*srcArea/mcget_ncount(); | ||
if (dlambda) | ||
pmul *= 2*dlambda; | ||
else if (dE) | ||
pmul *= 2*dE; | ||
} else { | ||
gauss = 0; | ||
pmul=1.0/(mcget_ncount()*4*PI); | ||
} | ||
|
||
if (target_index && !dist) | ||
{ | ||
Coords ToTarget; | ||
ToTarget = coords_sub(POS_A_COMP_INDEX(INDEX_CURRENT_COMP+target_index),POS_A_CURRENT_COMP); | ||
ToTarget = rot_apply(ROT_A_CURRENT_COMP, ToTarget); | ||
coords_get(ToTarget, &tx, &ty, &tz); | ||
dist=sqrt(tx*tx+ty*ty+tz*tz); | ||
} else if (dist) { | ||
tx = 0; | ||
ty = 0; | ||
tz = dist; | ||
} | ||
|
||
|
||
if (srcArea <= 0) { | ||
printf("Source_simple: %s: Source area is <= 0 !\n ERROR - Exiting\n", | ||
NAME_CURRENT_COMP); | ||
exit(0); | ||
} | ||
if (dist <= 0 || focus_xw <= 0 || focus_yh <= 0) { | ||
printf("Source_simple: %s: Target area unmeaningful! (negative dist / focus_xw / focus_yh)\n ERROR - Exiting\n", | ||
NAME_CURRENT_COMP); | ||
exit(0); | ||
} | ||
|
||
if ((!lambda0 && !E0 && !dE && !dlambda)) { | ||
printf("Source_simple: %s: You must specify either a wavelength or energy range!\n ERROR - Exiting\n", | ||
NAME_CURRENT_COMP); | ||
exit(0); | ||
} | ||
if ((!lambda0 && !dlambda && (E0 <= 0 || dE < 0 || E0-dE <= 0)) | ||
|| (!E0 && !dE && (lambda0 <= 0 || dlambda < 0 || lambda0-dlambda <= 0))) { | ||
printf("Source_simple: %s: Unmeaningful definition of wavelength or energy range!\n ERROR - Exiting\n", | ||
NAME_CURRENT_COMP); | ||
exit(0); | ||
} | ||
%} | ||
TRACE | ||
%{ | ||
double chi,E,lambda,v,r, xf, yf, rf, dx, dy, pdir; | ||
|
||
t=0; | ||
z=0; | ||
|
||
if (square == 1) { | ||
x = xwidth * (rand01() - 0.5); | ||
y = yheight * (rand01() - 0.5); | ||
} else { | ||
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_real(&xf, &yf, &rf, &pdir, | ||
tx, ty, tz, focus_xw, focus_yh, ROT_A_CURRENT_COMP, x, y, z, 2); | ||
|
||
dx = xf-x; | ||
dy = yf-y; | ||
rf = sqrt(dx*dx+dy*dy+rf*rf); | ||
|
||
p = pdir*pmul; | ||
|
||
if(lambda0==0) { | ||
if (!gauss) { | ||
E=E0+dE*randpm1(); /* Choose from uniform distribution */ | ||
} else { | ||
E=E0+randnorm()*dE; | ||
} | ||
v=sqrt(E)*SE2V; | ||
} else { | ||
if (!gauss) { | ||
lambda=lambda0+dlambda*randpm1(); | ||
} else { | ||
lambda=lambda0+randnorm()*dlambda; | ||
} | ||
v = K2V*(2*PI/lambda); | ||
} | ||
|
||
vz=v*dist/rf; | ||
vy=v*dy/rf; | ||
vx=v*dx/rf; | ||
%} | ||
|
||
MCDISPLAY | ||
%{ | ||
if (square == 1) { | ||
|
||
rectangle("xy",0,0,0,xwidth,yheight); | ||
} else { | ||
|
||
circle("xy",0,0,0,radius); | ||
} | ||
if (dist) { | ||
dashed_line(0,0,0, -focus_xw/2+tx,-focus_yh/2+ty,tz, 4); | ||
dashed_line(0,0,0, focus_xw/2+tx,-focus_yh/2+ty,tz, 4); | ||
dashed_line(0,0,0, focus_xw/2+tx, focus_yh/2+ty,tz, 4); | ||
dashed_line(0,0,0, -focus_xw/2+tx, focus_yh/2+ty,tz, 4); | ||
} | ||
%} | ||
|
||
END |