/* Code:  Cray T90 PVP version of starter C problem, MCS 592 F2000           */
/* Compile/Link:                                                             */
/*   cc -O3 -h scalar2 -h report=isvf -o [program] [program].c>&[program].V& */
/* Execute:   [program] >& [program].output &  "{assuming csh shell}"        */
#include <stdio.h>
#include <math.h>
#include <sys/time.h>

/* Define Global Parameters */
#define n 512
#define nn 6
#define nnd 5
#define NTime 20

FILE *out;

/* Main program */ 
main()
{
/* System generated locals */
    int i__1;
    double d__1;

/* Implicit Local variables */
    int i, j, k, l, m;
    int kt, n2, nd, ndd;
    double sm, tm, dev;

/* Local variables */
    double cog[n], fractn[n], box[n][3], t[n], y[n];
    double z[n], s[n], a[n], b[n], am[n], vm[n], zm[n];
    double d1[n][n], d2[n][n], d3[n][n], fv[3][n][n];
    int kk[n], ll[n], mm[n];

/* Time variables */
   struct timeval tp ;
/* timeval is a structure with pointer name tp and having 
   unsigned long  tp.tv_sec giving  seconds since Jan. 1, 1970
            long  tp.tv_usec giving microseconds */
   struct timezone tzp; /* needed only for time zone data */

    int gtod;
    long int tsecs[NTime], tmicrosecs[NTime];
    long int ttot[NTime], ttotmoh[NTime];
    float ts1, tt1, tu1, tu2, ts2, tt2, tu3, ts3, tt3;
    double ttotf;

/* Initialized data */
    static double cutl = 6.;
    static double cinc = 4.;
    static double alfa = 3.6;
    static double xbar = 8.;

/* external functions */
    extern double fm_();
    extern /* Subroutine */ int sub_();

/* begin main code */
   if (gettimeofday(&tp,&tzp) == -1) { perror("gettimeofday failed"); exit(1);}
   kt = 1;
/* gettimeofday = Microsecond Wall Timer C function;                         */
/* WallTime = UserTime + SystemTime, Undecomposed;                           */
/* gettimeofday returns gtod = 0 if successful;                              */
/* tv_sec in secs since 1/1/70;                                              */
/* tv_usec in added microseconds;                                            */
/* tzp gives the timezone;                                                   */
    gtod=gettimeofday(&tp,&tzp);
    tsecs[0] = tp.tv_sec;
    tmicrosecs[0] = tp.tv_usec;
    ++kt;
    gtod=gettimeofday(&tp,&tzp);
    tsecs[1] = tp.tv_sec;
    tmicrosecs[1] = tp.tv_usec;
    /* do 5 i loop */
    for (i = 0; i < n; ++i) {
	cog[i] = (float)1.;
	fractn[i] = (float)1.;
	t[i] = (float)1.;
	y[i] = (float)1.;
	s[i] = (float)1.;
	z[i] = (float)1.;
	a[i] = (float)1.;
	b[i] = (float)1.;
	mm[i] = 1;
	kk[i] = 1;
	ll[i] = 1;
        /* do 5 j loop */
	for (j = 0; j < 3; ++j) {
/* L5: */   box[i][j] = (j+1) * (float)1.5 * (i+1) / ((float)n+1.);
	}
    }
    /* do 6 i loop */
    for (i = 0; i < n; ++i) {
        /* do 6 j loop */
	for (j = 0; j < n; ++j) {
	    d1[i][j] = (float)1.25;
	    d2[i][j] = (float)1.25;
/* L6: */   d3[i][j] = (float)1.45;
	}
    }
    /* do 10 i loop */
    for (i = 0; i < n; ++i) {
/* L10: */ y[i] = t[i] + s[i];
    }
    /* do 20 m loop */
    for (m = 0; m < n; ++m) {
	s[m] = a[m] * (m+1);
/* L20: */ t[m] = y[m] + alfa + (float)2.7;
    }
    /* do 30 i loop */
    for (i = 0; i < n; ++i) {
	cog[i] = fractn[i] / (float)6.;
/* L30: */ mm[i] = kk[i] * ll[i] / 4;
    }
    k = 1;
    /* do 50 i loop */
    for (i = 0; i < n; ++i) {
	k += 2;
	cog[i] = cutl + (i) * cinc;
	dev = cog[i] + alfa - xbar;
        /* do 50 j loop */
	for (j = 0; j < 3; ++j) {
/* L50: */  box[i][j] += (float).25;
	}
    }
    for (i = 0; i < n; ++i) {
	for (j = 0; j < n; ++j) {
	    for (k = 0; k < n; ++k) {
		d1[i][j] = d1[i][j] + d2[i][j] + d3[i][j];
		for (l = 0; l < 5; ++l) {
/* L60: */          d3[i][l] = d2[i][l] * d1[i][l];
		}
	    }
	}
    }
    for (i = 0; i < n; ++i) {
	for (j = 0; j < 3; ++j) {
/* L70: */  t[i] -= box[i][j];
	}
    }
    for (i = 1; i < n; ++i) {
	a[i] = b[i] * box[i][0];
/* L80: */ z[i] = t[i] * z[i-1] + cog[i];
    }
    for (i = 3; i < n-2; ++i) {
	b[i] = s[i-3];
	s[i] = y[i];
        cog[i] = b[i] * cutl;
/* L90: */ cog[i + 2] = y[i] * xbar;
    }
    l = 0;
L100:
    y[l] = t[l] * s[l];
    l += 2;
    if (l < n) {
	goto L100;
    }
    sm = 0.;
    for (i = 0; i < n; ++i) {
/* L110: */ sm += sqrt(exp((i-1) * (float)-.24) + (float)1.);
    }
    for (i = 0; i < n; ++i) {
	i__1 = i+1;
        tm = exp(i__1 * i__1 * (float)-.23) + 1 + sin(i__1 * (float).26 + 6);
	d__1 = tm;
/* L120: */ am[i] = tm * (float).592 / (d__1 * d__1 + 1);
    }
    for (i = 0; i < n; ++i) {
/* L130: */ vm[i] = fm_(&am[i]);
    }
    for (i = 0; i < 3; ++i) {
	for (j = 0; j < n; ++j) {
	    for (k = 0; k < n; ++k) {
		fv[i][j][k] = box[j][i]*(float).03*box[k][(2-i)]
		            /(box[j][i]*(float).34 + 1);
/* L140: */
	    }
	}
    }
    for (i = 0; i < n; ++i) {
	sub_(am, vm, zm);
/* L150: */
    }
/* Clock: Elapsed Total Time: */
    ++kt;
    gtod=gettimeofday(&tp,&tzp);
    tsecs[kt] = tp.tv_sec;
    tmicrosecs[kt] = tp.tv_usec;
/* Total Elapsed Time Including Clock Overhead*/
    ttot[kt] = (tsecs[kt]-tsecs[1])*1000000+(tmicrosecs[kt]-tmicrosecs[1]);
/* Total Elapsed Time Minus Clock Overhead */
    ttotmoh[kt] = ttot[kt] - (tmicrosecs[1] - tmicrosecs[0]);
    printf("\nIntermediate Raw Timing Output:");
    printf("\ntmicrosecs[(0,1,kt)]=(%12d,%12d,%12d), in microseconds",
    tmicrosecs[0],tmicrosecs[1],tmicrosecs[kt]);
    printf("\ntsecs[(0,1,kt)]=(%12d,%12d,%12d), in seconds",
    tsecs[0],tsecs[1],tsecs[kt]);
    printf("\n(ttot[kt],ttotmoh[kt])=(%12d,%12d), in microseconds",
    ttot[kt],ttotmoh[kt]);
    if (ttot[kt] < 0){printf("\n  Error:Negative Times:Bad Clock:Rerun Job\n");}
    ttotf = ttotmoh[kt]/1.e6;
    printf("\n T90 Starter C Problem Output");
    printf("\n  Timing Output:");
printf("\n   final total time=%12.4e, in seconds\n",ttotf);
/* Change:  Extra output statements: */
    nd=(n-1)/(nn-1);
    ndd=(n-1)/(nnd-1);
    n2=(n+1)/2;
printf("\n parameters: n=%4d; nn=%2d; nnd=%2d; nd=%4d; ndd=%4d; n2=%4d;",n,nn,nnd,nd,ndd,n2);
    printf("\n    a(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11.3e",a[i]);}
    printf("\n   am(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11.3e",am[i]);}
    printf("\n    b(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11.3e",b[i]);}
    printf("\n     1:n:nd:");
    for (i = 0;i < n; i += nd){printf("%11d",i);}
    printf("\n  b(1:n:nd):");
    for (i = 1;i < n; i += nd){printf("%11.3e",b[i]);}
    printf("\n   box(i,2):");
    for (i = 0;i < n; i += nd){printf("%11.3e",box[i][1]);}
    printf("\ncog(2:n:nd):");
    for (i = 1;i < n; i += nd){printf("%11.3e",cog[i]);}
    printf("\n        dev:%11.3e",dev);
    printf("\n    1:n:ndd:");
    for (i = 0;i < n; i += ndd){printf("%13d",i);}
    printf("\n    d1(1,j):");
    for (j = 0;j < n; j += ndd){printf("%13.5e",d1[0][j]);}
    printf("\n   d1(n2,j):");
    for (j = 0;j < n; j += ndd){printf("%13.5e",d1[n2-1][j]);}
    printf("\n    d1(n,j):");
    for (j = 0;j < n; j += ndd){printf("%13.5e",d1[n-1][j]);}
    printf("\n    d1(i,1):");
    for (i = 0;i < n; i += ndd){printf("%13.5e",d1[i][0]);}
    printf("\n   d1(i,n2):");
    for (i = 0;i < n; i += ndd){printf("%13.5e",d1[i][n2-1]);}
    printf("\n    d1(i,n):");
    for (i = 0;i < n; i += ndd){printf("%13.5e",d1[i][n-1]);}
    printf("\n   d2(n2,j):");
    for (j = 0;j < n; j += ndd){printf("%13.5e",d2[n2-1][j]);}
    printf("\n    d3(i,1):");
    for (i = 0;i < n; i += ndd){printf("%13.5e",d3[i][0]);}
    printf("\n   d3(i,n2):");
    for (i = 0;i < n; i += ndd){printf("%13.5e",d3[i][n2-1]);}
    printf("\n    d3(i,n):");
    for (i = 0;i < n; i += ndd){printf("%13.5e",d3[i][n-1]);}
    printf("\n    d3(1,j):");
    for (j = 0;j < n; j += ndd){printf("%13.5e",d3[0][j]);}
    printf("\n   d3(n2,j):");
    for (j = 0;j < n; j += ndd){printf("%13.5e",d3[n2-1][j]);}
    printf("\n    d3(n,j):");
    for (j = 0;j < n; j += ndd){printf("%13.5e",d3[n-1][j]);}
    printf("\n    1:n:ndd:");
    for (i = 0;i < n; i += nd){printf("%11d",i);}
    printf("\n  fractn(i):");
    for (i = 0;i < n; i += nd){printf("%11.3e",fractn[i]);}
    printf("\n fv(1,n2,k):");
    for (k = 0;k < n; k += nd){printf("%11.3e",fv[0][n2-1][k]);}
    printf("\n fv(3,n2,k):");
    for (k = 0;k < n; k += nd){printf("%11.3e",fv[2][n2-1][k]);}
    printf("\n fv(1,k,n2):");
    for (k = 0;k < n; k += nd){printf("%11.3e",fv[0][k][n2-1]);}
    printf("\n fv(3,k,n2):");
    for (k = 0;k < n; k += nd){printf("%11.3e",fv[2][k][n2-1]);}
    printf("\n          k:%11d",k);
    printf("\n         kt:%11d",kt);
    printf("\n   kk(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11d",kk[i]);}
    printf("\n   ll(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11d",ll[i]);}
    printf("\n   mm(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11d",mm[i]);}
    printf("\n    s(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11.3e",s[i]);}
    printf("\n  s(2:n:nd):");
    for (i = 1;i < n; i += nd){printf("%11.3e",s[i]);}
    printf("\n         sm:%11.3e",sm);
    printf("\n  t(1:n:nd):");
    for (i = 0;i < n; i += nd){printf("%11.3e",t[i]);}
    printf("\n         tm:%11.3e",tm);
    printf("\n   vm(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11.3e",vm[i]);}
    printf("\n  y(1:n:nd):");
    for (i = 0;i < n; i += nd){printf("%11.3e",y[i]);}
    printf("\n  z(1:n:nd):");
    for (i = 0;i < n; i += nd){printf("%11.3e",z[i]);}
    printf("\n   zm(1:nn):");
    for (i = 0; i < nn; ++i){printf("%11.3e",zm[i]);}
} /* end MAIN__ */

/* function */
double fm_(x)
double *x;
{
/* System generated locals */
    double ret_val;

    ret_val = *x * (float).592 * ((float)17.27 - *x) + (float)48.67;
    return ret_val;
} /* fm_ */

/* Subroutine */ int sub_(a, v, z)
double *a, *v, *z;
{
/* System generated locals */
    int i__1;
/* Local variables */
    int i;

/* Function Body */
    for (i = 0; i < n; ++i) {
	if (a[i] > v[i]) {
	    z[i] = a[i];
	} else {
	    z[i] = a[i] + v[i] * (float)2.56;
	}
/* L1: */
    }
    return 0;
} /* sub_ */

