fptest01.c revision 4b20b1d51ab9293abe408289e9096fbf3fa9b080
1bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
2bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *
3bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   Copyright (c) International Business Machines  Corp., 2002
4bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *
5bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   This program is free software;  you can redistribute it and/or modify
6bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   it under the terms of the GNU General Public License as published by
7bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   the Free Software Foundation; either version 2 of the License, or
8bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   (at your option) any later version.
9bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *
10bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   This program is distributed in the hope that it will be useful,
11bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   the GNU General Public License for more details.
14bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *
15bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   You should have received a copy of the GNU General Public License
16bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   along with this program;  if not, write to the Free Software
17bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew */
19bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
20bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* Group Bull & IBM Corporation */
214b264476cb3f10b994b39e4b61cca0594ea79279robbiew/* 11/20/2002	Port to LTP	robbiew@us.ibm.com */
222c28215423293e443469a07ae7011135d058b671Garrett Cooper/*                                               jacky.malcles@bull.net */
23bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/* IBM Corporation */
244b264476cb3f10b994b39e4b61cca0594ea79279robbiew/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
25bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
26bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
27bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * fptest01.c -- Floating point test.
28bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *
29bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * It is taken from a benchmark called "barsim".
30bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew *
31bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * If the computation arrives at the expected values this routine
32bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * prints a "passed" message and exits 0.  If an incorrect value is
33bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew * computed a "failed" message is printed and the routine exits 1.
34bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew */
35bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
36bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <stdio.h>
37a70576c4834d89f937e46698fef4114736cce4d7robbiew#include <errno.h>
38bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <math.h>
39bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <stdlib.h>
40bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <unistd.h>
41bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <sys/types.h>
42bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <sys/stat.h>
43bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include <fcntl.h>
44bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
454b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define MAGIC1	1632.796126
464b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define DIFF1	0.001
474b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define MAGIC2	0.777807
484b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define DIFF2	0.001
494b264476cb3f10b994b39e4b61cca0594ea79279robbiew#define EVENTMX	256
50bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define BIG 1.e50
51bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define FALSE 0
52bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define TRUE  1
53bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define TRYCRIT   1
54bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define ENTERCRIT 2
55bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define LEAVECRIT 3
56bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define ATBARRIER 4
57bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define ENTERWORK 5
58bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define LEAVEWORK 6
59bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#define NULLEVENT 999
60bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
61bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/** LTP Port **/
62bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include "test.h"
63bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew#include "usctest.h"
64bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
65bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewchar *TCID="fptest01";          /* Test program identifier.    */
66bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint TST_TOTAL=1;                /* Total number of test cases. */
67bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewextern int Tst_count;           /* Test Case counter for tst_* routines */
68bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/**************/
69bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
70bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint init();
71bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint doevent();
72bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint term();
73bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint addevent();
74bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble gauss();
75bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewvoid   gaussinit();
76bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event {
774b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int proc;
784b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int type;
794b264476cb3f10b994b39e4b61cca0594ea79279robbiew	double time;
804b264476cb3f10b994b39e4b61cca0594ea79279robbiew	};
81bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
82bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event eventtab[EVENTMX];
83bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event rtrevent;
844b264476cb3f10b994b39e4b61cca0594ea79279robbiewint waiting[EVENTMX];	/* array of waiting processors */
854b264476cb3f10b994b39e4b61cca0594ea79279robbiewint nwaiting;		/* number of waiting processors */
869e78ade7d6c596a709d0228909bd5d37a85cf4a5vapierdouble global_time;		/* global clock */
874b264476cb3f10b994b39e4b61cca0594ea79279robbiewdouble lsttime;		/* time used for editing */
884b264476cb3f10b994b39e4b61cca0594ea79279robbiewdouble dtc, dts, alpha;	/* timing parameters */
894b264476cb3f10b994b39e4b61cca0594ea79279robbiewint nproc;		/* number of processors */
904b264476cb3f10b994b39e4b61cca0594ea79279robbiewint barcnt;		/* number of processors ATBARRIER */
914b264476cb3f10b994b39e4b61cca0594ea79279robbiewint ncycle;		/* number of cycles completed */
924b264476cb3f10b994b39e4b61cca0594ea79279robbiewint ncycmax;		/* number of cycles to run */
934b264476cb3f10b994b39e4b61cca0594ea79279robbiewint critfree;		/* TRUE if critical section not occupied */
944b264476cb3f10b994b39e4b61cca0594ea79279robbiewint gcount;		/* # calls to gauss */
95bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
96bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event *nextevent();
97bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
98bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint
994b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Coopermain(int argc, char **argv)
100bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
1014b264476cb3f10b994b39e4b61cca0594ea79279robbiew	struct event *ev;
102bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
1034b264476cb3f10b994b39e4b61cca0594ea79279robbiew	nproc = 128;
1044b264476cb3f10b994b39e4b61cca0594ea79279robbiew	ncycmax = 10;
1054b264476cb3f10b994b39e4b61cca0594ea79279robbiew	dtc = 0.01;
1064b264476cb3f10b994b39e4b61cca0594ea79279robbiew	dts = 0.0;
1074b264476cb3f10b994b39e4b61cca0594ea79279robbiew	alpha = 0.1;
108bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
1094b264476cb3f10b994b39e4b61cca0594ea79279robbiew	init();
110bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
111df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	while ((ev=nextevent()) != NULL) {
1124b264476cb3f10b994b39e4b61cca0594ea79279robbiew		doevent(ev);
1134b264476cb3f10b994b39e4b61cca0594ea79279robbiew	}
114bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
1154b264476cb3f10b994b39e4b61cca0594ea79279robbiew	term();
1164b264476cb3f10b994b39e4b61cca0594ea79279robbiew	tst_resm(TPASS,"PASS");
1174b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	tst_exit();
118bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
119bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
120bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
1214b264476cb3f10b994b39e4b61cca0594ea79279robbiew	initialize all processes to "entering work section"
122bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/
123bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint
124bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewinit()
125bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
1264b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int p;
1274b264476cb3f10b994b39e4b61cca0594ea79279robbiew	double dtw, dtwsig;
128bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
1294b264476cb3f10b994b39e4b61cca0594ea79279robbiew	ncycle=0;
1309e78ade7d6c596a709d0228909bd5d37a85cf4a5vapier	global_time=0;
1314b264476cb3f10b994b39e4b61cca0594ea79279robbiew	lsttime=0;
1324b264476cb3f10b994b39e4b61cca0594ea79279robbiew	barcnt=0;
1334b264476cb3f10b994b39e4b61cca0594ea79279robbiew	nwaiting=0;
1344b264476cb3f10b994b39e4b61cca0594ea79279robbiew	critfree=TRUE;
135bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
1364b264476cb3f10b994b39e4b61cca0594ea79279robbiew	dtw=1./nproc;		/* mean process work time */
1374b264476cb3f10b994b39e4b61cca0594ea79279robbiew	dtwsig=dtw*alpha;	/* std deviation of work time */
1384b264476cb3f10b994b39e4b61cca0594ea79279robbiew	gaussinit(dtw,dtwsig);
139bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
1404b264476cb3f10b994b39e4b61cca0594ea79279robbiew	for (p=1; p<=nproc; p++) {
1414b264476cb3f10b994b39e4b61cca0594ea79279robbiew		eventtab[p].type = NULLEVENT;
1424b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	}
143bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
1444b264476cb3f10b994b39e4b61cca0594ea79279robbiew	for (p=1; p<=nproc; p++) {
1459e78ade7d6c596a709d0228909bd5d37a85cf4a5vapier		addevent(ENTERWORK,p,global_time);
1464b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	}
147bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
1484b264476cb3f10b994b39e4b61cca0594ea79279robbiew	return(0);
149bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
150bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
1514b264476cb3f10b994b39e4b61cca0594ea79279robbiew	print edit quantities
152bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/
153bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint
154bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewterm()
155bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
1564b264476cb3f10b994b39e4b61cca0594ea79279robbiew	double avgspd;
1574b264476cb3f10b994b39e4b61cca0594ea79279robbiew	double t_total = 0.0;
1584b264476cb3f10b994b39e4b61cca0594ea79279robbiew	double v;
1594b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int i;
1604b264476cb3f10b994b39e4b61cca0594ea79279robbiew
1614b264476cb3f10b994b39e4b61cca0594ea79279robbiew	for (i=0; i < nproc; i++)
1624b264476cb3f10b994b39e4b61cca0594ea79279robbiew		t_total += eventtab[i].time;
1634b264476cb3f10b994b39e4b61cca0594ea79279robbiew
1649e78ade7d6c596a709d0228909bd5d37a85cf4a5vapier	avgspd=ncycle/global_time;
1654b264476cb3f10b994b39e4b61cca0594ea79279robbiew
1664b264476cb3f10b994b39e4b61cca0594ea79279robbiew	v = t_total - MAGIC1;
1674b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (v < 0.0)
1684b264476cb3f10b994b39e4b61cca0594ea79279robbiew		v *= -1.0;
1694b264476cb3f10b994b39e4b61cca0594ea79279robbiew
1704b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (v > DIFF1) {
1714b264476cb3f10b994b39e4b61cca0594ea79279robbiew		tst_resm(TFAIL,"FAIL");
1724b264476cb3f10b994b39e4b61cca0594ea79279robbiew		v = t_total - MAGIC1;
1734b264476cb3f10b994b39e4b61cca0594ea79279robbiew		tst_resm(TINFO,"t_total = %.15f\n", t_total);
1744b264476cb3f10b994b39e4b61cca0594ea79279robbiew		tst_resm(TINFO,"expected  %.15f\n", MAGIC1);
1754b264476cb3f10b994b39e4b61cca0594ea79279robbiew		tst_resm(TINFO,"diff = %.15f\n", v);
1764b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		tst_exit();
1774b264476cb3f10b994b39e4b61cca0594ea79279robbiew	}
1784b264476cb3f10b994b39e4b61cca0594ea79279robbiew
1794b264476cb3f10b994b39e4b61cca0594ea79279robbiew	v = avgspd - MAGIC2;
1804b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (v < 0.0)
1814b264476cb3f10b994b39e4b61cca0594ea79279robbiew		v *= -1.0;
1824b264476cb3f10b994b39e4b61cca0594ea79279robbiew
1834b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (v > DIFF2) {
1844b264476cb3f10b994b39e4b61cca0594ea79279robbiew		tst_resm(TFAIL,"FAIL");
1854b264476cb3f10b994b39e4b61cca0594ea79279robbiew		v = avgspd - MAGIC2;
1864b264476cb3f10b994b39e4b61cca0594ea79279robbiew		tst_resm(TINFO,"avgspd  = %.15f\n", avgspd);
1874b264476cb3f10b994b39e4b61cca0594ea79279robbiew		tst_resm(TINFO,"expected  %.15f\n", MAGIC2);
1884b264476cb3f10b994b39e4b61cca0594ea79279robbiew		tst_resm(TINFO,"diff = %.15f\n", v);
1894b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		tst_exit();
1904b264476cb3f10b994b39e4b61cca0594ea79279robbiew	}
1914b264476cb3f10b994b39e4b61cca0594ea79279robbiew	return(0);
192bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
193bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
1944b264476cb3f10b994b39e4b61cca0594ea79279robbiew	add an event to the event queue
195bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/
196bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint
1974b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooperaddevent(int type,int proc, double t)
198bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
1994b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int i;
2004b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int ok=FALSE;
2014b264476cb3f10b994b39e4b61cca0594ea79279robbiew
2024b264476cb3f10b994b39e4b61cca0594ea79279robbiew	for (i=1; i<=nproc; i++) {
2034b264476cb3f10b994b39e4b61cca0594ea79279robbiew		if (eventtab[i].type==NULLEVENT) {
2044b264476cb3f10b994b39e4b61cca0594ea79279robbiew			eventtab[i].type=type;
2054b264476cb3f10b994b39e4b61cca0594ea79279robbiew			eventtab[i].proc=proc;
2064b264476cb3f10b994b39e4b61cca0594ea79279robbiew			eventtab[i].time=t;
2074b264476cb3f10b994b39e4b61cca0594ea79279robbiew			ok=TRUE;
2084b264476cb3f10b994b39e4b61cca0594ea79279robbiew			break;
2094b264476cb3f10b994b39e4b61cca0594ea79279robbiew		}
2104b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	}
2112c28215423293e443469a07ae7011135d058b671Garrett Cooper	if (ok)
2124b264476cb3f10b994b39e4b61cca0594ea79279robbiew		return(0);
2134b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	else
2144b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		tst_brkm(TBROK, NULL, "No room for event");
2154b264476cb3f10b994b39e4b61cca0594ea79279robbiew	return(0);
216bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
217bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
2184b264476cb3f10b994b39e4b61cca0594ea79279robbiew	get earliest event in event queue
219bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/
220bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event *nextevent()
221bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
2224b264476cb3f10b994b39e4b61cca0594ea79279robbiew	double mintime=BIG;
2234b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int imin=0;
2244b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int i;
225bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
2264b264476cb3f10b994b39e4b61cca0594ea79279robbiew	for (i=1; i<=nproc; i++) {
2274b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		if (eventtab[i].type != NULLEVENT &&
2284b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		    eventtab[i].time<mintime) {
2294b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			imin=i;
2304b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			mintime=eventtab[i].time;
2314b264476cb3f10b994b39e4b61cca0594ea79279robbiew		}
2324b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	}
2332c28215423293e443469a07ae7011135d058b671Garrett Cooper
2344b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (imin) {
2354b264476cb3f10b994b39e4b61cca0594ea79279robbiew		rtrevent.type = eventtab[imin].type;
2364b264476cb3f10b994b39e4b61cca0594ea79279robbiew		rtrevent.proc = eventtab[imin].proc;
2374b264476cb3f10b994b39e4b61cca0594ea79279robbiew		rtrevent.time = eventtab[imin].time;
2384b264476cb3f10b994b39e4b61cca0594ea79279robbiew		eventtab[imin].type=NULLEVENT;
2394b264476cb3f10b994b39e4b61cca0594ea79279robbiew		return(&rtrevent);
2404b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	} else
2414b264476cb3f10b994b39e4b61cca0594ea79279robbiew		return((struct event *)NULL);
242bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
243bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
2444b264476cb3f10b994b39e4b61cca0594ea79279robbiew	add a processor to the waiting queue
245bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/
246bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint
247bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewaddwaiting(p)
248bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint p;
249bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
2504b264476cb3f10b994b39e4b61cca0594ea79279robbiew	waiting[++nwaiting]=p;
2514b264476cb3f10b994b39e4b61cca0594ea79279robbiew	return(0);
252bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
253bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
2544b264476cb3f10b994b39e4b61cca0594ea79279robbiew	remove the next processor from the waiting queue
255bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/
256bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint
257bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewgetwaiting()
258bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
2594b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (nwaiting)
2604b264476cb3f10b994b39e4b61cca0594ea79279robbiew		return(waiting[nwaiting--]);
2614b264476cb3f10b994b39e4b61cca0594ea79279robbiew	else
2624b264476cb3f10b994b39e4b61cca0594ea79279robbiew		return(0);
263bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
264bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble dtcrit()
265bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
2664b264476cb3f10b994b39e4b61cca0594ea79279robbiew	return(dtc);
267bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
268bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble dtspinoff()
269bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
2704b264476cb3f10b994b39e4b61cca0594ea79279robbiew	return(dts);
271bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
272bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble dtwork()
273bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
2744b264476cb3f10b994b39e4b61cca0594ea79279robbiew	return(gauss());
275bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
276bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew/*
2774b264476cb3f10b994b39e4b61cca0594ea79279robbiew	take the action prescribed by 'ev', update the clock, and
2784b264476cb3f10b994b39e4b61cca0594ea79279robbiew	generate any subsequent events
279bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew*/
280bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewint
281bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdoevent(ev)
282bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstruct event *ev;
283bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
2844b264476cb3f10b994b39e4b61cca0594ea79279robbiew	double nxttime;
2854b264476cb3f10b994b39e4b61cca0594ea79279robbiew	int i, p, proc;
2864b264476cb3f10b994b39e4b61cca0594ea79279robbiew
2879e78ade7d6c596a709d0228909bd5d37a85cf4a5vapier	global_time = ev->time;
2884b264476cb3f10b994b39e4b61cca0594ea79279robbiew	proc = ev->proc;
2894b264476cb3f10b994b39e4b61cca0594ea79279robbiew
2904b264476cb3f10b994b39e4b61cca0594ea79279robbiew	switch (ev->type) {
2914b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	case TRYCRIT:
2924b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		if (critfree==TRUE)
2934b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			addevent(ENTERCRIT,proc,global_time);
2944b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		else
2954b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			addwaiting(proc);
2964b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		break;
2974b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	case ENTERCRIT:
2984b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		critfree = FALSE;
2994b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		nxttime=global_time+dtcrit();
3004b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		addevent(LEAVECRIT,proc,nxttime);
3014b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		break;
3024b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	case LEAVECRIT:
3034b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		critfree = TRUE;
3044b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		addevent(ATBARRIER,proc,global_time);
3054b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		if ((p=getwaiting())!=0) {
3064b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			nxttime=global_time;
3074b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			addevent(ENTERCRIT,p,nxttime);
3084b264476cb3f10b994b39e4b61cca0594ea79279robbiew		}
3094b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		break;
3104b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	case ATBARRIER:
3114b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		barcnt++;
3124b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		if (barcnt==nproc) {
3134b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			nxttime=global_time;
3144b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			for (i=1; i<=nproc; i++) {
3154b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper				nxttime+=dtspinoff();
3164b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper				addevent(ENTERWORK,i,nxttime);
3174b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			}
3184b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			barcnt=0;
3194b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			ncycle++;
3204b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		}
3214b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		break;
3224b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	case ENTERWORK:
3234b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		nxttime=global_time+dtwork();
3244b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		if (ncycle<ncycmax)
3254b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper			addevent(LEAVEWORK,proc,nxttime);
3264b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		break;
3274b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	case LEAVEWORK:
3284b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		addevent(TRYCRIT,proc,global_time);
3294b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		break;
3304b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	default:
3314b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		tst_brkm(TBROK, NULL, "Illegal event");
3324b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper		break;
3334b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	}
3344b264476cb3f10b994b39e4b61cca0594ea79279robbiew	return(0);
335bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
336bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
337bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic int alternator=1;
338bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic double mean;
339bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic double stdev;
340bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic double u1,u2;
341bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewstatic double twopi;
342bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew
3434b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Coopervoid gaussinit(double m, double s)
344bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
3454b264476cb3f10b994b39e4b61cca0594ea79279robbiew	mean=m;
3464b264476cb3f10b994b39e4b61cca0594ea79279robbiew	stdev=s;
3474b264476cb3f10b994b39e4b61cca0594ea79279robbiew	twopi=2.*acos((double)-1.0);
3484b264476cb3f10b994b39e4b61cca0594ea79279robbiew	u1 = twopi / 400.0;
3494b264476cb3f10b994b39e4b61cca0594ea79279robbiew	u2 = twopi / 500.0;
350bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew}
3512c28215423293e443469a07ae7011135d058b671Garrett Cooper
352bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiewdouble gauss()
353bd002493fe25b809dbf37e89c6ceb8fe90dc9d49robbiew{
3544b264476cb3f10b994b39e4b61cca0594ea79279robbiew	double x1,x2;
3554b264476cb3f10b994b39e4b61cca0594ea79279robbiew
3564b264476cb3f10b994b39e4b61cca0594ea79279robbiew	gcount++;
3574b264476cb3f10b994b39e4b61cca0594ea79279robbiew
3584b264476cb3f10b994b39e4b61cca0594ea79279robbiew	u1 += u2;
3594b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (u1 > 0.99)
3604b264476cb3f10b994b39e4b61cca0594ea79279robbiew		u1 = twopi / 500.0;
3614b264476cb3f10b994b39e4b61cca0594ea79279robbiew	u2 += u1;
3624b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (u2 > 0.99)
3634b264476cb3f10b994b39e4b61cca0594ea79279robbiew		u2 = twopi / 400.0;
3644b264476cb3f10b994b39e4b61cca0594ea79279robbiew
3654b264476cb3f10b994b39e4b61cca0594ea79279robbiew	if (alternator==1) {
3664b264476cb3f10b994b39e4b61cca0594ea79279robbiew		alternator = -1;
3674b264476cb3f10b994b39e4b61cca0594ea79279robbiew		x1 = sqrt(-2.0*log(u1))*cos(twopi*u2);
3684b264476cb3f10b994b39e4b61cca0594ea79279robbiew		return(mean + stdev*x1);
3694b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	} else {
3704b264476cb3f10b994b39e4b61cca0594ea79279robbiew		alternator = 1;
3714b264476cb3f10b994b39e4b61cca0594ea79279robbiew		x2 = sqrt(-2.0*log(u1))*sin(twopi*u2);
3724b264476cb3f10b994b39e4b61cca0594ea79279robbiew		return(mean + stdev*x2);
3734b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper	}
3744b20b1d51ab9293abe408289e9096fbf3fa9b080Garrett Cooper}
375