/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright (C) 1997-2006, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Component: PSD_monitor_4PI * * %I * Written by: Kim Lefmann and Kristian Nielsen * Date: April 17, 1998 * Origin: Risoe * * Spherical position-sensitive detector. * * %D * An (n times m) pixel spherical PSD monitor using a cylindrical projection. * Mostly for test and debugging purposes. * * Example: PSD_monitor_4PI(radius=0.1, nx=90, ny=90, filename="Output.psd") * * %P * INPUT PARAMETERS: * * radius: [m] Radius of detector * nx: [1] Number of pixel columns * ny: [1] Number of pixel rows * filename: [string] Name of file in which to store the detector image * restore_neutron: [1] If set, the monitor does not influence the neutron state * nowritefile: [1] If set, monitor will skip writing to disk * * OUTPUT PARAMETERS: * * PSD_N: [] Array of neutron counts * PSD_p: [] Array of neutron weight counts * PSD_p2: [] Array of second moments * * %L * Test * results (not up-to-date). * * %E *******************************************************************************/ DEFINE COMPONENT PSD_monitor_4PI DEFINITION PARAMETERS () SETTING PARAMETERS (nx=90, ny=90, string filename=0, int nowritefile=0, radius=1, restore_neutron=0) OUTPUT PARAMETERS () /* Neutron parameters: (x,y,z,vx,vy,vz,t,sx,sy,sz,p) */ DECLARE %{ DArray2d PSD_N; DArray2d PSD_p; DArray2d PSD_p2; %} INITIALIZE %{ int i, j; PSD_N = create_darr2d(nx, ny); PSD_p = create_darr2d(nx, ny); PSD_p2 = create_darr2d(nx, ny); for (i=0; i 0) { if(t0 < 0) t0 = t1; /* t0 is now time of intersection with the sphere. */ mcPROP_DT(t0); phi = atan2(x,z); i = floor(nx*(phi/(2*PI)+0.5)); if(i >= nx) i = nx-1; /* Special case for phi = PI. */ else if(i < 0) i = 0; theta=asin(y/radius); j = floor(ny*(theta+PI/2)/PI+0.5); if(j >= ny) j = ny-1; /* Special case for y = radius. */ else if(j < 0) j = 0; double p2 = p*p; #pragma acc atomic PSD_N[i][j] = PSD_N[i][j]+1; #pragma acc atomic PSD_p[i][j] = PSD_p[i][j]+p; #pragma acc atomic PSD_p2[i][j] = PSD_p2[i][j] + p2; SCATTER; } if (restore_neutron) { RESTORE_NEUTRON(INDEX_CURRENT_COMP, x, y, z, vx, vy, vz, t, sx, sy, sz, p); } %} SAVE %{ if (!nowritefile) { DETECTOR_OUT_2D( "4PI PSD monitor", "Longitude [deg]", "Latitude [deg]", -180, 180, -90, 90, nx, ny, &PSD_N[0][0],&PSD_p[0][0],&PSD_p2[0][0], filename); } %} FINALLY %{ destroy_darr2d(PSD_N); destroy_darr2d(PSD_p); destroy_darr2d(PSD_p2); %} MCDISPLAY %{ circle("xy",0,0,0,radius); circle("xz",0,0,0,radius); circle("yz",0,0,0,radius); %} END