source: sans/XOP_Dev/MonteCarlo/MonteCarlo.h @ 503

Last change on this file since 503 was 458, checked in by srkline, 14 years ago

Added poor man's threading to the MonteCarlo? calculation.

My guess is that the ran() function from NR is not thread safe (it is non-reentrant). So I simply duplicated Monte_SANSX to Monte_SANSX2, where each incarnation uses a different random number generator, either ran1() or ran3(). This means that currently only two processors are supported. Not a big deal. At least it works.

File size: 1.5 KB
Line 
1/*
2 *  MonteCarlo.h
3 *  SANSAnalysis
4 *
5 *  Created by Steve Kline on 10/16/08.
6 *  Copyright 2008 __MyCompanyName__. All rights reserved.
7 *
8 */
9
10#include <math.h>
11#include <ctype.h>
12
13#include <stdlib.h>
14#include <stdio.h>
15
16#ifdef _WIN32
17#include <float.h>
18#include "winFuncs.h"
19#endif
20 
21/* Prototypes */
22HOST_IMPORT void main(IORecHandle ioRecHandle);
23
24 
25#define OLD_IGOR 1 + FIRST_XOP_ERR
26#define NON_EXISTENT_WAVE 2 + FIRST_XOP_ERR
27#define NEEDS_2D_WAVE 3 + FIRST_XOP_ERR
28
29
30// All structures passed to Igor are two-byte aligned.
31#include "XOPStructureAlignmentTwoByte.h"
32
33struct MC_Params {     // This structure must be 2-byte-aligned because it receives parameters from Igor.
34        waveHndl resultsH;      // results of MC
35        waveHndl MC_linear_dataH;               //this is a 2D WAVE
36        waveHndl nnH;
37        waveHndl j2H;
38        waveHndl j1H;
39        waveHndl ntH;
40        waveHndl ran_devH;
41        waveHndl inputWaveH;
42        void* tp;                               //unused void for ThreadSafe functions
43        double result;          // return value is unused, save for error if needed
44};
45typedef struct MC_Params MC_Params;
46typedef struct MC_Params *MC_ParamsPtr;
47
48#include "XOPStructureAlignmentReset.h"
49
50
51// function prototypes
52int Monte_SANSX(MC_ParamsPtr p);
53int Monte_SANSX2(MC_ParamsPtr p);
54int FindPixel(double testQ, double testPhi, double lam, double sdd, double pixSize, double xCtr, double yCtr, long *xPixel, long *yPixel);
55int NewDirection(double *vx, double *vy, double *vz, double theta, double phi);
56double path_len(double aval, double sig_tot);
57float ran1(long *idum);
58float ran3(long *idum);
59double locate_interp(double xx[], long n, double x);
Note: See TracBrowser for help on using the repository browser.