4340
4341
4342
4343
4344
4345
4346
4347 INTEGER OUTNUM, VERB, NSCOPE, NTOP, NSHAPE, NMAT, NSRC, NGRID
4348 INTEGER MEMLEN
4349
4350
4351 CHARACTER*1 SCOPE0(NSCOPE), TOP0(NTOP)
4352 CHARACTER*1 UPLO0(NSHAPE), DIAG0(NSHAPE)
4353 INTEGER M0(NMAT), N0(NMAT), LDAS0(NMAT), LDAD0(NMAT)
4354 INTEGER RSRC0(NSRC), CSRC0(NSRC), CONTEXT0(NGRID)
4355 INTEGER P0(NGRID), Q0(NGRID), TFAIL(*)
4356 REAL MEM(MEMLEN)
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446 LOGICAL ALLPASS, LSAME
4447 INTEGER IBTMYPROC, IBTSIZEOF
4449
4450
4451 EXTERNAL blacs_gridinfo
4452 EXTERNAL strbs2d, sgebs2d, strbr2d, sgebr2d
4454
4455
4456 CHARACTER*1 SCOPE, TOP, UPLO, DIAG
4457 LOGICAL TESTOK, INGRID
4458 INTEGER IAM, I, K, J, IGR, ISH, IMA, ISO, ISC, ITO
4459 INTEGER M, N, NPROW, NPCOL, MYROW, MYCOL, RSRC, CSRC
4460 INTEGER ISTART, ISTOP, IPRE, IPOST, SETWHAT
4461 INTEGER NERR, NSKIP, NFAIL, TESTNUM, CONTEXT, MAXERR, LDASRC
4462 INTEGER LDADST, ERRDPTR, APTR, ERRIPTR, ISIZE, SSIZE
4463 REAL SCHECKVAL, RCHECKVAL
4464
4465
4466
4467 scheckval = -0.01e0
4468 rcheckval = -0.02e0
4469
4473
4474
4475
4476 IF( iam .EQ. 0 ) THEN
4477 WRITE(outnum, *) ' '
4478 WRITE(outnum, *) ' '
4479 WRITE(outnum, 1000 )
4480 IF( verb .GT. 0 ) THEN
4481 WRITE(outnum,*) ' '
4482 WRITE(outnum, 2000) 'NSCOPE:', nscope
4483 WRITE(outnum, 3000) ' SCOPE:', ( scope0(i), i = 1, nscope )
4484 WRITE(outnum, 2000) 'NTOP :', ntop
4485 WRITE(outnum, 3000) ' TOP :', ( top0(i), i = 1, ntop )
4486 WRITE(outnum, 2000) 'NSHAPE:', nshape
4487 WRITE(outnum, 3000) ' UPLO :', ( uplo0(i), i = 1, nshape )
4488 WRITE(outnum, 3000) ' DIAG :', ( diag0(i), i = 1, nshape )
4489 WRITE(outnum, 2000) 'NMAT :', nmat
4490 WRITE(outnum, 2000) ' M :', ( m0(i), i = 1, nmat )
4491 WRITE(outnum, 2000) ' N :', ( n0(i), i = 1, nmat )
4492 WRITE(outnum, 2000) ' LDAS :', ( ldas0(i), i = 1, nmat )
4493 WRITE(outnum, 2000) ' LDAD :', ( ldad0(i), i = 1, nmat )
4494 WRITE(outnum, 2000) 'NSRC :', nsrc
4495 WRITE(outnum, 2000) ' RSRC :',( rsrc0(i), i = 1, nsrc )
4496 WRITE(outnum, 2000) ' CSRC :',( csrc0(i), i = 1, nsrc )
4497 WRITE(outnum, 2000) 'NGRIDS:', ngrid
4498 WRITE(outnum, 2000) ' P :', ( p0(i), i = 1, ngrid )
4499 WRITE(outnum, 2000) ' Q :', ( q0(i), i = 1, ngrid )
4500 WRITE(outnum, 2000) 'VERB :', verb
4501 WRITE(outnum,*) ' '
4502 END IF
4503 IF( verb .GT. 1 ) THEN
4504 WRITE(outnum,5000)
4505 WRITE(outnum,6000)
4506 END IF
4507 END IF
4508
4509
4510
4511 i = 0
4512 DO 10 ima = 1, nmat
4513 k = n0(ima) * max0( ldas0(ima), ldad0(ima) ) + 4 * m0(ima)
4514 IF( k .GT. i ) i = k
4515 10 CONTINUE
4516 maxerr = ( ssize * (memlen-i) ) / ( ssize*2 + isize*6 )
4517 IF( maxerr .LT. 1 ) THEN
4518 WRITE(outnum,*) 'ERROR: Not enough memory to run BSBR tests.'
4519 CALL blacs_abort(-1, 1)
4520 END IF
4521 errdptr = i + 1
4522 erriptr = errdptr + maxerr
4523 nerr = 0
4524 testnum = 0
4525 nfail = 0
4526 nskip = 0
4527
4528
4529
4530 DO 110 igr = 1, ngrid
4531
4532 context = context0(igr)
4533 CALL blacs_gridinfo( context, nprow, npcol, myrow, mycol )
4534
4535 ingrid = ( nprow .GT. 0 )
4536
4537 DO 100 isc = 1, nscope
4538 scope = scope0(isc)
4539 DO 90 ito = 1, ntop
4540 top = top0(ito)
4541
4542
4543
4544
4545 IF(
lsame(top,
'M') )
THEN
4546 setwhat = 11
4547 IF( scope .EQ. 'R' ) THEN
4548 istart = -(npcol - 1)
4549 istop = -istart
4550 ELSE IF (scope .EQ. 'C') THEN
4551 istart = -(nprow - 1)
4552 istop = -istart
4553 ELSE
4554 istart = -(nprow*npcol - 1)
4555 istop = -istart
4556 ENDIF
4557 ELSE IF(
lsame(top,
'T') )
THEN
4558 setwhat = 12
4559 istart = 1
4560 IF( scope .EQ. 'R' ) THEN
4561 istop = npcol - 1
4562 ELSE IF (scope .EQ. 'C') THEN
4563 istop = nprow - 1
4564 ELSE
4565 istop = nprow*npcol - 1
4566 ENDIF
4567 ELSE
4568 setwhat = 0
4569 istart = 1
4570 istop = 1
4571 ENDIF
4572 DO 80 ish = 1, nshape
4573 uplo = uplo0(ish)
4574 diag = diag0(ish)
4575
4576 DO 70 ima = 1, nmat
4577 m = m0(ima)
4578 n = n0(ima)
4579 ldasrc = ldas0(ima)
4580 ldadst = ldad0(ima)
4581
4582 DO 60 iso = 1, nsrc
4583 testnum = testnum + 1
4584 rsrc = rsrc0(iso)
4585 csrc = csrc0(iso)
4586 IF( rsrc.GE.p0(igr) .OR. csrc.GE.q0(igr) ) THEN
4587 nskip = nskip + 1
4588 GOTO 60
4589 END IF
4590 IF( verb .GT. 1 ) THEN
4591 IF( iam .EQ. 0 ) THEN
4592 WRITE(outnum, 7000)
4593 $ testnum, 'RUNNING',scope, top, uplo, diag,
4594 $ m, n, ldasrc, ldadst, rsrc, csrc,
4595 $ nprow, npcol
4596 END IF
4597 END IF
4598
4599 testok = .true.
4600 ipre = 2 * m
4601 ipost = ipre
4602 aptr = ipre + 1
4603
4604
4605
4606 IF( (myrow.EQ.rsrc .AND. scope.EQ.'R') .OR.
4607 $ (mycol.EQ.csrc .AND. scope.EQ.'C') .OR.
4608 $ (scope .EQ. 'A') ) THEN
4609
4610
4611
4612 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc ) THEN
4613 CALL sinitmat(uplo, diag, m, n, mem,
4614 $ ldasrc, ipre, ipost,
4615 $ scheckval, testnum,
4616 $ myrow, mycol )
4617
4618 DO 20 j = istart, istop
4619 IF( j.EQ.0 ) GOTO 20
4620 IF( setwhat.NE.0 )
4621 $ CALL blacs_set(context, setwhat, j)
4622 IF( uplo.EQ.'U' .OR. uplo.EQ.'L' ) THEN
4623 CALL strbs2d(context, scope, top,
4624 $ uplo, diag, m, n,
4625 $ mem(aptr), ldasrc )
4626 ELSE
4627 CALL sgebs2d(context, scope, top,
4628 $ m, n, mem(aptr),
4629 $ ldasrc )
4630 END IF
4631 20 CONTINUE
4632
4633
4634
4635 ELSE IF( ingrid ) THEN
4636 DO 40 j = istart, istop
4637 IF( j.EQ.0 ) GOTO 40
4638 IF( setwhat.NE.0 )
4639 $ CALL blacs_set(context, setwhat, j)
4640
4641
4642
4643 DO 30 k = 1, ipre+ipost+ldadst*n
4644 mem(k) = rcheckval
4645 30 CONTINUE
4646
4647
4648
4649 IF( uplo.EQ.'U' .OR. uplo.EQ.'L' ) THEN
4650 CALL strbr2d(context, scope, top,
4651 $ uplo, diag, m, n,
4652 $ mem(aptr), ldadst,
4653 $ rsrc, csrc)
4654 ELSE
4655 CALL sgebr2d(context, scope, top,
4656 $ m, n, mem(aptr),
4657 $ ldadst, rsrc, csrc)
4658 END IF
4659
4660
4661
4662 i = nerr
4663 CALL schkmat(uplo, diag, m, n,
4664 $ mem(aptr), ldadst, rsrc, csrc,
4665 $ myrow, mycol, testnum, maxerr,
4666 $ nerr, mem(erriptr),
4667 $ mem(errdptr))
4668
4669 CALL schkpad(uplo, diag, m, n, mem,
4670 $ ldadst, rsrc, csrc, myrow,
4671 $ mycol, ipre, ipost, rcheckval,
4672 $ testnum, maxerr, nerr,
4673 $ mem(erriptr), mem(errdptr))
4674 40 CONTINUE
4675 testok = ( i .EQ. nerr )
4676 END IF
4677 END IF
4678
4679 IF( verb .GT. 1 ) THEN
4680 i = nerr
4682 $ mem(erriptr), mem(errdptr),
4683 $ tfail)
4684 IF( iam .EQ. 0 ) THEN
4685 testok = ( testok .AND. (i.EQ.nerr) )
4686 IF( testok ) THEN
4687 WRITE(outnum,7000)testnum,'PASSED ',
4688 $ scope, top, uplo, diag, m, n,
4689 $ ldasrc, ldadst, rsrc, csrc,
4690 $ nprow, npcol
4691 ELSE
4692 nfail = nfail + 1
4693 WRITE(outnum,7000)testnum,'FAILED ',
4694 $ scope, top, uplo, diag, m, n,
4695 $ ldasrc, ldadst, rsrc, csrc,
4696 $ nprow, npcol
4697 END IF
4698 END IF
4699
4700
4701
4702 nerr = 0
4703 END IF
4704 60 CONTINUE
4705 70 CONTINUE
4706 80 CONTINUE
4707 90 CONTINUE
4708 100 CONTINUE
4709 110 CONTINUE
4710
4711 IF( verb .LT. 2 ) THEN
4712 nfail = testnum
4713 CALL sbtcheckin( nfail, outnum, maxerr, nerr, mem(erriptr),
4714 $ mem(errdptr), tfail )
4715 END IF
4716 IF( iam .EQ. 0 ) THEN
4717 IF( verb .GT. 1 ) WRITE(outnum,*) ' '
4718 IF( nfail+nskip .EQ. 0 ) THEN
4719 WRITE(outnum, 8000 ) testnum
4720 ELSE
4721 WRITE(outnum, 9000 ) testnum, testnum-nskip-nfail,
4722 $ nskip, nfail
4723 END IF
4724 END IF
4725
4726
4727
4728 testok =
allpass( (nfail.EQ.0) )
4729
4730 1000 FORMAT('REAL BSBR TESTS: BEGIN.' )
4731 2000 FORMAT(1x,a7,3x,10i6)
4732 3000 FORMAT(1x,a7,3x,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,5x,a1,
4733 $ 5x,a1,5x,a1)
4734 5000 FORMAT(' TEST# STATUS SCOPE TOP UPLO DIAG M N LDAS ',
4735 $ ' LDAD RSRC CSRC P Q')
4736 6000 FORMAT(' ----- ------- ----- --- ---- ---- ----- ----- ----- ',
4737 $ '----- ---- ---- ---- ----')
4738 7000 FORMAT(i6,1x,a7,5x,a1,3x,a1,2(4x,a1), 4i6, 4i5)
4739 8000 FORMAT('REAL BSBR TESTS: PASSED ALL',
4740 $ i5, ' TESTS.')
4741 9000 FORMAT('REAL BSBR TESTS:',i5,' TESTS;',i5,' PASSED,',
4742 $ i5,' SKIPPED,',i5,' FAILED.')
4743
4744 RETURN
4745
4746
4747
subroutine sbtcheckin(nftests, outnum, maxerr, nerr, ierr, sval, tfailed)
subroutine schkpad(uplo, diag, m, n, mem, lda, rsrc, csrc, myrow, mycol, ipre, ipost, checkval, testnum, maxerr, nerr, erribuf, errdbuf)
logical function allpass(thistest)
subroutine sinitmat(uplo, diag, m, n, mem, lda, ipre, ipost, checkval, testnum, myrow, mycol)
subroutine schkmat(uplo, diag, m, n, a, lda, rsrc, csrc, myrow, mycol, testnum, maxerr, nerr, erribuf, errdbuf)
integer function ibtmyproc()
integer function ibtsizeof(type)