1904
 1905
 1906
 1907
 1908
 1909
 1910
 1911      INTEGER            I, II, J, JJ, MYCOL, MYROW, NPCOL, NPROW, PCOL,
 1912     $                   PROW
 1913
 1914
 1915      INTEGER            DESC( * )
 1916
 1917
 1918
 1919
 1920
 1921
 1922
 1923
 1924
 1925
 1926
 1927
 1928
 1929
 1930
 1931
 1932
 1933
 1934
 1935
 1936
 1937
 1938
 1939
 1940
 1941
 1942
 1943
 1944
 1945
 1946
 1947
 1948
 1949
 1950
 1951
 1952
 1953
 1954
 1955
 1956
 1957
 1958
 1959
 1960
 1961
 1962
 1963
 1964
 1965
 1966
 1967
 1968
 1969
 1970
 1971
 1972
 1973
 1974
 1975
 1976
 1977
 1978
 1979
 1980
 1981
 1982
 1983
 1984
 1985
 1986
 1987
 1988
 1989
 1990
 1991
 1992
 1993
 1994
 1995
 1996
 1997
 1998
 1999
 2000
 2001
 2002
 2003
 2004
 2005
 2006
 2007
 2008
 2009
 2010
 2011
 2012
 2013
 2014
 2015
 2016
 2017
 2018
 2019
 2020
 2021
 2022
 2023
 2024
 2025
 2026
 2027
 2028
 2029
 2030
 2031
 2032
 2033
 2034
 2035
 2036
 2037
 2038
 2039
 2040
 2041
 2042
 2043
 2044
 2045
 2046
 2047
 2048
 2049
 2050      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 2051     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 2052     $                   RSRC_
 2053      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 2054     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 2055     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 2056     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 2057
 2058
 2059      INTEGER            CSRC, I1, ILOCBLK, IMB, INB, J1, MB, MYDIST,
 2060     $                   NB, NBLOCKS, RSRC
 2061
 2062
 2063      INTEGER            DESC2( DLEN_ )
 2064
 2065
 2067
 2068
 2069
 2070
 2071
 2073
 2074      imb  = desc2( imb_ )
 2075      prow = desc2( rsrc_ )
 2076
 2077
 2078
 2079      IF( ( prow.EQ.-1 ).OR.( nprow.EQ.1 ) ) THEN
 2080
 2081         ii = i
 2082
 2083      ELSE IF( i.LE.imb ) THEN
 2084
 2085
 2086
 2087         IF( myrow.EQ.prow ) THEN
 2088            ii = i
 2089         ELSE
 2090            ii = 1
 2091         END IF
 2092
 2093      ELSE
 2094
 2095
 2096
 2097         rsrc = prow
 2098         mb = desc2( mb_ )
 2099
 2100         IF( myrow.EQ.rsrc ) THEN
 2101
 2102            nblocks = ( i - imb - 1 ) / mb + 1
 2103            prow    = prow + nblocks
 2104            prow    = prow - ( prow / nprow ) * nprow
 2105
 2106            ilocblk = nblocks / nprow
 2107
 2108            IF( ilocblk.GT.0 ) THEN
 2109               IF( ( ilocblk*nprow ).GE.nblocks ) THEN
 2110                  IF( myrow.EQ.prow ) THEN
 2111                     ii = i + ( ilocblk - nblocks ) * mb
 2112                  ELSE
 2113                     ii = imb + ( ilocblk - 1 ) * mb + 1
 2114                  END IF
 2115               ELSE
 2116                  ii = imb + ilocblk * mb + 1
 2117               END IF
 2118            ELSE
 2119               ii = imb + 1
 2120            END IF
 2121
 2122         ELSE
 2123
 2124            i1      = i - imb
 2125            nblocks = ( i1 - 1 ) / mb + 1
 2126            prow    = prow + nblocks
 2127            prow    = prow - ( prow / nprow ) * nprow
 2128
 2129            mydist  = myrow - rsrc
 2130            IF( mydist.LT.0 )
 2131     $         mydist = mydist + nprow
 2132
 2133            ilocblk = nblocks / nprow
 2134
 2135            IF( ilocblk.GT.0 ) THEN
 2136               mydist = mydist - nblocks + ilocblk * nprow
 2137               IF( mydist.LT.0 ) THEN
 2138                  ii = mb + ilocblk * mb + 1
 2139               ELSE
 2140                  IF( myrow.EQ.prow ) THEN
 2141                     ii = i1 + ( ilocblk - nblocks + 1 ) * mb
 2142                  ELSE
 2143                     ii = ilocblk * mb + 1
 2144                  END IF
 2145               END IF
 2146            ELSE
 2147               mydist = mydist - nblocks
 2148               IF( mydist.LT.0 ) THEN
 2149                  ii = mb + 1
 2150               ELSE IF( myrow.EQ.prow ) THEN
 2151                  ii = i1 + ( 1 - nblocks ) * mb
 2152               ELSE
 2153                  ii = 1
 2154               END IF
 2155            END IF
 2156         END IF
 2157
 2158      END IF
 2159
 2160      inb  = desc2( inb_ )
 2161      pcol = desc2( csrc_ )
 2162
 2163
 2164
 2165      IF( ( pcol.EQ.-1 ).OR.( npcol.EQ.1 ) ) THEN
 2166
 2167         jj = j
 2168
 2169      ELSE IF( j.LE.inb ) THEN
 2170
 2171
 2172
 2173         IF( mycol.EQ.pcol ) THEN
 2174            jj = j
 2175         ELSE
 2176            jj = 1
 2177         END IF
 2178
 2179      ELSE
 2180
 2181
 2182
 2183         csrc = pcol
 2184         nb   = desc2( nb_ )
 2185
 2186         IF( mycol.EQ.csrc ) THEN
 2187
 2188            nblocks = ( j - inb - 1 ) / nb + 1
 2189            pcol    = pcol + nblocks
 2190            pcol    = pcol - ( pcol / npcol ) * npcol
 2191
 2192            ilocblk = nblocks / npcol
 2193
 2194            IF( ilocblk.GT.0 ) THEN
 2195               IF( ( ilocblk*npcol ).GE.nblocks ) THEN
 2196                  IF( mycol.EQ.pcol ) THEN
 2197                     jj = j + ( ilocblk - nblocks ) * nb
 2198                  ELSE
 2199                     jj = inb + ( ilocblk - 1 ) * nb + 1
 2200                  END IF
 2201               ELSE
 2202                  jj = inb + ilocblk * nb + 1
 2203               END IF
 2204            ELSE
 2205               jj = inb + 1
 2206            END IF
 2207
 2208         ELSE
 2209
 2210            j1      = j - inb
 2211            nblocks = ( j1 - 1 ) / nb + 1
 2212            pcol    = pcol + nblocks
 2213            pcol    = pcol - ( pcol / npcol ) * npcol
 2214
 2215            mydist  = mycol - csrc
 2216            IF( mydist.LT.0 )
 2217     $         mydist = mydist + npcol
 2218
 2219            ilocblk = nblocks / npcol
 2220
 2221            IF( ilocblk.GT.0 ) THEN
 2222               mydist = mydist - nblocks + ilocblk * npcol
 2223               IF( mydist.LT.0 ) THEN
 2224                  jj = nb + ilocblk * nb + 1
 2225               ELSE
 2226                  IF( mycol.EQ.pcol ) THEN
 2227                     jj = j1 + ( ilocblk - nblocks + 1 ) * nb
 2228                  ELSE
 2229                     jj = ilocblk * nb + 1
 2230                  END IF
 2231               END IF
 2232            ELSE
 2233               mydist = mydist - nblocks
 2234               IF( mydist.LT.0 ) THEN
 2235                  jj = nb + 1
 2236               ELSE IF( mycol.EQ.pcol ) THEN
 2237                  jj = j1 + ( 1 - nblocks ) * nb
 2238               ELSE
 2239                  jj = 1
 2240               END IF
 2241            END IF
 2242         END IF
 2243
 2244      END IF
 2245
 2246      RETURN
 2247
 2248
 2249
subroutine pb_desctrans(descin, descout)