/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright (C) 1997-2011, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Instrument: Crisp3 test instrument for the Multilayer_NR_Sample component. * * %Identification * Written by: Robert Dalgliesh * Date: 2010 * Origin: ISIS (UK) * Release: McStas 1.12cb * Version: 1.0 * %INSTRUMENT_SITE: ISIS * * Model of the ISIS CRISP reflectometer, including the Multilayer_Sample reflectivity sample. * * %Description * This model of the ISIS CRISP reflectometer demonstrates the use of the Multilayer_Sample component. * * The algorithm of the component requires complex numbers, facilitated by the * GNU Scientific Library (GSL). To link * your the instrument with an installed GSL, you should use MCSTAS_CFLAGS like * * MCSTAS_CFLAGS = -g -O2 -lm -lgsl -lgslcblas * * Example: mcrun ISIS_CRISP.instr glen=1.4 flen=0.4 w1=0.05 vm=3.0 FRAC=0.1 * * %Parameters * INPUT PARAMETERS: * glen: Length of the elliptical guides [m] * flen: Focal-length of elliptical guides [m] * w1: Entry-width of elliptical guides [m] * vm: m-value of material for left and right vertical guide mirrors [m] * FRAC: Fraction of statistics used to model incoherent scattering from sample [1] * * %Link * Website of the CRISP instrument * * %End *******************************************************************************/ DEFINE INSTRUMENT ISIS_CRISP(glen=1.4,flen=0.4,w1=0.05,vm=3.0, FRAC=0) DECLARE %{ double glen,flen,spos,tend,t15,fp1; double linw,loutw,l,u1,u2,div1,b_ell_q,w1,w12,a_ell_q,lbw,w2; %} INITIALIZE %{ spos=10.2055; l=glen; loutw=flen; linw=10.0; w12=w1/2.0; // calculate the width of the guide exit lbw = l + linw + loutw; u1 = sqrt((linw*linw)+(w12*w12)); u2 = sqrt((w12*w12) + ((l+loutw)*(l+loutw))); a_ell_q = ((u1 + u2)/2)*((u1 + u2)/2); b_ell_q = a_ell_q - ((lbw/2)*(lbw/2)); /* calculate width of guide exit (w2) */ div1 = ((lbw/2-loutw)*(lbw/2-loutw))/a_ell_q; w2 = sqrt(b_ell_q*(1-div1)); w2 = w2*2; tend=w2; t15=tan(-1.5*DEG2RAD); %} TRACE COMPONENT a1 = Arm() AT (0,0,0) ABSOLUTE COMPONENT isis_source = ISIS_moderator( Face = "crisp", E0 = -6.5, E1 = -0.55, dist = 7.2695, xw = 0.045, yh = 0.0045, modXsize = -1, modYsize = -1, CAngle = 0.0, SAC = 1) AT (0.0, 0.0, 0.00001) RELATIVE a1 ROTATED (1.5, 0.0, 0.0) ABSOLUTE COMPONENT defslit1 = Slit( xmin = -0.0345, xmax = 0.0345, ymin = -0.01731, ymax = 0.01731) AT (0.0, -0.09829, 3.7537) ABSOLUTE COMPONENT defslit2 = Slit( xmin = -0.0289, xmax = 0.0289, ymin = -0.0123, ymax = 0.0123) AT (0.0, -0.15976, 6.101) ABSOLUTE COMPONENT coarseslit1 = Slit( xmin = -0.03, xmax = 0.03, ymin = -0.1, ymax = 0.1) AT (0.0, -0.1757, 6.7096) ABSOLUTE COMPONENT coarseslit2 = Slit( xmin = -0.1, xmax = 0.1, ymin = -0.01, ymax = 0.01) AT (0.0, -0.17832, 6.8096) ABSOLUTE COMPONENT lmon1 = L_monitor( nchan = 500, filename = "lmon1.dat", xmin = -0.06, xmax = 0.06, ymin = -0.04, ymax = 0.04, Lmin = 0.0, Lmax = 10.0) AT (0.0, -0.1833, 7.0) ABSOLUTE COMPONENT PSDmon1 = PSD_monitor( nx = 100, ny = 100, filename = "PSD1.dat", xmin = -0.05, xmax = 0.05, ymin = -0.01, ymax = 0.01) AT (0.0, -0.1833, 7.01) ABSOLUTE COMPONENT slit1 = Slit( width=0.04, height=0.004) AT (0.0, -0.1904, 7.2695) ABSOLUTE COMPONENT PSDmons1 = PSD_monitor( nx = 100, ny = 100, filename = "PSDs1.dat", xmin = -0.05, xmax = 0.05, ymin = -0.01, ymax = 0.01) AT (0.0, 7.27*t15, 7.27) ABSOLUTE COMPONENT eguide1 = Guide_tapering( segno = 10, w1 = w1, h1 = 0.1, l = glen, option="elliptical", linw=10.0, loutw = flen, mx = vm, my = 0) AT (0.0, (spos-flen-glen)*t15, spos-flen-glen) ABSOLUTE ROTATED (1.5, 0.0, 0.0) ABSOLUTE COMPONENT slit2 = Slit( width=tend, height=0.0025) AT (0.0, -0.2581, 9.8555) ABSOLUTE COMPONENT lmon2 = L_monitor( nchan = 500, filename = "lmon2.dat", xmin = -0.06, xmax = 0.06, ymin = -0.04, ymax = 0.04, Lmin = 0.0, Lmax = 10.0) AT (0.0, -0.2608, 9.96) ABSOLUTE COMPONENT samp1 = Multilayer_Sample( xwidth = 0.05, zlength = 0.15, mu_inc=0.138, ythick=0.01, nlayer = 0, sldPar = {0.0,6.35e-6}, dPar = {0.0}, sigmaPar = {5.0}, target_index=1, focus_xw=2*tend, focus_yh=0.01, frac_inc=FRAC) AT (0.0, spos*t15, spos) ABSOLUTE COMPONENT slit3 = Slit( width= tend, height=0.003) AT (0.0, (spos+flen-0.01)*t15-2.0*(flen-0.01)*t15, spos+flen-0.01) ABSOLUTE COMPONENT eguide2 = Guide_tapering( segno = 10, w1 = tend, h1 = 0.1, l = glen, option="elliptical", linw=flen, loutw = 10.0, mx = vm, my = 0) AT (0.0, (spos+flen)*t15-2.0*flen*t15, spos+flen ) ABSOLUTE ROTATED(-1.5,0.0,0.0) ABSOLUTE COMPONENT lmon3 = L_monitor( nchan = 500, filename = "lmon3.dat", xmin = -0.05, xmax = 0.05, ymin = -0.05, ymax = 0.05, Lmin = 0.0, Lmax = 10.0) AT (0.0, 12.11*t15-2.0*(12.11-spos)*t15, 12.11) ABSOLUTE COMPONENT PSDdet1 = PSD_monitor( nx = 100, ny = 100, filename = "PSD3.dat", xmin = -0.05, xmax = 0.05, ymin = -0.05, ymax = 0.05) AT (0.0, 12.111*t15-2.0*(12.111-spos)*t15, 12.111) ABSOLUTE FINALLY %{ %} END