PDGEMM performs any one of the following combined matrix computations:
PZGEMM performs any one of the following combined matrix computations:
where, in the PDGEMM and PZGEMM formulas above:
In the following four cases, no computation is performed and the subroutine returns after doing some parameter checking:
Assuming the above conditions do not exist, if beta is not one and k is 0, then betaC is returned.
A, B, C, alpha, beta | Subroutine |
Long-precision real | PDGEMM |
Long-precision complex | PZGEMM |
Fortran | CALL PDGEMM | PZGEMM (transa, transb, m, n, k, alpha, a, ia, ja, desc_a, b, ib, jb, desc_b, beta, c, ic, jc, desc_c) |
C and C++ | pdgemm | pzgemm (transa, transb, m, n, k, alpha, a, ia, ja, desc_a, b, ib, jb, desc_b, beta, c, ic, jc, desc_c); |
If transa = 'N', A is used in the computation.
If transa = 'T', AT is used in the computation.
If transa = 'C', AH is used in the computation.
Scope: global
Specified as: a single character; transa = 'N', 'T', or 'C'
If transb = 'N', B is used in the computation.
If transb = 'T', BT is used in the computation.
If transb = 'C', BH is used in the computation.
Scope: global
Specified as: a single character; transb = 'N', 'T', or 'C'
If transa = 'N', it is the number of rows in submatrix A.
If transa = 'T' or 'C', it is the number of columns in submatrix A.
Scope: global
Specified as: a fullword integer; m >= 0.
If transb = 'N', it is the number of columns in submatrix B.
If transb = 'T' or 'C', it is the number of rows in submatrix B.
Scope: global
Specified as: a fullword integer; n >= 0.
If transa = 'N', it is the number of columns in submatrix A.
If transa = 'T' or 'C', it is the number of rows in submatrix A.
In addition:
If transb = 'N', it is the number of rows in submatrix B.
If transb = 'T' or 'C', it is the number of columns in submatrix B.
Scope: global
Specified as: a fullword integer; k >= 0.
Scope: global
Specified as: a number of the data type indicated in Table 45.
Scope: local
Specified as: an LLD_A by (at least) LOCq(N_A) array, containing numbers of the data type indicated in Table 45. Details about the block-cyclic data distribution of global matrix A are stored in desc_a.
Scope: global
Specified as: a fullword integer; 1 <= ia <= M_A, and:
If transa = 'N', then ia+m-1 <= M_A.
If transa = 'T' or 'C', then ia+k-1 <= M_A.
Scope: global
Specified as: a fullword integer; 1 <= ja <= N_A, and:
If transa = 'N', then ja+k-1 <= N_A.
If transa = 'T' or 'C', then ja+m-1 <= N_A.
desc_a | Name | Description | Limits | Scope |
---|---|---|---|---|
1 | DTYPE_A | Descriptor type | DTYPE_A=1 | Global |
2 | CTXT_A | BLACS context | Valid value, as returned by BLACS_GRIDINIT or BLACS_GRIDMAP | Global |
3 | M_A | Number of rows in the global matrix |
If m = 0 or k = 0: M_A >= 0 Otherwise: M_A >= 1 | Global |
4 | N_A | Number of columns in the global matrix |
If m = 0 or k = 0: N_A >= 0 Otherwise: N_A >= 1 | Global |
5 | MB_A | Row block size | MB_A >= 1 | Global |
6 | NB_A | Column block size | NB_A >= 1 | Global |
7 | RSRC_A | The process row of the p × q grid over which the first row of the global matrix is distributed | 0 <= RSRC_A < p | Global |
8 | CSRC_A | The process column of the p × q grid over which the first column of the global matrix is distributed | 0 <= CSRC_A < q | Global |
9 | LLD_A | The leading dimension of the local array | LLD_A >= max(1,LOCp(M_A)) | Local |
Specified as: an array of (at least) length 9, containing fullword integers.
Scope: local
Specified as: an LLD_B by (at least) LOCq(N_B) array, containing numbers of the data type indicated in Table 45. Details about the block-cyclic data distribution of global matrix B are stored in desc_b.
Scope: global
Specified as: a fullword integer; 1 <= ib <= M_B, and:
If transb = 'N', then ib+k-1 <= M_B.
If transb = 'T' or 'C', then ib+n-1 <= M_B.
Scope: global
Specified as: a fullword integer; 1 <= jb <= N_B, and:
If transb = 'N', then jb+n-1 <= N_B.
If transb = 'T' or 'C', then jb+k-1 <= N_B.
desc_b | Name | Description | Limits | Scope |
---|---|---|---|---|
1 | DTYPE_B | Descriptor type | DTYPE_B=1 | Global |
2 | CTXT_B | BLACS context | Valid value, as returned by BLACS_GRIDINIT or BLACS_GRIDMAP | Global |
3 | M_B | Number of rows in the global matrix |
If k = 0 or n = 0: M_B >= 0 Otherwise: M_B >= 1 | Global |
4 | N_B | Number of columns in the global matrix |
If k = 0 or n = 0: N_B >= 0 Otherwise: N_B >= 1 | Global |
5 | MB_B | Row block size | MB_B >= 1 | Global |
6 | NB_B | Column block size | NB_B >= 1 | Global |
7 | RSRC_B | The process row of the p × q grid over which the first row of the global matrix is distributed | 0 <= RSRC_B < p | Global |
8 | CSRC_B | The process column of the p × q grid over which the first column of the global matrix is distributed | 0 <= CSRC_B < q | Global |
9 | LLD_B | The leading dimension of the local array | LLD_B >= max(1,LOCp(M_B)) | Local |
Specified as: an array of (at least) length 9, containing fullword integers.
Scope: global
Specified as: a number of the data type indicated in Table 45.
When beta is zero, C need not be set on input.
Scope: local
Specified as: an LLD_C by (at least) LOCq(N_C) array, containing numbers of the data type indicated in Table 45. Details about the block-cyclic data distribution of global matrix C are stored in desc_c.
Scope: global
Specified as: a fullword integer; 1 <= ic <= M_C and ic+m-1 <= M_C.
Scope: global
Specified as: a fullword integer; 1 <= jc <= N_C and jc+n-1 <= N_C.
desc_c | Name | Description | Limits | Scope |
---|---|---|---|---|
1 | DTYPE_C | Descriptor type | DTYPE_C=1 | Global |
2 | CTXT_C | BLACS context | Valid value, as returned by BLACS_GRIDINIT or BLACS_GRIDMAP | Global |
3 | M_C | Number of rows in the global matrix |
If m = 0 or n = 0: M_C >= 0 Otherwise: M_C >= 1 | Global |
4 | N_C | Number of columns in the global matrix |
If m = 0 or n = 0: N_C >= 0 Otherwise: N_C >= 1 | Global |
5 | MB_C | Row block size | MB_C >= 1 | Global |
6 | NB_C | Column block size | NB_C >= 1 | Global |
7 | RSRC_C | The process row of the p × q grid over which the first row of the global matrix is distributed | 0 <= RSRC_C < p | Global |
8 | CSRC_C | The process column of the p × q grid over which the first column of the global matrix is distributed | 0 <= CSRC_C < q | Global |
9 | LLD_C | The leading dimension of the local array | LLD_C >= max(1,LOCp(M_C)) | Local |
Specified as: an array of (at least) length 9, containing fullword integers.
Scope: local
Returned as: an LLD_C by (at least) LOCq(N_C) array, containing numbers of the data type indicated in Table 45.
Step 1: First, the reference matrix is selected. For optimal performance, the reference matrix is selected based on the arguments m, n, and k, as follows:
The matrix selected must satisfy coding rules a and d, described below, to be a suitable reference matrix. If it does, you go to step 2. If it does not, then it checks to see if either of the other two matrices satisfies coding rules a, c, and d, making one of them a suitable reference matrix. If one of them is suitable, then you go to step 2. If neither matrix is suitable, an error condition results.
Step 2: After a suitable reference matrix is chosen in Step 2, all remaining coding rules, described below, are checked. If the rules are satisfied, the subroutine continues normally. If they are not, an error condition results.
Coding Rules: Following are the coding rules:
These indexes are indicated in column 5 of Table 46 for each entry for X.
Table 46. Coding Rules for the Reference Matrix X
-1- X |
-2- transa |
-3- transb |
-4- (b) Equal Block Sizes |
-5- (a) Block Bndry For X |
-6- (d) Block Bndry For Other |
-7- (c) Equal Block Offsets (If Looping is Required) |
-8- (c) Conditions For Looping |
---|---|---|---|---|---|---|---|
A | 'N' | 'N' |
MB_A = MB_C NB_B = NB_C NB_A = MB_B | ia, ja | ib, ic |
mod(jb-1, NB_B) = mod(jc-1, NB_C) |
n+mod(jb-1, NB_B) > NB_B -or- n+mod(jc-1, NB_C) > NB_C |
A | 'N' | 'T' or 'C' |
MB_A = MB_C MB_B = NB_C NB_A = NB_B | ia, ja | jb, ic |
mod(ib-1, MB_B) = mod(jc-1, NB_C) |
n+mod(ib-1, MB_B) > MB_B -or- n+mod(jc-1, NB_C) > NB_C |
A | 'T' or 'C' | 'N' |
NB_A = MB_C NB_B = NB_C MB_A = MB_B | ia, ja | ib, ic |
mod(jb-1, NB_B) = mod(jc-1, NB_C) |
n+mod(jb-1, NB_B) > NB_B -or- n+mod(jc-1, NB_C) > NB_C |
A | 'T' or 'C' | 'T' or 'C' |
NB_A = MB_C MB_B = NB_C MB_A = NB_B | ia, ja | jb, ic |
mod(ib-1, MB_B) = mod(jc-1, NB_C) |
n+mod(ib-1, MB_B) > MB_B -or- n+mod(jc-1, NB_C) > NB_C |
B | 'N' | 'N' |
MB_A = MB_C NB_B = NB_C NB_A = MB_B | ib, jb | ja, jc |
mod(ia-1, MB_A) = mod(ic-1, MB_C) |
m+mod(ia-1, MB_A) > MB_A -or- m+mod(ic-1, MB_C) > MB_C |
B | 'N' | 'T' or 'C' |
MB_A = MB_C MB_B = NB_C NB_A = NB_B | ib, jb | ja, jc |
mod(ia-1, MB_A) = mod(ic-1, MB_C) |
m+mod(ia-1, MB_A) > MB_A -or- m+mod(ic-1, MB_C) > MB_C |
B | 'T' or 'C' | 'N' |
NB_A = MB_C NB_B = NB_C MB_A = MB_B | ib, jb | ia, jc |
mod(ja-1, NB_A) = mod(ic-1, MB_C) |
m+mod(ja-1, NB_A) > NB_A -or- m+mod(ic-1, MB_C) > MB_C |
B | 'T' or 'C' | 'T' or 'C' |
NB_A = MB_C MB_B = NB_C MB_A = NB_B | ib, jb | ia, jc |
mod(ja-1, NB_A) = mod(ic-1, MB_C) |
m+mod(ja-1, NB_A) > NB_A -or- m+mod(ic-1, MB_C) > MB_C |
C | 'N' | 'N' |
MB_A = MB_C NB_B = NB_C NB_A = MB_B | ic, jc | ia, jb |
mod(ja-1, NB_A) = mod(ib-1, MB_B) |
k+mod(ja-1, NB_A) > NB_A -or- k+mod(ib-1, MB_B) > MB_B |
C | 'N' | 'T' or 'C' |
MB_A = MB_C MB_B = NB_C NB_A = NB_B | ic, jc | ia, ib |
mod(ja-1, NB_A) = mod(jb-1, NB_B) |
k+mod(ja-1, NB_A) > NB_A -or- k+mod(jb-1, NB_B) > NB_B |
C | 'T' or 'C' | 'N' |
NB_A = MB_C NB_B = NB_C MB_A = MB_B | ic, jc | ja, jb |
mod(ia-1, MB_A) = mod(ib-1, MB_B) |
k+mod(ia-1, MB_A) > MB_A -or- k+mod(ib-1, MB_B) > MB_B |
C | 'T' or 'C' | 'T' or 'C' |
NB_A = MB_C MB_B = NB_C MB_A = NB_B | ic, jc | ja, ib |
mod(ia-1, MB_A) = mod(jb-1, NB_B) |
k+mod(ia-1, MB_A) > MB_A -or- k+mod(jb-1, NB_B) > NB_B |
Table 47. Coding Rules for the Reference Matrix X
-1- X |
-2- transa |
-3- transb |
-4- (e) Process Grid Alignment |
---|---|---|---|
A | 'N' | 'N' | iarow = icrow |
A | 'N' | 'T' or 'C' |
iarow = icrow ibcol = iacol |
A | 'T' or 'C' | 'N' | iarow = ibrow |
A | 'T' or 'C' | 'T' or 'C' | (no rules) |
B | 'N' | 'N' | ibcol = iccol |
B | 'N' | 'T' or 'C' | ibcol = iacol |
B | 'T' or 'C' | 'N' |
iarow = ibrow ibcol = iccol |
B | 'T' or 'C' | 'T' or 'C' | (no rules) |
C | 'N' | 'N' |
iarow = icrow ibcol = iccol |
C | 'N' | 'T' or 'C' | iarow = icrow |
C | 'T' or 'C' | 'N' | ibcol = iccol |
C | 'T' or 'C' | 'T' or 'C' | (no rules) |
Example: Following is an example of the coding rules necessary for the case where transa = 'N' and transb = 'N', where the reference matrix selected is A. Following are the indexes, dimensions, and block sizes used in the computation for the matrices:
Indexes: ic jc ia ja ib jb ic jc
| | | | | | | |
Dimensions: C ( m , n )
<-- alpha A ( m , k ) B ( k , n ) + beta C ( m , n )
| | | | | | | |
Block Sizes: MB_C NB_C MB_A NB_A MB_B NB_B MB_C NB_C
then the following offsets must be equal, as indicated in column 7 in Table 46:
None
Unable to allocate work space
If m <> 0 and k <> 0:
If n <> 0 and k <> 0:
If m <> 0 and n <> 0:
This example computes C = betaC+alphaAB using a 2 × 2 process grid.
ORDER = 'R' NPROW = 2 NPCOL = 2 CALL BLACS_GET (0, 0, ICONTXT) CALL BLACS_GRIDINIT(ICONTXT, ORDER, NPROW, NPCOL) CALL BLACS_GRIDINFO(ICONTXT, NPROW, NPCOL, MYROW, MYCOL) TRANSA TRANSB M N K ALPHA A IA JA DESC_A B IB JB | | | | | | | | | | | | | CALL PDGEMM( 'N' , 'N' , 6 , 4 , 5 , 1.0D0 , A , 1 , 1 , DESC_A , B , 1 , 1 , DESC_B BETA C IC JC DESC_C | | | | | | DESC_B , 2.0D0 , C , 1 , 1 , DESC_C )
| Desc_A | Desc_B | Desc_C |
---|---|---|---|
DTYPE_ | 1 | 1 | 1 |
CTXT_ | icontxt(IOBG18) | icontxt(IOBG18) | icontxt(IOBG18) |
M_ | 6 | 5 | 6 |
N_ | 5 | 4 | 4 |
MB_ | 3 | 2 | 3 |
NB_ | 2 | 2 | 2 |
RSRC_ | 0 | 0 | 0 |
CSRC_ | 0 | 0 | 0 |
LLD_ | See below(EPSSL18) | See below(EPSSL18) | See below(EPSSL18) |
Notes:
|
Global general 6 × 5 matrix A with block size 3 × 2:
B,D 0 1 2 * * | 1.0 2.0 | -1.0 -1.0 | 4.0 | 0 | 2.0 0.0 | 1.0 1.0 | -1.0 | | 1.0 -1.0 | -1.0 1.0 | 2.0 | | -----------|-------------|------ | | -3.0 2.0 | 2.0 2.0 | 0.0 | 1 | 4.0 0.0 | -2.0 1.0 | -1.0 | | -1.0 -1.0 | 1.0 -3.0 | 2.0 | * *
The following is the 2 × 2 process grid:
B,D | 0 2 | 1 -----| ------- |----- 0 | P00 | P01 -----| ------- |----- 1 | P10 | P11
Local arrays for A:
p,q | 0 | 1 -----|-----------------|------------ | 1.0 2.0 4.0 | -1.0 -1.0 0 | 2.0 0.0 -1.0 | 1.0 1.0 | 1.0 -1.0 2.0 | -1.0 1.0 -----|-----------------|------------ | -3.0 2.0 0.0 | 2.0 2.0 1 | 4.0 0.0 -1.0 | -2.0 1.0 | -1.0 -1.0 2.0 | 1.0 -3.0
Global general 5 × 4 matrix B with block size 2 × 2:
B,D 0 1 * * 0 | 1.0 -1.0 | 0.0 2.0 | | 2.0 2.0 | -1.0 -2.0 | | -----------|----------- | 1 | 1.0 0.0 | -1.0 1.0 | | -3.0 -1.0 | 1.0 -1.0 | | -----------|----------- | 2 | 4.0 2.0 | -1.0 1.0 | * *
The following is the 2 × 2 process grid:
B,D | 0 | 1 -----| ------- |----- 0 | P00 | P01 2 | | -----| ------- |----- 1 | P10 | P11
Local arrays for B:
p,q | 0 | 1 -----|------------|------------ | 1.0 -1.0 | 0.0 2.0 0 | 2.0 2.0 | -1.0 -2.0 | 4.0 2.0 | -1.0 1.0 -----|------------|------------ 1 | 1.0 0.0 | -1.0 0.0 | -3.0 -1.0 | 1.0 -1.0
Global general 6 × 4 matrix C with block size 3 × 2:
B,D 0 1 * * | 0.5 0.5 | 0.5 0.5 | 0 | 0.5 0.5 | 0.5 0.5 | | 0.5 0.5 | 0.5 0.5 | | -----------|----------- | | 0.5 0.5 | 0.5 0.5 | 1 | 0.5 0.5 | 0.5 0.5 | | 0.5 0.5 | 0.5 0.5 | * *
The following is the 2 × 2 process grid:
B,D | 0 | 1 -----| ------- |----- 0 | P00 | P01 -----| ------- |----- 1 | P10 | P11
Local arrays for C:
p,q | 0 | 1 -----|------------|------------ | 0.5 0.5 | 0.5 0.5 0 | 0.5 0.5 | 0.5 0.5 | 0.5 0.5 | 0.5 0.5 -----|------------|------------ | 0.5 0.5 | 0.5 0.5 1 | 0.5 0.5 | 0.5 0.5 | 0.5 0.5 | 0.5 0.5
Output:
Global general 6 × 4 matrix C with block size 3 × 2:
B,D 0 1 * * | 24.0 13.0 | -5.0 3.0 | 0 | -3.0 -4.0 | 2.0 4.0 | | 4.0 1.0 | 2.0 5.0 | | -------------|------------- | | -2.0 6.0 | -1.0 -9.0 | 1 | -4.0 -6.0 | 5.0 5.0 | | 16.0 7.0 | -4.0 7.0 | * *
The following is the 2 × 2 process grid:
B,D | 0 | 1 -----| ------- |----- 0 | P00 | P01 -----| ------- |----- 1 | P10 | P11
Local arrays for C:
p,q | 0 | 1 -----|--------------|-------------- | 24.0 13.0 | -5.0 3.0 0 | -3.0 -4.0 | 2.0 4.0 | 4.0 1.0 | 2.0 5.0 -----|--------------|-------------- | -2.0 6.0 | -1.0 -9.0 1 | -4.0 -6.0 | 5.0 5.0 | 16.0 7.0 | -4.0 7.0
This example computes C = betaC+alphaAB using a 2 × 2 process grid.
ORDER = 'R' NPROW = 2 NPCOL = 2 CALL BLACS_GET (0, 0, ICONTXT) CALL BLACS_GRIDINIT(ICONTXT, ORDER, NPROW, NPCOL) CALL BLACS_GRIDINFO(ICONTXT, NPROW, NPCOL, MYROW, MYCOL) TRANSA TRANSB M N K ALPHA A IA JA DESC_A B IB JB | | | | | | | | | | | | | CALL PZGEMM('N' , 'N' , 6 , 2 , 3 , (1.0D0,0.0D0) , A , 1 , 1 , DESC_A , B , 1 , 1 , DESC_B BETA C IC JC DESC_C | | | | | | DESC_B , (2.0D0,0.0D0) , C , 1 , 1 , DESC_C)
| Desc_A | Desc_B | Desc_C |
---|---|---|---|
DTYPE_ | 1 | 1 | 1 |
CTXT_ | icontxt(IOBG19) | icontxt(IOBG19) | icontxt(IOBG19) |
M_ | 6 | 3 | 6 |
N_ | 3 | 2 | 2 |
MB_ | 2 | 2 | 2 |
NB_ | 2 | 2 | 2 |
RSRC_ | 0 | 0 | 0 |
CSRC_ | 0 | 0 | 0 |
LLD_ | See below(EPSSL19) | See below(EPSSL19) | See below(EPSSL19) |
Notes:
|
Global general 6 × 3 matrix A with block size 2 × 2:
B,D 0 1 * * 0 | (1.0,5.0) (9.0,2.0) | (1.0,9.0) | | (2.0,4.0) (8.0,3.0) | (1.0,8.0) | | -----------------------|------------ | 1 | (3.0,3.0) (7.0,5.0) | (1.0,7.0) | | (4.0,2.0) (4.0,7.0) | (1.0,5.0) | | -----------------------|------------ | 2 | (5.0,1.0) (5.0,1.0) | (1.0,6.0) | | (6.0,6.0) (3.0,6.0) | (1.0,4.0) | * *
The following is the 2 × 2 process grid:
B,D | 0 | 1 -----| ------- |----- 0 | P00 | P01 2 | | -----| ------- |----- 1 | P10 | P11
Local arrays for A:
p,q | 0 | 1 -----|------------------------|------------- | (1.0,5.0) (9.0,2.0) | (1.0,9.0) | (2.0,4.0) (8.0,3.0) | (1.0,8.0) 0 | (5.0,1.0) (5.0,1.0) | (1.0,6.0) | (6.0,6.0) (3.0,6.0) | (1.0,4.0) -----|------------------------|------------- 1 | (3.0,3.0) (7.0,5.0) | (1.0,7.0) | (4.0,2.0) (4.0,7.0) | (1.0,5.0)
Global general 3 × 2 matrix B with block size 2 × 2:
B,D 0 * * 0 | (1.0,8.0) (2.0,7.0) | | (4.0,4.0) (6.0,8.0) | | --------------------- | 1 | (6.0,2.0) (4.0,5.0) | * *
The following is the 2 × 2 process grid:
B,D | 0 | -- -----| ------- |----- 0 | P00 | P01 -----| ------- |----- 1 | P10 | P11
Local arrays for B:
p,q | 0 -----|----------------------- 0 | (1.0,8.0) (2.0,7.0) | (4.0,4.0) (6.0,8.0) -----|----------------------- 1 | (6.0,2.0) (4.0,5.0)
Global general 6 × 2 matrix C with block size 2 × 2:
B,D 0 * * 0 | (0.5,0.0) (0.5,0.0) | | (0.5,0.0) (0.5,0.0) | | --------------------- | 1 | (0.5,0.0) (0.5,0.0) | | (0.5,0.0) (0.5,0.0) | | --------------------- | 2 | (0.5,0.0) (0.5,0.0) | | (0.5,0.0) (0.5,0.0) | * *
The following is the 2 × 2 process grid:
B,D | 0 | -- -----| ------- |----- 0 | P00 | P01 2 | | -----| ------- |----- 1 | P10 | P11
Local arrays for C:
p,q | 0 -----|----------------------- | (0.5,0.0) (0.5,0.0) | (0.5,0.0) (0.5,0.0) 0 | (0.5,0.0) (0.5,0.0) | (0.5,0.0) (0.5,0.0) -----|----------------------- 1 | (0.5,0.0) (0.5,0.0) | (0.5,0.0) (0.5,0.0)
Output:
Global general 6 × 2 matrix C with block size 2 × 2:
B,D 0 * * 0 | (-22.0,113.0) (-35.0.142.0) | | (-19.0,114.0) (-35.0.141.0) | | ----------------------------- | 1 | (-20.0,119.0) (-43.0.146.0) | | (-27.0,110.0) (-58.0.131.0) | | ----------------------------- | 2 | (8.0,103.0) (0.0.112.0) | | (-55.0,116.0) (-75.0.135.0) | * *
The following is the 2 × 2 process grid:
B,D | 0 | -- -----| ------- |----- 0 | P00 | P01 2 | | -----| ------- |----- 1 | P10 | P11
Local arrays for C:
p,q | 0 -----|------------------------------- | (-22.0,113.0) (-35.0.142.0) | (-19.0,114.0) (-35.0.141.0) 0 | (8.0,103.0) (0.0.112.0) | (-55.0,116.0) (-75.0.135.0) -----|------------------------------- 1 | (-20.0,119.0) (-43.0.146.0) | (-27.0,110.0) (-58.0.131.0)