| /*************************************************************************/ |
| /* */ |
| /* Copyright (c) 1994 Stanford University */ |
| /* */ |
| /* All rights reserved. */ |
| /* */ |
| /* Permission is given to use, copy, and modify this software for any */ |
| /* non-commercial purpose as long as this copyright notice is not */ |
| /* removed. All other uses, including redistribution in whole or in */ |
| /* part, are forbidden without prior written permission. */ |
| /* */ |
| /* This software is provided with absolutely no warranty and no */ |
| /* support. */ |
| /* */ |
| /*************************************************************************/ |
| |
| /* Set all the pointers to the proper locations for the q_multi and |
| rhs_multi data structures */ |
| |
| EXTERN_ENV |
| |
| #include "decs.h" |
| |
| void linkup(); |
| void link_multi(); |
| |
| void link_all() |
| |
| { |
| int i; |
| int j; |
| |
| for (j=0;j<nprocs;j++) { |
| linkup(psium[j]); |
| linkup(psilm[j]); |
| linkup(psib[j]); |
| linkup(ga[j]); |
| linkup(gb[j]); |
| linkup(work2[j]); |
| linkup(work3[j]); |
| linkup(work6[j]); |
| linkup(tauz[j]); |
| linkup(oldga[j]); |
| linkup(oldgb[j]); |
| for (i=0;i<=1;i++) { |
| linkup(psi[j][i]); |
| linkup(psim[j][i]); |
| linkup(work1[j][i]); |
| linkup(work4[j][i]); |
| linkup(work5[j][i]); |
| linkup(work7[j][i]); |
| linkup(temparray[j][i]); |
| } |
| } |
| link_multi(); |
| } |
| |
| void linkup(row_ptr) |
| |
| double **row_ptr; |
| |
| { |
| int i; |
| int j; |
| double *a; |
| double **row; |
| double **y; |
| int x_part; |
| int y_part; |
| |
| x_part = (jm-2)/xprocs + 2; |
| y_part = (im-2)/yprocs + 2; |
| row = row_ptr; |
| y = row + y_part; |
| a = (double *) y; |
| for (i=0;i<y_part;i++) { |
| *row = (double *) a; |
| row++; |
| a += x_part; |
| } |
| } |
| |
| void link_multi() |
| |
| { |
| int i; |
| int j; |
| int l; |
| double *a; |
| double **row; |
| double **y; |
| void* z; |
| void* zz; |
| int x_part; |
| int y_part; |
| unsigned int d_size; |
| |
| z = ((void*) q_multi + nprocs*sizeof(double ***)); |
| |
| if (nprocs%2 == 1) { /* To make sure that the actual data |
| starts double word aligned, add an extra |
| pointer */ |
| z += sizeof(double ***); |
| } |
| |
| d_size = numlev*sizeof(double **); |
| if (numlev%2 == 1) { /* To make sure that the actual data |
| starts double word aligned, add an extra |
| pointer */ |
| d_size += sizeof(double **); |
| } |
| for (i=0;i<numlev;i++) { |
| d_size += ((imx[i]-2)/yprocs+2)*((jmx[i]-2)/xprocs+2)*sizeof(double)+ |
| ((imx[i]-2)/yprocs+2)*sizeof(double *); |
| } |
| for (i=0;i<nprocs;i++) { |
| q_multi[i] = (double ***) z; |
| z += d_size; |
| } |
| for (j=0;j<nprocs;j++) { |
| zz = (void*) q_multi[j]; |
| zz += numlev*sizeof(double **); |
| if (numlev%2 == 1) { /* To make sure that the actual data |
| starts double word aligned, add an extra |
| pointer */ |
| zz += sizeof(double **); |
| } |
| for (i=0;i<numlev;i++) { |
| d_size = ((imx[i]-2)/yprocs+2)*((jmx[i]-2)/xprocs+2)*sizeof(double)+ |
| ((imx[i]-2)/yprocs+2)*sizeof(double *); |
| q_multi[j][i] = (double **) zz; |
| zz += d_size; |
| } |
| } |
| |
| for (l=0;l<numlev;l++) { |
| x_part = (jmx[l]-2)/xprocs + 2; |
| y_part = (imx[l]-2)/yprocs + 2; |
| for (j=0;j<nprocs;j++) { |
| row = q_multi[j][l]; |
| y = row + y_part; |
| a = (double *) y; |
| for (i=0;i<y_part;i++) { |
| *row = (double *) a; |
| row++; |
| a += x_part; |
| } |
| } |
| } |
| |
| z = ((void*) rhs_multi + nprocs*sizeof(double ***)); |
| if (nprocs%2 == 1) { /* To make sure that the actual data |
| starts double word aligned, add an extra |
| pointer */ |
| z += sizeof(double ***); |
| } |
| |
| d_size = numlev*sizeof(double **); |
| if (numlev%2 == 1) { /* To make sure that the actual data |
| starts double word aligned, add an extra |
| pointer */ |
| d_size += sizeof(double **); |
| } |
| for (i=0;i<numlev;i++) { |
| d_size += ((imx[i]-2)/yprocs+2)*((jmx[i]-2)/xprocs+2)*sizeof(double)+ |
| ((imx[i]-2)/yprocs+2)*sizeof(double *); |
| } |
| for (i=0;i<nprocs;i++) { |
| rhs_multi[i] = (double ***) z; |
| z += d_size; |
| } |
| for (j=0;j<nprocs;j++) { |
| zz = (void*) rhs_multi[j]; |
| zz += numlev*sizeof(double **); |
| if (numlev%2 == 1) { /* To make sure that the actual data |
| starts double word aligned, add an extra |
| pointer */ |
| zz += sizeof(double **); |
| } |
| for (i=0;i<numlev;i++) { |
| d_size = ((imx[i]-2)/yprocs+2)*((jmx[i]-2)/xprocs+2)*sizeof(double)+ |
| ((imx[i]-2)/yprocs+2)*sizeof(double *); |
| rhs_multi[j][i] = (double **) zz; |
| zz += d_size; |
| } |
| } |
| |
| for (l=0;l<numlev;l++) { |
| x_part = (jmx[l]-2)/xprocs + 2; |
| y_part = (imx[l]-2)/yprocs + 2; |
| for (j=0;j<nprocs;j++) { |
| row = rhs_multi[j][l]; |
| y = row + y_part; |
| a = (double *) y; |
| for (i=0;i<y_part;i++) { |
| *row = (double *) a; |
| row++; |
| a += x_part; |
| } |
| } |
| } |
| |
| } |
| |
| |