+ /* Must determine which C type matches this Fortran type */
+ MPI_Type_size(MPI_DOUBLE_COMPLEX, &dc);
+ if (dc == sizeof(d_complex)) {
+ MTestPrintfMsg(10, "Reduce of MPI_DOUBLE_COMPLEX\n");
+ /* double complex; may be null if we do not have Fortran support */
+ dinbuf[0].r = 1;
+ dinbuf[1].r = 0;
+ dinbuf[2].r = (rank > 0);
+ dinbuf[0].i = -1;
+ dinbuf[1].i = 0;
+ dinbuf[2].i = -(rank > 0);
+
+ doutbuf[0].r = 0;
+ doutbuf[1].r = 1;
+ doutbuf[2].r = 1;
+ doutbuf[0].i = 0;
+ doutbuf[1].i = 1;
+ doutbuf[2].i = 1;
+ MPI_Reduce(dinbuf, doutbuf, 3, MPI_DOUBLE_COMPLEX, MPI_SUM, 0, comm);
+ if (rank == 0) {
+ if (doutbuf[0].r != size || doutbuf[0].i != -size) {
+ errs++;
+ fprintf(stderr, "double complex SUM(1) test failed\n");
+ }
+ if (doutbuf[1].r != 0 || doutbuf[1].i != 0) {
+ errs++;
+ fprintf(stderr, "double complex SUM(0) test failed\n");
+ }
+ if (doutbuf[2].r != size - 1 || doutbuf[2].i != 1 - size) {
+ errs++;
+ fprintf(stderr, "double complex SUM(>) test failed\n");
+ }
+ }
+ }
+#ifdef HAVE_LONG_DOUBLE
+ else if (dc == sizeof(ld_complex)) {
+ MTestPrintfMsg(10, "Reduce of MPI_DOUBLE_COMPLEX\n");
+ /* double complex; may be null if we do not have Fortran support */
+ ldinbuf[0].r = 1;
+ ldinbuf[1].r = 0;
+ ldinbuf[2].r = (rank > 0);
+ ldinbuf[0].i = -1;
+ ldinbuf[1].i = 0;
+ ldinbuf[2].i = -(rank > 0);
+
+ ldoutbuf[0].r = 0;
+ ldoutbuf[1].r = 1;
+ ldoutbuf[2].r = 1;
+ ldoutbuf[0].i = 0;
+ ldoutbuf[1].i = 1;
+ ldoutbuf[2].i = 1;
+ MPI_Reduce(ldinbuf, ldoutbuf, 3, MPI_DOUBLE_COMPLEX, MPI_SUM, 0, comm);
+ if (rank == 0) {
+ if (ldoutbuf[0].r != size || ldoutbuf[0].i != -size) {
+ errs++;
+ fprintf(stderr, "double complex SUM(1) test failed\n");
+ }
+ if (ldoutbuf[1].r != 0 || ldoutbuf[1].i != 0) {
+ errs++;
+ fprintf(stderr, "double complex SUM(0) test failed\n");
+ }
+ if (ldoutbuf[2].r != size - 1 || ldoutbuf[2].i != 1 - size) {
+ errs++;
+ fprintf(stderr, "double complex SUM(>) test failed\n");
+ }
+ }
+ }
+#endif
+ /* Implicitly ignore if there is no matching C type */