int main(int argc, char **argv) { // OP initialisation op_init(argc,argv,5); int nnode, nedge, n, e; nnode = (NN-1)*(NN-1); nedge = (NN-1)*(NN-1) + 4*(NN-1)*(NN-2); int *pp = (int *)malloc(sizeof(int)*2*nedge); float *A = (float *)malloc(sizeof(float)*nedge); float *r = (float *)malloc(sizeof(float)*nnode); float *u = (float *)malloc(sizeof(float)*nnode); float *du = (float *)malloc(sizeof(float)*nnode); // create matrix and r.h.s., and set coordinates needed for renumbering / partitioning e = 0; for (int i=1; i<NN; i++) { for (int j=1; j<NN; j++) { n = i-1 + (j-1)*(NN-1); r[n] = 0.0f; u[n] = 0.0f; du[n] = 0.0f; pp[2*e] = n; pp[2*e+1] = n; A[e] = -1.0f; e++; for (int pass=0; pass<4; pass++) { int i2 = i; int j2 = j; if (pass==0) i2 += -1; if (pass==1) i2 += 1; if (pass==2) j2 += -1; if (pass==3) j2 += 1; if ( (i2==0) || (i2==NN) || (j2==0) || (j2==NN) ) { r[n] += 0.25f; } else { pp[2*e] = n; pp[2*e+1] = i2-1 + (j2-1)*(NN-1); A[e] = 0.25f; e++; } } } } // declare sets, pointers, and datasets op_set nodes = op_decl_set(nnode, "nodes"); op_set edges = op_decl_set(nedge, "edges"); op_map ppedge = op_decl_map(edges,nodes,2,pp, "ppedge"); op_dat p_A = op_decl_dat(edges,1,"float",A, "p_A" ); op_dat p_r = op_decl_dat(nodes,1,"float",r, "p_r" ); op_dat p_u = op_decl_dat(nodes,1,"float",u, "p_u" ); op_dat p_du = op_decl_dat(nodes,1,"float",du, "p_du"); alpha = 1.0f; op_decl_const2("alpha",1,"float",&alpha); op_diagnostic_output(); // main iteration loop float u_sum, u_max, beta = 1.0f; for (int iter=0; iter<NITER; iter++) { op_par_loop_res("res",edges, op_arg_dat(p_A,-1,OP_ID,1,"float",OP_READ), op_arg_dat(p_u,1,ppedge,1,"float",OP_READ), op_arg_dat(p_du,0,ppedge,1,"float",OP_INC), op_arg_gbl(&beta,1,"float",OP_READ)); u_sum = 0.0f; u_max = 0.0f; op_par_loop_update("update",nodes, op_arg_dat(p_r,-1,OP_ID,1,"float",OP_READ), op_arg_dat(p_du,-1,OP_ID,1,"float",OP_RW), op_arg_dat(p_u,-1,OP_ID,1,"float",OP_INC), op_arg_gbl(&u_sum,1,"float",OP_INC), op_arg_gbl(&u_max,1,"float",OP_MAX)); op_printf("\n u max/rms = %f %f \n\n",u_max, sqrt(u_sum/nnode)); } // print out results op_printf("\n Results after %d iterations:\n\n",NITER); op_fetch_data(p_u, u); for (int pass=0; pass<1; pass++) { for (int j=NN-1; j>0; j--) { for (int i=1; i<NN; i++) { if (pass==0) op_printf(" %7.4f",u[i-1 + (j-1)*(NN-1)]); else if (pass==1) op_printf(" %7.4f",du[i-1 + (j-1)*(NN-1)]); else if (pass==2) op_printf(" %7.4f",r[i-1 + (j-1)*(NN-1)]); } op_printf("\n"); } op_printf("\n"); } op_timing_output(); int result = check_result<float>(u, NN, TOLERANCE); op_exit(); free(pp); free(A); free(u); free(du); free(r); return result; }
int main(int argc, char **argv){ int nnode, nedge, n, e; float dx; nnode = (NN-1)*(NN-1); nedge = (NN-1)*(NN-1) + 4*(NN-1)*(NN-2); dx = 1.0f / ((float) NN); int *pp = (int *)malloc(sizeof(int)*2*nedge); int *p1 = (int *)malloc(sizeof(int)*nedge); int *p2 = (int *)malloc(sizeof(int)*nedge); float *xe = (float *)malloc(sizeof(float)*2*nedge); float *xn = (float *)malloc(sizeof(float)*2*nnode); double *A = (double *)malloc(sizeof(double)*3*nedge); float *r = (float *)malloc(sizeof(float)*2*nnode); float *u = (float *)malloc(sizeof(float)*2*nnode); float *du = (float *)malloc(sizeof(float)*3*nnode); // create matrix and r.h.s., and set coordinates needed for renumbering / partitioning e = 0; for (int i=1; i<NN; i++) { for (int j=1; j<NN; j++) { n = i-1 + (j-1)*(NN-1); r[2*n] = 0.0f; u[2*n] = 0.0f; du[3*n] = 0.0f; xn[2*n ] = i*dx; xn[2*n+1] = j*dx; p1[e] = n; p2[e] = n; pp[2*e] = p1[e]; pp[2*e+1] = p2[e]; A[3*e] = -1.0f; xe[2*e ] = i*dx; xe[2*e+1] = j*dx; e++; for (int pass=0; pass<4; pass++) { int i2 = i; int j2 = j; if (pass==0) i2 += -1; if (pass==1) i2 += 1; if (pass==2) j2 += -1; if (pass==3) j2 += 1; if ( (i2==0) || (i2==NN) || (j2==0) || (j2==NN) ) { r[2*n] += 0.25f; } else { p1[e] = n; p2[e] = i2-1 + (j2-1)*(NN-1); pp[2*e] = p1[e]; pp[2*e+1] = p2[e]; A[3*e] = 0.25f; xe[2*e ] = i*dx; xe[2*e+1] = j*dx; e++; } } } } // OP initialisation op_init(argc,argv,5); // declare sets, pointers, and datasets op_set nodes = op_decl_set(nnode, "nodes"); op_set edges = op_decl_set(nedge, "edges"); op_map ppedge = op_decl_map(edges,nodes,2,pp, "ppedge"); op_dat p_A = op_decl_dat(edges,3,"double",A, "p_A" ); op_dat p_r = op_decl_dat(nodes,2,"float", r, "p_r" ); op_dat p_u = op_decl_dat(nodes,2,"float", u, "p_u" ); op_dat p_du = op_decl_dat(nodes,3,"float", du, "p_du"); alpha = 2.0f; op_decl_const2("alpha",1,"float",&alpha); alpha = 1.0f; op_decl_const2("alpha",1,"float",&alpha); op_diagnostic_output(); // main iteration loop float u_sum, u_max, beta = 1.0f; for (int iter=0; iter<NITER; iter++) { op_par_loop_res("res", edges, op_arg_dat(p_A, -1,OP_ID, 3,"double",OP_READ), op_arg_dat(p_u, 1,ppedge, 2,"float", OP_READ), op_arg_dat(p_du, 0,ppedge, 3,"float", OP_INC ), op_arg_gbl(&beta,1,"float",OP_READ)); u_sum = 0.0f; u_max = 0.0f; op_par_loop_update("update", nodes, op_arg_dat(p_r, -1,OP_ID, 2,"float",OP_READ), op_arg_dat(p_du, -1,OP_ID, 3,"float",OP_RW ), op_arg_dat(p_u, -1,OP_ID, 2,"float",OP_INC ), op_arg_gbl(&u_sum,1,"float",OP_INC), op_arg_gbl(&u_max,1,"float",OP_MAX)); printf("\n u max/rms = %f %f \n\n",u_max, sqrt(u_sum/nnode)); } // print out results printf("\n Results after %d iterations:\n\n",NITER); op_fetch_data(p_u); /* op_fetch_data(p_du); op_fetch_data(p_r); */ for (int pass=0; pass<1; pass++) { /* if(pass==0) printf("\narray u\n"); else if(pass==1) printf("\narray du\n"); else if(pass==2) printf("\narray r\n"); */ for (int j=NN-1; j>0; j--) { for (int i=1; i<NN; i++) { if (pass==0) printf(" %7.4f",u[2*(i-1 + (j-1)*(NN-1))]); else if (pass==1) printf(" %7.4f",du[i-1 + (j-1)*(NN-1)]); else if (pass==2) printf(" %7.4f",r[2*(i-1 + (j-1)*(NN-1))]); } printf("\n"); } printf("\n"); } op_timing_output(); op_exit(); // free allocated arrays free(pp); free(A); free(r); free(u); free(du); }