00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #pragma ident "@(#) libf/fio/iochunk.c 92.2 06/21/99 10:37:55"
00043
00044
00045 #include <liberrno.h>
00046 #include <stdlib.h>
00047 #include <cray/nassert.h>
00048 #include "fio.h"
00049 #include "f90io.h"
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 int
00067 _iochunk(
00068 FIOSPTR css,
00069 unit *cup,
00070 xfer_func *func,
00071 struct DvDimen *dim,
00072 type_packet *tip,
00073 short nd,
00074 long extent,
00075 int bshft,
00076 bcont *addr)
00077
00078 {
00079 register int errn;
00080 register long binc;
00081 register long dim2_ex;
00082 register long dim1_pb;
00083 register long dim1_sz;
00084 register long i;
00085 register long id3, id4, id5, id6, id7;
00086 #ifdef KEY
00087
00088 long long lbuf[CHBUFSIZE / sizeof(long long)];
00089 #else
00090 long lbuf[CHBUFSIZE / sizeof(long)];
00091 #endif
00092 char *lptr;
00093 bcont *addr2, *addr3, *addr4, *addr5, *addr6;
00094
00095
00096
00097 assert ( (extent * tip->elsize) <= CHBUFSIZE );
00098
00099 binc = tip->elsize * tip->stride;
00100 dim1_sz = extent * tip->elsize;
00101 tip->stride = 1;
00102
00103 if (nd == 1)
00104 dim2_ex = 1;
00105 else
00106 dim2_ex = dim[1].extent;
00107
00108 dim1_pb = CHBUFSIZE / dim1_sz;
00109
00110 if (dim1_pb > dim2_ex)
00111 dim1_pb = dim2_ex;
00112
00113 switch (nd) {
00114
00115 case 7:
00116 for (id7 = 0; id7 < dim[6].extent; id7++) {
00117 addr6 = addr;
00118 case 6:
00119 for (id6 = 0; id6 < dim[5].extent; id6++) {
00120 addr5 = addr;
00121 case 5:
00122 for (id5 = 0; id5 < dim[4].extent; id5++) {
00123 addr4 = addr;
00124 case 4:
00125 for (id4 = 0; id4 < dim[3].extent; id4++) {
00126 addr3 = addr;
00127 case 3:
00128 for (id3 = 0; id3 < dim[2].extent; id3++) {
00129 addr2 = addr;
00130
00131 case 2:
00132 dim2_ex = dim[1].extent;
00133
00134 while (dim2_ex > 0) {
00135
00136 if (dim1_pb > dim2_ex)
00137 dim1_pb = dim2_ex;
00138
00139 case 1:
00140 lptr = (char *) lbuf;
00141 tip->count = dim1_pb * extent;
00142
00143 if (cup->uwrt) {
00144
00145
00146
00147
00148
00149
00150 for (i = 0; i < dim1_pb; i++) {
00151 _gather_data(lptr, extent, binc, tip->elsize, addr);
00152
00153 addr = addr + (dim[1].stride_mult << bshft);
00154 lptr = lptr + dim1_sz;
00155 }
00156
00157 errn = func(css, cup, lbuf, tip, PARTIAL);
00158 }
00159 else {
00160
00161 errn = func(css, cup, lbuf, tip, PARTIAL);
00162
00163
00164
00165
00166
00167
00168 for (i = 0; i < dim1_pb; i++) {
00169 _scatter_data(addr, extent, binc, tip->elsize, lptr);
00170
00171 addr = addr + (dim[1].stride_mult << bshft);
00172 lptr = lptr + dim1_sz;
00173 }
00174 }
00175
00176 if (errn != 0) goto done;
00177
00178 dim2_ex = dim2_ex - dim1_pb;
00179
00180 if (nd == 1) goto done;
00181 }
00182
00183 if (nd == 2) goto done;
00184 addr = addr2 + (dim[2].stride_mult << bshft);
00185 }
00186 if (nd == 3) goto done;
00187 addr = addr3 + (dim[3].stride_mult << bshft);
00188 }
00189 if (nd == 4) goto done;
00190 addr = addr4 + (dim[4].stride_mult << bshft);
00191 }
00192 if (nd == 5) goto done;
00193 addr = addr5 + (dim[5].stride_mult << bshft);
00194 }
00195 if (nd == 6) goto done;
00196 addr = addr6 + (dim[6].stride_mult << bshft);
00197 }
00198 }
00199
00200 done:
00201 return(errn);
00202 }