Skip to content

Commit d414ad3

Browse files
committed
First stab at cogen support for N_trains et al
1 parent 0ff8aa5 commit d414ad3

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

common/lib/share/mccode-r.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ static long mcseed = 0; /* seed for random generator */
6060
static long mcstartdate = 0; /* start simulation time */
6161
static int mcdisable_output_files = 0; /* --no-output-files */
6262
mcstatic int mcgravitation = 0; /* use gravitation flag, for PROP macros */
63+
mcstatic int NTOF = 0; /* Number of TOF "sub-particles" in a TOF_TRAIN */
6364
mcstatic int mcusedefaults = 0; /* assume default value for all parameters */
6465
mcstatic int mcdotrace = 0; /* flag for --trace and messages for DISPLAY */
6566
mcstatic int mcnexus_embed_idf = 0; /* flag to embed xml-formatted IDF file for Mantid */
@@ -1234,6 +1235,9 @@ static void mcruninfo_out(char *pre, FILE *f)
12341235
fprintf(f, "%sNcount: %llu\n", pre, mcget_ncount());
12351236
fprintf(f, "%sTrace: %s\n", pre, mcdotrace ? "yes" : "no");
12361237
fprintf(f, "%sGravitation: %s\n", pre, mcgravitation ? "yes" : "no");
1238+
#ifdef TOF_TRAIN
1239+
fprintf(f, "%sTOF_TRAIN: %d\n", pre, NTOF);
1240+
#endif
12371241
snprintf(Parameters, CHAR_BUF_LENGTH, "%ld", mcseed);
12381242
fprintf(f, "%sSeed: %s\n", pre, Parameters);
12391243
fprintf(f, "%sDirectory: %s\n", pre, dirname ? dirname : ".");
@@ -4800,6 +4804,10 @@ mcparseoptions(int argc, char *argv[])
48004804
else if(!strcmp("--format", argv[i]) && (i + 1) < argc) {
48014805
mcformat=argv[++i];
48024806
}
4807+
#ifdef TOF_TRAIN
4808+
else if(!strncmp("--tof-trains=", argv[i], 13)) {
4809+
NTOF=atoi(&argv[i][13]);
4810+
#endif
48034811
#ifdef USE_NEXUS
48044812
else if(!strcmp("--IDF", argv[i])) {
48054813
mcnexus_embed_idf = 1;

mccode/nlib/share/mcstas-r.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ int (*mcMagneticField) (double, double, double, double,
5151
* mcsetstate: transfer parameters into global McStas variables
5252
*******************************************************************************/
5353
_class_particle mcsetstate(double x, double y, double z, double vx, double vy, double vz,
54-
double t, double sx, double sy, double sz, double p, int mcgravitation, void *mcMagnet, int mcallowbackprop)
54+
double t, double sx, double sy, double sz, double p, int mcgravitation, void *mcMagnet, int mcallowbackprop, int NTOF)
5555
{
5656
_class_particle mcneutron;
5757

@@ -81,6 +81,14 @@ _class_particle mcsetstate(double x, double y, double z, double vx, double vy, d
8181
// what about mcneutron._logic ?
8282
mcneutron._logic.dummy=1;
8383
// init uservars via cogen'd-function
84+
85+
#ifdef TOF_TRAIN
86+
mcneutron.N_trains=NTOF;
87+
mcneutron.t_offset=malloc(NTOF*sizeof(double));
88+
mcneutron.p_trains=malloc(NTOF*sizeof(double));
89+
mcneutron.alive_trains=malloc(NTOF*sizeof(int));
90+
#endif
91+
8492
particle_uservar_init(&mcneutron);
8593

8694
return(mcneutron);

mccode/src/cogen.c.in

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2464,10 +2464,14 @@ cogen_header(struct instr_def *instr, char *output_name)
24642464
cout(" randstate_t randstate[7];"); // for the KISS generator
24652465
cout(" double t, p; /* time, event weight */");
24662466
cout(" #ifdef TOF_TRAIN");
2467-
cout(" int Ntof_train; /* initialised like e.g. ncount, seed from cmdline */");
2468-
cout(" double *tof_train;");
2467+
cout(" int N_trains; /* initialised like e.g. ncount, seed from cmdline */");
2468+
cout(" double *t_offset;");
2469+
cout(" double *p_trains;");
2470+
cout(" int *alive_trains;");
2471+
cout(" #pragma acc shape(t_offset[0:N_trains]) init_needed(N_trains)");
2472+
cout(" #pragma acc shape(p_trains[0:N_trains]) init_needed(N_trains)");
2473+
cout(" #pragma acc shape(alive_trains[0:N_trains]) init_needed(N_trains)");
24692474
cout(" int Ntof_init; /* 0/1 - set to 1 once \"times are filled in\" */");
2470-
cout(" #pragma acc shape(tof_train[0:Ntof_train]) init_needed(Ntof_train)");
24712475
cout(" #endif /* TOF_TRAIN */");
24722476
cout(" long long _uid; /* Unique event ID */");
24732477
cout(" long _index; /* component index where to send this event */");
@@ -2542,29 +2546,33 @@ cogen_header(struct instr_def *instr, char *output_name)
25422546
#if MCCODE_PROJECT == 1 /* neutron */
25432547
cout("#pragma acc routine");
25442548
cout("_class_particle mcsetstate(double x, double y, double z, double vx, double vy, double vz,");
2545-
cout(" double t, double sx, double sy, double sz, double p, int mcgravitation, void *mcMagnet, int mcallowbackprop);");
2549+
cout(" double t, double sx, double sy, double sz, double p, int mcgravitation, void *mcMagnet, int mcallowbackprop, int NTOF);");
25462550
cout("#pragma acc routine");
25472551
cout("_class_particle mcgetstate(_class_particle mcneutron, double *x, double *y, double *z,");
25482552
cout(" double *vx, double *vy, double *vz, double *t,");
25492553
cout(" double *sx, double *sy, double *sz, double *p);");
25502554
#elif MCCODE_PROJECT == 2 /* xray */
25512555
cout("#pragma acc routine");
25522556
cout("_class_particle mcsetstate(double x, double y, double z, double kx, double ky, double kz,");
2553-
cout(" double phi, double t, double Ex, double Ey, double Ez, double p, int mcgravitation, void *mcMagnet, int mcallowbackprop);");
2557+
cout(" double phi, double t, double Ex, double Ey, double Ez, double p, int mcgravitation, void *mcMagnet, int mcallowbackprop, int NTOF);");
25542558
cout("#pragma acc routine");
25552559
cout("_class_particle mcgetstate(_class_particle mcphoton, double *x, double *y, double *z, double *kx, double *ky, double *kz,");
25562560
cout(" double *phi, double *t, double *Ex, double *Ey, double *Ez, double *p);");
25572561
#endif
25582562
cout("");
25592563
cout("extern int mcgravitation; /* flag to enable gravitation */");
25602564
cout("#pragma acc declare create ( mcgravitation )");
2565+
cout("");
2566+
2567+
cout("extern int NTOF; /* TOF_train suppport */");
2568+
cout("#pragma acc declare create ( NTOF )");
25612569

25622570
cout("");
25632571
cout("_class_particle mcgenstate(void) {");
25642572
#if MCCODE_PROJECT == 1 /* neutron */
2565-
cout(" _class_particle particle = mcsetstate(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, mcgravitation, NULL, 0);");
2573+
cout(" _class_particle particle = mcsetstate(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, mcgravitation, NULL, 0, NTOF);");
25662574
#elif MCCODE_PROJECT == 2 /* xray */
2567-
cout(" _class_particle particle = mcsetstate(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, mcgravitation, NULL, 0);");
2575+
cout(" _class_particle particle = mcsetstate(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, mcgravitation, NULL);");
25682576
#endif
25692577
cout(" return(particle);");
25702578
cout("}");

0 commit comments

Comments
 (0)