Changeset 38062 for trunk/Ohana/src/opihi/lib.shell/stack_math.c
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
-
trunk/Ohana
- Property svn:mergeinfo deleted
-
trunk/Ohana/src/opihi/lib.shell/stack_math.c
r36528 r38062 80 80 break; \ 81 81 } \ 82 if ((V1->vector->type == OPIHI_FLT) && (V2->vector->type == OPIHI_FLT) && (V3->vector->type == OPIHI_INT)) { \ 83 CopyVector (OUT[0].vector, V1[0].vector); \ 84 opihi_flt *M1 = V1[0].vector[0].elements.Flt; \ 85 opihi_flt *M2 = V2[0].vector[0].elements.Flt; \ 86 opihi_int *M3 = V3[0].vector[0].elements.Int; \ 87 opihi_flt *out = OUT[0].vector[0].elements.Flt; \ 88 for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) { \ 89 *out = OP; \ 90 } \ 91 break; \ 92 } \ 93 if ((V1->vector->type == OPIHI_FLT) && (V2->vector->type == OPIHI_INT) && (V3->vector->type == OPIHI_FLT)) { \ 94 CopyVector (OUT[0].vector, V1[0].vector); \ 95 opihi_flt *M1 = V1[0].vector[0].elements.Flt; \ 96 opihi_int *M2 = V2[0].vector[0].elements.Int; \ 97 opihi_flt *M3 = V3[0].vector[0].elements.Flt; \ 98 opihi_flt *out = OUT[0].vector[0].elements.Flt; \ 99 for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) { \ 100 *out = OP; \ 101 } \ 102 break; \ 103 } \ 104 if ((V1->vector->type == OPIHI_FLT) && (V2->vector->type == OPIHI_INT) && (V3->vector->type == OPIHI_INT)) { \ 105 CopyVector (OUT[0].vector, V2[0].vector); \ 106 opihi_flt *M1 = V1[0].vector[0].elements.Flt; \ 107 opihi_int *M2 = V2[0].vector[0].elements.Int; \ 108 opihi_int *M3 = V3[0].vector[0].elements.Int; \ 109 opihi_int *out = OUT[0].vector[0].elements.Int; \ 110 for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) { \ 111 *out = OP; \ 112 } \ 113 break; \ 114 } \ 115 if ((V1->vector->type == OPIHI_INT) && (V2->vector->type == OPIHI_FLT) && (V3->vector->type == OPIHI_FLT)) { \ 116 CopyVector (OUT[0].vector, V2[0].vector); \ 117 opihi_int *M1 = V1[0].vector[0].elements.Int; \ 118 opihi_flt *M2 = V2[0].vector[0].elements.Flt; \ 119 opihi_flt *M3 = V3[0].vector[0].elements.Flt; \ 120 opihi_flt *out = OUT[0].vector[0].elements.Flt; \ 121 for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) { \ 122 *out = OP; \ 123 } \ 124 break; \ 125 } \ 126 if ((V1->vector->type == OPIHI_INT) && (V2->vector->type == OPIHI_FLT) && (V3->vector->type == OPIHI_INT)) { \ 127 CopyVector (OUT[0].vector, V2[0].vector); \ 128 opihi_int *M1 = V1[0].vector[0].elements.Int; \ 129 opihi_flt *M2 = V2[0].vector[0].elements.Flt; \ 130 opihi_int *M3 = V3[0].vector[0].elements.Int; \ 131 opihi_flt *out = OUT[0].vector[0].elements.Flt; \ 132 for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) { \ 133 *out = OP; \ 134 } \ 135 break; \ 136 } \ 137 if ((V1->vector->type == OPIHI_INT) && (V2->vector->type == OPIHI_INT) && (V3->vector->type == OPIHI_FLT)) { \ 138 CopyVector (OUT[0].vector, V3[0].vector); \ 139 opihi_int *M1 = V1[0].vector[0].elements.Int; \ 140 opihi_int *M2 = V2[0].vector[0].elements.Int; \ 141 opihi_flt *M3 = V3[0].vector[0].elements.Flt; \ 142 opihi_flt *out = OUT[0].vector[0].elements.Flt; \ 143 for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) { \ 144 *out = OP; \ 145 } \ 146 break; \ 147 } \ 82 148 if ((V1->vector->type == OPIHI_INT) && (V2->vector->type == OPIHI_INT) && (V3->vector->type == OPIHI_INT)) { \ 83 149 CopyVector (OUT[0].vector, V1[0].vector); \ … … 127 193 int MMM_trinary (StackVar *OUT, StackVar *V1, StackVar *V2, StackVar *V3, char *op) { 128 194 129 int i , Nx, Ny;195 int i; 130 196 float *out, *M1, *M2, *M3; 131 197 char line[512]; // this is only used to report an error 132 198 133 Nx = V1[0].buffer[0].matrix.Naxis[0]; 134 Ny = V1[0].buffer[0].matrix.Naxis[1]; 135 199 int Npix = gfits_npix_matrix (&V1[0].buffer[0].matrix); 200 136 201 if (V1[0].type == ST_MATRIX_TMP) { /** use V1 as temp buffer **/ 137 202 OUT[0].buffer = V1[0].buffer; … … 154 219 155 220 # define MMM_FUNC(OP) \ 156 for (i = 0; i < N x*Ny; i++, out++, M1++, M2++, M3++) { \221 for (i = 0; i < Npix; i++, out++, M1++, M2++, M3++) { \ 157 222 *out = OP; \ 158 223 } \ … … 531 596 } 532 597 533 // the vector is applied to each column 598 // the vector is applied to each column (currently only valid for 2D matrix) 534 599 int MV_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) { 535 600 … … 626 691 } 627 692 628 // the vector is applied to each row 693 // the vector is applied to each row (currently only valid for 2D matrix) 629 694 int VM_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) { 630 695 … … 722 787 int MM_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) { 723 788 724 int i , Nx, Ny;789 int i; 725 790 float *out, *M1, *M2; 726 791 char line[512]; // this is only used to report an error 727 792 728 Nx = V1[0].buffer[0].matrix.Naxis[0]; 729 Ny = V1[0].buffer[0].matrix.Naxis[1]; 730 793 int Npix = gfits_npix_matrix (&V1[0].buffer[0].matrix); 794 731 795 if (V1[0].type == ST_MATRIX_TMP) { /** use V1 as temp buffer **/ 732 796 OUT[0].buffer = V1[0].buffer; … … 748 812 749 813 # define MM_FUNC(OP) \ 750 for (i = 0; i < N x*Ny; i++, out++, M1++, M2++) { \814 for (i = 0; i < Npix; i++, out++, M1++, M2++) { \ 751 815 *out = OP; \ 752 816 } \ … … 803 867 int MS_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) { 804 868 805 int i , Nx, Ny;869 int i; 806 870 char line[512]; // this is only used to report an error 807 871 808 Nx = V1[0].buffer[0].matrix.Naxis[0]; 809 Ny = V1[0].buffer[0].matrix.Naxis[1]; 872 int Npix = gfits_npix_matrix (&V1[0].buffer[0].matrix); 810 873 811 874 /* if possible, use V1 as temp buffer, otherwise create new one */ … … 825 888 if (V2->type == ST_SCALAR_FLT) { \ 826 889 opihi_flt M2 = V2[0].FltValue; \ 827 for (i = 0; i < N x*Ny; i++, out++, M1++) { \890 for (i = 0; i < Npix; i++, out++, M1++) { \ 828 891 *out = OP; \ 829 892 } \ … … 832 895 if (V2->type == ST_SCALAR_INT) { \ 833 896 opihi_int M2 = V2[0].IntValue; \ 834 for (i = 0; i < N x*Ny; i++, out++, M1++) { \897 for (i = 0; i < Npix; i++, out++, M1++) { \ 835 898 *out = OP; \ 836 899 } \ … … 881 944 int SM_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) { 882 945 883 int i , Nx, Ny;946 int i; 884 947 char line[512]; // this is only used to report an error 885 948 886 Nx = V2[0].buffer[0].matrix.Naxis[0]; 887 Ny = V2[0].buffer[0].matrix.Naxis[1]; 888 949 int Npix = gfits_npix_matrix (&V2[0].buffer[0].matrix); 950 889 951 if (V2[0].type == ST_MATRIX_TMP) { /* V2[0] is NOT temporary, we can't use it for storage */ 890 952 OUT[0].buffer = V2[0].buffer; … … 902 964 if (V1->type == ST_SCALAR_FLT) { \ 903 965 opihi_flt M1 = V1[0].FltValue; \ 904 for (i = 0; i < N x*Ny; i++, out++, M2++) { \966 for (i = 0; i < Npix; i++, out++, M2++) { \ 905 967 *out = OP; \ 906 968 } \ … … 909 971 if (V1->type == ST_SCALAR_INT) { \ 910 972 opihi_int M1 = V1[0].IntValue; \ 911 for (i = 0; i < N x*Ny; i++, out++, M2++) { \973 for (i = 0; i < Npix; i++, out++, M2++) { \ 912 974 *out = OP; \ 913 975 } \ … … 1240 1302 if (!strcmp (op, "xramp")) V_FUNC(i, ST_SCALAR_INT); 1241 1303 if (!strcmp (op, "yramp")) V_FUNC(0, ST_SCALAR_INT); 1242 /* xramp and yramp above only make sense for matrices. for vectors, xramp = ramp, yramp = zero */ 1304 if (!strcmp (op, "zramp")) V_FUNC(0, ST_SCALAR_INT); 1305 /* xramp, yramp, zramp above only make sense for matrices. for vectors, xramp = ramp, yramp = zero */ 1243 1306 1244 1307 # undef V_FUNC … … 1259 1322 int M_unary (StackVar *OUT, StackVar *V1, char *op) { 1260 1323 1261 int i, j, Nx, Ny;1324 int i, j, k; 1262 1325 float *out, *M1; 1263 1326 1264 Nx = V1[0].buffer[0].matrix.Naxis[0]; 1265 Ny = V1[0].buffer[0].matrix.Naxis[1]; 1266 1327 int Npix = gfits_npix_matrix (&V1[0].buffer[0].matrix); 1328 1267 1329 if (V1[0].type == ST_MATRIX_TMP) { 1268 1330 OUT[0].buffer = V1[0].buffer; … … 1277 1339 1278 1340 if (!strcmp (op, "=")) { } 1279 if (!strcmp (op, "abs")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = fabs(*M1); }}1280 if (!strcmp (op, "int")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = (opihi_flt)(long long)(*M1); }}1281 1282 if (!strcmp (op, "floor")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = floor (*M1); }}1283 if (!strcmp (op, "ceil")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = ceil (*M1); }}1284 // if (!strcmp (op, "rint")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = nearbyint (*M1); }}1285 1286 if (!strcmp (op, "exp")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = exp(*M1); }}1287 if (!strcmp (op, "ten")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = pow(10.0,*M1); }}1288 if (!strcmp (op, "log")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = log10(*M1); }}1289 if (!strcmp (op, "ln")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = log(*M1); }}1290 if (!strcmp (op, "sqrt")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = sqrt(*M1); }}1291 if (!strcmp (op, "erf")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = erf(*M1); }}1292 1293 if (!strcmp (op, "sinh")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = sinh(*M1); }}1294 if (!strcmp (op, "cosh")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = cosh(*M1); }}1295 if (!strcmp (op, "asinh")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = asinh(*M1); }}1296 if (!strcmp (op, "acosh")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = acosh(*M1); }}1297 if (!strcmp (op, "lgamma")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = lgamma(*M1); }}1298 1299 if (!strcmp (op, "sin")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = sin(*M1); }}1300 if (!strcmp (op, "cos")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = cos(*M1); }}1301 if (!strcmp (op, "tan")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = tan(*M1); }}1302 if (!strcmp (op, "dsin")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = sin(*M1*RAD_DEG); }}1303 if (!strcmp (op, "dcos")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = cos(*M1*RAD_DEG); }}1304 if (!strcmp (op, "dtan")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = tan(*M1*RAD_DEG); }}1305 if (!strcmp (op, "asin")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = asin(*M1); }}1306 if (!strcmp (op, "acos")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = acos(*M1); }}1307 if (!strcmp (op, "atan")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = atan(*M1); }}1308 if (!strcmp (op, "dasin")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = asin(*M1)*DEG_RAD; }}1309 if (!strcmp (op, "dacos")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = acos(*M1)*DEG_RAD; }}1310 if (!strcmp (op, "datan")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = atan(*M1)*DEG_RAD; }}1311 if (!strcmp (op, "not")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = !(*M1); }}1312 if (!strcmp (op, "--")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = -(*M1); }}1313 if (!strcmp (op, "rnd")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = drand48(); }}1314 if (!strcmp (op, "ramp")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = i; }}1315 if (!strcmp (op, "zero")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = 0; }}1316 if (!strcmp (op, "isinf")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = !finite(*M1); }}1317 if (!strcmp (op, "isnan")) { for (i = 0; i < N x*Ny; i++, out++, M1++) { *out = isnan(*M1); }}1318 1319 /* xrm and yrm only make sense in formatrices. see special meaning for vectors */1341 if (!strcmp (op, "abs")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = fabs(*M1); }} 1342 if (!strcmp (op, "int")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = (opihi_flt)(long long)(*M1); }} 1343 1344 if (!strcmp (op, "floor")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = floor (*M1); }} 1345 if (!strcmp (op, "ceil")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = ceil (*M1); }} 1346 // if (!strcmp (op, "rint")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = nearbyint (*M1); }} 1347 1348 if (!strcmp (op, "exp")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = exp(*M1); }} 1349 if (!strcmp (op, "ten")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = pow(10.0,*M1); }} 1350 if (!strcmp (op, "log")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = log10(*M1); }} 1351 if (!strcmp (op, "ln")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = log(*M1); }} 1352 if (!strcmp (op, "sqrt")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = sqrt(*M1); }} 1353 if (!strcmp (op, "erf")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = erf(*M1); }} 1354 1355 if (!strcmp (op, "sinh")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = sinh(*M1); }} 1356 if (!strcmp (op, "cosh")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = cosh(*M1); }} 1357 if (!strcmp (op, "asinh")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = asinh(*M1); }} 1358 if (!strcmp (op, "acosh")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = acosh(*M1); }} 1359 if (!strcmp (op, "lgamma")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = lgamma(*M1); }} 1360 1361 if (!strcmp (op, "sin")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = sin(*M1); }} 1362 if (!strcmp (op, "cos")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = cos(*M1); }} 1363 if (!strcmp (op, "tan")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = tan(*M1); }} 1364 if (!strcmp (op, "dsin")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = sin(*M1*RAD_DEG); }} 1365 if (!strcmp (op, "dcos")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = cos(*M1*RAD_DEG); }} 1366 if (!strcmp (op, "dtan")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = tan(*M1*RAD_DEG); }} 1367 if (!strcmp (op, "asin")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = asin(*M1); }} 1368 if (!strcmp (op, "acos")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = acos(*M1); }} 1369 if (!strcmp (op, "atan")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = atan(*M1); }} 1370 if (!strcmp (op, "dasin")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = asin(*M1)*DEG_RAD; }} 1371 if (!strcmp (op, "dacos")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = acos(*M1)*DEG_RAD; }} 1372 if (!strcmp (op, "datan")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = atan(*M1)*DEG_RAD; }} 1373 if (!strcmp (op, "not")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = !(*M1); }} 1374 if (!strcmp (op, "--")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = -(*M1); }} 1375 if (!strcmp (op, "rnd")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = drand48(); }} 1376 if (!strcmp (op, "ramp")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = i; }} 1377 if (!strcmp (op, "zero")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = 0; }} 1378 if (!strcmp (op, "isinf")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = !finite(*M1); }} 1379 if (!strcmp (op, "isnan")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = isnan(*M1); }} 1380 1381 /* xrm and yrm only make sense for 2D matrices. see special meaning for vectors */ 1320 1382 if (!strcmp (op, "xramp")) { 1321 for (j = 0; j < Ny; j++) { 1322 for (i = 0; i < Nx; i++, out++, M1++) { 1323 *out = i; 1383 int Nx = V1[0].buffer[0].matrix.Naxis[0]; 1384 int Ny = V1[0].buffer[0].matrix.Naxis[1]; 1385 int Nz = MAX (1, V1[0].buffer[0].matrix.Naxis[2]); 1386 for (k = 0; k < Nz; k++) { 1387 for (j = 0; j < Ny; j++) { 1388 for (i = 0; i < Nx; i++, out++, M1++) { 1389 *out = i; 1390 } 1324 1391 } 1325 1392 } 1326 1393 } 1327 1394 if (!strcmp (op, "yramp")) { 1328 for (j = 0; j < Ny; j++) { 1329 for (i = 0; i < Nx; i++, out++, M1++) { 1330 *out = j; 1395 int Nx = V1[0].buffer[0].matrix.Naxis[0]; 1396 int Ny = V1[0].buffer[0].matrix.Naxis[1]; 1397 int Nz = MAX (1, V1[0].buffer[0].matrix.Naxis[2]); 1398 for (k = 0; k < Nz; k++) { 1399 for (j = 0; j < Ny; j++) { 1400 for (i = 0; i < Nx; i++, out++, M1++) { 1401 *out = j; 1402 } 1403 } 1404 } 1405 } 1406 if (!strcmp (op, "zramp")) { 1407 int Nx = V1[0].buffer[0].matrix.Naxis[0]; 1408 int Ny = V1[0].buffer[0].matrix.Naxis[1]; 1409 int Nz = MAX (1, V1[0].buffer[0].matrix.Naxis[2]); 1410 for (k = 0; k < Nz; k++) { 1411 for (j = 0; j < Ny; j++) { 1412 for (i = 0; i < Nx; i++, out++, M1++) { 1413 *out = k; 1414 } 1331 1415 } 1332 1416 }
Note:
See TracChangeset
for help on using the changeset viewer.
