@@ -295,6 +295,7 @@ void Scph::postprocess(std::complex<double> ****delta_dymat, std::complex<double
295295 double *FE_QHA = nullptr ;
296296 double *dFE_scph = nullptr ;
297297 double *FE_total = nullptr ;
298+ double *entropy = nullptr ;
298299 double **msd_update = nullptr ;
299300 double ***ucorr_update = nullptr ;
300301 double ****dielec_update = nullptr ;
@@ -318,6 +319,7 @@ void Scph::postprocess(std::complex<double> ****delta_dymat, std::complex<double
318319 allocate (FE_QHA, NT);
319320 allocate (dFE_scph, NT);
320321 allocate (FE_total, NT);
322+ allocate (entropy, NT);
321323
322324 if (writes->getPrintMSD ()) {
323325 allocate (msd_update, NT, ns);
@@ -434,6 +436,14 @@ void Scph::postprocess(std::complex<double> ****delta_dymat, std::complex<double
434436
435437 FE_total[iT] = thermodynamics->compute_FE_total (iT, FE_QHA[iT], dFE_scph[iT]);
436438
439+ entropy[iT] = thermodynamics->vibrational_entropy (temperature,
440+ dos->kmesh_dos ->nk_irred ,
441+ ns,
442+ dos->kmesh_dos ->kpoint_irred_all ,
443+ dos->kmesh_dos ->weight_k .data (),
444+ eval_update[iT]) /
445+ k_Boltzmann;
446+
437447 if (writes->getPrintMSD ()) {
438448 double shift[3 ]{0.0 , 0.0 , 0.0 };
439449
@@ -501,7 +511,13 @@ void Scph::postprocess(std::complex<double> ****delta_dymat, std::complex<double
501511 if (dos->compute_dos ) {
502512 writes->writePhononDos (dos_update, is_qha, 0 );
503513 }
504- writes->writeThermodynamicFunc (heat_capacity, heat_capacity_correction, FE_QHA, dFE_scph, FE_total, is_qha);
514+ writes->writeThermodynamicFunc (heat_capacity,
515+ heat_capacity_correction,
516+ FE_QHA,
517+ dFE_scph,
518+ FE_total,
519+ entropy,
520+ is_qha);
505521 if (writes->getPrintMSD ()) {
506522 writes->writeMSD (msd_update, is_qha, 0 );
507523 }
@@ -777,6 +793,7 @@ void Scph::postprocess(std::complex<double> ****delta_dymat, std::complex<double
777793 if (FE_QHA) deallocate (FE_QHA);
778794 if (dFE_scph) deallocate (dFE_scph);
779795 if (FE_total) deallocate (FE_total);
796+ if (entropy) deallocate (entropy);
780797 if (dielec_update) deallocate (dielec_update);
781798
782799 if (eval_gam) deallocate (eval_gam);
@@ -2131,8 +2148,6 @@ void Scph::interpolate_to_dense_mesh(std::complex<double> ***dymat_q,
21312148}
21322149
21332150
2134-
2135-
21362151bool Scph::check_convergence (const Eigen::MatrixXd &omega_now, const Eigen::MatrixXd &omega_old, const double conv_tol,
21372152 const unsigned int verbosity, const int iloop, double &diff) const
21382153{
@@ -2386,10 +2401,10 @@ void Scph::compute_anharmonic_frequency(std::complex<double> ***v4_array_all, do
23862401
23872402
23882403void Scph::compute_anharmonic_frequency_diis_perkpoint (std::complex <double > ***v4_array_all, double **omega2_out,
2389- std::complex <double > ***evec_anharm_scph, const double temp,
2390- bool &flag_converged, std::complex <double > ***cmat_convert,
2391- const bool offdiag, std::complex <double > **delta_v2_renorm,
2392- const unsigned int verbosity)
2404+ std::complex <double > ***evec_anharm_scph, const double temp,
2405+ bool &flag_converged, std::complex <double > ***cmat_convert,
2406+ const bool offdiag, std::complex <double > **delta_v2_renorm,
2407+ const unsigned int verbosity)
23932408{
23942409 // SCPH with per-k-point DIIS using GDIIS_PerKpoint class
23952410 // Each k-point has independent DIIS history and coefficients
@@ -2448,13 +2463,23 @@ void Scph::compute_anharmonic_frequency_diis_perkpoint(std::complex<double> ***v
24482463
24492464 const auto T_in = temp;
24502465
2451- initialize_scph_iteration (T_in, flag_converged, omega2_out, verbosity,
2452- omega_now, omega2_HA, evec_initial, evec_initial_adjoint, cmat_convert);
2466+ initialize_scph_iteration (T_in,
2467+ flag_converged,
2468+ omega2_out,
2469+ verbosity,
2470+ omega_now,
2471+ omega2_HA,
2472+ evec_initial,
2473+ evec_initial_adjoint,
2474+ cmat_convert);
24532475
24542476 setup_harmonic_dynamical_matrices (omega2_HA, evec_initial, delta_v2_renorm, Fmat0, dymat_q_HA);
24552477
2456- dynamical->precompute_dymat_harm (kmesh_dense->nk , kmesh_dense->xk , kmesh_dense->kvec_na ,
2457- dymat_harm_short, dymat_harm_long);
2478+ dynamical->precompute_dymat_harm (kmesh_dense->nk ,
2479+ kmesh_dense->xk ,
2480+ kmesh_dense->kvec_na ,
2481+ dymat_harm_short,
2482+ dymat_harm_long);
24582483
24592484 // Initialize per-k-point DIIS mixer
24602485 const int diis_history = std::min (3 , static_cast <int >(maxiter / 3 ));
@@ -2473,13 +2498,28 @@ void Scph::compute_anharmonic_frequency_diis_perkpoint(std::complex<double> ***v
24732498 knum = kmap_interpolate_to_scph[knum_interpolate];
24742499
24752500 update_fmat_with_v4 (Fmat0, v4_array_all, dmat_convert, offdiag, ik, Fmat);
2476- diagonalize_and_symmetrize (Fmat, evec_initial, v4_array_all, ik, knum, knum_interpolate,
2477- flag_converged, omega2_out, verbosity, icount, eval_tmp, dymat_q);
2501+ diagonalize_and_symmetrize (Fmat,
2502+ evec_initial,
2503+ v4_array_all,
2504+ ik,
2505+ knum,
2506+ knum_interpolate,
2507+ flag_converged,
2508+ omega2_out,
2509+ verbosity,
2510+ icount,
2511+ eval_tmp,
2512+ dymat_q);
24782513 }
24792514
24802515 // Step 2: Interpolate to get new eigenvalues (output from using dmat_convert)
2481- interpolate_to_dense_mesh (dymat_q, dymat_q_HA, evec_initial, eval_interpolate,
2482- evec_new, cmat_convert, omega_now);
2516+ interpolate_to_dense_mesh (dymat_q,
2517+ dymat_q_HA,
2518+ evec_initial,
2519+ eval_interpolate,
2520+ evec_new,
2521+ cmat_convert,
2522+ omega_now);
24832523
24842524 // Step 3: Check convergence before mixing
24852525 if (check_convergence (omega_now, omega_old, conv_tol, verbosity, iloop, diff)) {
@@ -2492,7 +2532,7 @@ void Scph::compute_anharmonic_frequency_diis_perkpoint(std::complex<double> ***v
24922532 }
24932533
24942534 if (use_diis) {
2495- gdiis_mixer_perkpoint.push (dmat_convert, omega_now); // Correct: D_input → ω_output
2535+ gdiis_mixer_perkpoint.push (dmat_convert, omega_now); // Correct: D_input → ω_output
24962536 }
24972537
24982538 // Step 5: Compute what D should be based on new eigenvalues
@@ -2549,7 +2589,8 @@ void Scph::compute_anharmonic_frequency_diis_perkpoint(std::complex<double> ***v
25492589 std::cout << " (with per-k-point DIIS)" ;
25502590 auto stats = gdiis_mixer_perkpoint.get_success_stats ();
25512591 int total_success = 0 ;
2552- for (int s : stats) total_success += s;
2592+ for (int s: stats)
2593+ total_success += s;
25532594 if (verbosity > 1 ) {
25542595 std::cout << " \n Total DIIS successes: " << total_success;
25552596 }
0 commit comments