@@ -88,6 +88,15 @@ def apply(general_params, icrsh, gf_struct_solver, solvers):
8888 mpi .report ('\n copying the self-energy for shell {} from shell {}' .format (icrsh , imp_source ))
8989 mpi .report ('inverting spin channels: ' + str (invert_spin ))
9090
91+ if solvers [icrsh ].solver_params .get ('measure_density_matrix' ):
92+ solvers [icrsh ].density_matrix = solvers [imp_source ].density_matrix
93+ solvers [icrsh ].h_loc_diagonalization = solvers [imp_source ].h_loc_diagonalization
94+ solvers [icrsh ].Sigma_moments = solvers [imp_source ].Sigma_moments
95+ solvers [icrsh ].Sigma_Hartree = solvers [imp_source ].Sigma_Hartree
96+ solvers [icrsh ].G_moments = solvers [imp_source ].G_moments
97+ # copy orbital occupations dict with deep copy of arrays
98+ solvers [icrsh ].orbital_occupations = {key : occ .copy () for key , occ in solvers [imp_source ].orbital_occupations .items ()}
99+
91100 if invert_spin :
92101 for spin_channel in gf_struct_solver .keys ():
93102 if 'up' in spin_channel :
@@ -101,28 +110,26 @@ def apply(general_params, icrsh, gf_struct_solver, solvers):
101110 solvers [icrsh ].G0_freq [spin_channel ] << solvers [imp_source ].G0_freq [target_channel ]
102111 solvers [icrsh ].G_time [spin_channel ] << solvers [imp_source ].G_time [target_channel ]
103112
104- if solvers [icrsh ].solver_params ['measure_pert_order' ]:
105- if not hasattr (solvers [icrsh ], 'perturbation_order' ):
106- solvers [icrsh ].perturbation_order = {}
113+ if solvers [icrsh ].solver_params .get ('measure_pert_order' ):
107114 solvers [icrsh ].perturbation_order [spin_channel ] = solvers [imp_source ].perturbation_order [target_channel ]
108115 solvers [icrsh ].perturbation_order_total = solvers [imp_source ].perturbation_order_total
109116
117+ # we also need to swap the orbital occupations, but we skip moments since the whole self-energy is copied anyway
118+ if solvers [icrsh ].solver_params .get ('measure_density_matrix' ):
119+ solvers [icrsh ].orbital_occupations [spin_channel ] = solvers [imp_source ].orbital_occupations [target_channel ]
120+
110121 else :
111122 solvers [icrsh ].Sigma_freq << solvers [imp_source ].Sigma_freq
112123 solvers [icrsh ].G_freq << solvers [imp_source ].G_freq
113124 solvers [icrsh ].G_freq_unsym << solvers [imp_source ].G_freq_unsym
114125 solvers [icrsh ].G0_freq << solvers [imp_source ].G0_freq
115126 solvers [icrsh ].G_time << solvers [imp_source ].G_time
116127
117- if solvers [icrsh ].solver_params [ 'measure_pert_order' ] :
128+ if solvers [icrsh ].solver_params . get ( 'measure_pert_order' ) :
118129 solvers [icrsh ].perturbation_order = solvers [imp_source ].perturbation_order
119130 solvers [icrsh ].perturbation_order_total = solvers [imp_source ].perturbation_order_total
120131
121- if solvers [icrsh ].solver_params ['measure_density_matrix' ]:
122- solvers [icrsh ].density_matrix = solvers [imp_source ].density_matrix
123- solvers [icrsh ].h_loc_diagonalization = solvers [imp_source ].h_loc_diagonalization
124-
125- if 'measure_chi' in solvers [icrsh ].solver_params and solvers [icrsh ].solver_params ['measure_chi' ] is not None :
132+ if solvers [icrsh ].solver_params .get ('measure_chi' ):
126133 solvers [icrsh ].O_time = solvers [imp_source ].O_time
127134
128135 return solvers
0 commit comments