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 DOUBLE PRECISION 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 DOUBLE PRECISION 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, dgebr2d, dgebs2d,
1026 $
icopy, igebr2d, igebs2d, sgebr2d, sgebs2d
1027
1028
1029 DOUBLE PRECISION PDLAMCH
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='PDBLAS1TST.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 dgebs2d( 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 double 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 dgebr2d( 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)
double precision function pdlamch(ictxt, cmach)