#include <stdio.h> #include <stdlib.h> #include <math.h> #include <mpc.h> #define DELTA (0.5) typedef struct { double len; double wid; double hei; double mass; } rail; nettype HeteroNet(int n, double v[n]) { coord I=n; node { I>=0: v[I]; }; parent [0]; }; double Density(double x, double y, double z) { return 6.0 * sqrt( exp( sin( sqrt( x*y*z ) ) ) ); } int [*]main(int [host]argc, char **[host]argv) { repl N=3; if(argc>1) N = [host]atoi(argv[1]); if(N>0) { static rail [host]steel_hedgehog[[host]N]; repl double volumes[N], [host]start; int [host]i; repl j; for(i=0; i<[host]N; i++) { steel_hedgehog[i].len = 200.0*(i+1); steel_hedgehog[i].wid = 5.0*(i+1); steel_hedgehog[i].hei = 10.0*(i+1); } start = [host]MPC_Wtime(); for(j=0; j<N; j++) volumes[j] = steel_hedgehog[j].len * steel_hedgehog[j].wid * steel_hedgehog[j].hei; { net HeteroNet(N, volumes) mynet; [mynet]: { rail myrail; double x, y, z; myrail = steel_hedgehog[]; for(myrail.mass=0., x=0.; x<myrail.len; x+=DELTA) for(y=0.; y<myrail.wid; y+=DELTA) for(z=0.; z<myrail.hei; z+=DELTA) myrail.mass += Density(x,y,z); myrail.mass *= DELTA*DELTA*DELTA; MPC_Printf("Rail #%d is %gcm x %gcm x%gcm and weights %g kg\n", I coordof mynet, myrail.len, myrail.wid, myrail.hei, myrail.mass/1000.0); [host]printf("The steel hedgehog weights %g kg\n", [host]( (myrail.mass)[+]) / 1000.0 ); } } [host]printf("\nIt took %.1f seconds to run the program.\n", [host]MPC_Wtime() - start); } else [host]printf("Wrong input (N=%d)\n", [host]N); }