Loading...
Searching...
No Matches
eonc::Hessian Class Reference

#include <Hessian.h>

Public Member Functions

 Hessian (const Parameters &params, Matter *matter)
 ~Hessian ()=default
MatrixXd getHessian (Matter *matterIn, const VectorXi &atomsIn)
VectorXd getFreqs (Matter *matterIn, const VectorXi &atomsIn)
VectorXd removeZeroFreqs (const VectorXd &freqs)
const MatrixXd & getModes () const noexcept
 Eigenvectors of the mass-weighted Hessian, one column per eigenvalue of getFreqs(), over the mobile degrees of freedom.
void writeHessianFile (bool on) noexcept
 Whether a finished Hessian goes to hessian.dat (on by default).

Private Member Functions

bool calculate ()
bool finalizeHessian (int size)
bool calculateColored (double cutoff, double dr, FdScheme scheme)
bool calculateSerial (double dr, FdScheme scheme)
bool calculateBatched (double dr, FdScheme scheme)

Private Attributes

Matter * matter
const Parameters & parameters
MatrixXd hessian
VectorXd freqs
MatrixXd modes
bool writeFile = true
VectorXi atoms
eonc::log::Scoped log

Detailed Description

Definition at line 47 of file Hessian.h.

Constructor & Destructor Documentation

◆ Hessian()

eonc::Hessian::Hessian ( const Parameters & params,
Matter * matter )

Definition at line 81 of file Hessian.cpp.

82 : matter{matter},
83 parameters{params} {
84 hessian.resize(0, 0);
85 freqs.resize(0);
86}
Matter * matter
Definition Hessian.h:64
VectorXd freqs
Definition Hessian.h:68
const Parameters & parameters
Definition Hessian.h:65
MatrixXd hessian
Definition Hessian.h:67

◆ ~Hessian()

eonc::Hessian::~Hessian ( )
default

Member Function Documentation

◆ calculate()

bool eonc::Hessian::calculate ( )
private

Definition at line 271 of file Hessian.cpp.

271 {
272 int nAtoms = matter->numberOfAtoms();
273
274 int size = static_cast<int>(atoms.rows()) * 3;
275 QUILL_LOG_DEBUG(log, "[Hessian] Hessian size: {}\n", size);
276 if (size == 0) {
277 return false;
278 }
279
280 // Mobile-atom polarity: indices in `atoms` are FD-displaced DOF owners.
281 for (int a = 0; a < atoms.rows(); ++a) {
282 const long idx = atoms(a);
283 if (idx < 0 || idx >= nAtoms) {
284 QUILL_LOG_ERROR(log,
285 "[Hessian] atom index {} out of range [0, {}) at list "
286 "entry {}; aborting FD Hessian",
287 idx, nAtoms, a);
288 return false;
289 }
290 }
291
292 double dr = parameters.main_options().finiteDifference;
293 if (!(dr > 0.0) || !std::isfinite(dr)) {
294 QUILL_LOG_ERROR(log, "[Hessian] invalid finiteDifference dr={}\n", dr);
295 return false;
296 }
297
298 const FdScheme scheme = parseFdScheme(parameters.hessian_options().fd_scheme);
299 const std::string &ckptPath = parameters.hessian_options().checkpoint_path;
300
301 hessian.resize(size, size);
302 hessian.setZero();
303
304 // Net-force removal adds the same shift to every atom, so columns are
305 // no longer confined to the cutoff neighborhood. A column checkpoint is
306 // also stored one coordinate at a time.
307 bool anyFixed = false;
308 for (int i = 0; i < nAtoms; ++i) {
309 if (matter->getFixed(i)) {
310 anyFixed = true;
311 break;
312 }
313 }
314 const bool netCoupled =
315 parameters.main_options().removeNetForce && nAtoms > 1 && !anyFixed;
316 double cutoff = 0.0;
317 if (matter->getPotential()) {
318 cutoff = matter->getPotential()->finiteCutoff();
319 }
320 if (!netCoupled && ckptPath.empty() && cutoff > 0.0 &&
321 std::isfinite(cutoff)) {
322 if (calculateColored(cutoff, dr, scheme)) {
323 return true;
324 }
325 hessian.setZero();
326 }
327 // A potential that evaluates batches (calculator groups, GPU models)
328 // takes the displaced structures together; the column checkpoint stays
329 // on the one-column-at-a-time path.
330 if (ckptPath.empty() && matter->getPotential() &&
331 matter->getPotential()->supportsBatchEvaluation() && size > 1) {
332 return calculateBatched(dr, scheme);
333 }
334 return calculateSerial(dr, scheme);
335}
eonc::log::Scoped log
Definition Hessian.h:78
bool calculateSerial(double dr, FdScheme scheme)
Definition Hessian.cpp:542
VectorXi atoms
Definition Hessian.h:72
bool calculateBatched(double dr, FdScheme scheme)
Definition Hessian.cpp:337
bool calculateColored(double cutoff, double dr, FdScheme scheme)
Definition Hessian.cpp:427
FdScheme
Real finite-difference scheme for the assembled Hessian and for Lanczos/Davidson Hessian-vector produ...
FdScheme parseFdScheme(std::string_view scheme)

◆ calculateBatched()

bool eonc::Hessian::calculateBatched ( double dr,
FdScheme scheme )
private

Definition at line 337 of file Hessian.cpp.

337 {
338 const int size = static_cast<int>(atoms.rows()) * 3;
339 const AtomMatrix pos = matter->getPositions();
340 auto pot = matter->getPotential();
341
342 Matter base(*matter);
343 const AtomMatrix force0 = base.getForces();
344 if (!force0.allFinite()) {
345 QUILL_LOG_ERROR(log, "[Hessian] non-finite forces at undisplaced geometry; "
346 "aborting FD Hessian");
347 return false;
348 }
349
350 // Stencil points per column, in the order fdForceDerivative takes them.
351 std::vector<double> steps{1.0};
352 if (scheme != FdScheme::OneSided) {
353 steps.push_back(-1.0);
354 }
355 if (scheme == FdScheme::Fourth) {
356 steps.push_back(2.0);
357 steps.push_back(-2.0);
358 }
359 const int perColumn = static_cast<int>(steps.size());
360 const long nAtoms = matter->numberOfAtoms();
361 const VectorXi nrs = matter->getAtomicNrs();
362 const Matrix3d box =
363 matter->getPeriodic() ? matter->getCell() : Matrix3d::Zero().eval();
364
365 // Columns in chunks, so memory stays bounded for large mobile sets.
366 constexpr int kChunkColumns = 32;
367 std::vector<Matter> displaced;
368 for (int c0 = 0; c0 < size; c0 += kChunkColumns) {
369 const int c1 = std::min(size, c0 + kChunkColumns);
370 const long n = static_cast<long>(c1 - c0) * perColumn;
371 displaced.assign(static_cast<size_t>(n), base);
372 std::vector<const double *> posPtr, boxPtr;
373 std::vector<const int *> nrsPtr;
374 std::vector<double *> frcPtr;
375 for (int i = c0; i < c1; ++i) {
376 for (int k = 0; k < perColumn; ++k) {
377 Matter &m = displaced[static_cast<size_t>((i - c0) * perColumn + k)];
378 AtomMatrix p = pos;
379 p(atoms(i / 3), i % 3) += steps[static_cast<size_t>(k)] * dr;
380 m.setPositions(p);
381 }
382 }
383 for (auto &m : displaced) {
384 posPtr.push_back(m.getPositions().data());
385 nrsPtr.push_back(nrs.data());
386 frcPtr.push_back(m.forcesData());
387 boxPtr.push_back(box.data());
388 }
389 std::vector<double> energies(static_cast<size_t>(n)),
390 variances(static_cast<size_t>(n));
391 pot->forceBatch(n, nAtoms, posPtr.data(), nrsPtr.data(), frcPtr.data(),
392 energies.data(), variances.data(), boxPtr.data());
393 for (long j = 0; j < n; ++j) {
394 displaced[static_cast<size_t>(j)].setComputedPotential(
395 energies[static_cast<size_t>(j)], variances[static_cast<size_t>(j)]);
396 }
397 for (int i = c0; i < c1; ++i) {
398 auto forces = [&](int k) -> const AtomMatrix & {
399 return displaced[static_cast<size_t>((i - c0) * perColumn + k)]
400 .getForces();
401 };
402 const AtomMatrix &fPlus = forces(0);
403 const AtomMatrix &fMinus = perColumn > 1 ? forces(1) : force0;
404 const AtomMatrix &fPlus2 = perColumn > 2 ? forces(2) : force0;
405 const AtomMatrix &fMinus2 = perColumn > 3 ? forces(3) : force0;
406 if (!fPlus.allFinite() || !fMinus.allFinite() || !fPlus2.allFinite() ||
407 !fMinus2.allFinite()) {
408 QUILL_LOG_ERROR(log,
409 "[Hessian] non-finite forces for FD column {}; "
410 "aborting FD Hessian",
411 i);
412 return false;
413 }
414 const AtomMatrix slope =
415 fdForceDerivative(scheme, dr, force0, fPlus, fMinus, fPlus2, fMinus2);
416 for (int j = 0; j < size; j++) {
417 const double effMass = std::sqrt(matter->getMass(atoms(j / 3)) *
418 matter->getMass(atoms(i / 3)));
419 hessian(i, j) =
420 eonc::safemath::safe_div(-slope(atoms(j / 3), j % 3), effMass, 0.0);
421 }
422 }
423 }
424 return finalizeHessian(size);
425}
Eigen::Matrix< double, 3, 3, eOnStorageOrder > Matrix3d
Definition Eigen.h:35
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition Eigen.h:37
bool finalizeHessian(int size)
Definition Hessian.cpp:640
constexpr double safe_div(double num, double denom, double fallback=0.0)
Definition SafeMath.h:21
M fdForceDerivative(FdScheme scheme, double dr, const M &f0, const M &fPlus, const M &fMinus, const M &fPlus2, const M &fMinus2)
Derivative of a sampled force map along one real step of length dr.

◆ calculateColored()

bool eonc::Hessian::calculateColored ( double cutoff,
double dr,
FdScheme scheme )
private

Definition at line 427 of file Hessian.cpp.

427 {
428 const int nAtoms = static_cast<int>(matter->numberOfAtoms());
429 const int nMobile = static_cast<int>(atoms.rows());
430 const int size = nMobile * 3;
431 const MobileColoring coloring = buildMobileColoring(*matter, atoms, cutoff);
432 if (static_cast<int>(coloring.color.size()) != nMobile ||
433 static_cast<int>(coloring.closed.size()) != nMobile) {
434 return false;
435 }
436
437 int nColors = 0;
438 for (int c : coloring.color) {
439 if (c < 0) {
440 return false;
441 }
442 nColors = std::max(nColors, c + 1);
443 }
444 if (nColors <= 0) {
445 return false;
446 }
447 QUILL_LOG_DEBUG(log,
448 "[Hessian] cutoff coloring: {} colors for {} mobile atoms\n",
449 nColors, nMobile);
450
451 std::vector<std::vector<int>> members(static_cast<std::size_t>(nColors));
452 for (int ia = 0; ia < nMobile; ++ia) {
453 members[static_cast<std::size_t>(
454 coloring.color[static_cast<std::size_t>(ia)])]
455 .push_back(ia);
456 }
457 std::vector<std::vector<int>> owner(
458 static_cast<std::size_t>(nColors),
459 std::vector<int>(static_cast<std::size_t>(nMobile), -1));
460 for (int c = 0; c < nColors; ++c) {
461 for (int ia : members[static_cast<std::size_t>(c)]) {
462 for (int k : coloring.closed[static_cast<std::size_t>(ia)]) {
463 int &slot =
464 owner[static_cast<std::size_t>(c)][static_cast<std::size_t>(k)];
465 if (slot >= 0 && slot != ia) {
466 return false;
467 }
468 slot = ia;
469 }
470 }
471 }
472
473 Matter matterTemp(*matter);
474 const AtomMatrix pos = matter->getPositions();
475 AtomMatrix posDisplace(nAtoms, 3);
476 AtomMatrix force0 = matterTemp.getForces();
477 if (!force0.allFinite()) {
478 QUILL_LOG_ERROR(log, "[Hessian] non-finite forces at undisplaced geometry; "
479 "aborting FD Hessian");
480 return false;
481 }
482
483 for (int dir = 0; dir < 3; ++dir) {
484 for (int c = 0; c < nColors; ++c) {
485 const auto &group = members[static_cast<std::size_t>(c)];
486 if (group.empty()) {
487 continue;
488 }
489 auto shifted = [&](double scale, const char *side) -> AtomMatrix {
490 posDisplace.setZero();
491 for (int ia : group) {
492 posDisplace(atoms(ia), dir) = scale * dr;
493 }
494 matterTemp.setPositions(pos + posDisplace);
495 AtomMatrix force = matterTemp.getForces();
496 if (!force.allFinite()) {
497 QUILL_LOG_ERROR(log,
498 "[Hessian] non-finite forces for color {} dir {} "
499 "({}); aborting FD Hessian",
500 c, dir, side);
501 return AtomMatrix();
502 }
503 return force;
504 };
505 const AtomMatrix forcePlus = shifted(1.0, "+");
506 if (forcePlus.size() == 0) {
507 return false;
508 }
509 AtomMatrix forceMinus = force0;
510 AtomMatrix forcePlus2 = force0;
511 AtomMatrix forceMinus2 = force0;
512 if (scheme != FdScheme::OneSided) {
513 forceMinus = shifted(-1.0, "-");
514 if (forceMinus.size() == 0) {
515 return false;
516 }
517 }
518 if (scheme == FdScheme::Fourth) {
519 forcePlus2 = shifted(2.0, "+2");
520 if (forcePlus2.size() == 0) {
521 return false;
522 }
523 forceMinus2 = shifted(-2.0, "-2");
524 if (forceMinus2.size() == 0) {
525 return false;
526 }
527 }
528 const AtomMatrix slope = fdForceDerivative(
529 scheme, dr, force0, forcePlus, forceMinus, forcePlus2, forceMinus2);
530 const AtomMatrix zero = AtomMatrix::Zero(nAtoms, 3);
531 for (int ia : group) {
532 const int col = ia * 3 + dir;
533 writeMassWeighted(hessian, *matter, atoms, col,
534 static_cast<int>(atoms(ia)), slope, zero, 1.0,
535 owner[static_cast<std::size_t>(c)], ia);
536 }
537 }
538 }
539 return finalizeHessian(size);
540}

◆ calculateSerial()

bool eonc::Hessian::calculateSerial ( double dr,
FdScheme scheme )
private

Definition at line 542 of file Hessian.cpp.

542 {
543 const int nAtoms = static_cast<int>(matter->numberOfAtoms());
544 const int size = static_cast<int>(atoms.rows()) * 3;
545 const std::string &ckptPath = parameters.hessian_options().checkpoint_path;
546 const bool wantResume =
547 parameters.hessian_options().resume && !ckptPath.empty();
548
549 AtomMatrix pos = matter->getPositions();
550 AtomMatrix posDisplace(nAtoms, 3);
551 AtomMatrix posTemp(nAtoms, 3);
552 AtomMatrix forcePlus(nAtoms, 3);
553 AtomMatrix forceMinus(nAtoms, 3);
554
555 int startCol = 0;
556 if (wantResume && loadColumnCheckpoint(ckptPath, size, startCol, hessian)) {
557 QUILL_LOG_DEBUG(log, "[Hessian] resume from column {} / {}\n", startCol,
558 size);
559 } else {
560 startCol = 0;
561 hessian.setZero();
562 }
563
564 Matter matterTemp(*matter);
565 AtomMatrix force0 = matterTemp.getForces();
566 if (!force0.allFinite()) {
567 QUILL_LOG_ERROR(log, "[Hessian] non-finite forces at undisplaced geometry; "
568 "aborting FD Hessian");
569 return false;
570 }
571
572 for (int i = startCol; i < size; i++) {
573 posDisplace.setZero();
574 posDisplace(atoms(i / 3), i % 3) = dr;
575
576 posTemp = pos + posDisplace;
577 matterTemp.setPositions(posTemp);
578 forcePlus = matterTemp.getForces();
579 if (!forcePlus.allFinite()) {
580 QUILL_LOG_ERROR(log,
581 "[Hessian] non-finite forces for FD column {} (+); "
582 "aborting FD Hessian",
583 i);
584 return false;
585 }
586
587 if (scheme != FdScheme::OneSided) {
588 posTemp = pos - posDisplace;
589 matterTemp.setPositions(posTemp);
590 forceMinus = matterTemp.getForces();
591 if (!forceMinus.allFinite()) {
592 QUILL_LOG_ERROR(log,
593 "[Hessian] non-finite forces for FD column {} (-); "
594 "aborting FD Hessian",
595 i);
596 return false;
597 }
598 }
599 AtomMatrix forcePlus2 = force0;
600 AtomMatrix forceMinus2 = force0;
601 if (scheme == FdScheme::Fourth) {
602 posDisplace(atoms(i / 3), i % 3) = 2.0 * dr;
603 matterTemp.setPositions(pos + posDisplace);
604 forcePlus2 = matterTemp.getForces();
605 if (!forcePlus2.allFinite()) {
606 QUILL_LOG_ERROR(log,
607 "[Hessian] non-finite forces for FD column {} (+2); "
608 "aborting FD Hessian",
609 i);
610 return false;
611 }
612 matterTemp.setPositions(pos - posDisplace);
613 forceMinus2 = matterTemp.getForces();
614 if (!forceMinus2.allFinite()) {
615 QUILL_LOG_ERROR(log,
616 "[Hessian] non-finite forces for FD column {} (-2); "
617 "aborting FD Hessian",
618 i);
619 return false;
620 }
621 }
622 // H ≈ -dF, mass-weighted. dF is the selected real stencil.
623 const AtomMatrix slope = fdForceDerivative(
624 scheme, dr, force0, forcePlus, forceMinus, forcePlus2, forceMinus2);
625 for (int j = 0; j < size; j++) {
626 hessian(i, j) = -slope(atoms(j / 3), j % 3);
627 const double effMass = std::sqrt(matter->getMass(atoms(j / 3)) *
628 matter->getMass(atoms(i / 3)));
629 hessian(i, j) = eonc::safemath::safe_div(hessian(i, j), effMass, 0.0);
630 }
631
632 if (!ckptPath.empty()) {
633 // next column to compute after a clean interrupt
634 saveColumnCheckpoint(ckptPath, size, i + 1, hessian);
635 }
636 }
637 return finalizeHessian(size);
638}

◆ finalizeHessian()

bool eonc::Hessian::finalizeHessian ( int size)
private

Definition at line 640 of file Hessian.cpp.

640 {
641 const std::string &ckptPath = parameters.hessian_options().checkpoint_path;
642
643 // Symmetrize (FD noise breaks H=H^T; required for vib analysis)
644 for (int i = 0; i < size; i++) {
645 for (int j = 0; j < i; j++) {
646 hessian(i, j) = (hessian(i, j) + hessian(j, i)) / 2;
647 hessian(j, i) = hessian(i, j);
648 }
649 }
650
651 if (!hessian.allFinite()) {
652 QUILL_LOG_ERROR(log, "[Hessian] non-finite entries after FD assembly; "
653 "aborting eigen solve");
654 return false;
655 }
656
657 if (!parameters.main_options().quiet) {
658 QUILL_LOG_DEBUG(log, "[Hessian] writing hessian\n");
659 }
660 if (writeFile) {
661 // A previous case in the same process can still hold hessian.dat on
662 // Windows. Replace it, and try once more after removing the old file.
663 std::ofstream hessfile("hessian.dat", std::ios::out | std::ios::trunc);
664 if (!hessfile) {
665 std::remove("hessian.dat");
666 hessfile.clear();
667 hessfile.open("hessian.dat", std::ios::out | std::ios::trunc);
668 }
669 if (!hessfile) {
670 QUILL_LOG_ERROR(log, "[Hessian] failed to open hessian.dat");
671 return false;
672 }
673 hessfile << hessian;
674 hessfile.close();
675 if (!hessfile) {
676 QUILL_LOG_ERROR(log, "[Hessian] failed to write hessian.dat");
677 return false;
678 }
679 }
680
681 // Completed run: remove checkpoint so a later job does not resume stale cols
682 if (!ckptPath.empty()) {
683 std::remove(ckptPath.c_str());
684 }
685
686 double t0, t1;
687 eonc::helpers::getTime(&t0, nullptr, nullptr);
688 QUILL_LOG_DEBUG(log, "[Hessian] calculating eigen values of the hessian\n");
689 // ColMajor copy for SelfAdjointEigenSolver (eOn MatrixXd is RowMajor)
690 using ColMajorXd =
691 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>;
692 ColMajorXd hessianCol = hessian;
693 const bool withModes = parameters.hessian_options().write_modes;
694 Eigen::SelfAdjointEigenSolver<ColMajorXd> es(
695 hessianCol,
696 withModes ? Eigen::ComputeEigenvectors : Eigen::EigenvaluesOnly);
697 eonc::helpers::getTime(&t1, nullptr, nullptr);
698 QUILL_LOG_DEBUG(log, "[Hessian] eigenvalue problem took {:.4e} seconds\n",
699 t1 - t0);
700 if (es.info() != Eigen::Success) {
701 QUILL_LOG_ERROR(log,
702 "[Hessian] SelfAdjointEigenSolver failed (info={}); "
703 "aborting",
704 static_cast<int>(es.info()));
705 return false;
706 }
707 freqs = es.eigenvalues();
708 if (!freqs.allFinite()) {
709 QUILL_LOG_ERROR(log, "[Hessian] non-finite eigenvalues; aborting");
710 return false;
711 }
712 if (withModes) {
713 modes = es.eigenvectors();
714 } else {
715 modes.resize(0, 0);
716 }
717
718 return true;
719}
bool writeFile
Definition Hessian.h:70
MatrixXd modes
Definition Hessian.h:69
void getTime(double *real, double *user, double *sys)

◆ getFreqs()

VectorXd eonc::Hessian::getFreqs ( Matter * matterIn,
const VectorXi & atomsIn )

Definition at line 102 of file Hessian.cpp.

102 {
103 if ((matter != matterIn) || (atoms.size() != atomsIn.size()) ||
104 (atoms != atomsIn) || (hessian.rows() == 0)) {
105 hessian.resize(0, 0);
106 matter = matterIn;
107 atoms = atomsIn;
108
109 if (!calculate()) {
110 freqs.resize(0);
111 hessian.resize(0, 0);
112 }
113 }
114 return freqs;
115}
bool calculate()
Definition Hessian.cpp:271

◆ getHessian()

MatrixXd eonc::Hessian::getHessian ( Matter * matterIn,
const VectorXi & atomsIn )

Definition at line 88 of file Hessian.cpp.

88 {
89 if ((matter != matterIn) || (atoms.size() != atomsIn.size()) ||
90 (atoms != atomsIn) || (hessian.rows() == 0)) {
91 hessian.resize(0, 0);
92 matter = matterIn;
93 atoms = atomsIn;
94
95 if (!calculate()) {
96 hessian.resize(0, 0);
97 }
98 }
99 return hessian;
100}

◆ getModes()

const MatrixXd & eonc::Hessian::getModes ( ) const
inlinenodiscardnoexcept

Eigenvectors of the mass-weighted Hessian, one column per eigenvalue of getFreqs(), over the mobile degrees of freedom.

Empty unless [Hessian] write_modes is set.

Definition at line 58 of file Hessian.h.

58{ return modes; }

◆ removeZeroFreqs()

VectorXd eonc::Hessian::removeZeroFreqs ( const VectorXd & freqs)

Definition at line 721 of file Hessian.cpp.

721 {
722 QUILL_LOG_DEBUG(log, "[Hessian] removing zero frequency modes");
723 int size = freqs.size();
724 if (size != 3 * matter->numberOfAtoms()) {
725 return freqs;
726 }
727 VectorXd newfreqs;
728 newfreqs.resize(size);
729 int nremoved = 0;
730 for (int i = 0; i < size; i++) {
731 if (std::abs(freqs(i)) > parameters.hessian_options().zero_freq_value) {
732 newfreqs(i - nremoved) = freqs(i);
733 } else {
734 nremoved++;
735 }
736 }
737
738 if (!trivialModeCountIsPhysical(nremoved, matter->numberOfFixedAtoms())) {
739 QUILL_LOG_WARNING(log,
740 "[Hessian] found {} trivial eigenmodes; a free cluster "
741 "has 6 (5 if linear), a periodic cell 3, and a "
742 "structure with fixed atoms none",
743 nremoved);
744 }
745 return newfreqs.head(size - nremoved);
746}
bool trivialModeCountIsPhysical(long removed, long fixedAtoms)
Whether removed zero-frequency modes are what the structure's symmetries give: 6 for a free cluster (...
Definition Hessian.cpp:798

◆ writeHessianFile()

void eonc::Hessian::writeHessianFile ( bool on)
inlinenoexcept

Whether a finished Hessian goes to hessian.dat (on by default).

A caller that takes many Hessians, one per instanton bead, turns it off.

Definition at line 61 of file Hessian.h.

61{ writeFile = on; }

Member Data Documentation

◆ atoms

VectorXi eonc::Hessian::atoms
private

Definition at line 72 of file Hessian.h.

◆ freqs

VectorXd eonc::Hessian::freqs
private

Definition at line 68 of file Hessian.h.

◆ hessian

MatrixXd eonc::Hessian::hessian
private

Definition at line 67 of file Hessian.h.

◆ log

eonc::log::Scoped eonc::Hessian::log
private

Definition at line 78 of file Hessian.h.

◆ matter

Matter* eonc::Hessian::matter
private

Definition at line 64 of file Hessian.h.

◆ modes

MatrixXd eonc::Hessian::modes
private

Definition at line 69 of file Hessian.h.

◆ parameters

const Parameters& eonc::Hessian::parameters
private

Definition at line 65 of file Hessian.h.

◆ writeFile

bool eonc::Hessian::writeFile = true
private

Definition at line 70 of file Hessian.h.


The documentation for this class was generated from the following files: