777
  778
  779
  780
  781
  782
  783
  784      LOGICAL            SOF, TEE
  785      INTEGER            IAM, IGAP, IVERB, LDPVAL, LDQVAL, LDVAL,
  786     $                   NGRIDS, NMAT, NOUT, NPROCS
  787      REAL               ALPHA
  788
  789
  790      CHARACTER*( * )    SUMMRY
  791      LOGICAL            LTEST( * )
  792      INTEGER            CSCXVAL( LDVAL ), CSCYVAL( LDVAL ),
  793     $                   IMBXVAL( LDVAL ), IMBYVAL( LDVAL ),
  794     $                   INBXVAL( LDVAL ), INBYVAL( LDVAL ),
  795     $                   INCXVAL( LDVAL ), INCYVAL( LDVAL ),
  796     $                   IXVAL( LDVAL ), IYVAL( LDVAL ), JXVAL( LDVAL ),
  797     $                   JYVAL( LDVAL ), MBXVAL( LDVAL ),
  798     $                   MBYVAL( LDVAL ), MXVAL( LDVAL ),
  799     $                   MYVAL( LDVAL ), NBXVAL( LDVAL ),
  800     $                   NBYVAL( LDVAL ), NVAL( LDVAL ), NXVAL( LDVAL ),
  801     $                   NYVAL( LDVAL ), PVAL( LDPVAL ), QVAL( LDQVAL ),
  802     $                   RSCXVAL( LDVAL ), RSCYVAL( LDVAL ), WORK( * )
  803
  804
  805
  806
  807
  808
  809
  810
  811
  812
  813
  814
  815
  816
  817
  818
  819
  820
  821
  822
  823
  824
  825
  826
  827
  828
  829
  830
  831
  832
  833
  834
  835
  836
  837
  838
  839
  840
  841
  842
  843
  844
  845
  846
  847
  848
  849
  850
  851
  852
  853
  854
  855
  856
  857
  858
  859
  860
  861
  862
  863
  864
  865
  866
  867
  868
  869
  870
  871
  872
  873
  874
  875
  876
  877
  878
  879
  880
  881
  882
  883
  884
  885
  886
  887
  888
  889
  890
  891
  892
  893
  894
  895
  896
  897
  898
  899
  900
  901
  902
  903
  904
  905
  906
  907
  908
  909
  910
  911
  912
  913
  914
  915
  916
  917
  918
  919
  920
  921
  922
  923
  924
  925
  926
  927
  928
  929
  930
  931
  932
  933
  934
  935
  936
  937
  938
  939
  940
  941
  942
  943
  944
  945
  946
  947
  948
  949
  950
  951
  952
  953
  954
  955
  956
  957
  958
  959
  960
  961
  962
  963
  964
  965
  966
  967
  968
  969
  970
  971
  972
  973
  974
  975
  976
  977
  978
  979
  980
  981
  982
  983
  984
  985
  986
  987
  988
  989
  990
  991
  992
  993
  994
  995
  996
  997
  998
  999
 1000
 1001
 1002
 1003
 1004
 1005
 1006
 1007
 1008
 1009
 1010
 1011      INTEGER            NIN, NSUBS
 1012      parameter( nin = 11, nsubs = 8 )
 1013
 1014
 1015      LOGICAL            LTESTT
 1016      INTEGER            I, ICTXT, J
 1017      REAL               EPS
 1018
 1019
 1020      CHARACTER*7        SNAMET
 1021      CHARACTER*79       USRINFO
 1022
 1023
 1024      EXTERNAL           blacs_abort, blacs_get, blacs_gridexit,
 1025     $                   blacs_gridinit, blacs_setup, 
icopy, igebr2d,
 
 1026     $                   igebs2d, sgebr2d, sgebs2d
 1027
 1028
 1029      REAL               PSLAMCH
 1031
 1032
 1034
 1035
 1036      CHARACTER*7        SNAMES( NSUBS )
 1037      COMMON             /snamec/snames
 1038
 1039
 1040
 1041
 1042
 1043
 1044      IF( iam.EQ.0 ) THEN
 1045
 1046
 1047
 1048         OPEN( nin, file='PSBLAS1TST.dat', status='OLD' )
 1049         READ( nin, fmt = * ) summry
 1050         summry = ' '
 1051
 1052
 1053
 1054         READ( nin, fmt = 9999 ) usrinfo
 1055
 1056
 1057
 1058         READ( nin, fmt = * ) summry
 1059         READ( nin, fmt = * ) nout
 1060         IF( nout.NE.0 .AND. nout.NE.6 )
 1061     $      OPEN( nout, file = summry, status = 'UNKNOWN' )
 1062
 1063
 1064
 1065
 1066
 1067         READ( nin, fmt = * ) sof
 1068
 1069
 1070
 1071         READ( nin, fmt = * ) tee
 1072
 1073
 1074
 1075         READ( nin, fmt = * ) iverb
 1076         IF( iverb.LT.0 .OR. iverb.GT.3 )
 1077     $      iverb = 0
 1078
 1079
 1080
 1081         READ( nin, fmt = * ) igap
 1082         IF( igap.LT.0 )
 1083     $      igap = 0
 1084
 1085
 1086
 1087         READ( nin, fmt = * ) ngrids
 1088         IF( ngrids.LT.1 .OR. ngrids.GT.ldpval ) THEN
 1089            WRITE( nout, fmt = 9998 ) 'Grids', ldpval
 1090            GO TO 100
 1091         ELSE IF( ngrids.GT.ldqval ) THEN
 1092            WRITE( nout, fmt = 9998 ) 'Grids', ldqval
 1093            GO TO 100
 1094         END IF
 1095
 1096
 1097
 1098         READ( nin, fmt = * ) ( pval( i ), i = 1, ngrids )
 1099         READ( nin, fmt = * ) ( qval( i ), i = 1, ngrids )
 1100
 1101
 1102
 1103         READ( nin, fmt = * ) alpha
 1104
 1105
 1106
 1107         READ( nin, fmt = * ) nmat
 1108         IF( nmat.LT.1 .OR. nmat.GT.ldval ) THEN
 1109            WRITE( nout, fmt = 9998 ) 'Tests', ldval
 1110            GO TO 100
 1111         END IF
 1112
 1113
 1114
 1115         READ( nin, fmt = * ) ( nval( i ),     i = 1, nmat )
 1116         READ( nin, fmt = * ) ( mxval( i ),    i = 1, nmat )
 1117         READ( nin, fmt = * ) ( nxval( i ),    i = 1, nmat )
 1118         READ( nin, fmt = * ) ( imbxval( i ),  i = 1, nmat )
 1119         READ( nin, fmt = * ) ( inbxval( i ),  i = 1, nmat )
 1120         READ( nin, fmt = * ) ( mbxval( i ),   i = 1, nmat )
 1121         READ( nin, fmt = * ) ( nbxval( i ),   i = 1, nmat )
 1122         READ( nin, fmt = * ) ( rscxval( i ),  i = 1, nmat )
 1123         READ( nin, fmt = * ) ( cscxval( i ),  i = 1, nmat )
 1124         READ( nin, fmt = * ) ( ixval( i ),    i = 1, nmat )
 1125         READ( nin, fmt = * ) ( jxval( i ),    i = 1, nmat )
 1126         READ( nin, fmt = * ) ( incxval( i ),  i = 1, nmat )
 1127         READ( nin, fmt = * ) ( myval( i ),    i = 1, nmat )
 1128         READ( nin, fmt = * ) ( nyval( i ),    i = 1, nmat )
 1129         READ( nin, fmt = * ) ( imbyval( i ),  i = 1, nmat )
 1130         READ( nin, fmt = * ) ( inbyval( i ),  i = 1, nmat )
 1131         READ( nin, fmt = * ) ( mbyval( i ),   i = 1, nmat )
 1132         READ( nin, fmt = * ) ( nbyval( i ),   i = 1, nmat )
 1133         READ( nin, fmt = * ) ( rscyval( i ),  i = 1, nmat )
 1134         READ( nin, fmt = * ) ( cscyval( i ),  i = 1, nmat )
 1135         READ( nin, fmt = * ) ( iyval( i ),    i = 1, nmat )
 1136         READ( nin, fmt = * ) ( jyval( i ),    i = 1, nmat )
 1137         READ( nin, fmt = * ) ( incyval( i ),  i = 1, nmat )
 1138
 1139
 1140
 1141
 1142         DO 10 i = 1, nsubs
 1143            ltest( i ) = .false.
 1144   10    CONTINUE
 1145   20    CONTINUE
 1146         READ( nin, fmt = 9996, END = 50 ) SNAMET, ltestt
 1147         DO 30 i = 1, nsubs
 1148            IF( snamet.EQ.snames( i ) )
 1149     $         GO TO 40
 1150   30    CONTINUE
 1151
 1152         WRITE( nout, fmt = 9995 )snamet
 1153         GO TO 100
 1154
 1155   40    CONTINUE
 1156         ltest( i ) = ltestt
 1157         GO TO 20
 1158
 1159   50    CONTINUE
 1160
 1161
 1162
 1163         CLOSE ( nin )
 1164
 1165
 1166
 1167
 1168         IF( nprocs.LT.1 ) THEN
 1169            nprocs = 0
 1170            DO 60 i = 1, ngrids
 1171               nprocs = 
max( nprocs, pval( i )*qval( i ) )
 
 1172   60       CONTINUE
 1173            CALL blacs_setup( iam, nprocs )
 1174         END IF
 1175
 1176
 1177
 1178
 1179         CALL blacs_get( -1, 0, ictxt )
 1180         CALL blacs_gridinit( ictxt, 'Row-major', 1, nprocs )
 1181
 1182
 1183
 1185
 1186
 1187
 1188         CALL sgebs2d( ictxt, 'All', ' ', 1, 1, alpha, 1 )
 1189
 1190         work( 1 ) = ngrids
 1191         work( 2 ) = nmat
 1192         CALL igebs2d( ictxt, 'All', ' ', 2, 1, work, 2 )
 1193
 1194         i = 1
 1195         IF( sof ) THEN
 1196            work( i ) = 1
 1197         ELSE
 1198            work( i ) = 0
 1199         END IF
 1200         i = i + 1
 1201         IF( tee ) THEN
 1202            work( i ) = 1
 1203         ELSE
 1204            work( i ) = 0
 1205         END IF
 1206         i = i + 1
 1207         work( i ) = iverb
 1208         i = i + 1
 1209         work( i ) = igap
 1210         i = i + 1
 1211         CALL icopy( ngrids, pval,     1, work( i ), 1 )
 
 1212         i = i + ngrids
 1213         CALL icopy( ngrids, qval,     1, work( i ), 1 )
 
 1214         i = i + ngrids
 1215         CALL icopy( nmat,   nval,     1, work( i ), 1 )
 
 1216         i = i + nmat
 1217         CALL icopy( nmat,   mxval,    1, work( i ), 1 )
 
 1218         i = i + nmat
 1219         CALL icopy( nmat,   nxval,    1, work( i ), 1 )
 
 1220         i = i + nmat
 1221         CALL icopy( nmat,   imbxval,  1, work( i ), 1 )
 
 1222         i = i + nmat
 1223         CALL icopy( nmat,   inbxval,  1, work( i ), 1 )
 
 1224         i = i + nmat
 1225         CALL icopy( nmat,   mbxval,   1, work( i ), 1 )
 
 1226         i = i + nmat
 1227         CALL icopy( nmat,   nbxval,   1, work( i ), 1 )
 
 1228         i = i + nmat
 1229         CALL icopy( nmat,   rscxval,  1, work( i ), 1 )
 
 1230         i = i + nmat
 1231         CALL icopy( nmat,   cscxval,  1, work( i ), 1 )
 
 1232         i = i + nmat
 1233         CALL icopy( nmat,   ixval,    1, work( i ), 1 )
 
 1234         i = i + nmat
 1235         CALL icopy( nmat,   jxval,    1, work( i ), 1 )
 
 1236         i = i + nmat
 1237         CALL icopy( nmat,   incxval,  1, work( i ), 1 )
 
 1238         i = i + nmat
 1239         CALL icopy( nmat,   myval,    1, work( i ), 1 )
 
 1240         i = i + nmat
 1241         CALL icopy( nmat,   nyval,    1, work( i ), 1 )
 
 1242         i = i + nmat
 1243         CALL icopy( nmat,   imbyval,  1, work( i ), 1 )
 
 1244         i = i + nmat
 1245         CALL icopy( nmat,   inbyval,  1, work( i ), 1 )
 
 1246         i = i + nmat
 1247         CALL icopy( nmat,   mbyval,   1, work( i ), 1 )
 
 1248         i = i + nmat
 1249         CALL icopy( nmat,   nbyval,   1, work( i ), 1 )
 
 1250         i = i + nmat
 1251         CALL icopy( nmat,   rscyval,  1, work( i ), 1 )
 
 1252         i = i + nmat
 1253         CALL icopy( nmat,   cscyval,  1, work( i ), 1 )
 
 1254         i = i + nmat
 1255         CALL icopy( nmat,   iyval,    1, work( i ), 1 )
 
 1256         i = i + nmat
 1257         CALL icopy( nmat,   jyval,    1, work( i ), 1 )
 
 1258         i = i + nmat
 1259         CALL icopy( nmat,   incyval,  1, work( i ), 1 )
 
 1260         i = i + nmat
 1261
 1262         DO 70 j = 1, nsubs
 1263            IF( ltest( j ) ) THEN
 1264               work( i ) = 1
 1265            ELSE
 1266               work( i ) = 0
 1267            END IF
 1268            i = i + 1
 1269   70    CONTINUE
 1270         i = i - 1
 1271         CALL igebs2d( ictxt, 'All', ' ', i, 1, work, i )
 1272
 1273
 1274
 1275         WRITE( nout, fmt = 9999 ) 'Level 1 PBLAS testing program.'
 1276         WRITE( nout, fmt = 9999 ) usrinfo
 1277         WRITE( nout, fmt = * )
 1278         WRITE( nout, fmt = 9999 )
 1279     $               'Tests of the real single precision '//
 1280     $               'Level 1 PBLAS'
 1281         WRITE( nout, fmt = * )
 1282         WRITE( nout, fmt = 9999 )
 1283     $               'The following parameter values will be used:'
 1284         WRITE( nout, fmt = * )
 1285         WRITE( nout, fmt = 9993 ) nmat
 1286         WRITE( nout, fmt = 9992 ) ngrids
 1287         WRITE( nout, fmt = 9990 )
 1288     $               
'P', ( pval(i), i = 1, 
min(ngrids, 5) )
 
 1289         IF( ngrids.GT.5 )
 1290     $      WRITE( nout, fmt = 9991 ) ( pval(i), i = 6,
 1291     $                                  
min( 10, ngrids ) )
 
 1292         IF( ngrids.GT.10 )
 1293     $      WRITE( nout, fmt = 9991 ) ( pval(i), i = 11,
 1294     $                                  
min( 15, ngrids ) )
 
 1295         IF( ngrids.GT.15 )
 1296     $      WRITE( nout, fmt = 9991 ) ( pval(i), i = 16, ngrids )
 1297         WRITE( nout, fmt = 9990 )
 1298     $               
'Q', ( qval(i), i = 1, 
min(ngrids, 5) )
 
 1299         IF( ngrids.GT.5 )
 1300     $      WRITE( nout, fmt = 9991 ) ( qval(i), i = 6,
 1301     $                                  
min( 10, ngrids ) )
 
 1302         IF( ngrids.GT.10 )
 1303     $      WRITE( nout, fmt = 9991 ) ( qval(i), i = 11,
 1304     $                                  
min( 15, ngrids ) )
 
 1305         IF( ngrids.GT.15 )
 1306     $      WRITE( nout, fmt = 9991 ) ( qval(i), i = 16, ngrids )
 1307         WRITE( nout, fmt = 9988 ) sof
 1308         WRITE( nout, fmt = 9987 ) tee
 1309         WRITE( nout, fmt = 9983 ) igap
 1310         WRITE( nout, fmt = 9986 ) iverb
 1311         WRITE( nout, fmt = 9982 ) alpha
 1312         IF( ltest( 1 ) ) THEN
 1313            WRITE( nout, fmt = 9985 ) snames( 1 ), ' ... Yes'
 1314         ELSE
 1315            WRITE( nout, fmt = 9985 ) snames( 1 ), ' ... No '
 1316         END IF
 1317         DO 80 i = 2, nsubs
 1318            IF( ltest( i ) ) THEN
 1319               WRITE( nout, fmt = 9984 ) snames( i ), ' ... Yes'
 1320            ELSE
 1321               WRITE( nout, fmt = 9984 ) snames( i ), ' ... No '
 1322            END IF
 1323   80    CONTINUE
 1324         WRITE( nout, fmt = 9994 ) eps
 1325         WRITE( nout, fmt = * )
 1326
 1327      ELSE
 1328
 1329
 1330
 1331         IF( nprocs.LT.1 )
 1332     $      CALL blacs_setup( iam, nprocs )
 1333
 1334
 1335
 1336
 1337         CALL blacs_get( -1, 0, ictxt )
 1338         CALL blacs_gridinit( ictxt, 'Row-major', 1, nprocs )
 1339
 1340
 1341
 1343
 1344         CALL sgebr2d( ictxt, 'All', ' ', 1, 1, alpha, 1, 0, 0 )
 1345
 1346         CALL igebr2d( ictxt, 'All', ' ', 2, 1, work, 2, 0, 0 )
 1347         ngrids = work( 1 )
 1348         nmat   = work( 2 )
 1349
 1350         i = 2*ngrids + 23*nmat + nsubs + 4
 1351         CALL igebr2d( ictxt, 'All', ' ', i, 1, work, i, 0, 0 )
 1352
 1353         i = 1
 1354         IF( work( i ).EQ.1 ) THEN
 1355            sof = .true.
 1356         ELSE
 1357            sof = .false.
 1358         END IF
 1359         i = i + 1
 1360         IF( work( i ).EQ.1 ) THEN
 1361            tee = .true.
 1362         ELSE
 1363            tee = .false.
 1364         END IF
 1365         i = i + 1
 1366         iverb = work( i )
 1367         i = i + 1
 1368         igap = work( i )
 1369         i = i + 1
 1370         CALL icopy( ngrids, work( i ), 1, pval,     1 )
 
 1371         i = i + ngrids
 1372         CALL icopy( ngrids, work( i ), 1, qval,     1 )
 
 1373         i = i + ngrids
 1374         CALL icopy( nmat,   work( i ), 1, nval,     1 )
 
 1375         i = i + nmat
 1376         CALL icopy( nmat,   work( i ), 1, mxval,    1 )
 
 1377         i = i + nmat
 1378         CALL icopy( nmat,   work( i ), 1, nxval,    1 )
 
 1379         i = i + nmat
 1380         CALL icopy( nmat,   work( i ), 1, imbxval,  1 )
 
 1381         i = i + nmat
 1382         CALL icopy( nmat,   work( i ), 1, inbxval,  1 )
 
 1383         i = i + nmat
 1384         CALL icopy( nmat,   work( i ), 1, mbxval,   1 )
 
 1385         i = i + nmat
 1386         CALL icopy( nmat,   work( i ), 1, nbxval,   1 )
 
 1387         i = i + nmat
 1388         CALL icopy( nmat,   work( i ), 1, rscxval,  1 )
 
 1389         i = i + nmat
 1390         CALL icopy( nmat,   work( i ), 1, cscxval,  1 )
 
 1391         i = i + nmat
 1392         CALL icopy( nmat,   work( i ), 1, ixval,    1 )
 
 1393         i = i + nmat
 1394         CALL icopy( nmat,   work( i ), 1, jxval,    1 )
 
 1395         i = i + nmat
 1396         CALL icopy( nmat,   work( i ), 1, incxval,  1 )
 
 1397         i = i + nmat
 1398         CALL icopy( nmat,   work( i ), 1, myval,    1 )
 
 1399         i = i + nmat
 1400         CALL icopy( nmat,   work( i ), 1, nyval,    1 )
 
 1401         i = i + nmat
 1402         CALL icopy( nmat,   work( i ), 1, imbyval,  1 )
 
 1403         i = i + nmat
 1404         CALL icopy( nmat,   work( i ), 1, inbyval,  1 )
 
 1405         i = i + nmat
 1406         CALL icopy( nmat,   work( i ), 1, mbyval,   1 )
 
 1407         i = i + nmat
 1408         CALL icopy( nmat,   work( i ), 1, nbyval,   1 )
 
 1409         i = i + nmat
 1410         CALL icopy( nmat,   work( i ), 1, rscyval,  1 )
 
 1411         i = i + nmat
 1412         CALL icopy( nmat,   work( i ), 1, cscyval,  1 )
 
 1413         i = i + nmat
 1414         CALL icopy( nmat,   work( i ), 1, iyval,    1 )
 
 1415         i = i + nmat
 1416         CALL icopy( nmat,   work( i ), 1, jyval,    1 )
 
 1417         i = i + nmat
 1418         CALL icopy( nmat,   work( i ), 1, incyval,  1 )
 
 1419         i = i + nmat
 1420
 1421         DO 90 j = 1, nsubs
 1422            IF( work( i ).EQ.1 ) THEN
 1423               ltest( j ) = .true.
 1424            ELSE
 1425               ltest( j ) = .false.
 1426            END IF
 1427            i = i + 1
 1428   90    CONTINUE
 1429
 1430      END IF
 1431
 1432      CALL blacs_gridexit( ictxt )
 1433
 1434      RETURN
 1435
 1436  100 WRITE( nout, fmt = 9997 )
 1437      CLOSE( nin )
 1438      IF( nout.NE.6 .AND. nout.NE.0 )
 1439     $   CLOSE( nout )
 1440      CALL blacs_abort( ictxt, 1 )
 1441
 1442      stop
 1443
 1444 9999 FORMAT( a )
 1445 9998 FORMAT( ' Number of values of ',5a, ' is less than 1 or greater ',
 1446     $        'than ', i2 )
 1447 9997 FORMAT( ' Illegal input in file ',40a,'.  Aborting run.' )
 1448 9996 FORMAT( a7, l2 )
 1449 9995 FORMAT( '  Subprogram name ', a7, ' not recognized',
 1450     $        /' ******* TESTS ABANDONED *******' )
 1451 9994 FORMAT( 2x, 'Relative machine precision (eps) is taken to be ',
 1452     $        e18.6 )
 1453 9993 FORMAT( 2x, 'Number of Tests           : ', i6 )
 1454 9992 FORMAT( 2x, 'Number of process grids   : ', i6 )
 1455 9991 FORMAT( 2x, '                          : ', 5i6 )
 1456 9990 FORMAT( 2x, a1, '                         : ', 5i6 )
 1457 9988 FORMAT( 2x, 'Stop on failure flag      : ', l6 )
 1458 9987 FORMAT( 2x, 'Test for error exits flag : ', l6 )
 1459 9986 FORMAT( 2x, 'Verbosity level           : ', i6 )
 1460 9985 FORMAT( 2x, 'Routines to be tested     :      ', a, a8 )
 1461 9984 FORMAT( 2x, '                                 ', a, a8 )
 1462 9983 FORMAT( 2x, 'Leading dimension gap     : ', i6 )
 1463 9982 FORMAT( 2x, 'Alpha                     : ', g16.6 )
 1464
 1465
 1466
subroutine icopy(n, sx, incx, sy, incy)
 
real function pslamch(ictxt, cmach)