1 SUBROUTINE pssyngst( IBTYPE, UPLO, N, A, IA, JA, DESCA, B, IB, JB,
2 $ DESCB, SCALE, WORK, LWORK, INFO )
11 INTEGER IA, IB, , INFO
16 REAL A( * ), B( * ), WORK( * )
208 REAL ONEHALF, ONE, MONE
209 parameter( onehalf = 0.5e0, one = 1.0e0, mone
210 INTEGER DLEN_, CTXT_, MB_, NB_, RSRC_, CSRC_, LLD_
211 parameter( dlen_ = 9, ctxt_ = 2, mb_ = 5, nb_ = 6,
212 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
215 LOGICAL LQUERY, UPPER
216 INTEGER I, IACOL, IAROW, IBCOL, IBROW, ICOFFA, ,
217 $ ictxt, indaa, indg, indr, indrt, iroffa,
218 $ iroffb, j, k, kb, lwmin, lwopt, mycol, myrow,
219 $ nb, np0, npcol, npk, nprow, nq0, postk
222 INTEGER DESCAA( DLEN_ ), DESCG( DLEN_ ),
223 $ descr( dlen_ ), descrt( dlen_ ), idum1( 2 ),
228 INTEGER INDXG2P, NUMROC
229 EXTERNAL lsame, indxg2p, numroc
237 INTRINSIC ichar,
max,
min, mod, real
240 ictxt = desca( ctxt_ )
250 IF( nprow.EQ.-1 )
THEN
251 info = -( 700+ctxt_ )
253 upper = lsame( uplo,
'U' )
254 CALL chk1mat( n, 3, n, 3, ia, ja, desca, 7, info )
255 CALL chk1mat( n, 3, n, 3, ib, jb, descb, 11, info )
257 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
259 ibrow = indxg2p( ib, descb( mb_ ), myrow, descb( rsrc_ ),
261 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
263 ibcol = indxg2p( jb, descb( nb_ ), mycol, descb( csrc_ ),
265 iroffa = mod( ia-1, desca( mb_ ) )
266 icoffa = mod( ja-1, desca( nb_ ) )
267 iroffb = mod( ib-1, descb( mb_ ) )
268 icoffb = mod( jb-1, descb( nb_ ) )
269 np0 = numroc( n, nb, 0, 0, nprow )
270 nq0 = numroc( n, nb, 0, 0, npcol )
271 lwmin =
max( nb*( np0+1 ), 3*nb )
272 IF( ibtype.EQ.1 .AND. .NOT.upper )
THEN
273 lwopt = 2*np0*nb + nq0*nb + nb*nb
277 work( 1 ) = real( lwopt )
278 lquery = ( lwork.EQ.-1 )
279 IF( ibtype.LT.1 .OR. ibtype.GT.3 )
THEN
281 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
283 ELSE IF( n.LT.0 )
THEN
285 ELSE IF( iroffa.NE.0 )
THEN
287 ELSE IF( icoffa.NE.0 )
THEN
289 ELSE IF( desca( mb_ ).NE.desca( nb_ ) )
THEN
291 ELSE IF( iroffb.NE.0 .OR. ibrow.NE.iarow )
THEN
293 ELSE IF( icoffb.NE.0 .OR. ibcol.NE.iacol )
THEN
295 ELSE IF( descb( mb_ ).NE.desca( mb_ ) )
THEN
297 ELSE IF( descb( nb_ ).NE.desca( nb_ ) )
THEN
299 ELSE IF( ictxt.NE.descb( ctxt_ ) )
THEN
300 info = -( 1100+ctxt_ )
301 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
308 idum1( 2 ) = ichar(
'U' )
310 idum1( 2 ) = ichar( 'l
' )
313 CALL PCHK2MAT( N, 3, N, 3, IA, JA, DESCA, 7, N, 3, N, 3, IB,
314 $ JB, DESCB, 11, 2, IDUM1, IDUM2, INFO )
318 CALL PXERBLA( ICTXT, 'pssyngst', -INFO )
320 ELSE IF( LQUERY ) THEN
330.NE..OR..OR..LT.
IF( IBTYPE1 UPPER LWORKLWOPT ) THEN
331 CALL PSSYGST( IBTYPE, UPLO, N, A, IA, JA, DESCA, B, IB, JB,
332 $ DESCB, SCALE, INFO )
336 CALL DESCSET( DESCG, N, NB, NB, NB, IAROW, IACOL, ICTXT, NP0 )
337 CALL DESCSET( DESCR, N, NB, NB, NB, IAROW, IACOL, ICTXT, NP0 )
338 CALL DESCSET( DESCRT, NB, N, NB, NB, IAROW, IACOL, ICTXT, NB )
339 CALL DESCSET( DESCAA, NB, NB, NB, NB, IAROW, IACOL, ICTXT, NB )
342 INDR = INDG + DESCG( LLD_ )*NB
343 INDAA = INDR + DESCR( LLD_ )*NB
344 INDRT = INDAA + DESCAA( LLD_ )*NB
348 KB = MIN( N-K+1, NB )
353 CALL PSLACPY( 'a
', N-POSTK+1, KB, B, POSTK+IB-1, K+JB-1, DESCB,
354 $ WORK( INDG ), POSTK, 1, DESCG )
355 CALL PSLACPY( 'a
', N-POSTK+1, KB, A, POSTK+IA-1, K+JA-1, DESCA,
356 $ WORK( INDR ), POSTK, 1, DESCR )
357 CALL PSLACPY( 'a
', KB, K-1, A, K+IA-1, JA, DESCA,
358 $ WORK( INDRT ), 1, 1, DESCRT )
360 CALL PSLACPY( 'l
', KB, KB, A, K+IA-1, K+JA-1, DESCA,
361 $ WORK( INDR ), K, 1, DESCR )
362 CALL PSTRSM( 'right',
'L',
'N',
'N', npk, kb, mone, b, k+ib-1,
363 $ k+jb-1, descb, work( indg ), postk, 1, descg )
365 CALL pssymm(
'Right',
'L', npk, kb, onehalf, a, k+ia-1, k+ja-1,
366 $ desca, work( indg ), postk, 1, descg, one,
367 $ work( indr ), postk, 1, descr )
369 CALL pssyr2k( 'lower
', 'no t
', NPK, KB, ONE, WORK( INDG ),
370 $ POSTK, 1, DESCG, WORK( INDR ), POSTK, 1, DESCR,
371 $ ONE, A, POSTK+IA-1, POSTK+JA-1, DESCA )
373 CALL PSGEMM( 'no t
', 'no conj
', NPK, K-1, KB, ONE,
374 $ WORK( INDG ), POSTK, 1, DESCG, WORK( INDRT ), 1,
375 $ 1, DESCRT, ONE, A, POSTK+IA-1, JA, DESCA )
377 CALL PSSYMM( 'right
', 'l
', NPK, KB, ONE, WORK( INDR ), K, 1,
378 $ DESCR, WORK( INDG ), POSTK, 1, DESCG, ONE, A,
379 $ POSTK+IA-1, K+JA-1, DESCA )
381 CALL PSTRSM( 'left
', 'lower
', 'no conj
', 'non-unit
', KB, K-1,
382 $ ONE, B, K+IB-1, K+JB-1, DESCB, A, K+IA-1, JA,
385 CALL PSLACPY( 'l
', KB, KB, A, K+IA-1, K+JA-1, DESCA,
386 $ WORK( INDAA ), 1, 1, DESCAA )
388.EQ..AND..EQ.
IF( MYROWDESCAA( RSRC_ ) MYCOLDESCAA( CSRC_ ) )
392 WORK( INDAA+J-1+( I-1 )*DESCAA( LLD_ ) )
393 $ = WORK( INDAA+I-1+( J-1 )*DESCAA( LLD_ ) )
398 CALL PSTRSM( 'left
', 'lower
', 'no conj
', 'non-unit
', KB, KB,
399 $ ONE, B, K+IB-1, K+JB-1, DESCB, WORK( INDAA ), 1,
402 CALL PSTRSM( 'right
', 'lower
', 'conj
', 'non-unit
', KB, KB, ONE,
403 $ B, K+IB-1, K+JB-1, DESCB, WORK( INDAA ), 1, 1,
406 CALL PSLACPY( 'l
', KB, KB, WORK( INDAA ), 1, 1, DESCAA, A,
407 $ K+IA-1, K+JA-1, DESCA )
409 CALL PSTRSM( 'right
', 'lower
', 'conj
', 'non-unit
', NPK, KB,
410 $ ONE, B, K+IB-1, K+JB-1, DESCB, A, POSTK+IA-1,
413 DESCR( CSRC_ ) = MOD( DESCR( CSRC_ )+1, NPCOL )
414 DESCG( CSRC_ ) = MOD( DESCG( CSRC_ )+1, NPCOL )
415 DESCRT( RSRC_ ) = MOD( DESCRT( RSRC_ )+1, NPROW )
416 DESCAA( RSRC_ ) = MOD( DESCAA( RSRC_ )+1, NPROW )
417 DESCAA( CSRC_ ) = MOD( DESCAA( CSRC_ )+1, NPCOL )
420 WORK( 1 ) = REAL( LWOPT )