@@ -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