Skip to content

Commit a8a15d1

Browse files
authored
Merge pull request #78 from LLNL/bugfix-hamiltonianreader
Bugfix: Hamiltonian reader for Petsc-parallel Lindblad solver
2 parents e1a44eb + a98f8ca commit a8a15d1

13 files changed

+4150
-16
lines changed

src/hamiltonianfilereader.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ void HamiltonianFileReader::receiveHsys(Mat& Ad, Mat& Bd){
6464
MPI_Bcast(real_vals.data(), num_entries, MPI_DOUBLE, 0, MPI_COMM_WORLD);
6565
MPI_Bcast(imag_vals.data(), num_entries, MPI_DOUBLE, 0, MPI_COMM_WORLD);
6666

67-
// Now all ranks set the values
67+
// Now all ranks set their local values
68+
PetscInt ilow, iupp;
69+
MatGetOwnershipRange(Ad, &ilow, &iupp);
6870
for (int i = 0; i < num_entries; i++) {
6971
PetscInt row = rows[i];
7072
PetscInt col = cols[i];
@@ -75,19 +77,21 @@ void HamiltonianFileReader::receiveHsys(Mat& Ad, Mat& Bd){
7577
// Assemble: Bd = Imag(-i*Hsys) = -Real(Hsys)
7678
if (lindbladtype == LindbladType::NONE) {
7779
// Schroedinger
78-
if (fabs(imag) > 1e-15) MatSetValue(Ad, row, col, imag, INSERT_VALUES);
79-
if (fabs(real) > 1e-15) MatSetValue(Bd, row, col, -real, INSERT_VALUES);
80+
if (fabs(imag) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Ad, row, col, imag, INSERT_VALUES);
81+
if (fabs(real) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Bd, row, col, -real, INSERT_VALUES);
8082
} else {
81-
// Lindblad: Vectorize I_N \kron X - X^T \kron I_N
83+
// Lindblad:
84+
// Vectorized Ad = Real(I_N \kron (-iH) - (-iH)^T \kron I_N) = I_N \kron Im(Hsys) - Im(Hsys)^T \kron I_N
85+
// Vectorized Bd = Imag(I_N \kron (-iH) - (-iH)^T \kron I_N) = - I_n \kron Real(Hsys) + Real(Hsys)^T \kron I_N
8286
for (PetscInt k = 0; k < dim_rho; k++) {
8387
PetscInt rowk = row + dim_rho * k;
8488
PetscInt colk = col + dim_rho * k;
85-
if (fabs(imag) > 1e-15) MatSetValue(Ad, rowk, colk, imag, INSERT_VALUES);
86-
if (fabs(real) > 1e-15) MatSetValue(Bd, rowk, colk, -real, INSERT_VALUES);
89+
if (fabs(imag) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Ad, rowk, colk, imag, ADD_VALUES);
90+
if (fabs(real) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Bd, rowk, colk, -real, ADD_VALUES);
8791
rowk = col * dim_rho + k;
8892
colk = row * dim_rho + k;
89-
if (fabs(imag) > 1e-15) MatSetValue(Ad, rowk, colk, -imag, INSERT_VALUES);
90-
if (fabs(real) > 1e-15) MatSetValue(Bd, rowk, colk, real, INSERT_VALUES);
93+
if (fabs(imag) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Ad, rowk, colk, -imag, ADD_VALUES);
94+
if (fabs(real) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Bd, rowk, colk, real, ADD_VALUES);
9195
}
9296
}
9397
}
@@ -153,7 +157,9 @@ void HamiltonianFileReader::receiveHc(std::vector<Mat>& Ac_vec, std::vector<Mat>
153157
MPI_Bcast(real_vals.data(), num_entries, MPI_DOUBLE, 0, MPI_COMM_WORLD);
154158
MPI_Bcast(imag_vals.data(), num_entries, MPI_DOUBLE, 0, MPI_COMM_WORLD);
155159

156-
// Now all ranks set the values
160+
// Now all ranks set their local values
161+
PetscInt ilow, iupp;
162+
MatGetOwnershipRange(Ac_vec[0], &ilow, &iupp);
157163
for (int i = 0; i < num_entries; i++) {
158164
PetscInt row = rows[i];
159165
PetscInt col = cols[i];
@@ -164,19 +170,21 @@ void HamiltonianFileReader::receiveHc(std::vector<Mat>& Ac_vec, std::vector<Mat>
164170
// Assemble: Bc = Imag(-i*Hc) = -Real(Hc)
165171
if (lindbladtype == LindbladType::NONE) {
166172
// Schroedinger
167-
if (fabs(imag) > 1e-15) MatSetValue(Ac_vec[osc], row, col, imag, INSERT_VALUES);
168-
if (fabs(real) > 1e-15) MatSetValue(Bc_vec[osc], row, col, -real, INSERT_VALUES);
173+
if (fabs(imag) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Ac_vec[osc], row, col, imag, ADD_VALUES);
174+
if (fabs(real) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Bc_vec[osc], row, col, -real, ADD_VALUES);
169175
} else {
170-
// Lindblad: Vectorize I_N \kron X - X^T \kron I_N
176+
// Lindblad:
177+
// Vectorized Ac = Real(I_N \kron (-iH) - (-iH)^T \kron I_N) = I_N \kron Im(Hsys) - Im(Hsys)^T \kron I_N
178+
// Vectorized Bc = Imag(I_N \kron (-iH) - (-iH)^T \kron I_N) = - I_n \kron Real(Hsys) + Real(Hsys)^T \kron I_N
171179
for (PetscInt k = 0; k < dim_rho; k++) {
172180
PetscInt rowk = row + dim_rho * k;
173181
PetscInt colk = col + dim_rho * k;
174-
if (fabs(imag) > 1e-15) MatSetValue(Ac_vec[osc], rowk, colk, imag, INSERT_VALUES);
175-
if (fabs(real) > 1e-15) MatSetValue(Bc_vec[osc], rowk, colk, -real, INSERT_VALUES);
182+
if (fabs(imag) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Ac_vec[osc], rowk, colk, imag, ADD_VALUES);
183+
if (fabs(real) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Bc_vec[osc], rowk, colk, -real, ADD_VALUES);
176184
rowk = col * dim_rho + k;
177185
colk = row * dim_rho + k;
178-
if (fabs(imag) > 1e-15) MatSetValue(Ac_vec[osc], rowk, colk, -imag, INSERT_VALUES);
179-
if (fabs(real) > 1e-15) MatSetValue(Bc_vec[osc], rowk, colk, real, INSERT_VALUES);
186+
if (fabs(imag) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Ac_vec[osc], rowk, colk, -imag, ADD_VALUES);
187+
if (fabs(real) > 1e-15 && ilow <= row && row < iupp) MatSetValue(Bc_vec[osc], rowk, colk, real, ADD_VALUES);
180188
}
181189
}
182190
}

0 commit comments

Comments
 (0)