RealTimeTransport 1.0.0
Real-time simulation of quantum transport processes
Loading...
Searching...
No Matches
MatrixOperations.h
1//
2// This Source Code Form is subject to the terms of the Mozilla Public
3// License, v. 2.0. If a copy of the MPL was not distributed with this
4// file, You can obtain one at https://mozilla.org/MPL/2.0/.
5//
6
7#ifndef REAL_TIME_TRANSPORT_BLOCK_MATRICES_MATRIX_OPERATIONS_H
8#define REAL_TIME_TRANSPORT_BLOCK_MATRICES_MATRIX_OPERATIONS_H
9
10#include <SciCore/Utility.h>
11
13#include "BlockMatrix.h"
14#include "BlockVector.h"
15
16namespace RealTimeTransport
17{
18
19// Computes result += α * \sum_k A_{ik} B_{kj}, where i,j,k refer to block indices for fixed i,j
20REALTIMETRANSPORT_EXPORT void addProduct(
21 int i,
22 int j,
23 SciCore::Complex alpha,
24 const BlockMatrix& A,
25 const BlockMatrix& B,
26 typename BlockMatrix::MatrixType& result);
27
28// Returns α * \sum_k A_{ik} B_{kj}, where i,j,k refer to block indices for fixed i,j
29REALTIMETRANSPORT_EXPORT typename BlockMatrix::MatrixType product(
30 int i,
31 int j,
32 SciCore::Complex alpha,
33 const BlockMatrix& A,
34 const BlockMatrix& B);
35
36// Computed result += α * A * B * C
37REALTIMETRANSPORT_EXPORT void addProduct(
38 SciCore::Complex alpha,
39 const BlockMatrix& A,
40 const BlockMatrix& B,
41 const BlockMatrix& C,
42 BlockMatrix& result);
43
45product(SciCore::Complex alpha, const BlockMatrix& A, const BlockMatrix& B, const BlockMatrix& C);
46
47// Computes result += α * A * B. It is assumed that A and B are such that the result is block diagonal.
48REALTIMETRANSPORT_EXPORT void addProduct(
49 SciCore::Complex alpha,
50 const BlockMatrix& A,
51 const BlockMatrix& B,
52 BlockDiagonalMatrix& result);
53
55product_toDiagonal(SciCore::Complex alpha, const BlockMatrix& A, const BlockMatrix& B);
56
57// Computes result += α \sum_i A1_{ni} D_i A2_{im} where n,m,i refer to block indices and n,m is fixed
58REALTIMETRANSPORT_EXPORT void addProduct(
59 int n,
60 int m,
61 SciCore::Complex alpha,
62 const BlockMatrix& A1,
63 const BlockDiagonalMatrix& D,
64 const BlockMatrix& A2,
65 typename BlockMatrix::MatrixType& result);
66
67// Computes result += α \sum_i A1_{ni} A2_{ij} A3_{jm}
68REALTIMETRANSPORT_EXPORT void addProduct(
69 int n,
70 int m,
71 SciCore::Complex alpha,
72 const BlockMatrix& A1,
73 const BlockMatrix& A2,
74 const BlockMatrix& A3,
75 typename BlockMatrix::MatrixType& result);
76
77// Computes result += α \sum_i A_{ni} D_{i} x_i
78REALTIMETRANSPORT_EXPORT void addProduct(
79 int n,
80 SciCore::Complex alpha,
81 const BlockMatrix& A,
82 const BlockDiagonalMatrix& D,
83 const BlockVector& x,
84 typename BlockMatrix::MatrixType& result);
85
86// Computes result_n += α A1_ni D_i A2_im
87REALTIMETRANSPORT_EXPORT void addProduct_col(
88 int m,
89 SciCore::Complex alpha,
90 const BlockMatrix& A1,
91 const BlockDiagonalMatrix& D,
92 const BlockMatrix& A2,
93 BlockVector& result);
94
95// Computes result_n += α A1_{ni} A2_{ij} A3_{jm}
96// Only the vector elements in result are changed which initially exist!
97REALTIMETRANSPORT_EXPORT void addProduct_col_unsafe(
98 int m,
99 SciCore::Complex alpha,
100 const BlockMatrix& A1,
101 const BlockMatrix& A2,
102 const BlockMatrix& A3,
103 BlockVector& result);
104
105// Computes result += α A D
106REALTIMETRANSPORT_EXPORT void addProduct(
107 SciCore::Complex alpha,
108 const BlockMatrix& A,
109 const BlockDiagonalMatrix& D,
110 BlockMatrix& result);
111
112// Computes result_n += α A_nm D_m
113REALTIMETRANSPORT_EXPORT void addProduct_col_unsafe_2(
114 int m,
115 SciCore::Complex alpha,
116 const BlockMatrix& A,
117 const BlockDiagonalMatrix& D,
118 BlockVector& result);
119
120// Computes A -> D1 A D2
121REALTIMETRANSPORT_EXPORT void productCombination_1(
122 const BlockDiagonalMatrix& D1,
123 BlockMatrix& A,
124 const BlockDiagonalMatrix& D2);
125
126// Computes A -> D1 A D2 + D1 A + A D2
127REALTIMETRANSPORT_EXPORT void productCombination_2(
128 const BlockDiagonalMatrix& D1,
129 BlockMatrix& A,
130 const BlockDiagonalMatrix& D2);
131
132// Returns α D1 D2 D3
134 SciCore::Complex alpha,
135 const BlockDiagonalMatrix& D1,
136 const BlockDiagonalMatrix& D2,
137 const BlockDiagonalMatrix& D3);
138
139// Computes result += alpha * x * D * A
140REALTIMETRANSPORT_EXPORT void addProduct(
141 SciCore::Complex alpha,
142 const Eigen::Matrix<SciCore::Complex, 1, Eigen::Dynamic>& x,
143 const BlockDiagonalMatrix& D,
144 const BlockMatrix& A,
145 Eigen::Matrix<SciCore::Complex, 1, Eigen::Dynamic>& result,
146 const std::vector<int>& blockStartIndices);
147
148// Computes result += α \sum_i A1_{ni} A2_{ij} x_j
149REALTIMETRANSPORT_EXPORT void addProduct(
150 int n,
151 SciCore::Complex alpha,
152 const BlockMatrix& A1,
153 const BlockMatrix& A2,
154 const BlockVector& x,
155 typename BlockMatrix::MatrixType& result);
156
157} // namespace RealTimeTransport
158
159#endif // REAL_TIME_TRANSPORT_BLOCK_MATRICES_MATRIX_OPERATIONS_H
#define REALTIMETRANSPORT_EXPORT
Definition RealTimeTransport_export.h:15
Represents a block diagonal matrix.
Definition BlockDiagonalMatrix.h:33