7846
7847
7848
7849
7850
7851
7852
7853 LOGICAL INPLACE
7854 CHARACTER*1 AFORM, DIAG
7855 INTEGER IA, IASEED, JA, LDA, M, N, OFFA
7856
7857
7858 INTEGER DESCA( * )
7859 REAL A( LDA, * )
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
8038 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
8039 $ RSRC_
8040 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
8041 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
8042 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
8043 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
8044 INTEGER JMP_1, JMP_COL, JMP_IMBV, JMP_INBV, JMP_LEN,
8045 $ JMP_MB, JMP_NB, JMP_NPIMBLOC, JMP_NPMB,
8046 $ JMP_NQINBLOC, JMP_NQNB, JMP_ROW
8047 parameter( jmp_1 = 1, jmp_row = 2, jmp_col = 3,
8048 $ jmp_mb = 4, jmp_imbv = 5, jmp_npmb = 6,
8049 $ jmp_npimbloc = 7, jmp_nb = 8, jmp_inbv = 9,
8050 $ jmp_nqnb = 10, jmp_nqinbloc = 11,
8051 $ jmp_len = 11 )
8052
8053
8054 LOGICAL DIAGDO, SYMM, HERM, NOTRAN
8055 INTEGER CSRC, I, IACOL, IAROW, ICTXT, IIA, ILOCBLK,
8056 $ ILOCOFF, ILOW, IMB, IMB1, IMBLOC, IMBVIR, INB,
8057 $ INB1, INBLOC, INBVIR, INFO, IOFFDA, ITMP, IUPP,
8058 $ IVIR, JJA, JLOCBLK, JLOCOFF, JVIR, LCMT00,
8059 $ LMBLOC, LNBLOC, LOW, MAXMN, MB, MBLKS, MP,
8060 $ MRCOL, MRROW, MYCDIST, MYCOL, MYRDIST, MYROW,
8061 $ NB, NBLKS, NPCOL, NPROW, NQ, NVIR, RSRC, UPP
8062 REAL ALPHA
8063
8064
8065 INTEGER DESCA2( DLEN_ ), IMULADD( 4, JMP_LEN ),
8066 $ IRAN( 2 ), JMP( JMP_LEN ), MULADD0( 4 )
8067
8068
8074
8075
8076 LOGICAL LSAME
8078
8079
8081
8082
8083 DATA ( muladd0( i ), i = 1, 4 ) / 20077, 16838,
8084 $ 12345, 0 /
8085
8086
8087
8088
8089
8091
8092
8093
8094 ictxt = desca2( ctxt_ )
8095 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
8096
8097
8098
8099 info = 0
8100 IF( nprow.EQ.-1 ) THEN
8101 info = -( 1000 + ctxt_ )
8102 ELSE
8103 symm =
lsame( aform,
'S' )
8104 herm =
lsame( aform,
'H' )
8105 notran =
lsame( aform,
'N' )
8106 diagdo =
lsame( diag,
'D' )
8107 IF( .NOT.( symm.OR.herm.OR.notran ) .AND.
8108 $ .NOT.(
lsame( aform,
'T' ) ) .AND.
8109 $ .NOT.(
lsame( aform,
'C' ) ) )
THEN
8110 info = -2
8111 ELSE IF( ( .NOT.diagdo ) .AND.
8112 $ ( .NOT.
lsame( diag,
'N' ) ) )
THEN
8113 info = -3
8114 END IF
8115 CALL pb_chkmat( ictxt, m, 5, n, 6, ia, ja, desca2, 10, info )
8116 END IF
8117
8118 IF( info.NE.0 ) THEN
8119 CALL pxerbla( ictxt,
'PSLAGEN', -info )
8120 RETURN
8121 END IF
8122
8123
8124
8125 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
8126 $ RETURN
8127
8128
8129
8130 mb = desca2( mb_ )
8131 nb = desca2( nb_ )
8132 imb = desca2( imb_ )
8133 inb = desca2( inb_ )
8134 rsrc = desca2( rsrc_ )
8135 csrc = desca2( csrc_ )
8136
8137
8138
8139 CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
8140 $ mycol, imb1, inb1, mp, nq, iia, jja, iarow,
8141 $ iacol, mrrow, mrcol )
8142
8143
8144
8145 IF( inplace ) THEN
8146 iia = 1
8147 jja = 1
8148 END IF
8149
8150
8151
8152
8153 ioffda = ja + offa - ia
8154 CALL pb_binfo( ioffda, mp, nq, imb1, inb1, mb, nb, mrrow,
8155 $ mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
8156 $ lmbloc, lnbloc, ilow, low, iupp, upp )
8157
8158
8159
8160
8161
8162
8163
8164 itmp =
max( 0, -offa )
8165 ivir = ia + itmp
8166 imbvir = imb + itmp
8167 nvir = desca2( m_ ) + itmp
8168
8169 CALL pb_locinfo( ivir, imbvir, mb, myrow, rsrc, nprow, ilocblk,
8170 $ ilocoff, myrdist )
8171
8172 itmp =
max( 0, offa )
8173 jvir = ja + itmp
8174 inbvir = inb + itmp
8175 nvir =
max(
max( nvir, desca2( n_ ) + itmp ),
8176 $ desca2( m_ ) + desca2( n_ ) - 1 )
8177
8178 CALL pb_locinfo( jvir, inbvir, nb, mycol, csrc, npcol, jlocblk,
8179 $ jlocoff, mycdist )
8180
8181 IF( symm .OR. herm .OR. notran ) THEN
8182
8183 CALL pb_initjmp( .true., nvir, imbvir, inbvir, imbloc, inbloc,
8184 $ mb, nb, rsrc, csrc, nprow, npcol, 1, jmp )
8185
8186
8187
8189
8190
8191
8192 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
8193 $ myrdist, mycdist, nprow, npcol, jmp,
8194 $ imuladd, iran )
8195
8196 CALL pb_slagen(
'Lower', aform, a( iia, jja ), lda, lcmt00,
8197 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
8198 $ nb, lnbloc, jmp, imuladd )
8199
8200 END IF
8201
8202 IF( symm .OR. herm .OR. ( .NOT. notran ) ) THEN
8203
8204 CALL pb_initjmp( .false., nvir, imbvir, inbvir, imbloc, inbloc,
8205 $ mb, nb, rsrc, csrc, nprow, npcol, 1, jmp )
8206
8207
8208
8210
8211
8212
8213 CALL pb_setlocran( iaseed, ilocblk, jlocblk, ilocoff, jlocoff,
8214 $ myrdist, mycdist, nprow, npcol, jmp,
8215 $ imuladd, iran )
8216
8217 CALL pb_slagen(
'Upper', aform, a( iia, jja ), lda, lcmt00,
8218 $ iran, mblks, imbloc, mb, lmbloc, nblks, inbloc,
8219 $ nb, lnbloc, jmp, imuladd )
8220
8221 END IF
8222
8223 IF( diagdo ) THEN
8224
8225 maxmn =
max( desca2( m_ ), desca2( n_ ) )
8226 alpha = real( maxmn )
8227
8228 IF( ioffda.GE.0 ) THEN
8230 $ a,
min( ia+ioffda, ia+m-1 ), ja, desca )
8231 ELSE
8233 $ a, ia,
min( ja-ioffda, ja+n-1 ), desca )
8234 END IF
8235
8236 END IF
8237
8238 RETURN
8239
8240
8241
subroutine pb_ainfog2l(m, n, i, j, desc, nprow, npcol, myrow, mycol, imb1, inb1, mp, nq, ii, jj, prow, pcol, rprow, rpcol)
subroutine pb_binfo(offd, m, n, imb1, inb1, mb, nb, mrrow, mrcol, lcmt00, mblks, nblks, imbloc, inbloc, lmbloc, lnbloc, ilow, low, iupp, upp)
subroutine pb_setran(iran, iac)
subroutine pb_locinfo(i, inb, nb, myroc, srcproc, nprocs, ilocblk, ilocoff, mydist)
subroutine pb_chkmat(ictxt, m, mpos0, n, npos0, ia, ja, desca, dpos0, info)
subroutine pb_jump(k, muladd, irann, iranm, ima)
subroutine pb_setlocran(seed, ilocblk, jlocblk, ilocoff, jlocoff, myrdist, mycdist, nprow, npcol, jmp, imuladd, iran)
subroutine pb_initmuladd(muladd0, jmp, imuladd)
subroutine pb_desctrans(descin, descout)
subroutine pb_initjmp(colmaj, nvir, imbvir, inbvir, imbloc, inbloc, mb, nb, rsrc, csrc, nprow, npcol, stride, jmp)
subroutine pb_jumpit(muladd, irann, iranm)
subroutine psladom(inplace, n, alpha, a, ia, ja, desca)
subroutine pb_slagen(uplo, aform, a, lda, lcmt00, iran, mblks, imbloc, mb, lmbloc, nblks, inbloc, nb, lnbloc, jmp, imuladd)
subroutine pxerbla(ictxt, srname, info)